Создание и сопровождение сайтов

Блог. Yii. Подсказки по yii. Глава вторая.

Поиск

Продолжаю рассказывать некоторые интересные моменты по фреймворку Yii, встречающиеся при разработке.

  1. Поведения (Behaviors).

    Бывает очень часто при добавлении новой записи или обновлении существующей необходимо обновлять поле в таблице, типа date_updated / date_created.

    Для этого в модель добавим:

     

    1. public function behaviors(){  
    2.     return array(  
    3.         'AutoTimestampBehavior' => array(  
    4.             'class' => 'zii.behaviors.CTimestampBehavior',  
    5.             'createAttribute' => 'date_updated',  
    6.             'updateAttribute' => 'date_updated',  
    7.         ),  
    8.     );  
    9. }  

     Теперь у нас автоматически при создании или редактировании записи будет заполняться поле date_updated актуальным значением.

  1. Вставка фотографии из модели в GridView.

    Если хотите выводить фотографии каждого объекта в колонке, выставляйте 'type' => 'image' и в 'value' => 'путь до изображения':

     

    1. $this->widget('zii.widgets.grid.CGridView'array(  
    2.     'dataProvider'=>$model->search(),  
    3.     'filter'=>$model,  
    4.     'columns'=>array(  
    5.         array (  
    6.             'name' => 'img',  
    7.             'type' => 'image',  
    8.             'value'=> 'url/to/image' /* например: 'Yii::app()->request->baseUrl."/".$data->sliderThumbPath."/".$data->img' - обязательно в ковычках */  
    9.             'filter' => false,  
    10.         ),  
    11.         ...  
    12. ));  

     

  2. Задание имени сценария перед валидацией и его правила валидации:

     

    1. $model->scenario = 'upload';  
    2.       
    3. if($model->validate()) {  
    4.     ...  
    5. }  

     

    в правилах валидации указываем сценарий 'on' => 'upload':

     

    1. public function rules() {  
    2.     return array(  
    3.         array(  
    4.             'upload''file',  
    5.             'types' => "{$this->supportExt}",  
    6.             'maxSize' => $this->fileMaxSize,  
    7.             'tooLarge' => Yii::t('module_slider''The file was larger than {size}MB. Please upload a smaller file.'array('{size}' => $this->fileMaxSize)),  
    8.             'on' => 'upload',  
    9.         ),  
    10.     );  
    11. }  

     

  3. Приятное расширение для ресайза - http://www.yiiframework.com/extension/image/

     

    1. if(isset($_POST["{$this->modelName}"])){  
    2.     $model->attributes = $_POST;                  
    3.     $model->scenario = 'upload';  
    4.       
    5.     if($model->validate()) {  
    6.         $model->upload = CUploadedFile::getInstance($model,'upload');                                 
    7.         $model->img = md5(uniqid()).'.'.$model->upload->extensionName;                
    8.           
    9.         if($model->save()){  
    10.             $model->upload->saveAs($model->uploadPath.'/'.$model->img);  
    11.               
    12.             Yii::import('application.extensions.image.Image');  
    13.             $image = new Image($model->uploadPath.'/'.$model->img);  
    14.             $image->resize($model->maxWidth, $model->maxHeight);  
    15.             $image->save();  
    16.               
    17.             Yii::app()->user->setFlash(  
    18.                     'mesSlider', tt('Image succesfullty added to slider.')  
    19.             );  
    20.             $model->unsetAttributes();                
    21.         }  
    22.     }  
    23. }  

     

    Разберём подробнее:

     

    1. Yii::import('application.extensions.image.Image'); // подключаем  
    2. $image = new Image($model->uploadPath.'/'.$model->img); // в качестве параметра указываем физический путь к файлу  
    3. $image->resize($model->maxWidth, $model->maxHeight); //параметры – максимальная ширина и максимальная высота  
    4. $image->save();   

     

    Благодаря данному расширению совсем немного кода и фотография уменьшена в размерах, а затем сохранена.

    Ссылка в тему: на мой взгляд очень красивый метод ресайза - http://habrahabr.ru/blogs/webdev/92654/

  4. Удаление кнопок просмотра, редактирования в GridView. При клике на кнопку "удаления" - alert о подтверждении

     

    1. array(  
    2.     'class'=>'CButtonColumn',  
    3.     'buttons' => array(  
    4.         'view' => array(  
    5.             'visible' => 'false',  
    6.         ),  
    7.         'update' => array(  
    8.             'visible' => 'false',  
    9.         ),  
    10.     ),  
    11.     'deleteConfirmation' => 'Are you sure you want to delete this item?'  
    12. )  

     

  5. Обычно, после какого либо действия, пользователь ожидает оповещения от системы (ошибка или успешность проведённой операции).

    Например, добавил пользователь новую фотографию, а скриптом задумано не переносить пользователя на другую страницу (с выводом всех фотографий), а оставлять на той же странице - форме добавления.

    Для вывода сообщения об успешности и(или) ошибках можно использовать:

     

    1. Yii::app()->user->setFlash(  
    2.         'message''Image succesfullty added to slider.'  
    3. );  
    4. // очистим данные с прошлой формы   
    5. $model->unsetAttributes();  

     

    и в представлении добавим ещё пару-тройку строк:

     

    1. if (Yii::app()->user->hasFlash('message')) {  
    2.     echo "<div class='success'>" . Yii::app()->user->getFlash('message') . "</div>";  
    3. }  

     

    Теперь пользователь будет уверен, что его фотография добавлена, а недоумевать и идти на страницу со списком всех фотографий и искать вновь загруженную.

    Меньше минуты потраченного времени программистом принесут пользователю радость.

  6. Например, при работе фотографиями очень полезно из любого места в скрипте получать данные о расположении папок с файлами.

    Я в таком случае делаю так:

     

    1. ...  
    2.   
    3.     $public sitePath;  
    4.     $public uploadPath;  
    5.     ...  
    6.     public function init() {  
    7.         $this->preparePaths();  
    8.     }  
    9.   
    10.     public function preparePaths() {  
    11.         $this->sitePath = Yii::app()->basePath . '/../';  
    12.         $this->uploadPath = $this->sitePath . '/uploads/slider;  
    13.         ...  
    14.     }  
    15. ...  

     

    теперь можно получать пути: $this->uploadPath, Slider::model()->uploadPath в зависимости от ситуации.

Обсудить статью на форуме