Здравствуйте, уважаемые читатели сайта shargaev-group.ru! При разработке расширений на Joomla, зачастую приходиться строить большие выпадающие списки. Например – список городов, телефонных баз и пр.

Стандартный тип поля list не позволяет динамически добавлять элементы option, все значения данного типа должны быть явно указаны в xml  файле формы.

А что делать, если нужно добавить 1000 значений этому полю? Или эти значения хранятся в базе и по определенному условию нужно сделать выборку, проверку данных и показать пользователю?

Для частичной решения данной задачи в Joomla есть тип поля sql, который позволяет по определенным критериям сделать выборку из базы и полученные данные поместить в форму. Но, данный тип не дает той  гибкости, которая бы потребовалась при работе с элементами списка.

Решить эту задачу можно двумя путями

  1. Написать собственный тип данных
  2. Расширить существующий тип (добавить функционал)

О втором способе ниже и пойдет речь.

Расширяем класс JFormFieldList

Для расширения функционала типа list создаем файл extendslist.php c кодом:

defined('_JEXEC') or die('@');

jimport('joomla.form.formfield');
jimport('joomla.form.helper');
JFormHelper::loadFieldClass('list');

class JFormFieldExtendslist extends JFormFieldList {

	protected $type = 'Extendslist';

	public function setOption($value, $title) {
		
		if($value && $title) {
			$this->element->addChild('option', $title)->addAttribute('value', $value);
			return true;
		}
		
		return false;
	}
}

Данный класс расширяет стандартный тип поля list, метод setOption позволяет добавлять значения option в объект JFormField.

Метод принимает два обязательных параметра: значение и имя.

Использование в коде

Созданный файл помещаем в папочку fields своего расширения.

Создаем поле и указываем ему наш тип Extendslist, в addfieldpath обязательно укажите путь до папки с ваши типом:

<fieldset name="basic" addfieldpath="путь до папки с типом/fields">
 <field name="имя поля" 
       type="extendslist(тип)" 
       default="Значение по умолчанию (если надо)" 
       label="Название поля" 
       description="Описание поля">
       <option value="">Значение по умолчанию (если надо)</option>
 </field>
</fieldset>

При обработке формы в коде, получаем нужный элемент и добавляем в него данные:

$element  = $form->getField('имя элемента');

foreach ($data as $d) {
 $element->Option(value, title);
}

На этом все, берегите себя!