Ограничение

Использование этого универсального типа поля формы вынуждает вас писать 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.

См . также