Тип 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/joomla-4/joomla-dlia-rozrobnykiv/standartni-tipi-poliv-formi
