Продолжаю рассказывать некоторые интересные моменты по фреймворку Yii, встречающиеся при разработке.
-
Поведения (Behaviors).
Бывает очень часто при добавлении новой записи или обновлении существующей необходимо обновлять поле в таблице, типа date_updated / date_created.
Для этого в модель добавим:
- public function behaviors(){
- return array(
- 'AutoTimestampBehavior' => array(
- 'class' => 'zii.behaviors.CTimestampBehavior',
- 'createAttribute' => 'date_updated',
- 'updateAttribute' => 'date_updated',
- ),
- );
- }
Теперь у нас автоматически при создании или редактировании записи будет заполняться поле date_updated актуальным значением.
-
Вставка фотографии из модели в GridView.
Если хотите выводить фотографии каждого объекта в колонке, выставляйте 'type' => 'image' и в 'value' => 'путь до изображения':
- $this->widget('zii.widgets.grid.CGridView', array(
- 'dataProvider'=>$model->search(),
- 'filter'=>$model,
- 'columns'=>array(
- array (
- 'name' => 'img',
- 'type' => 'image',
- 'value'=> 'url/to/image'
- 'filter' => false,
- ),
- ...
- ));
-
Задание имени сценария перед валидацией и его правила валидации:
- $model->scenario = 'upload';
-
- if($model->validate()) {
- ...
- }
в правилах валидации указываем сценарий 'on' => 'upload':
- public function rules() {
- return array(
- array(
- 'upload', 'file',
- 'types' => "{$this->supportExt}",
- 'maxSize' => $this->fileMaxSize,
- 'tooLarge' => Yii::t('module_slider', 'The file was larger than {size}MB. Please upload a smaller file.', array('{size}' => $this->fileMaxSize)),
- 'on' => 'upload',
- ),
- );
- }
-
Приятное расширение для ресайза - http://www.yiiframework.com/extension/image/
- if(isset($_POST["{$this->modelName}"])){
- $model->attributes = $_POST;
- $model->scenario = 'upload';
-
- if($model->validate()) {
- $model->upload = CUploadedFile::getInstance($model,'upload');
- $model->img = md5(uniqid()).'.'.$model->upload->extensionName;
-
- if($model->save()){
- $model->upload->saveAs($model->uploadPath.'/'.$model->img);
-
- Yii::import('application.extensions.image.Image');
- $image = new Image($model->uploadPath.'/'.$model->img);
- $image->resize($model->maxWidth, $model->maxHeight);
- $image->save();
-
- Yii::app()->user->setFlash(
- 'mesSlider', tt('Image succesfullty added to slider.')
- );
- $model->unsetAttributes();
- }
- }
- }
Разберём подробнее:
- Yii::import('application.extensions.image.Image');
- $image = new Image($model->uploadPath.'/'.$model->img);
- $image->resize($model->maxWidth, $model->maxHeight);
- $image->save();
Благодаря данному расширению совсем немного кода и фотография уменьшена в размерах, а затем сохранена.
Ссылка в тему: на мой взгляд очень красивый метод ресайза - http://habrahabr.ru/blogs/webdev/92654/
-
Удаление кнопок просмотра, редактирования в GridView. При клике на кнопку "удаления" - alert о подтверждении
- array(
- 'class'=>'CButtonColumn',
- 'buttons' => array(
- 'view' => array(
- 'visible' => 'false',
- ),
- 'update' => array(
- 'visible' => 'false',
- ),
- ),
- 'deleteConfirmation' => 'Are you sure you want to delete this item?'
- )
-
Обычно, после какого либо действия, пользователь ожидает оповещения от системы (ошибка или успешность проведённой операции).
Например, добавил пользователь новую фотографию, а скриптом задумано не переносить пользователя на другую страницу (с выводом всех фотографий), а оставлять на той же странице - форме добавления.
Для вывода сообщения об успешности и(или) ошибках можно использовать:
- Yii::app()->user->setFlash(
- 'message', 'Image succesfullty added to slider.'
- );
-
- $model->unsetAttributes();
и в представлении добавим ещё пару-тройку строк:
- if (Yii::app()->user->hasFlash('message')) {
- echo "<div class='success'>" . Yii::app()->user->getFlash('message') . "</div>";
- }
Теперь пользователь будет уверен, что его фотография добавлена, а недоумевать и идти на страницу со списком всех фотографий и искать вновь загруженную.
Меньше минуты потраченного времени программистом принесут пользователю радость.
-
Например, при работе фотографиями очень полезно из любого места в скрипте получать данные о расположении папок с файлами.
Я в таком случае делаю так:
- ...
-
- $public sitePath;
- $public uploadPath;
- ...
- public function init() {
- $this->preparePaths();
- }
-
- public function preparePaths() {
- $this->sitePath = Yii::app()->basePath . '/../';
- $this->uploadPath = $this->sitePath . '/uploads/slider;
- ...
- }
- ...
теперь можно получать пути: $this->uploadPath, Slider::model()->uploadPath в зависимости от ситуации.
Обсудить статью на форуме