01 - Поле формы SQL
Использование этого универсального типа поля формы вынуждает вас писать SQL в XML-файле и является довольно ограниченным. Для большей гибкости рассмотрите возможность создания собственного конкретного типа поля формы путем подкласса класса Joomla\CMS\Form\FormField
.
Тип поля формы sql предоставляет раскрывающийся список записей полученный путем выполнения запроса к базе данных Joomla. Если в поле сохранено значение , это значение выбирается при первой загрузке страницы. Если нет, выбирается значение по умолчанию (если оно есть).
- type (обязательный) должен быть sql.
- name (обязательно) - это уникальное имя поля. Это должно совпадать с именем столбца результатов запроса, содержащего значения , которые будут показаны пользователю в раскрывающемся списке, если только в атрибуте value_field не указано другое имя.
- label (обязательное) (переводимых) - это описательное название поле.
- query (обязательный, если не используются атрибуты sql_*) - это запрос SQL, который предоставит данные для раскрывающегося списка. Запрос должен возвращать два столбца; один называется 'value' (если он не переопределен в атрибуте key_field), он будет содержать значения списка элементы; другой называется так же, как значение атрибута name (если не переопределяется атрибутом value_field), содержащим текст, который будет показан в раскрывающемся списке.
- default (необязательно) - это значение по умолчанию. Это значение для столбца 'value', если оно не переопределено атрибутом key_field.
- описание (необязательно) (с возможностью перевода) - это текст, который будет отображаться в виде всплывающей подсказки, когда пользователь наводит курсор мыши на раскрывающийся список.
- multiple (необязательно) превращает поле в мультиселектор. Используйте multiple="multiple".
- key_field (необязательно) - это имя столбца, который будет содержать значения параметра. Если опущено, то вызываемый столбец будет использовано "value", если оно существует.
- value_field (необязательно) - это имя столбца, он будет содержать значения, которые будут показаны пользователю в раскрывающемся списке. Если параметр опущен, то будет использоваться столбец с тем же именем, что и атрибут name , если он существует.
- translate (необязательно) преобразует выходные данные параметра value_field, если установлено значение true. По умолчанию оно равно false.
- header (необязательно) (переводимый) добавит запись с пустым значением в верхней части списка параметров. Обычно это используется для добавления записи "- Выберите что-нибудь" в список. Смотрите В примерах альтернативный способ достижения этого.
- sql_select (обязательно, если не с помощью запроса атрибута) предложение Select в оператор SQL. Только одно такое предложение допускаются.
- sql_from (обязательный, если не используется атрибут query) - это предложение FROM инструкции SQL.
- sql_join (необязательно) - это предложение LEFT JOIN инструкции SQL. Допускается только одно такое предложение.
- sql_where (необязательно) - это предложение WHERE инструкции SQL. Допускается только одно такое предложение.
- sql_group (необязательно) - это предложение GROUP BY инструкции SQL.
- sql_order (необязательно) - это предложение ORDER BY инструкции SQL.
- sql_filter (опция) фильтрует список по значению другой поле. Имя поля или разделенный запятыми список имен полей могут быть дали. Имена полей должны совпадать с именами столбцов таблицы базы данных, к которому выполняется запрос. Посмотрите примеры для дальнейшего объяснение.
- sql_default_{FIELD_NAME} (необязательно) используется по умолчанию атрибутом sql_filter, когда значение {FIELD_NAME} фильтра не было установлено. Смотрите примеры для дальнейшего пояснения.
Пример определения параметра XML
<field name="title" type="sql" default="10" label="Select an article" query="SELECT id AS value, title AS text FROM #__content" />
Обратите внимание, что в этом примере было использовано предложение AS, потому что в таблице jos_content нет столбца с именем 'value' . Фактически очень немногие таблицы в базе данных Joomla имеют столбец с именем 'value' .
В качестве альтернативы, вы можете использовать атрибут key_field для определения столбца , который будет использоваться вместо 'value' :
<field name="title" type="sql" default="10" label="Select an article" query="SELECT id, title FROM #__content" key_field="id" />
Это даст результаты, идентичные предыдущему примеру.
Возможно, потребуется присвоить обоим именам столбцов псевдонимы. Например, предположим, вы хотите, чтобы ваше поле называлось 'myfield' вместо 'title' в предыдущем примере. Тогда вы можете сделать это:
<field name="myfield" type="sql" default="10" label="Select an article" query="SELECT id AS value, title AS myfield FROM #__content" />
Или в качестве альтернативы:
<field name="myfield" type="sql" default="10" label="Select an article" query="SELECT id, title FROM #__content" key_field="id" value_field="title" />
Вы также можете собирать или вычислять поля в инструкции SQL. Например, предположим, что вы хотите добавить созданную дату / время для каждой статьи к названию статьи в списке. Затем вы можете использовать этот SQL заявление:
SELECT id, concat( title, ' (', created, ')') AS title FROM #__content
Вы также можете указать статический параметр в XML с помощью тега. Пожалуйста, посмотрите на следующий пример.
<field name="myfield" type="sql" default="10" label="Select an article" query="SELECT id, title FROM #__content" key_field="id" value_field="title" required="true" > <option value="">Please select your option</option> </field>
В качестве альтернативы, вы можете добиться того же результата, используя атрибут header следующим образом:
<field name="myfield" type="sql" default="10" label="Select an article" query="SELECT id, title FROM #__content" key_field="id" value_field="title" required="true" header="Please select your option" />
Альтернативный синтаксис запроса
Начиная с Joomla 3.5, альтернатива атрибуту query предоставляет некоторые дополнительные функции. Эти функции недоступны, если присутствует атрибут query. Например, это определение поля:
<field name="example_group" type="sql" label="COM_EXAMPLE_GROUP" query="SELECT e.* FROM #__example AS e GROUP BY name ORDER e.id ASC" key_field="id" value_field="name" />
может быть выражен как:
<field name="example_group" type="sql" label="COM_EXAMPLE_GROUP" sql_select="e.*" sql_from="#__example AS e" sql_group="name" sql_order="e.id ASC" key_field="id" value_field="name" />
Следующая функция связанные поля в качестве фильтров в настоящее время не работает! Смотрите Выпуск 22241 на Github.
Одним из преимуществ использования этого синтаксиса является то, что он позволяет использовать связанные поля в качестве фильтров. Например, предположим, что у вас есть форма, содержащая два списка выбора, один из которых называется groups, а другой - subgroups. Поле groups является простым:
<field name="groups" type="sql" label="COM_EXAMPLE_GROUPS" sql_select="e.*" sql_from="#__example_groups AS e" sql_group="name" sql_order="e.id ASC" key_field="id" value_field="name" />
но поле subgroups содержит атрибут sql_filter, который ссылается на поле groups по имени:
<field name="subgroups" type="sql" label="COM_EXAMPLE_SUBGROUPS" sql_select="e.*" sql_from="#__example_subgroups AS e" sql_group="name" sql_order="e.id ASC" sql_filter="groups" key_field="id" value_field="name" />
Затем, если поле groups имеет значение "99 ", для поля subgroups будет выполнена следующая инструкция SQL . Для поля subgroups :
SELECT e.* FROM jos_example_subgroups AS e WHERE `groups` = 99 GROUP BY `name` ORDER BY e.id ASC
Для фильтрации по нескольким полям можно использовать разделенный запятыми список имена фильтров в предложении sql_filter. Например, если существует фильтр под названием groups со значением 99 и фильтр под названием categories со значением 12, то
sql_filter="groups,categories"
создаст предложение SQL WHERE:
WHERE `groups` = 99 AND `categories` = 12
Вы также можете определить значение по умолчанию для любого фильтра, которое может не иметь значения при вычислении поля путем добавления атрибутов sql_default_{FIELD_NAME} . Например, предположим, что значение по умолчанию для фильтра groups равно 0, а значение по умолчанию для фильтра categories равно 0, тогда это определение:
<field name="subgroups" type="sql" label="COM_EXAMPLE_SUBGROUPS" sql_select="e.*" sql_from="#__example_subgroups AS e" sql_group="name" sql_order="e.id ASC" sql_filter="groups,categories" sql_default_groups="0" sql_default_categories="1" key_field="id" value_field="name" />
выдаст этот SQL-оператор при первоначальном вычислении без фильтров:
SELECT e.* FROM jos_example_subgroups AS e WHERE `groups` = 0 AND `categories` = 1 GROUP BY `name` ORDER BY e.id ASC
Примечание: Инструкции SQL должны соответствовать типу и версии базовой базы данных, на которой запущена Joomla. Это будет скорее всего, версия MySQL, но это может быть что-то другое. Там нет возможности запрашивать базы данных, отличные от той, на которой работает сама Joomla.
Примечание: Как показано в этих примерах, префикс базы данных (часто jos
) должен быть введен в форму #__
(хэш-подчеркивание-underscore). Он будет автоматически заменен фактическим префиксом базы данных, используемым Joomla.