Добавляем поддержку множественного выбора в JElementList для Joomla 1.5

joomla модули

При разработке модулей периодически требуется параметр, позволяющий выбрать из списка сразу несколько значений. В 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="/administrator/components/com_content/elements">

Так вот, если мы у элемента params задаем атрибут addpath, то Joomla 1.5 добавляет этот путь в самый верх списка путей, где будет искаться тип параметра (в этом можно легко убедиться изучив код метода addElementPath класса JParameter).

Вот в этой особенности и кроется основная хитрость, которую я хочу предложить. Мы создаем альтернативную реализацию типа параметра list, добавляем его к нашему модулю (или компоненту) и прописываем путь к папке с нашим элементом. После этого, уже в XML-файле описания параметров (или XML-манифесте модуля или компонента) мы можем использовать тип параметра list с поддержкой множественного выбора.
Создание альтернативной реализации JElementList

Создаем файл list.php следующего содержания:
<?php
defined('JPATH_BASE') or die();

class JElementList extends JElement
{
var $_name = 'List';

function fetchElement($name, $value, &$node, $control_name)
{
$ctrl = $control_name . '[' . $name . ']';
$attribs = '';

if ($v = $node->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


Источник: http://joomlaportal.ru

Добавить комментарий:
Имя:
E-mail:
2021 © Обсуждение Joomla и других CMS-систем управления сайтами  Правила | О проекте | Обратная связь