Тип sql поля формы предоставляет раскрывающийся список записей, полученных путем выполнения запроса к базе данных Joomla. Если поле имеет сохраненное значение, это значение выбирается при первой загрузке страницы. Если нет, выбирается значение по умолчанию (если есть).
Предупреждение!
Использование этого общего типа поля формы вынуждает вас писать SQL в файле XML и довольно ограничено. Для большей гибкости рассмотрите возможность создания собственного конкретного типа поля формы путем создания подкласса класса JFormField.
- type (обязательно) должен быть sql.
- name (обязательно) — уникальное имя поля. Оно должно совпадать с именем столбца результатов запроса, содержащего значения, которые будут показаны пользователю в раскрывающемся списке, если в атрибуте value_field не указано другое имя.
- label (обязательно) (разрешается переводить) — описательный заголовок поля.
- query (обязательный, если не используются атрибуты sql_*) — это SQL-запрос, который предоставит данные для раскрывающегося списка. Запрос должен возвращать два столбца; один называется «значение» (если он не переопределен атрибутом key_field), который будет содержать значения элементов списка; другой вызывается так же, как значение атрибута name (если только он не переопределен атрибутом value_field), содержащий текст, который будет отображаться в раскрывающемся списке.
- default (необязательно) — является значением по умолчанию. Это значение столбца value, если оно не переопределено атрибутом key_field.
- description (необязательно) (разрешается переводить) — это текст, который будет отображаться в виде всплывающей подсказки, когда пользователь наводит указатель мыши на раскрывающийся список.
- multiple (необязательно) — превращает поле в мультиселектор. Используйте multiple="multiple".
- key_field (необязательно) — имя столбца, который будет содержать значения для параметра. Если опущено, то будет использоваться столбец с именем «значение», если он существует.
- value_field (необязательно) — это имя столбца, который будет содержать значения, отображаемые пользователю в раскрывающемся списке. Если опущено, то будет использоваться столбец с тем же именем, что и у атрибута имени, если он существует.
- translate (необязательно) — будет переводить вывод value_field, если установлено значение true. По умолчанию оно равно false.
- header (необязательно) (разрешается переводить) — добавит запись с пустым значением вверху списка параметров. Обычно это используется для добавления записи «- Выберите что-нибудь -» в список. См. примеры альтернативного способа достижения этого.
- sql_select (обязательный, если не используется атрибут запроса) — это выражение SELECT оператора SQL. Допускается только один такой пункт.
- sql_from (обязательный, если не используется атрибут запроса) — это выражение 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, используя тег <option></option>. Пожалуйста, посмотрите на следующий пример.
<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>
Кроме того, вы можете добиться того же результата, используя атрибут заголовка следующим образом:
<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"
/>
Альтернативный query синтаксис
Начиная с 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"
/>
Предупреждение!
Следующие функции, связанные с фильтрами, в настоящее время не работают! См. проблему тут Github
Одним из преимуществ использования этого синтаксиса является то, что он позволяет использовать связанные поля в качестве фильтров. Например, предположим, что у вас есть форма, содержащая два списка выбора, один из которых называется groups, а другой — subgroups. Поле групп простое:
<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"
/>
Затем, если поле групп имеет значение 99, для поля подгрупп будет выполнен следующий оператор SQL:
SELECT e.* FROM jos_example_subgroups AS e WHERE `groups` = 99 GROUP BY `name` ORDER BY e.id ASC
Для фильтрации по нескольким полям можно использовать список имен фильтров, разделенных запятыми, в предложении sql_filter. Например, если есть фильтр с именем группы со значением 99 и фильтр с именем категории со значением 12, то
sql_filter="groups,categories"
создаст выражение SQL WHERE:
WHERE `groups` = 99 AND `categories` = 12
Вы также можете определить значение по умолчанию для любого фильтра, который может не иметь значения при оценке поля, добавив атрибуты sql_default_{FIELD_NAME}. Например, предположим, что значение по умолчанию для фильтра групп равно 0, а значение по умолчанию для фильтра категорий равно 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
Примечание 1. Операторы SQL должны соответствовать типу и версии базовой базы данных, на которой работает Joomla. Скорее всего, это будет версия MySQL, но может быть и что-то другое. Нет возможности запрашивать базы данных, кроме той, на которой работает сама Joomla.
Примечание 2. Как показано в этих примерах, префикс базы данных (часто jos) следует вводить в виде #__ (решетка-подчеркивание-подчеркивание). Он будет автоматически заменен фактическим префиксом базы данных, используемым Joomla.
Посмотреть все стандартные типы полей формы можно здесь: https://d-nik.site/ru/joomla-4/joomla-dlya-razrabotchikov/standartnye-tipy-polej-formy
