При разработке модулей периодически требуется параметр, позволяющий выбрать из списка сразу несколько значений. В Joomla 1.7 с этим никаких проблем нет, тип поля формы JFormFieldList, используемый для списков, поддерживает множественный выбор, а вот в Joomla 1.5, в JElementList, этого нет. Однако, все можно исправить.
Для начала небольшое отступление по поводу типов полей в Joomla 1.5 (как это все работает в Joomla 1.7 расскажу в одной из следующих статей), откуда они берутся и как они работают. Все стандартные типы полей в Joomla 1.5 унаследованы от JElement и их реализации находятся в директории /libraries/joomla/html/parameter/element/. Когда Joomla, при разборе параметров (модуля или компонента) находит элемент param, она считывает значение атрибута type и ищет в указанной директории файл с классом, реализующим этот элемент.
Для того, чтобы обеспечить поддержку пользовательских типов параметров у элемента params существует атрибут addpath, с помощью которого можно указать путь к реализациям пользовательских типов параметров. Например, у стандартного компонента com_content есть 2 типа параметров author и article, и для того, чтобы они работали, в XML-файле описания формы параметров материала (/administrator/components/com_content/models/article.xml) используется addpath:
Так вот, если мы у элемента params задаем атрибут addpath, то Joomla 1.5 добавляет этот путь в самый верх списка путей, где будет искаться тип параметра (в этом можно легко убедиться изучив код метода addElementPath класса JParameter).
Вот в этой особенности и кроется основная хитрость, которую я хочу предложить. Мы создаем альтернативную реализацию типа параметра list, добавляем его к нашему модулю (или компоненту) и прописываем путь к папке с нашим элементом. После этого, уже в XML-файле описания параметров (или XML-манифесте модуля или компонента) мы можем использовать тип параметра list с поддержкой множественного выбора.
Создание альтернативной реализации JElementList
Создаем файл list.php следующего содержания:
attributes('class')) { $attribs .= ' class="'.$v.'"'; } else { $attribs .= ' class="inputbox"'; } if ($v = $node->attributes('size')) { $attribs .= ' size="'.$v.'"'; } if ($m = $node->attributes('multiple')) { $attribs .= ' multiple="multiple"'; $ctrl .= '[]'; } $options = array (); foreach ($node->children() as $option) { $val = $option->attributes('value'); $text = $option->data(); $options[] = JHTML::_('select.option', $val, JText::_($text)); } return JHTML::_('select.genericlist', $options, $ctrl, trim($attribs), 'value', 'text', $value, $control_name.$name); } }
Как видите, мы добавили поддержку 2-х дополнительных атрибутов: size (для указания количества видимых элементов в списке) и multiple (для поддержки множественного выбора). Теперь, в параметрах нашего модуля (или компонента) для Joomla 1.5 мы можем использовать элемент list так же, как в Joomla 1.7:
Однако, чтобы наши дополнительные атрибуты работали, необходимо не забыть прописать атрибут addpath у элемента params, указав в качестве значения путь к директории с нашей реализацией типа параметров JElementList.
Вот и все, будут вопросы - готов ответить у нас на форуме!