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

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

Поиск

Советы по CMF Yii. Глава шестая.

  1. Label, помеченный как обязательный для заполнения.

    Крайне редко, но бывает необходимо пометить label, как обязательный для заполнения (звёздочкой), но в правилах написать required нельзя.

    Для этого в массив htmlOption передайте required => true:

     

    1. echo CHtml::activeLabel($model'name'array('required' => true));  
  2. CGridView. Добавляем раскрывающийся список для сортировки/поиска.

    По-умолчанию, в CGridView filter, установленный в значение true, является текстовым полем.

    Разберём как сделать его раскрывающимся списком (dropDownList).

    В представление добавьте следующий код:

     

    1. 'filter' => array(0 => 'Все', 1 => 'Продажа', 2 => 'Аренда'),  

    Должно получиться типа такого:

     

    1. $this->widget('zii.widgets.grid.CGridView'array(    
    2.     'id'=>'apartments-grid',    
    3.     'dataProvider'=>$model->search(),    
    4.     'filter'=>$model,    
    5.     'columns'=>array(    
    6.         ...    
    7.         array(    
    8.             'name' => 'type',    
    9.             'type' => 'raw',    
    10.             'value' => 'Apartment::getNameByType($data->type)',    
    11.             'filter' => array(0 => 'Все', 1 => 'Продажа', 2 => 'Аренда'),  
    12.         ),          
    13.         ...    
    14.     )    
    15. ));   

    Осталось добавить в метод search модели нижеприведённый код:

     

    1. if ($this->type)  
    2.     $criteria->compare('type'$this->type);  

    В итоге получим такой фильтрующий раскрывающийся список:

    dropdownlist 01

  3. Одна форма с данными из двух и более моделей.

    Предположим, что нам нужна одна форма для добавления/редактирования данных с выводом ошибок из двух моделей (категории и подкатегории).

    Экшен для модели Категорий:

     

    1. <?php   
    2. ...  
    3. public function actionCreate() {  
    4.     $category = new Category;  
    5.     $subCategory = new SubCategory;  
    6.       
    7.     if(isset($_POST['Category'], $_POST['SubCategory'])) {  
    8.         // собираем входные данные  
    9.         $model->attributes = $_POST['Category'];  
    10.         $sub->attributes = $_POST['SubCategory'];  
    11.    
    12.         // валидация  
    13.         $valid = $model->validate();  
    14.         $valid = $sub->validate() && $valid;  
    15.    
    16.         if($valid) {  
    17.             // сохраняем данные без валидации (параметр false), так как уже валидация была выше.  
    18.             if($model->save(false)) {  
    19.                 $sub->category_id = $model->id;  
    20.                 $sub->save(false);  
    21.                 $this->redirect(array('view','id'=>$model->id));  
    22.             }             
    23.         }  
    24.     }  
    25.    
    26.     $this->render('create'array(  
    27.         'model'=>$model,  
    28.         'sub'=>$sub,  
    29.     ));  
    30. }  
    31. ...  
    32. ?>  

    Представление create модели Category имеет вид:

     

    1. <?php  
    2. $this->breadcrumbs=array(  
    3.     'Управление категориями' => array('admin'),  
    4.     'Добавить категорию',  
    5. );  
    6.   
    7. $this->renderPartial('_form',array(  
    8.     'model'=>$model,  
    9.     'sub' => $sub,  
    10. ));  
    11. ?>  

    И представление _form:

     

    1. <div class="form">  
    2.     <?php $form=$this->beginWidget('CActiveForm'array(  
    3.         'id'=>'category-form',  
    4.         'enableAjaxValidation'=>false,  
    5.     )); ?>  
    6.   
    7.     <p class="note">Поля, отмеченные <span class="required">*</span> являются обязательными.</p>  
    8.   
    9.     <?php echo $form->errorSummary(array($model$sub)); ?>  
    10.   
    11.     <div class="row">  
    12.         <?php echo $form->labelEx($model'model_field1'); ?>  
    13.         <?php echo $form->textField($model'model_field1'); ?>  
    14.         <?php echo $form->error($model'model_field1'); ?>  
    15.     </div>  
    16.    
    17.     <div class="row">  
    18.         <?php echo $form->labelEx($sub'sub_field1'); ?>  
    19.         <?php echo $form->textField($sub'sub_field1'); ?>  
    20.         <?php echo $form->error($sub'sub_field1'); ?>  
    21.     </div>  
    22.   
    23.     <div class="row buttons">  
    24.         <?php echo CHtml::submitButton($model->isNewRecord ? 'Добавить' : 'Сохранить'); ?>  
    25.     </div>  
    26.   
    27. <?php $this->endWidget(); ?>  
    28. </div>  

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