Выделение чекбоксов в CGridView

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
Elfer
Сообщения: 132
Зарегистрирован: 2012.06.07, 16:09
Откуда: Беларусь, Лида
Контактная информация:

Выделение чекбоксов в CGridView

Сообщение Elfer »

В параметрах CGridView есть свойство selectableRows. Оно влияет на возможность выделять чекбоксы и на лимит кол-ва выделяемых чекбоксов. При нажатии на любую область таблицы - отмечается чекбокс в данной строке.
Передо мной стоит задача: выделять чекбоксы только при непосредственном нажатии на сами чекбоксы. Если нажимаем не на чекбокс - чекбоксы не должны срабатывать.
I need help!
Последний раз редактировалось Elfer 2017.11.28, 09:34, всего редактировалось 1 раз.
Приколы: юмор, анекдоты - Zasmeshi.Ru сайт на Yii, великие возможности фреймворка.
Аватара пользователя
Elfer
Сообщения: 132
Зарегистрирован: 2012.06.07, 16:09
Откуда: Беларусь, Лида
Контактная информация:

Re: Dыделение чекбоксов в CGridView

Сообщение Elfer »

Никто не сталкивался с этим? Глухо, ни одного ответа в теме.
Приколы: юмор, анекдоты - Zasmeshi.Ru сайт на Yii, великие возможности фреймворка.
Аватара пользователя
Elfer
Сообщения: 132
Зарегистрирован: 2012.06.07, 16:09
Откуда: Беларусь, Лида
Контактная информация:

Re: Выделение чекбоксов в CGridView

Сообщение Elfer »

Потому что нелогично, когда в строке есть ссылка (target="_blank") на какую-то страницу с данными, мы нажимаем на неё, включается чекбокс и открывается другая страница. Можно таким образом ненароком выделить совсем не те строки и затем удалить их.
Приколы: юмор, анекдоты - Zasmeshi.Ru сайт на Yii, великие возможности фреймворка.
Аватара пользователя
Elfer
Сообщения: 132
Зарегистрирован: 2012.06.07, 16:09
Откуда: Беларусь, Лида
Контактная информация:

Re: Выделение чекбоксов в CGridView

Сообщение Elfer »

Задачу решил.
В js-скрипте "jquery.yiigridview.js", который подключается к виджету CGridView нашёл строки:

Код: Выделить всё

$(document).on('click.yiiGridView', '#' + id + ' .' + settings.tableClass + ' > tbody > tr', function (e) {
	var $currentGrid, $row, isRowSelected, $checks, $target = $(e.target);
	if ($target.closest('td').is('.empty,.button-column') || (e.target.type === 'checkbox' && !$target.hasClass('select-on-check'))) {
		return;
	}
	...
});
Эти строки отвечают за отмену клика по ячейкам. Если у них css-классы "empty" или "button-column", то по нажатию на такую ячейку чекбокс не будет активирован. Как вариант, можно во вьюхе при объявлении ячеек виджета CGridView добавлять свойство ['htmlOptions']['class'=>'empty'].

Код: Выделить всё

'columns' => [
	[
		'name' => 'name',
		'htmlOptions' => [
			'class' => 'empty',
		]
	],
	...
]
Но т.к. колонок может быть много и могу просто напросто забыть это указать, да и гридов много на сайте накпоилось, то оптимальнее будет просто расширить класс CCheckBoxColumn и добавить одну надстройку.
В папку "protected/components" положил файл "CheckBoxColumn.php":

Код: Выделить всё

<?
Yii::import('zii.widgets.grid.CCheckBoxColumn');

class CheckBoxColumn extends CCheckBoxColumn {
	// Variants: all, checkbox, not_link 
	public $clickable = 'checkbox';
	
	public function init() {
		if ($this->clickable != 'all') {
			echo '<script>$(document).ready(function() {';
				
			if ($this->clickable == 'checkbox') {
				echo '$("#'.$this->grid->id.' .items > tbody > tr > td").not(".checkbox-column").addClass("empty");';
			} elseif ($this->clickable == 'not_link') {
				echo '$("#'.$this->grid->id.' .items > tbody > tr > td").not(".checkbox-column").find("a").closest("td").addClass("empty");';
			}
			
			echo '});</script>';
		}
		
		parent::init();
	}
}
?>
В нем я добавил свойство "clickable". Имеет 3 режима:
- all - это как обычно работает, т.е. по клику в любом месте строки выделяется активируется чекбокс
- checkbox - только по клику на чекбокс либо ячейки, в которой он находится
- not_link - ячейки, которые имеют ссылки, не участвуют в активации чекбокса.

Во вьюхе в параметре columns указываем новый класс и новое свойство:

Код: Выделить всё

'columns' => [
	[
		'class'	=> 'CheckBoxColumn',
		'clickable' => 'not_link',
	],
Приколы: юмор, анекдоты - Zasmeshi.Ru сайт на Yii, великие возможности фреймворка.
Ответить