Вывода списка с мультивыбором в фильтре
Как сделать вывод в фильтре не чекбоксами, а обычным списком
Вопрос к знатокам: Как сделать вывод списка с мультивыбором в фильтре в виде обычного списка <select> а не чекбоксов.
Если просто в наглую заменить заменить функции в system/fields/listmultiple на те что содержаться в просто system/fields/list, то по этому полю фильтр работать перестает.
Если просто поменять все такие списки в нужный вам вид, то достаточно внести правки в файл \system\libs\html.helper.php строка где-то 551
Что касается вывода только в фильтре, то лучше сделать копию поля listmultiple с нужным видом и в нужных типах контента установить тип этого поля вместо стандартного.
А можете немного подробнее пояснить?
Простой заменой одного файла на другой ничего не выйдет.
Если просто поменять все такие списки в нужный вам вид, то достаточно внести правки в файл \system\libs\html.helper.php строка где-то 551
или поправить файл вашего шаблона templates\вашшаблон\assets\fields\listmultiple.tpl.php где вместо
вставить свою похожую функцию или код самого селекта.
Что касается вывода только в фильтре, то лучше сделать копию поля listmultiple с нужным видом и в нужных типах контента установить тип этого поля вместо стандартного.
Файл шаблона как я понимаю отвечает за вывод в момент создания\изменения записи. А вот в фильтр это поле выводится на основе соответствующего файла из system/fields:
return html_select_multiple($this->name, $items, $value);
return html_list_multiple($this->name, $items, $value);
$attr_str = html_attr_str($attributes); $html = '<select name="'.$name.'" '.$attr_str.'>'."\n".'<option></option>'."\n"; foreach ($items as $value=>$title){ if ($selected == $value) { $sel = 'selected'; } else { $sel = ''; } $html .= "\t" . '<option value="'.htmlspecialchars($value).'" '.$sel.'>'.htmlspecialchars($title).'</option>' . "\n"; } $html .= '</select>'."\n"; return $html; }
В вашем html_list_multiple я не увидел слова multiple, ни в коде, ни в передаваемых атрибутах. Возможно с этим связана его неработоспособность.
Iceman, за вывод в фильтре по моему отвечает функция — public function getFilterInput($value) в файлах \system\fields\list.php и \system\fields\listbitmask.php (второй вроде за мультиселект отвечает).
В вашем html_list_multiple я не увидел слова multiple, ни в коде, ни в передаваемых атрибутах. Возможно с этим связана его неработоспособность.
Насколько смог понять я, именно getFilterInput($value) в указанных Вами файлах и отвечает за вывод, а applyFilter($model, $value) собственно за обработку фильтра. В новом поле вне зависимости от того в какой вид я его привожу (как в listbitmask.php или как в list.php) фильтр работать отказывается.
С multiple я знаком, в html_list_multiple его нет потому, что мне нужен в фильтре простой список, с единственным возможным вариант выбора, возможность выбора нескольких значений нужна только в момент создания/изменения записи. В любом случае установка этого атрибута картину все равно не меняет, фильтр по этому полю работать не начинает.
в system/fields/selectmulti.php:
<?php class fieldSelectMulti extends cmsFormField { public $title = "Select Multiple"; public $sql = 'varchar(64) NULL DEFAULT NULL'; public $allow_index = true; public $filter_type = 'str'; public function getFilterInput($value) { $items = $this->getListItems(); return html_list_multiple($this->name, $items, $value); } public function getRules() { if($this->item){ } return $this->rules; } public function parse($value){ if (!$value) { return LANG_NO; } $items = $this->getListItems(); $html = ''; if ($items) { $pos = 0; $html .= '<ul>'; foreach($items as $key => $item){ } $pos++; } $html .= '</ul>'; } return $html; } public function getListItems(){ $items = $this->items; $generator = $this->generator; $items = $generator($this->item); } else if ($this->hasDefaultValue()) { $items = $this->parseListItems($this->getDefaultValue()); } return $items; } public function parseListItems($string){ return string_explode_list($string); } public function parseValue($values){ if (!$values) { return false; } $items = $this->getListItems(); $value = ''; if ($items){ foreach($items as $key => $title){ } } return $value; } public function store($value, $is_submitted, $old_value=null){ $value = $this->parseValue($value); return ""; } return $value; } public function applyFilter($model, $values) { $filter = $this->parseValue($values); $model->filterLike($this->name, $filter); return $model; } }
<?php if ($field->title) { ?><label for="<?php echo $field->id; ?>"><?php echo $field->title; ?></label><?php } ?> <?php $users_model = cmsCore::getModel('users'); $items = $field->getListItems(); if ($value) { $pos = 0; foreach($items as $key => $title){ $selected[] = $key; } $pos++; } } else { $selected = $value; } }
И в libs/html.helper.php:
$attr_str = html_attr_str($attributes); $html = '<select multiple name="'.$name.'" '.$attr_str.'>'."\n".'<option></option>'."\n"; foreach ($items as $value=>$title){ if ($selected == $value) { $sel = 'selected'; } else { $sel = ''; } $html .= "\t" . '<option value="'.htmlspecialchars($value).'" '.$sel.'>'.htmlspecialchars($title).'</option>' . "\n"; } $html .= '</select>'."\n"; return $html; }
Iceman, я бы избавился от кода который в libs/html.helper.php и перенёс его в файл поля. Это избавит вас от рутины при обновлении движка и этого файла. В итоге у вас получится свой тип поля независимый от изменения файлов движка.
С этим согласен, перенесу. Но все же главный вопрос остался не решенным, как сделать, что бы это поле функционировало, куда копать? :)
public function applyFilter($model, $value) { $model->filterEqual($this->name, $value); return $model; }
public function applyFilter($model, $value) { $model->filterLike($this->name, $value); return $model; }
Или лыжи плох едут или даже не знаю😊
Попробовал заменить на написанное Вами, но все равно фильтр не работает, ничего не возвращает. Сейчас поле выглядит так (заменил дополнительно getFilterInput что бы нормально выводилось после применения фильтра и перенес в него функцию html_list_multiple):
<?php class fieldSelectMulti extends cmsFormField { public $title = "Select Multiple"; public $sql = 'varchar(64) NULL DEFAULT NULL'; public $allow_index = true; public $filter_type = 'str'; $attr_str = html_attr_str($attributes); $html = '<select name="'.$name.'" '.$attr_str.'>'."\n"; foreach ($items as $value=>$title){ if ($selected == $value) { $sel = 'selected'; } else { $sel = ''; } $html .= "\t" . '<option value="'.htmlspecialchars($value).'" '.$sel.'>'.htmlspecialchars($title).'</option>' . "\n"; } $html .= '</select>'."\n"; return $html; } public function getFilterInput($value) { $items = $this->getListItems(); return $this->html_list_multiple($this->name, $items, $value); } public function getRules() { if($this->item){ } return $this->rules; } public function parse($value){ if (!$value) { return LANG_NO; } $items = $this->getListItems(); $html = ''; if ($items) { $pos = 0; $html .= '<ul>'; foreach($items as $key => $item){ } $pos++; } $html .= '</ul>'; } return $html; } public function getListItems(){ $items = $this->items; $generator = $this->generator; $items = $generator($this->item); } else if ($this->hasDefaultValue()) { $items = $this->parseListItems($this->getDefaultValue()); } return $items; } public function parseListItems($string){ return string_explode_list($string); } public function parseValue($values){ if (!$values) { return false; } $items = $this->getListItems(); $value = ''; if ($items){ foreach($items as $key => $title){ } } return $value; } public function store($value, $is_submitted, $old_value=null){ $value = $this->parseValue($value); return ""; } return $value; } public function applyFilter($model, $value) { $model->filterLike($this->name, $value); return $model; } }
А если попробовать не трогать движок, а поменять шаблон вывода чекбоксов — стилизовать его под селект? Например как здесь: http://stackoverflow.com/questions/17714705/how-to-use-checkbox-inside-select-option При желании и галочки можно скрыть, но с ними, IMHO, юзабельнее)))Приветствую.
Вопрос к знатокам: Как сделать вывод списка с мультивыбором в фильтре в виде обычного списка <select> а не чекбоксов.
Если просто в наглую заменить заменить функции в system/fields/listmultiple на те что содержаться в просто system/fields/list, то по этому полю фильтр работать перестает.
Jestik, Есть подозрение, что в самом фильтре заложена обработка checked состояния чекбоксов и selected списка банально не обрабатывается, хотя на первый взгляд не нашел такого в функции фильтра в model.php.