В параметрах CGridView есть свойство selectableRows. Оно влияет на возможность выделять чекбоксы и на лимит кол-ва выделяемых чекбоксов. При нажатии на любую область таблицы - отмечается чекбокс в данной строке.
Передо мной стоит задача: выделять чекбоксы только при непосредственном нажатии на сами чекбоксы. Если нажимаем не на чекбокс - чекбоксы не должны срабатывать.
I need help!
Выделение чекбоксов в CGridView
- Elfer
- Сообщения: 132
- Зарегистрирован: 2012.06.07, 16:09
- Откуда: Беларусь, Лида
- Контактная информация:
Выделение чекбоксов в CGridView
Последний раз редактировалось Elfer 2017.11.28, 09:34, всего редактировалось 1 раз.
Приколы: юмор, анекдоты - Zasmeshi.Ru сайт на Yii, великие возможности фреймворка.
- Elfer
- Сообщения: 132
- Зарегистрирован: 2012.06.07, 16:09
- Откуда: Беларусь, Лида
- Контактная информация:
Re: Dыделение чекбоксов в CGridView
Никто не сталкивался с этим? Глухо, ни одного ответа в теме.
Приколы: юмор, анекдоты - Zasmeshi.Ru сайт на Yii, великие возможности фреймворка.
- Elfer
- Сообщения: 132
- Зарегистрирован: 2012.06.07, 16:09
- Откуда: Беларусь, Лида
- Контактная информация:
Re: Выделение чекбоксов в CGridView
Потому что нелогично, когда в строке есть ссылка (target="_blank") на какую-то страницу с данными, мы нажимаем на неё, включается чекбокс и открывается другая страница. Можно таким образом ненароком выделить совсем не те строки и затем удалить их.
Приколы: юмор, анекдоты - Zasmeshi.Ru сайт на Yii, великие возможности фреймворка.
- Elfer
- Сообщения: 132
- Зарегистрирован: 2012.06.07, 16:09
- Откуда: Беларусь, Лида
- Контактная информация:
Re: Выделение чекбоксов в CGridView
Задачу решил.
В js-скрипте "jquery.yiigridview.js", который подключается к виджету CGridView нашёл строки:
Эти строки отвечают за отмену клика по ячейкам. Если у них css-классы "empty" или "button-column", то по нажатию на такую ячейку чекбокс не будет активирован. Как вариант, можно во вьюхе при объявлении ячеек виджета CGridView добавлять свойство ['htmlOptions']['class'=>'empty'].
Но т.к. колонок может быть много и могу просто напросто забыть это указать, да и гридов много на сайте накпоилось, то оптимальнее будет просто расширить класс CCheckBoxColumn и добавить одну надстройку.
В папку "protected/components" положил файл "CheckBoxColumn.php":
В нем я добавил свойство "clickable". Имеет 3 режима:
- all - это как обычно работает, т.е. по клику в любом месте строки выделяется активируется чекбокс
- checkbox - только по клику на чекбокс либо ячейки, в которой он находится
- not_link - ячейки, которые имеют ссылки, не участвуют в активации чекбокса.
Во вьюхе в параметре columns указываем новый класс и новое свойство:
В 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;
}
...
});
Код: Выделить всё
'columns' => [
[
'name' => 'name',
'htmlOptions' => [
'class' => 'empty',
]
],
...
]
В папку "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();
}
}
?>
- all - это как обычно работает, т.е. по клику в любом месте строки выделяется активируется чекбокс
- checkbox - только по клику на чекбокс либо ячейки, в которой он находится
- not_link - ячейки, которые имеют ссылки, не участвуют в активации чекбокса.
Во вьюхе в параметре columns указываем новый класс и новое свойство:
Код: Выделить всё
'columns' => [
[
'class' => 'CheckBoxColumn',
'clickable' => 'not_link',
],
Приколы: юмор, анекдоты - Zasmeshi.Ru сайт на Yii, великие возможности фреймворка.