Механизм обмена/перемещения записей из таблицы.

[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. Как-то всё печально. Отрисовывается весь сайт в место таблицы, получается матрёшка. :)

Подскажите хоть что-то ) Я уже тут паникую ))

Спасибо что дочитали)