Поля ListMultiple и List в icms2
ЕСТЬ РЕШЕНИЕ
ЗАКРЫТО
#1
20 декабря 2014 в 14:28
Уважаемые разработчики наверно все столкнулись с необходимостью вывода списка чекбоксов — списка множественного выбора, в системе есть поле список и множественный вывод в фильтре — но нет возможности задать несколько значений при добавлении контента, так же в системе есть поле несколько значений — но по какой то причине выключено в списке общих полей, кто нибудь разбирался и нашел решение к данному затруднению?
#2
21 декабря 2014 в 21:39
— есть такая проблем!!!нет возможности задать несколько значений при добавлении контента
надо решить
#3
21 декабря 2014 в 21:43
Жуткая проблема, пока решаем путём создания нескольких подкатегорий, благо нам сделали многоуровневое меню иначе вообще никак не разместить товар.
Сегодня в 17:04
#4
22 декабря 2014 в 09:59
Это надо будет делать, но пока я не придумал как лучше.
Сложность в том, что появляется связь "один ко многим", то есть значения таких полей нужно хранить в отдельных таблицах, количество и параметры которых заранее неизвестны.
Сложность в том, что появляется связь "один ко многим", то есть значения таких полей нужно хранить в отдельных таблицах, количество и параметры которых заранее неизвестны.
#5
22 декабря 2014 в 11:23
r2,
Вам картина виднее, но как вариант можно попробовать так, где то я это видел не помню в какой системе примеительно к инстанту: в базе тип_контента — fields значение values массив из строк впереди можно добавить цифровое значение чтобы сделать привязку к поиску значений и соответствия, в базе тип_контента несколько значений такой же массив из строк куда мы записываем массив при добавлении — совпадения ищем по цифровому значению откинув сибволы после определенного симбвола, например массив в базе тип_контента_поля: 1`значение, 2`значение, 3`значение, при создании записи добавляем симбволы до ` в массив в типе_контента 1(значение 1) 3(значение 3) — при выводе наоборот, при выводе в фильтре делаем сравнение если есть совпадение по одной из искомой выводим запись. Как то так, так же смотрю разные решения…не придумал как лучше
#6
23 декабря 2014 в 08:37
r2, что вы можете сказать про использование такого метода:
он работает, но я не знаю насколько это ресурсоёмко. По моим знаниям ICMS2, этот метод должен сгенерить всего один запрос из переданного массива. Пока со временем напряг, позже выложу своё рабочее решение полностью, но там кроме добавления этого метода в ядро модели надо изменить ещё в контролере валидацию строки на валидацию массива.
как-то так
Возможно уже есть готовое решение, но у меня заработало только с этим.
public function filterMultiIn($field, $value){ $this->filterStart(); foreach($value as $k=>$v){ $v = $this->db->escape($v); $this->filterOr()->filter("locate('{$v}',{$field})>0"); } $this->filterEnd(); return $this; }
как-то так
// public function validate_array_key($array, $value){ // if (!isset($array[$value])) { return ERR_VALIDATE_INVALID; } // return true; // } public function validate_array_key($array, $value){ foreach ($value as $val){ } } else { } return true; }
#7
26 декабря 2014 в 10:57
Как обещал — готовое решение. Добавил новое поле чтоб, не трогать имеющиеся, хотя это по сути копия поля list. Все файлы в папках system/core и system/language надо смержить, остальные просто скопировать. У вас появится дополнительное поле Список с множественным выбором. Введите предустановленные значения и выбирайте, где показывать — в записи и/или в фильтре. При редактировании самой записи выбираете несколько пунктов из доступных. Сейчас выбранные поля в записи выводятся просто через запятую. А в фильтре можно выбрать несколько значений и отфильтровать с их учётом.
#8
26 декабря 2014 в 16:55
Спасибо Loadырь, как всегда выручаете, попробую использовать…
#9
30 декабря 2014 в 01:05
Loadырь, а этот хак для какой версии?
с icms 2.1.2 есть такие отличия
include_once $hook_file; — cmsCore::includeFile($hook_file);
если их вносишь то при добавлении поля белый экран
в model.php управление кешем тоже нужно менять?
с icms 2.1.2 есть такие отличия
include_once $hook_file; — cmsCore::includeFile($hook_file);
если их вносишь то при добавлении поля белый экран
в model.php управление кешем тоже нужно менять?
#10
30 декабря 2014 в 06:19
eoleg, это для версии 2.1.2.
а куда вы их вносите?если их вносишь то при добавлении поля белый экран
#11
5 января 2015 в 19:25
controller.php замените с 659 строчки вот этим
// public function validate_array_key($array, $value){ // if (!isset($array[$value])) { return ERR_VALIDATE_INVALID; } // return true; // } public function validate_array_key($array, $value){ foreach ($value as $val){ } } else { } return true; }
#12
5 января 2015 в 19:30
model.php на 671 вставляйте вот это
public function filterMultiIn($field, $value){ $this->filterStart(); foreach($value as $k=>$v){ $v = $this->db->escape($v); $this->filterOr()->filter("locate('{$v}',{$field})>0"); } $this->filterEnd(); return $this; }
#14
5 января 2015 в 21:49
Рабочий метод, но не по фен-шую, как говорится) Использовать locate и like в таких выборках не поднимается рука из эстетических соображений. Плюс это может давать побочные эффекты (если один вариант списка является вхождением в другой вариант). В общем хочется сделать все более грамотно, хотя и ваш способ имеет право на жизнь.r2, что вы можете сказать про использование такого метода
#15
6 января 2015 в 11:50
r2, полнотекстовый индекс же ну, если без лишней таблицы