[b]Здравствуйте!
Задача: [/b]
Есть некий массив с данными, отправитель, назовём его "материалы".
Есть массив-приемник, назовём его "сотрудник".
Нужно организовать диалог передачи материала сотруднику и от сотрудника на склад материалов (обратно в массив материалов).
Данные:
База данных у меня на LDAP, все данные передаются/обрабатываются через массивы/обработку массивов.
Что сделано:
Я реализовал этот диалог с помощью двух CGridView. Сначала формирую данные в кеш, затем через CArrayDataProvider строю таблицы. Создал дополнительную кнопку в ButtonsColumn, которая выполняет определенный экшн. У каждой таблицы своя кнопка, первая убирает элемент из (верхней) таблицы, вторая возвращает элемент (из нижней в верхнюю). В общем так можно манипулировать данными сколько угодно, при перемещении данные добавляются в кеш и перерисовывается страница с таблицами.(Собственно это уже первый минус) По кнопке сабмит я отправляю форму, перебираю по определённому правилу кеш и сохраняю данные в LDAP.
Что хотелось бы:
А хотелось бы конечно большего )
Почему бы не перерисовывать CGridView независимо, c помощью AJAX. Структура кода, которую я насочинял затрудняет перенос этого компонента на другие схожие задачи. Хочется что бы при перемещении элемента и последующей перерисовки таблицы пользователь попадал не на самую первую страницу (как у меня сейчас), а на ту, на которой он находился во время выполнения действия.
Ниже приведу код…
Это основной акшн. Контроллер у него materials.
public function actionTransferMaterial(){
if (isset($_POST['TransferMaterialForm'])){ $this->redirect(array('materials/finishtransfer'));} //сохраняемся
$model=new TransferMaterialForm(); //не понятно зачем создаём модель
$cache=Yii::app()->cache;
if (!isset($cache['materials'])){ //берём данные из базы в кеш только один раз
$tmp_z = Yii::app()->db->z_ldap_list($cache['fromdn']); //поиск в LDAP
$tmp=NULL;
$tmp_sub=NULL;
for ($i=0;$i<$tmp_z['count'];$i++){
$tmp_sub['id']=$i;
$tmp_sub['dn']=$tmp_z[$i]['dn'];
$tmp_sub['desc']=$tmp_z[$i]['description'][0];
$tmp_sub['oprice']=$tmp_z[$i]['outprice'][0];
$tmp[]=$tmp_sub;
}
$cache['materials'] = $tmp;
}
if (!isset($cache['materials_dest'])){ // просто пустой массив далее объясню почему
$cache['materials_dest'] = array();
}
//создаём провайдеров для таблиц
$dataProvider1 = new CArrayDataProvider($cache['materials'], array('pagination'=>array('pageSize'=>5)));
$dataProvider2 = new CArrayDataProvider($cache['materials_dest'], array('pagination'=>array('pageSize'=>5)));
//отрисовываем вьюху
$this->render('SelectMaterialStep',array('model'=>$model, 'dataProvider1' => $dataProvider1, 'dataProvider2' => $dataProvider2));
}
Вьюшка выполняемая предыдущим акшеном (SelectMaterialStep.php)
<?php echo CHtml::beginForm(); ?>
<?php echo CHtml::errorSummary($model); ?>
<br>
Выбор маршрута перемещения материала >> <b>[Выбор материала]</b>
<br>
<table width=100%>
<tr>
<td style="width:150px"><?php echo '<b>Материалы у источника:</b>'.''; ?></td>
</tr>
</table>
<?php $this->renderPartial('_selectgrid', array('dataProvider'=>$dataProvider1, 'mode'=>'1', )); ?> //mode тут определяет какую их кнопок отображать
<br>
<table width=100%>
<tr>
<td style="width:150px"><?php echo '<b>Материалы у сотрудника:</b>'; ?></td>
</tr>
</table>
<?php $this->renderPartial('_selectgrid', array('dataProvider'=>$dataProvider2, 'mode'=>'0', )); ?> //не знаю зачем тут renderPartial использую.
<?php ?>
<center>
<br>
<?php echo chtml::submitButton('Сохранить',array('class'=>'bt','style'=>'width:90px;')); ?>
</center>
<?php echo CHtml::endForm(); ?>
Вьющка с самим виджетом (_selectGrid.php)
<?php
$this->widget('zii.widgets.grid.CGridView', array(
//'id'=>'selectgrid',
'dataProvider'=>$dataProvider,
'selectableRows'=>0, //Выделение строк (0,1,2)
'cssFile'=>false,
'enablePagination'=>true,
'ajaxUpdate'=>true,
//------------- колонки
'columns'=>array(
array(
'class'=>'CDataColumn',
'header'=>'Материал',
'name'=>'desc',
),
array(
'class'=>'CDataColumn',
'header'=>'Цена',
'name'=>'oprice',
'htmlOptions' => array('style' => 'text-align: center; width: 20%;'),
),
///-----кнопки
array(
'class'=>'CButtonColumn',
'template'=>'{add}{rem}',
'header'=>'Добавить',
'buttons'=>array(
'add' => array(
'label' => 'Передать материал',
'imageUrl' => Yii::app()->baseUrl.'/w_comty/images/add2.png',
'visible' => $mode, //тут либо показываем кнопку либо не показываем на своё усмотрение
// экшн который орабатывает нажатие кнопки
'url'=> 'Yii::app()->createUrl("/materials/transferto", array("id"=>$data["id"]))',
),
'rem' => array(
'label' => 'Вернуть материал',
'imageUrl' => Yii::app()->baseUrl.'/w_comty/images/rem1.png',
'visible' => '!'.$mode,
'url'=> 'Yii::app()->createUrl("/materials/transferback", array("id"=>$data["id"]))',
),
),
),
),
));
?>
акшены обработки действий пользователя
1 перемещение сотруднику
public function actionTransferTo($id=0){
$cache=Yii::app()->cache;
$tmp1 = $cache['materials_dest'];
$tmp1[] = $cache['materials'][$id];
end($tmp1); $key=key($tmp1);
$tmp1[$key]['id']=$key;
$cache['materials_dest'] = $tmp1;
$tmp2 = $cache['materials'];
unset($tmp2[$id]);
$cache['materials'] = $tmp2;
$this->redirect(array('materials/transfermaterial'));
}
2 перемещение от сотрудника
public function actionTransferBack($id=0){
$cache=Yii::app()->cache;
$tmp1 = $cache['materials'];
$tmp1[] = $cache['materials_dest'][$id];
end($tmp1); $key=key($tmp1);
$tmp1[$key]['id']=$key;
$cache['materials'] = $tmp1;
$tmp2 = $cache['materials_dest'];
unset($tmp2[$id]);
$cache['materials_dest'] = $tmp2;
$this->redirect(array('materials/transfermaterial'));
}
Пожалуйста подскажите в какую сторону копать чтобы по нажатию кнопки у меня перерисовывались только таблицы а не вся страница.
Есть статья тут. К сожалению пока что плохо понимаю по-английски. Вроде в конце этого топика все счастливы)) Но я точно не понимаю что они там делают. Да еще вводит в заблуждение использование Модели данных
public function actionAjaxUpdate($id)
{
$model=$this->loadModel($id);
$model->enabled = (!$model->enabled);
$model->update();
}
У меня нет ничего подобного.
Только начал изучать jQuery (первая глава прочитана) по этому посты вроде этого для меня очень не информативны.
Пробовал менять кнопки на AjaxButton/ajaxLink. Как-то всё печально. Отрисовывается весь сайт в место таблицы, получается матрёшка. 
Подскажите хоть что-то ) Я уже тут паникую ))
Спасибо что дочитали)