SQL表单字段类型允许我们通过指定SQL语句从数据库获得内容,并且将记录以下拉列表的方式展示出来
专属属性:
上面为模式1.通过query ,key_field ,value_field这个3个属性来生成列表。本字段也支持模式2.使用sql_*来指定。具体的参数如下:
通用属性:
<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 数据库中很少有表有名为“值”的列。或者,您可以使用 key_field 属性来定义要使用的列而不是“值”
<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>
或者,您可以使用 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属性,则这些功能不可用。例如,这个字段定义:
<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" />
使用此语法的一个优点是它允许使用链接字段作为过滤器。例如,假设您有一个包含两个选择列表的表单,一个称为组,另一个称为子组。组字段很简单:
<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,则将为子组字段执行以下 SQL 语句:
SELECT e.* FROM jos_example_subgroups AS e WHERE `groups` = 99 GROUP BY `name` ORDER BY e.id ASC
要过滤多个字段,您可以在 sql_filter 子句中使用逗号分隔的过滤器名称列表。例如,如果有一个值为 99 的名为group的过滤器和值为 12 的名为categories的过滤器,则:
sql_filter="groups,categories"
相应的SQL语句:
WHERE `groups` = 99 AND `categories` = 12
您还可以通过添加 sql_default_{FIELD_NAME} 属性在字段没有值的时候设置默认只作为过滤器。例如,假设group过滤器的默认值是 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
1,使用此种方式生成的SQL语句可能存在兼容性问题
2,在字段参数设置中系统会自动替换#__为正确的表前缀