Перекопал документацию и примеры но так и не могу найти КАК сделать.
Обычно описано как выводить НЕСКОЛЬКО таблиц в один грид а у меня задача противоположная ОДНУ таблицу в несколько гридов.
Суть: на странице во вьюхе выводится несколько виджетов GridView использующие ОДНУ таблицу описанную одной моделью (ТАБЛИЦА-1).
Виджеты вывожу в цикле подключая через renderPartial отдельный файлик.
ТАБЛИЦА-1 - справочник источник записей для выбора (использую колонку чекбоксов для выбора нужных записей).
Проблема в том, что модель одна и таже, потому и поля в таблицах грид имеют одинаковые имена и соответственно имя поля получаемое в контроллере привязано к модели таблицы (в формате ИМЯ_МОДЕЛИ[ИМЯ_ПОЛЯ].
В итоге когда например в первой табличке грид я использую фильтр записей (в шапке таблицы ввожу значение) и нажимаю ентер, то на сервер отправляются поля шапки ВСЕХ грид таблиц страницы
и поскольку они имеют одинаковые имена то введенное значение затирается значениями последней таблички грид.
По идее достаточно задавать имя полей для грид с уникальной приставкой для каждой таблички, но грид как я понял автоматом подставляет эту приставку на основе имени модели таблицы источника данных для грид.
Вот и вопрос А КАК управлять этим именем
? или как решить проблему? Не создавать же руками кучу моделей для каждой грид таблички, если их будет много то это тоскливо (((.
Пробовал цеплять приставку (ИД грида) к имени полей но тогда ругается что такого поля нет в модели.
Возможно все банально решается, но как не пойму.
Фрагмент скриптов как все это крутится:
в контроллере обработчик запроса на фильтрацию записей:
/**
* Обновление Grid таблицы после Ajax запроса
*
* @param string $id - ID выбраной записи
* @param string $table - имя выбраной таблицы
*/
public function actionUpdate_grid_ajax()
{
//адрес возврата
//$urlRefer = $_SERVER['HTTP_REFERER'];
$urlRefer = Yii::app()->sesion->getParam('urlRef');
$nameTable = Yii::app()->request->getParam('table');
$nameModelForm = Yii::app()->request->getParam('nameModelForm');
$nameFieldForm = Yii::app()->request->getParam('nameFieldForm');
$idRow = Yii::app()->request->getParam('id');
$idTableGrid = Yii::app()->request->getParam('idGrid');
$ajaxUrl = Yii::app()->request->getParam('ajaxurl');
$arrayRequestCheckBoxes = Yii::app()->request->getParam($idTableGrid);
$arrayCheckBoxes = $arrayRequestCheckBoxes['check_boxes_id'];
//подключение модели ТАБЛИЦЫ
$nameModelTable = strtolower($nameTable);
$nameModelTable = ucfirst($nameModelTable); //имя модели ТАБЛИЦЫ
$modelTable = new $nameModelTable; //модель ТАБЛИЦЫ
//подключение модели ФОРМЫ
$modelForm = new $nameModelForm;
//массив настроек полей ФОРМЫ
$arraySetingsFieldsForm = $modelForm->fieldsSettings();
//подключение модели таблицы источника
$nameTableSource = $arraySetingsFieldsForm[$nameFieldForm]['tableSource'];
$nameModelSource = ucfirst($nameTableSource);
$modelSource = new $nameModelSource;
//массив описания настроек полей таблицы источника
$arraySetingsFieldsTableSource = $modelSource->fieldsSettings();
//массив полученных данных фильтра сортировки записией таблицы источника
$arrayParamRequestModelSource = array();
//формируем условие поиска
$criteriaRowsSource = new CDbCriteria;
//вводим в модель данные фильтра столбцов таблицы Grid
if (is_array($arrayParamRequestModelSource)) {
foreach ($arrayParamRequestModelSource as $nameFieldSource => $valueField) {
if ($valueField != '' && !is_null($valueField)) {
if ( ($arraySetingsFieldsTableSource[$nameFieldSource]['settings']['type'] == TYPE_FIELD_FORM_TEXT)
|| ($arraySetingsFieldsTableSource[$nameFieldSource]['settings']['type'] == TYPE_FIELD_FORM_TEXTAREA)
){
$criteriaRowsSource->compare($nameFieldSource, $valueField, true, 'LIKE');
}
else {
$criteriaRowsSource->compare($nameFieldSource, $valueField);
}
}
}
}
//добавляем условия выбора записей
$listValue = $modelSource->getListSource(
$arraySetingsFieldsForm[$nameFieldForm]['tableValueFilter'], //таблица источник значения
$arraySetingsFieldsForm[$nameFieldForm]['fieldValueFilter'], //поле источник значения
$idRow
); //массив список значений для выбора
$modeSelect = $arraySetingsFieldsForm[$nameFieldForm]['modeSelectFilter'];
//
if ($modeSelect == CODE_ENABLE) {
//селект выбранных
$criteriaRowsSource->addInCondition(FIELD_ID, explode(",", $listValue));
}
else {
//исключение выбранных
$criteriaRowsSource->addNotInCondition(FIELD_ID, explode(",", $listValue));
}
$nameFieldPageCount = 'pageCount_'.$nameFieldForm; //имя поля выбора числа записей в списке
$sessionPageCount = Yii::app()->session->get($nameFieldPageCount);
//выбранные записи из талицы источника
$dataProviderSource = new CActiveDataProvider(
$nameTableSource,
array(
'criteria' => $criteriaRowsSource,
'pagination'=>array(
'pageSize' => (!is_null($sessionPageCount)) ? $sessionPageCount : ConfigSite::$_defPageCount,
),
)
);
//вывод таблицы записей из БД
echo $this->renderPartial('/admintable/_sel_rows_grid',
array(
'arrayData'=>array(
'dataProvider' => $dataProviderSource, //выбранные записи из таблицы источника
'model' => new $modelSource, //модель талицы источника данных
'table' => $modelTable->tableName(), //имя таблицы сохранения записи
'idRow' => $idRow, //ID записи редактируемой в форме
'idTableGrid' => $idTableGrid, //ID Таблицы Grid
'ajaxUrl' => $ajaxUrl, //URL обработчика Ajax обновления Grid
)
)
, false, true
);
}
вызов в основном файле вьюхи (в цикле) файлика: _sel_rows_grid.php
…
//вывод таблицы записей из таблицы БД
echo $this->renderPartial(
'/admintable/_sel_rows_grid',
array(
'arrayData'=>array(
'dataProvider' => $dataProviderSource, //выбранные записи из таблицы источника
'model' => new $modelSource, //модель талицы источника данных
'table' => $modelTable->tableName(), //имя таблицы сохранения записи
'idRow' => $modelForm->id, //ID записи в таблице сохранения записи
'idTableGrid' => $idTableGrid, //ID Таблицы Grid
'ajaxUrl' => $ajaxUrl, //URL обработчика Ajax обновления Grid
)
)
);
…
Подключаемый файлик: _sel_rows_grid.php
<?php
/**
* Шаблон таблицы выбора записей в формате Grid таблицы
*
*/
//Входные данные:
$arrayData = $arrayData; //массив входных данных
$model = $arrayData['model']; //модель текущей талицы
$dataProvider = $arrayData['dataProvider']; //выбранные записи из таблицы текущей моделис учетом фильтра
$idTableGrid = $arrayData['idTableGrid']; //ID Таблицы Grid
$tableSave = $arrayData['table']; //имя таблицы сохранения записи
$idRowTableSave = $arrayData['idRow']; ////ID записи в таблице сохранения записи
$ajaxUrl = $arrayData['ajaxUrl']; //URL обработчика Ajax обновления Grid
$arraySettingsTable = $model->tableSettings(); //массив описания настроек текущей таблицы
$nameTable = $arraySettingsTable['name']; //имя таблицы в БД
//массив описания настроек полей таблицы
$arraySetingsFields = $model->fieldsSettings();
//массив список порядка отображения полей
$arrayNameFieldView = ($arraySettingsTable['settings']['select']['fields'] != '') ? $arraySettingsTable['settings']['select']['fields'] : array();
//формирование массива списка отображаемых полей таблицы с учетом порядка отображения
if (count($arrayNameFieldView) == 0) {
foreach ($arraySetingsFields as $nameField => $arrayParamField)
{
$arrayNameFieldView[] = $nameField;
}
}
//СКРИПТ управления активации Датапикера (при ОБНОВЛЕНИИ СТРАНИЦЫ)
$datePickerUpdate = NULL;
//формирование массива описания полей для таблицы Grid
$arrayColumnsTable = array();
//добавляем колонку поля чекбокса
$arrayColumnsTable[] = array(
'id'=>$idTableGrid.'_check_boxes',
'checked'=>"0", //значение по умолчанию (0-не помечена)
'class'=>'CCheckBoxColumn', //используем стандартные CCheckBoxColumn элементы Yii
'selectableRows' => 2, // из какого по счету столбца брать значения для поля value
'checkBoxHtmlOptions' => array('class' => 'checkclass', 'name'=>$idTableGrid.'[check_boxes_id][]'),
'htmlOptions'=>array('class'=>'group-checkbox-column'),
);
?>
<?php
//перебор имен полей для колонок таблицы
foreach ($arrayNameFieldView as $key => $nameField) {
//массив настроек текущего поля таблицы
$arrayParamField = $arraySetingsFields[$nameField];
//общие пераметры для всех полей
$arrayParamColumnsTable = array(
'name' => $arrayParamField['name'], //имя поля в таблице БД
'header' => $arrayParamField['label'], //имя Колонки для поля
//поле фильтра
'filter' => $model->$nameField,//'', // оставляем фильтр по УМОЛЧАНИЮ пустым
'htmlOptions' => $arrayParamField['settings']['htmlOtions'], //HTML опции форматироывания поля по умолчанию
);
//вывод для поля типа 'select'
if ( $arrayParamField['settings']['type'] == 'select') {
//замена отображаемого значения Название значения вместо ID значения для полей содержащих ID записи из справочника
$arrayParamColumnsTable['value'] = '$data->convert_IdValue("'.$arrayParamField["settings"]["table"].'", "title", "$data->'.$arrayParamField['name'].'")';
// генерируем фильтр просто подставив обычный массив состоящий из пар ID=>наименование
// ВАЖНО!!! код не нужно указывать в кавычках как в value!!!!
$arrayParamColumnsTable['filter'] = $arrayParamField['settings']['listData'];
}
//вывод для поля типа 'data'
if ( $arrayParamField['settings']['type'] == TYPE_FIELD_FORM_DATE) {
// + не забудьте указать в своих скриптах код afterAjaxUpdate для работы фильтра даты
$arrayParamColumnsTable['filter'] = $this->widget(
'zii.widgets.jui.CJuiDatePicker',
array(
'model' => $model,
'attribute' => $nameField,
'language' => 'ru',
'options' => array(
'showAnim' => 'fold',
'dateFormat' => 'yy-mm-dd',
'changeMonth' => 'true',
'changeYear' => 'true',
'showButtonPanel' => 'true',
),
'htmlOptions' => array(
'id' => $nameField,
'size' => '10',
),
),
true
);
$datePickerUpdate = "function() {
jQuery('#".$nameField."').datepicker(
jQuery.extend(
jQuery.datepicker.regional['ru'], {
'showAnim':'fold',
'dateFormat':'yy-mm-dd',
'changeMonth':'true',
'showButtonPanel':'true',
'changeYear':'true'
}
)
);
}";
}
//вывод для поля типа 'datetime'
if ( $arrayParamField['settings']['type'] == TYPE_FIELD_FORM_DATETIME) {
$arrayParamColumnsTable['filter'] = '';
}
//вывод для поля СТАТУС
if ($arrayParamField['name'] == 'status_id') {
$arrayParamColumnsTable['class'] = "ext.Status_id"; //обработчик значения поля
}
//сохраняем итоговый блок описания столбца таблицы
$arrayColumnsTable[] = $arrayParamColumnsTable;
}
//массив описания настроек кнопок
$arrayButtons = array();
//массив списка шаблонов используемых кнопок
$template = array();
//массив описания кнопок управления записью
$arraySettingsButtonRow = array(
'info' => array(
'label'=>'просмотреть',
'imageUrl'=>ICON_VIEW_32,
'options'=>array('style'=>"margin-left:5px;", 'title'=>'Просмотреть запись'),
'url'=>'Yii::app()->createUrl("admintable/table_view/table/$data->code")',
),
);
if (is_array($arraySettingsButtonRow) && (count($arraySettingsButtonRow)>0) ){
//формируем массив описания кнопок для Grid
foreach ($arraySettingsButtonRow as $codeButton => $arrayParamButton) {
if ( !isset($arraySettingsTable['settings'][$codeButton]['status'])
|| ((isset($arraySettingsTable['settings'][$codeButton]['status']))
&& ($arraySettingsTable['settings'][$codeButton]['status'] == TRUE)
)){
$arrayButtons[$codeButton] = $arrayParamButton;
$template[] = $codeButton;
}
}
//формирование строки списка шаблонов кнопок
$templateList = '';
foreach ($template as $key => $val) {
$templateList .= '{'.$val.'}';
}
//Кнопки управления записью
$arrayColumnsTable[] = array(
'class' => 'CButtonColumn',
'header' => 'Управление',//наименование колонки
'htmlOptions' => array('style'=>'text-align: center; width:150px;' ),
'template' => $templateList, //строка список шаблонов кнопок
'buttons' => $arrayButtons,
);
}
//Дополнительная Настройка офрмления полей отображаемой таблицы
if(isset($arrayColumnsTable['id'])) {
//замена настроек по умолчанию
$arrayColumnsTable['id']['htmlOptions'] = array('style'=>'text-align: center; width:50px; font-weight: bold; font-size: 18px;');
}
//вывод таблицы записей из БД
$this->widget('zii.widgets.grid.CGridView',
array(
'id' => $idTableGrid,
//обновление таблицы после Ajax запроса
'ajaxUpdate' => true,
//URL обработчика запроса обновления таблицы (полсе фильтрации)
'ajaxUrl' => array($ajaxUrl),
// источник данных
'dataProvider' => $dataProvider,
// фильтр
'filter' => $model,
//Устанавливаем позицию фильтра
'filterPosition' => 'body', //под названием столбца
// текст описывающий общее количество элементов и количество элементов на текущей странице пагинатора
'summaryText' => "Записи {start}—{end} из {count}",
// текст выводимый при отсутствии записей в БД или когда все записи не удовлетворяют значениям фильтров
'emptyText' => 'Записи не найдены',
// заголовок пагинатора
'pager'=>array(
'header'=>'Навигация: '
),
// при каждом обновлении запускаем jQuery скрипт для датапикера
'afterAjaxUpdate' => $datePickerUpdate,
//массив описания и настроек столбцов, которые должны выводиться
'columns' => $arrayColumnsTable,
)
);