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

  • Пятница, 25 ноября 2011

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

Вот и все, будут вопросы - готов ответить у нас на форуме!

Joomla!® CMS — пожалуй, лучшая система управления контентом с открытым исходным кодом

Логотип Joomla

Joomla! — это больше, чем просто программное обеспечение, это люди, включающие разработчиков, дизайнеров, системных администраторов, переводчиков, копирайтеров, и, что самое главное — простых пользователей.

Мы рады пригласить вас в ряды нашего сообщества!

Свернуть

Коротко о главном в Joomla

Новости портала

Новое в блогах

Видео

Форум о Joomla