SQL表单字段类型允许我们通过指定SQL语句从数据库获得内容,并且将记录以下拉列表的方式展示出来

表现形式


字段配置参数


专属属性:

  • type (必填) 必须为 sql.
  • name (必填) 字段的名称,当没有指定value_field的时候,这个字段的名称必须在查询字段中。
  • query (必填) 获得下拉列表所需要查询的SQL语句.这个查询必须返回两个字段,一个字段的名称为value,另外一个字段和name属性中值一样。
  • key_field (选填)  sql结果作为select值的字段。
  • value_field (选填)  sql结果select文本的字段。
  • translate (选填)  当设置为true的时候,value_field的结果将通过JText::_类进行多语言翻译。默认为false
  • header (选填) (支持多语言) 是否显示一个空的选项如:请选择 。
  • multiple (选填) (true/false) 是否允许多选

上面为模式1.通过query ,key_field ,value_field这个3个属性来生成列表。本字段也支持模式2.使用sql_*来指定。具体的参数如下:

  • sql_select (必填)  指定需要查询字段。如 a.*
  • sql_from (必填)  指定需要查询的表。如 #__zmaxshop_item
  • sql_join (选填)  指定需要Join的表。如 #__zmaxshop_order
  • sql_where (选填)  指定查询条件。如 price>15
  • sql_group (选填)  指定分组的条件。如 item_id
  • sql_order (选填)  指定排序的方式。如 price ASC
  • sql_filter (选填)  指定数据过滤的字段。你可以指定表单中的其他的字段作为本sql字段的过滤条件。前提是表单中其他字段的名称必须在查询的数据表中。
  • sql_filter (optional) filters the list by the value of another field. A field name or a comma-separated list of field names can be given. The field names must correspond to column names in the database table being queried. See the examples for further explanation.
  • sql_default_{FIELD_NAME} (optional) is the default value used by the sql_filter attribute when the value of the {FIELD_NAME} filter has not been set. See the examples for further explanation.

通用属性:

  • name (必填)  能代表该字段的唯一的名称.
  • label (选填) (支持多语言机制) 字段的标题
  • description (选填) (支持多语言机制) 该字段的描述信息。当鼠标移动到标签上面的时候,会以tooltip的形式显示出来.
  • default (选填) (不支持多语言机制) 默认值
  • class (选填) 表单字段的css类名。如果省略,默认为'text_area'.
  • required (选填l)  是否必须填写内容,用于在提交表单是进行校验. ( "true", "1", "readonly"这些都表示true)
  • hint 显示在html占位符元素中的文本,通常是在空白字段内显示的浅色提示
  • readonly (选填l) 是否只读,字段的值不能编辑. ("true", "1", "readonly" 这些都表示true)
  • disabled (选填) 是否禁用字段。如果为true,那么这个字段的值不能填写,只能展示 - 并且这个值不会在表单中提交. (可设置的值: "true", "1", "readonly" 这些都表示true)

使用方法


<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,在字段参数设置中系统会自动替换#__为正确的表前缀