Здравствуйте, уважаемые читатели сайта 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);

}

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