教程栏目

joomla中文网出品的官方教程

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

作者: 樱木花道

Joomla程序员,从J1.5到J4.x始终都在做Joomla相关开发定制工作,有超过10年行业经验,国内Joomla扩展开发商ZMAX团队的核心成员

作者网站:ZMAX程序人

评论 (0)

  • 最新在前
  • 最佳在前

第1章 Joomla入门教程

第3章 C计划

第5章 E计划

第6章 H计划

第7章 G计划

第9章 运行环境

第11章 主从与集群

第12章 模块开发

第13章 插件开发

第14章 j2.x组件开发教程

第15章 页面定制教程

第16章 页面构造器

第17章 joomla升级

第18章 其他系统迁移

第19章 流量翻倍计划