Стандартный тип списка параметров не поддерживает выбор нескольких объектов в Joomla 1.5.x. Однако, это достаточно просто добавить дополнительные пользовательские параметр типа с этой функциональностью для любого компонента или модуля. Заметим, что это не является обязательным для Joomla 1.6.x как эта версия поддерживает несколько списков выбора изначально.
Код для поддержки пользовательских параметров состоит из двух частей. Один файл, содержащий весь код, необходимый для отображения списка HTML SELECT и небольшой кусок дополнительный код для добавления в любой код процессы форму после представления пользователем. Это может, например, быть Bind () метод, если стоимость (ы) хранятся в таблице базы данных. Кроме того, вам нужно будет добавить один или несколько элементов <param> в файл XML который определяет форму, где SELECT список должен быть добавлен.
Оказание параметра
Код, необходимый для отображения нескольких элементов списка выбора здесь:
<?php
/**
* @copyright Copyright (C) 2009 Open Source Matters. All rights reserved.
* @license GNU/GPL
*/
// Check to ensure this file is within the rest of the framework
defined('JPATH_BASE') or die();
/**
* Renders a multiple item select element
*
*/
class JElementMultiList extends JElement
{
/**
* Element name
*
* @access protected
* @var string
*/
var $_name = 'MultiList';
function fetchElement($name, $value, &$node, $control_name)
{
// Base name of the HTML control.
$ctrl = $control_name .'['. $name .']';
// Construct an array of the HTML OPTION statements.
$options = array ();
foreach ($node->children() as $option)
{
$val = $option->attributes('value');
$text = $option->data();
$options[] = JHTML::_('select.option', $val, JText::_($text));
}
// Construct the various argument calls that are supported.
$attribs = ' ';
if ($v = $node->attributes( 'size' )) {
$attribs .= 'size="'.$v.'"';
}
if ($v = $node->attributes( 'class' )) {
$attribs .= 'class="'.$v.'"';
} else {
$attribs .= 'class="inputbox"';
}
if ($m = $node->attributes( 'multiple' ))
{
$attribs .= ' multiple="multiple"';
$ctrl .= '[]';
}
// Render the HTML SELECT list.
return JHTML::_('select.genericlist', $options, $ctrl, $attribs, 'value', 'text', $value, $control_name.$name );
}
}
Это должно быть сохранено в файле под названием multilist.php в отдельный каталог в вашем компонент или модуль каталога. Рекомендуется для согласования этого каталога называется элементов, но это и не требуется. Например, если вы хотите добавить поддержку для данного поля в компонент, называемый MyComponent, то вы бы скопировать и вставить этот код в этом файле:
/administrator/components/com_mycomponent/elements/multilist.php
Не забудьте добавить пустой файл index.html в каталог элементов, чтобы предотвратить каталога.
Добавление элементов в форму
Параметры отображаются с помощью определения формы информации, содержащейся в файле XML. Например, для компонента этот файл как правило, будет:
/administrator/components/com_mycomponent/config.xml
В этот файл, вы должны добавить один или несколько параметров выбора списка, добавив <param> элемента в соответствующую группу
параметров <params>, как это:
<param name="field-name" type="multilist" default="OPT1" multiple="multiple" label="Select one or more items"
description="Select one or more items from the list. You can use Ctrl-click to select more than one item.">
<option value="OPT1">Title for option 1</option>
<option value="OPT2">Title for option 2</option>
<option value="OPT3">Title for option 3</option>
<option value="OPT4">Title for option 4</option>
<option value="OPT5">Title for option 5</option>
</param>
Аргументы таковы:
* type (обязательно) должны быть multilist.
* name (обязательно) это уникальное имя параметра.
* label (обязательное) (переводимых) является описательным названием поля.
* default (необязательно) запятыми список значений по умолчанию.
* size (приобретается дополнительно) число вариант строки, которые будут отображаться в списке. Если опущен, все строки будут отображаться.
* description (необязательно) (переводимых) это текст, который будет показан в подсказке, когда пользователь перемещает курсор мыши на выпадающем списке.
* class (приобретается дополнительно) Название класса для поля формы HTML. Если опустить это будет по умолчанию "InputBox.
* multiple (опционально) указывает, является ли поле позволит более чем один вариант строки должны быть выбраны. Всегда должны быть установлены в "нескольких", поскольку, если он не может также использовать стандартный тип списка параметров.
Элемент XML <param> должны включать один или несколько <option> элементы, которые определяют элементы списка. Текст между <option> и </ ption> теги это то, что будет показано в списке опций и переводимые строки. <option> Теги принимает следующие аргументы:
* value (обязательный) является значение, которое будет сохранено для параметра, если этот пункт выбран.
Так как это пользовательский тип параметра, вы также должны сообщить Joomla, где найти код для отображения параметров. Вы можете сделать это путем добавления addPath аргумент содержащие <params> элемента. Например, чтобы добавить параметр группа, содержащая только один список выбора нескольких элементов, чтобы ваш компонент, XML будет выглядеть следующим образом:
<params group="group-name" addPath="/administrator/components/com_mycomponent/elements">
<param name="field-name" type="multilist" default="OPT1" multiple="multiple" label="Select one or more items"
description="Select one or more items from the list. You can use Ctrl-click to select more than one item.">
<option value="OPT1">Title for option 1</option>
<option value="OPT2">Title for option 2</option>
<option value="OPT3">Title for option 3</option>
<option value="OPT4">Title for option 4</option>
<option value="OPT5">Title for option 5</option>
</param>
</params>
Только один аргумент addPath разрешено в группе параметров, поэтому это хорошая идея, чтобы собрать все пользовательский код параметра в одном каталоге элементов.
Сохранение значений параметров базы данных
Наиболее распространенное использование для этого пользовательский тип параметра будет включать экономию те значения, выбранного пользователем в поля в таблице базы данных. Предполагая, что вы делаете это с помощью класса JTable API, то вам нужно добавить следующий код в JTable расширенного класса для соответствующей таблице.
/**
* Overloaded bind function
*
* @param array $array Array or object of values to bind
* @param mixed $ignore Array or space separated list of fields not to bind
*
* @return null|string Success returns null, failure returns an error
* @access public
* @see JTable:bind
*/
function bind( $array, $ignore = '' )
{
if (key_exists( 'field-name', $array ) && is_array( $array['field-name'] )) {
$array['field-name'] = implode( ',', $array['field-name'] );
}
return parent::bind( $array, $ignore );
}
Обратите внимание, что поля-имя должно совпадать с именем вы дали поля в определении XML-файл форма и название, данное поле базы данных.
С помощью этого кода будут храниться данные, как список разделенных запятыми значений в поле базы данных. Чтобы использовать другой разделитель, изменения запятой на любой символ, который вы хотите использовать в взрываться вызова функции в привязку () и соответствующие взорваться вызов функции в multilist.php файл.
