直接在模板文件中硬编码(最简单)
当你下拉框的选项是固定不变,不需要从后台数据中获取时,可以直接在模板文件中手写HTML代码。
适用场景:固定的性别选择(男/女)、固定的状态选择(启用/禁用)等。
示例代码:
<select name="gender" id="gender">
<option value="">请选择性别</option>
<option value="1">男</option>
<option value="2">女</option>
</select>
说明:
name属性:在表单提交时,用于标识这个字段。id属性:用于JavaScript或CSS进行精确定位。value属性:提交到服务器的实际值。<option>标签之间的文本:用户在下拉框中看到的文本。
使用织梦的{dede:arclist}或{dede:channel}标签动态生成(最常用)
这是织梦最核心、最强大的用法,通常用于动态生成栏目分类、文章列表等。
场景1:生成顶级栏目下拉框(用于文章分类选择)
使用{dede:channel}标签可以轻松获取栏目列表。
示例代码:
<select name="typeid" id="typeid">
<option value="0">请选择栏目</option>
{dede:channel type='top' row='10'}
<option value="[field:id/]">[field:typename/]</option>
{/dede:channel}
</select>
代码解析:
{dede:channel type='top' row='10'}:type='top': 表示只获取顶级栏目,如果去掉这个属性,会获取包括所有子栏目在内的所有栏目。row='10': 表示获取10个栏目,不写则默认获取所有。
[field:id/]: 输出当前栏目的ID。[field:typename/]: 输出当前栏目的名称。
场景2:生成带层级的栏目下拉框(高级用法)
如果希望栏目在下拉框中能体现出层级关系(如“一级栏目 > 二级栏目”),需要使用{dede:channelartlist}并配合一些CSS样式。
示例代码:
<select name="typeid" id="typeid">
<option value="0">请选择栏目</option>
{dede:channelartlist type='top' row='20'}
<optgroup label="[field:typename/]">
{dede:channel type='son' noself='yes'}
<option value="[field:id/]">|-- [field:typename/]</option>
{/dede:channel}
</optgroup>
{/dede:channelartlist}
</select>
代码解析:
{dede:channelartlist}: 循环顶级栏目。<optgroup label="...">: HTML中用于对选项进行分组的标签,label属性是分组的标题。{dede:channel type='son' noself='yes'}: 在顶级栏目循环内部,再循环出该顶级栏目下的所有子栏目。type='son': 表示获取子栏目。noself='yes': 表示不获取栏目本身。
- 这里用符号来模拟层级缩进,你也可以用CSS的
padding-left来实现更美观的缩进效果。
通过调用自定义字段(自定义模型)
模型中添加了“单选列表”类型的自定义字段,织梦会自动为你生成一个下拉框。
适用场景:文章的来源选择、产品规格选择等。
操作步骤:
-
在后台添加自定义字段:
- 进入“后台” -> “核心” -> “内容模型管理” -> 选择你想要修改的模型(如“文章”) -> “更改字段”。
- 点击“添加新字段”。
- 字段名:
source(英文,用于数据库) - 字段别名:
来源(中文,用于后台显示) - 字段类型:
单选列表(选择框) - 字段参数: 在这里输入你的选项,每行一个。
新浪新闻 搜狐新闻 腾讯新闻 其他 - 保存。
-
在前台模板中调用: 在文章内容页模板(
article_article.htm)中,直接使用{field:来源/}即可,织梦会自动将其渲染成一个<select>下拉框。
渲染后的HTML效果:
<select name="source" id="source">
<option value="新浪新闻">新浪新闻</option>
<option value="搜狐新闻">搜狐新闻</option>
<option value="腾讯新闻">腾讯新闻</option>
<option value="其他">其他</option>
</select>
使用SQL直接查询数据库(最灵活)
当下拉框的数据来源比较复杂,或者不是织梦默认的栏目、文章表时,可以使用自定义SQL查询。
适用场景:从自定义的数据表中读取地区列表、品牌列表等。
示例代码:
假设你有一个名为dede_shop_brands的表,你想从中读取所有品牌。
<select name="brand" id="brand">
<option value="0">请选择品牌</option>
{dede:sql sql='SELECT id, brandname FROM `dede_shop_brands` ORDER BY id ASC'}
<option value="[field:id/]">[field:brandname/]</option>
{/dede:sql}
</select>
代码解析:
{dede:sql}: 织梦的自定义SQL标签。sql='...': 你要执行的SQL查询语句。[field:id/]和[field:brandname/]: 分别对应SQL查询结果中的id和brandname字段。
综合示例:一个完整的搜索表单
这是一个结合了多种方法的常见例子:一个带有分类和地区筛选的搜索框。
<form action="/plus/search.php" name="searchform" id="searchform">
<div>
<label for="keyword">关键词:</label>
<input type="text" name="keyword" id="keyword" />
</div>
<div>
<label for="typeid">文章分类:</label>
<select name="typeid" id="typeid">
<option value="0">全部分类</option>
{dede:channel type='top' row='20'}
<option value="[field:id/]">[field:typename/]</option>
{/dede:channel}
</select>
</div>
<div>
<label for="areaid">所在地区:</label>
<select name="areaid" id="areaid">
<option value="0">全部地区</option>
{dede:sql sql='SELECT id, area FROM `dede_area` ORDER BY paixu ASC'}
<option value="[field:id/]">[field:area/]</option>
{/dede:sql}
</select>
</div>
<div>
<button type="submit">搜索</button>
</div>
</form>
总结与建议
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 硬编码 | 固定不变的选项 | 简单直接,无需调用数据 | 不灵活,数据变更需修改代码 |
{dede:channel} |
生成栏目列表 | 织梦原生支持,与系统无缝集成 | 仅适用于栏目等特定数据源 |
| 自定义字段 | 调用模型的单选/多选数据 | 无需写模板代码,后台配置即可 | 仅适用于模型内的数据 |
{dede:sql} |
任意复杂的数据源 | 灵活性最高,可查询任意表 | 需要懂SQL,有一定性能开销 |
对于大多数织梦使用者来说,方法二({dede:channel})和方法三(自定义字段) 是最常用和最应该掌握的,根据你的具体需求选择最合适的方法即可。
