Разобрался самостоятельно,
попробую объяснить решение.Первым делом определим файл разметки формы form.xml
<field
name="bron_services"
type="sql"
default="0"
class="articleselectbox"
label="Выберите услугу:"
query="SELECT id as value,service as title FROM #__bron_services"
key_field="value"
value_field="title"
required="true"
onchange="servicesOnChange()"
>
<option value="0" selected="true">- не выбрано -</option>
</field>
<field name="bron_masters" type="list" label="Выберите мастера:" required="true" disabled="true">
<option value="0" selected="true">- не выбрано -</option>
</field>
Первое поле заполняется результатом запроса указанного в аттрибуте поля. Ко всему этому мы добавляем название обработчика
onchange. Это поле отвечает за хранение родительских структур (категорий).
Второе поле является
дочерним (зависимым). Поэтому кроме как одной опции "не выбрано" в нем быть не должно, заполнятся оно будет при
onchange родительского.
Теперь нам нужно обзавестись функцией получения списка дочерних элементов, в моем случае мастеров. Функцию засунем в
главный контроллер компонента (расположение
/components/com_yourcomponent/controller.php). Алгоритм прост:
- получаем id выбранной категории
- делаем запрос в бд (select id,master from #__tablename where service_id = $sid)
- отправляем результат в формате JSON для удобства последующей обработки
public static function getMasterByServiceId()
{
$sid = JRequest::getVar('sid', null, 'GET');
if ($sid) {
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('id,master');
$query->from('#__tablename');
$query->where('service_id = '. $db->quote($sid));
$db->setQuery($query);
$rows = $db->loadObjectList();
$res = Array();
foreach ($rows as $row)
{
$res[] = $row;
}
echo json_encode($res);
}
}
Основную работу сделали. Осталось привести в порядок наше отображение (View). (не забудьте вывести поля формы во view.html.php)
Теперь только JS:
Первым делом напишем функцию очистки дочернего селекта (чистим, добавляем по дефолту "не выбрано"):
function clearMasters()
{
document.getElementById('bron_masters').length = 0;
var opt = document.createElement('option');
opt.value = 0;
opt.text = "- не выбрано -";
document.getElementById('bron_masters').appendChild(opt);
document.getElementById('bron_masters').options.selectedIndex = 0;
}
Далее уже забытое родительское
OnChange():
function servicesOnChange()
{
clearMasters(); //чистим дочерний селект
if (document.getElementById('bron_services').value == 0) //если не выбрана категория
{
document.getElementById('bron_masters').disabled = true; //деактивируем дочерний селект
}
else
{
//если выбрали категорию
document.getElementById('bron_masters').disabled = false; //активируем дочерний селект
//формируем запрос в контроллер компонента
var myRequest = new Request({
url: 'index.php?option=com_bron&task=getMasterByServiceId&format=json',
method: 'get',
onSuccess: function(responseText){
//наши действия при успешном выполнении
//парсим результат в формате JSON
var arr = JSON.parse(responseText);
//закидываем всё в дочерний селект
for (var i=0;i<arr.length;i++)
{
var opt = document.createElement('option');
opt.value = arr[i].id;
opt.text = arr[i].master;
document.getElementById('bron_masters').appendChild(opt);
}
},
onFailure: function(){
//alert('onFailure');
}
});
//здесь указываем параметр sid
myRequest.send('sid='+document.getElementById('bron_services').value);
}
}
Вот и всё, а ты боялась, даже юбка не помялась
