Я смог заставить это работать, не завися от javascript. Шаги следующие:
Добавить форму в файл представления
Это позволит значениям флажков, которые являются элементами ввода html, быть отправленными на ваш контроллер.
<?php echo CHtml::beginForm(); ?>
<?php $this->widget('zii.widgets.grid.CGridView', array(
'dataProvider'=>$dataProvider,
'selectableRows' => 2,
'columns' => array(
array(
'id' => 'selectedIds',
'class' => 'CCheckBoxColumn'
),
'id',
'username',
'content',
array(
'name' => 'created',
'value' => '$data->created'
),
),
));
?>
<div>
<?php echo CHtml::submitButton('Approve', array('name' => 'ApproveButton')); ?>
<?php echo CHtml::submitButton('Delete',
array('name' => 'DeleteButton',
'confirm' => 'Are you sure you want to permanently delete these comments?'));
?>
</div>
<?php echo CHtml::endForm(); ?>
Обратите внимание, что передача параметра «Имя» в submitButton позволяет узнать, какая кнопка была нажата в контроллере.
Укажите идентификатор столбца флажка
Раньше у меня было:
'columns' => array(
array(
'class' => 'CCheckBoxColumn'
),
Я изменил это на:
'columns' => array(
array(
'id' => 'selectedIds',
'class' => 'CCheckBoxColumn'
),
Теперь вы можете ссылаться на выбранные строки как на массив через $_POST['selectedIds']
. По умолчанию CCheckBoxColumn
будет использовать первичный ключ элементов вашей модели в представлении сетки (но вы можете изменить это), поэтому selectedIds будет массивом выбранных первичных ключей.
Изменить контроллер для обработки выбранных строк
public function actionApprove()
{
if (isset($_POST['ApproveButton']))
{
if (isset($_POST['selectedIds']))
{
foreach ($_POST['selectedIds'] as $id)
{
$comment = $this->loadModel($id);
$comment->is_published = 1;
$comment->update(array('is_published'));
}
}
}
// similar code for delete button goes here
$criteria = new CDbCriteria();
$criteria->condition = 'is_published = 0';
$criteria->order = 'created DESC';
$dataProvider = new CActiveDataProvider('Comment');
$dataProvider->criteria = $criteria;
$this->render('approve', array(
'dataProvider' => $dataProvider,
));
}
Я использовал эту вики-статью Yii, чтобы найти решение: Работа с CGridView в панели администратора
Не уверен, что это идеальный способ сделать это, но он работает. Я открыт для предложений по улучшению или другим методам.
17.10.2012