При разработке модулей периодически требуется параметр, позволяющий выбрать из списка сразу несколько значений. В 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: <param
name="fields"
type="list"
size="5"
multiple="true"
default=""
label="Select Fields"
description="">
<option value="title">Title</option>
<option value="author">Author</option>
<option value="date">Date</option>
</param> Однако, чтобы наши дополнительные атрибуты работали, необходимо не забыть прописать атрибут addpath у элемента params, указав в качестве значения путь к директории с нашей реализацией типа параметров JElementList.
|