Я пытаюсь добавить в один столбец CGridView фильтр с расширением select2 после этого ответа, но не работает.
Мой код:
В виду vehicleulos / admin.php
<?php $this->widget('zii.widgets.grid.CGridView', array( 'id'=>'vehiculos-grid', 'dataProvider'=>$model->search(), 'filter'=>$model, 'columns'=>array( 'id', 'placa', array( 'name'=>'asociado_id', 'value'=>'Vehiculos::model()->getListNombreCompleto()', 'type'=>'html', ), 'modelo', 'color', array( 'class'=>'CButtonColumn', ), )));
В модели vehicleulos.php
public function getListNombreCompleto() { $nombreCompleto = Contactos::model()->findAll(); $data = array(); foreach ($nombreCompleto as $contacto) { $data[$contacto->id] = $contacto->nombre; } $this->widget('ext.select2.ESelect2',array( 'name'=>'asociado_id', 'data'=>$data, 'htmlOptions'=>array( ), )); }
Ошибка отображения CException:
Vehiculos and its behaviors do not have a method or closure named "widget".
Нет необходимости извлекать виджет из метода контроллера
В столбце gridview
array( 'name'=>'asociado_id', 'value'=>'Vehiculos::model()->getListNombreCompleto()', 'filter' => $this->widget('ext.select2.ESelect2',array( 'name'=>'asociado_id', 'data'=>$select2_options, ), true) ),
Я создал класс, расширяющий CDataColumn, чтобы добавить фильтр в столбец:
Yii::import('zii.widgets.grid.CDataColumn'); class TbTableDeviceType extends CDataColumn { public $model; public $fieldName; public function init() { $ajaxUpdate = $this->grid->afterAjaxUpdate; $this->grid->afterAjaxUpdate = "function(id,data){'.$ajaxUpdate.' $('#" . get_class($this->model) . "_" . $this->fieldName . "').select2({placeholder:' ', allowClear: true}); }"; } /** * Renders the filter cell. */ public function renderFilterCell() { echo '<td><div class="filter-container">'; $deviceTypes = Helper::getDeviceTypesArray(); $deviceTypes[''] = ''; // Translate::t('globals', '-- all --'); asort($deviceTypes); $this->filter = $deviceTypes; $model = $this->model; $field = $this->fieldName; if (empty($model->$field)) echo CHtml::dropDownList(get_class($this->model) . '[' . $this- >fieldName . ']', $this->fieldName, $deviceTypes); else echo CHtml::dropDownList(get_class($this->model) . '[' . $this->fieldName . ']', $this->fieldName, $deviceTypes, array( 'options' => array( $model->$field => array( 'selected' => true ) ) )); Yii::app()->controller->widget('ext.ESelect2.ESelect2', array( 'selector' => '#' . get_class($this->model) . '_' . $this- >fieldName, 'data' => $deviceTypes, 'options' => array( 'placeholder' => ' ', 'allowClear' => true ), 'htmlOptions' => array( 'minimumInputLength' => 2, 'style' => 'width:100%' ) )); echo '</div></td>'; } }
И затем вы добавляете этот столбец в свой cgridview:
array( 'class' => 'ext.widgets.TbTableDeviceType', 'model' => $model, 'fieldName' => 'deviceType_id', 'name' => 'deviceType_id', ),