Changes
Title
unchanged
Yii v2 snippet guide II
Category
unchanged
Tutorials
Yii version
unchanged
2.0
Tags
unchanged
tutorial,beginner,yii2,snippets
Content
changed
**Intro**
---
Hi. I had to split my article as max length was reached. Check my previous articles here (mainly the 1st one):## My articles
Articles are separated into more files as there is the max lenght for each file on wiki.
-* [
Yii v1 for beginners](https://www.yiiframework.com/wiki/25
520/yii-
v2-snippet-guidefor-beginners)
* [Yii v1 for beginners 2](https://www.yiiframework.com/wiki/
255462/yii-
for-beginners-2)
* [Yii v2
- snippet
- guide
)
- [ I](https://www.yiiframework.com/wiki/25
052/yii-
for-beginnersv2-snippet-guide)
* [Yii v2 snippet guide II](https://www.yiiframework.com/wiki/25
058/yii-
for-beginnersv2-snippet-guide-ii)
-* [
Yii v2 snippet guide III](https://www.yiiframework.com/wiki/
4622567/yii-
for-beginners-2](https://www.yiiframework.com/wiki/462/yii-for-beginners-2v2-snippet-guide-iii)
* [Začínáme s PHP frameworkem Yii2 (I) česky - YouTube](https://youtu.be/ub06hNoL8B8)
**Connection to MSSQL**[...]
```
Into method search() add HAVING condition if you want to filter by amount or items:
```php
if (trim($this->amount)!=='') {
$query->and
HavingFilterWhere([
'amount' => $this->amount
]);[...]
// ...
// You must use joinWith() in order to have both tables in one JOIN - then you can call WHERE and ORDER BY on the 2nd table.
// Explanation here:
// https://stackoverflow.com/questions/25600048/what-is-the-difference-between-with-and-joinwith-in-yii2-and-when-to-use-them
$query = Invoice::find()->joinWith('companyRelation');
// Appending new sortable column:
$sort = $dataProvider->getSort();
$sort->attributes['company_name'] = [[...]
'default' => SORT_ASC
];
// ...
if (trim($this->company_name)!=='') {
$query->and
HavingFilterWhere(['like', 'table.column', $this->company_name]);
}
``` }
}
```
**Sending binary data as a file to browser - decoded base64**
---
In my tutorial for Yii v1 I presented following way how to send headers manually and then call exit(). But calling exit() or die() is not a good idea so I discovered a better way in Yii v2.
See chapter [Secured (secret) file download](https://www.yiiframework.com/wiki/462/yii-for-beginners-2)
Motivation: Sometimes you receive a PDF file encoded into a string using base64. For example a label with barcodes from FedEx, DPD or other delivery companies and your task is to show the label to users.
For me workes this algorithm:
```php
$pdfBase64 = 'JVBERi0xLjQ ... Y0CiUlRU9GCg==';
// First I create a fictive stream in a temporary file
// Read more about PHP wrappers:
// https://www.php.net/manual/en/wrappers.php.php
$stream = fopen('php://temp','r+');
// Decoded base64 is written into the stream
fwrite($stream, base64_decode($pdfBase64));
// And the stream is rewound back to the start so others can read it
rewind($stream);
// This row sets "Content-Type" header to none. Below I set it manually do application/pdf.
Yii::$app->response->format = Yii::$app->response::FORMAT_RAW;
Yii::$app->response->headers->set('Content-Type', 'application/pdf');
// This row will download the file. If you do not use the line, the file will be displayed in the browser.
// Details here:
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers#Downloads
// Yii::$app->response->headers->set('Content-Disposition','attachment; filename="hello.pdf"');
// Here is used the temporary stream
Yii::$app->response->stream = $stream;
// You can call following line, but you don't have to. Method send() is called automatically when current action ends:
// Details here:
// https://www.yiiframework.com/doc/api/2.0/yii-web-response#sendContentAsFile()-detail
// return Yii::$app->response->send();
```
**Note:** You can add more headers if you need. Check my previous article (linked above).