Пример принципа единственной ответственности для Joomla
Имеем:
Форму с полями город и пункт выдачи. Поля наследуют ListField
.
<field
name="city_id"
type="city"
label="City"
/>
<field
name="point_id"
type="point"
label="City"
/>
Задача:
В методе getOptions класса PointField получить id выбранного города.
Очевидное решение:
Получим id города из данных формы. Такой способ применяется в ядре Joomla.
<?php
class PointField
{
protected function getOptions(): array
{
$cityId = $this->form->getValue('city_id');
}
}
Но через некоторое время нам может потребоваться добавить в форму ещё пару аналогичных полей. recipient_city_id и recipient_point_id.
Но теперь второе поле точки типа Point зависит от не своего поля город.
Как это исправить? Неужели делать отдельные типы полей для отправителя и получателя? А если у нас вообще не будет поля город?
Проблема в том что мы поручили классу PointField получение id города.$cityId = $this->form->getValue('city_id');
А его единственной ответственностью должен быть вывод списка точек доставки из заданного города.
Уничверсальное решение:
Добавим полю Point атрибут city_id прямо в XML, или программно, в событии onContentPrepareForm.
<field
name="point_id"
type="point"
city_id=""
label="City"
/>
<?php
class PointField
{
protected function getOptions(): array
{
$cityId = $this->element['city_id'];
}
}
Теперь поле зависит только от своего атрибута.
Так же можно передавать и более сложные данные. Например. размеры посылки: {width:10,height:7,length:20}.