Поля ListMultiple и List в icms2

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО
#1 20 декабря 2014 в 14:28
Уважаемые разработчики наверно все столкнулись с необходимостью вывода списка чекбоксов — списка множественного выбора, в системе есть поле список и множественный вывод в фильтре — но нет возможности задать несколько значений при добавлении контента, так же в системе есть поле несколько значений — но по какой то причине выключено в списке общих полей, кто нибудь разбирался и нашел решение к данному затруднению?
#2 21 декабря 2014 в 21:39

нет возможности задать несколько значений при добавлении контента

jorgovich
— есть такая проблем!!!
надо решить
#3 21 декабря 2014 в 21:43
Жуткая проблема, пока решаем путём создания нескольких подкатегорий, благо нам сделали многоуровневое меню иначе вообще никак не разместить товар.
#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, что вы можете сказать про использование такого метода:
  1.  
  2. public function filterMultiIn($field, $value){
  3. if (!strstr($field, '.')){ $field = 'i.' . $field; }
  4.  
  5. $this->filterStart();
  6. foreach($value as $k=>$v){
  7. $v = $this->db->escape($v);
  8. $this->filterOr()->filter("locate('{$v}',{$field})>0");
  9. }
  10. $this->filterEnd();
  11.  
  12. return $this;
  13. }
  14.  
он работает, но я не знаю насколько это ресурсоёмко. По моим знаниям ICMS2, этот метод должен сгенерить всего один запрос из переданного массива. Пока со временем напряг, позже выложу своё рабочее решение полностью, но там кроме добавления этого метода в ядро модели надо изменить ещё в контролере валидацию строки на валидацию массива.
как-то так
  1.  
  2. // public function validate_array_key($array, $value){
  3. // if (!isset($array[$value])) { return ERR_VALIDATE_INVALID; }
  4. // return true;
  5. // }
  6.  
  7. public function validate_array_key($array, $value){
  8. if (is_array($value)) {
  9. foreach ($value as $val){
  10. if (!isset($array[$val])) { return ERR_VALIDATE_INVALID; }
  11. }
  12. } else {
  13. if (!isset($array[$value])) { return ERR_VALIDATE_INVALID; }
  14. }
  15. return true;
  16. }
Возможно уже есть готовое решение, но у меня заработало только с этим.
#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 управление кешем тоже нужно менять?
#10 30 декабря 2014 в 06:19
eoleg, это для версии 2.1.2.

если их вносишь то при добавлении поля белый экран

eoleg
а куда вы их вносите?
#11 5 января 2015 в 19:25
controller.php замените с 659 строчки вот этим
  1. // public function validate_array_key($array, $value){
  2. // if (!isset($array[$value])) { return ERR_VALIDATE_INVALID; }
  3. // return true;
  4. // }
  5.  
  6. public function validate_array_key($array, $value){
  7. if (is_array($value)) {
  8. foreach ($value as $val){
  9. if (!isset($array[$val])) { return ERR_VALIDATE_INVALID; }
  10. }
  11. } else {
  12. if (!isset($array[$value])) { return ERR_VALIDATE_INVALID; }
  13. }
  14. return true;
  15. }
#12 5 января 2015 в 19:30
model.php на 671 вставляйте вот это
  1. public function filterMultiIn($field, $value){
  2. if (!strstr($field, '.')){ $field = 'i.' . $field; }
  3.  
  4. $this->filterStart();
  5. foreach($value as $k=>$v){
  6. $v = $this->db->escape($v);
  7. $this->filterOr()->filter("locate('{$v}',{$field})>0");
  8. }
  9. $this->filterEnd();
  10.  
  11. return $this;
  12. }
#13 5 января 2015 в 19:37
вот это вставляйте в конце language.php
  1. define('LANG_PARSER_MULTILIST', 'Список с множественным выбором');
Спасибо Loadырь
#14 5 января 2015 в 21:49

r2, что вы можете сказать про использование такого метода

Loadырь
Рабочий метод, но не по фен-шую, как говорится) Использовать locate и like в таких выборках не поднимается рука из эстетических соображений. Плюс это может давать побочные эффекты (если один вариант списка является вхождением в другой вариант). В общем хочется сделать все более грамотно, хотя и ваш способ имеет право на жизнь.
#15 6 января 2015 в 11:50
r2, полнотекстовый индекс же ну, если без лишней таблицы joke
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.