SQL表單字段類型允許我們通過指定SQL語句從數(shù)據(jù)庫獲得內(nèi)容,并且將記錄以下拉列表的方式展示出來
表現(xiàn)形式

字段配置參數(shù)
專屬屬性:
- type (必填) 必須為 sql.
- name (必填) 字段的名稱,當(dāng)沒有指定value_field的時候,這個字段的名稱必須在查詢字段中。
- query (必填) 獲得下拉列表所需要查詢的SQL語句.這個查詢必須返回兩個字段,一個字段的名稱為value,另外一個字段和name屬性中值一樣。
- key_field (選填) sql結(jié)果作為select值的字段。
- value_field (選填) sql結(jié)果select文本的字段。
- translate (選填) 當(dāng)設(shè)置為true的時候,value_field的結(jié)果將通過JText::_類進行多語言翻譯。默認(rèn)為false
- header (選填) (支持多語言) 是否顯示一個空的選項如:請選擇 。
- multiple (選填) (true/false) 是否允許多選
上面為模式1.通過query ,key_field ,value_field這個3個屬性來生成列表。本字段也支持模式2.使用sql_*來指定。具體的參數(shù)如下:
- 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 (選填) 指定數(shù)據(jù)過濾的字段。你可以指定表單中的其他的字段作為本sql字段的過濾條件。前提是表單中其他字段的名稱必須在查詢的數(shù)據(jù)表中。
- 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 (選填) (支持多語言機制) 字段的標(biāo)題
- description (選填) (支持多語言機制) 該字段的描述信息。當(dāng)鼠標(biāo)移動到標(biāo)簽上面的時候,會以tooltip的形式顯示出來.
- default (選填) (不支持多語言機制) 默認(rèn)值
- class (選填) 表單字段的css類名。如果省略,默認(rèn)為'text_area'.
- required (選填l) 是否必須填寫內(nèi)容,用于在提交表單是進行校驗. ( "true", "1", "readonly"這些都表示true)
- hint 顯示在html占位符元素中的文本,通常是在空白字段內(nèi)顯示的淺色提示
- readonly (選填l) 是否只讀,字段的值不能編輯. ("true", "1", "readonly" 這些都表示true)
- disabled (選填) 是否禁用字段。如果為true,那么這個字段的值不能填寫,只能展示 - 并且這個值不會在表單中提交. (可設(shè)置的值: "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 數(shù)據(jù)庫中很少有表有名為“值”的列。或者,您可以使用 key_field 屬性來定義要使用的列而不是“值”
<field
name="title"
type="sql"
default="10"
label="Select an article"
query="SELECT id, title FROM #__content"
key_field="id"
/>
|
上面的兩個方式展示的結(jié)果是一樣的。
兩個列名都可能需要別名。例如,假設(shè)您希望將您的字段稱為“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 語句中的字段。例如,假設(shè)您想將每篇文章的創(chuàng)建日期/時間附加到列表中的文章標(biāo)題。然后你可以使用這個 SQL 語句:
SELECT id, concat( title, ' (', created, ')') AS title FROM #__content
|
您還可以在 XML 中指定使用 <option></option>標(biāo)題定義靜態(tài)選項。如下:
<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 屬性獲得相同的結(jié)果,如下所示:
<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"
/>
|
使用此語法的一個優(yōu)點是它允許使用鏈接字段作為過濾器。例如,假設(shè)您有一個包含兩個選擇列表的表單,一個稱為組,另一個稱為子組。組字段很簡單:
<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"
/>
|
那么,如果上一個字段中g(shù)roups的值為 99,則將為子組字段執(zhí)行以下 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"
|
相應(yīng)的SQL語句:
WHERE `groups` = 99 AND `categories` = 12
|
您還可以通過添加 sql_default_{FIELD_NAME} 屬性在字段沒有值的時候設(shè)置默認(rèn)只作為過濾器。例如,假設(shè)group過濾器的默認(rèn)值是 0,categories過濾器的默認(rèn)值是 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,在字段參數(shù)設(shè)置中系統(tǒng)會自動替換#__為正確的表前綴
更多建議: