织梦CMS模板如何接收$get参数?

99ANYc3cd6
预计阅读时长 21 分钟
位置: 首页 织梦建站 正文

织梦CMS本身提供了一个核心函数 GetQueryString() 来安全地获取 $_GET 参数,这是推荐使用的标准方法,直接使用PHP原生 $_GET 也是可以的,但前者更安全、更符合织梦的开发规范。

织梦cms 模板接收$get参数
(图片来源网络,侵删)

下面我将详细介绍几种在织梦模板中接收 $_GET 参数的方法,并附上实例。


使用织梦核心函数 GetQueryString() (推荐)

这是最安全、最规范的方法。GetQueryString() 函数会对获取的参数进行过滤,可以有效防止SQL注入和XSS攻击。

语法

{dede:global name='变量名'/}

这里的 变量名 就是你想获取的 $_GET 参数的键名。

示例:实现一个简单的筛选功能

假设你的URL是:/plus/list.php?tid=1&keyword=织梦

织梦cms 模板接收$get参数
(图片来源网络,侵删)

你希望在列表页模板中获取 tidkeyword 这两个参数。

修改列表页模板 (/plus/list_article.htm)

在模板的合适位置,你可以直接使用这两个变量来显示或进行逻辑判断。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">{dede:global name='keyword'/} - 搜索结果</title>
</head>
<body>
    <h1>
        {dede:if function='isset(@me)'}
            正在显示关于 "{dede:global name='keyword'/}" 的搜索结果
        {else /}
            所有文章列表
        {/dede:if}
    </h1>
    <p>
        当前栏目ID: {dede:global name='tid'/}
    </p>
    <!-- 这里是你的文章列表循环 -->
    {dede:list pagesize='10'}
        <li>
            <a href="[field:arcurl/]">[field:title/]</a>
            <span>[field:pubdate function="MyDate('Y-m-d', @me)"/]</span>
        </li>
    {/dede:list}
    <!-- 这里是分页 -->
    <div class="dede_pages">
        <ul>{dede:pagelist listitem="info,index,end,pre,next,pageno" listsize="5"/}</ul>
    </div>
</body>
</html>

说明:

织梦cms 模板接收$get参数
(图片来源网络,侵删)
  • {dede:global name='tid'/} 会获取 $_GET['tid'] 的值,即 1
  • {dede:global name='keyword'/} 会获取 $_GET['keyword'] 的值,即 织梦
  • {dede:if function='isset(@me)'} 是一个判断,keyword 参数存在,就显示特定的标题,否则显示默认标题。

直接使用PHP原生 $_GET

在某些复杂的逻辑处理中,你可能需要直接访问 $_GET 数组,在织梦模板中,你可以通过 php 标签来实现。

示例:根据不同参数显示不同内容

假设URL是:/plus/list.php?mode=newest/plus/list.php?mode=hot

修改列表页模板 (/plus/list_article.htm)

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">文章列表</title>
</head>
<body>
    <h1>
        {dede:php}
            // 直接使用PHP获取参数
            $mode = isset($_GET['mode']) ? $_GET['mode'] : 'default';
            if ($mode == 'newest') {
                echo '最新文章';
            } elseif ($mode == 'hot') {
                echo '热门文章';
            } else {
                echo '所有文章';
            }
        {/dede:php}
    </h1>
    <!-- 文章列表... -->
    {dede:list pagesize='10'}
        <li>
            <a href="[field:arcurl/]">[field:title/]</a>
        </li>
    {/dede:list}
</body>
</html>

说明:

  • {dede:php}...{/dede:php} 标签允许你在模板中直接写PHP代码。
  • 这种方法非常灵活,但要注意安全性,如果直接将获取的参数用于SQL查询,必须手动进行过滤和转义,否则存在巨大的安全风险,织梦的标签系统已经内置了安全处理,直接使用PHP会绕过这一层保护。

结合 GetQueryStringdede:sql 标签 (高级应用)

这是实现动态查询功能的核心,比如根据URL中的ID或关键词来查询并显示特定内容。

示例:根据URL中的ID获取特定文章信息

假设你有一个自定义的URL,如:/plus/view.php?aid=123&from=index

你想在模板中获取 aid 并用它来查询文章。

修改文章内容页模板 (/plus/view_article.htm) 页默认通过 arcID 全局变量获取文章ID,如果你想额外获取其他参数,可以这样:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">{dede:field.title/}</title>
</head>
<body>
    <h1>{dede:field.title/}</h1>
    <p>来源:{dede:field.source/}</p>
    <p>时间:{dede:field.pubdate function="MyDate('Y-m-d H:i:s', @me)"/}</p>
    <hr>
    <div>
        {dede:field.body/}
    </div>
    <hr>
    <h3>根据来源参数显示其他信息</h3>
    {dede:php}
        $from = isset($_GET['from']) ? $_GET['from'] : '';
        if (!empty($from)) {
            echo "您是从 {$from} 页面跳转过来的。";
        }
    {/dede:php}
</body>
</html>

更复杂的动态查询示例

假设你有一个需求:在列表页,如果URL中带有 search 参数,就只显示标题包含该关键词的文章。

这需要修改列表页的底层文件,但我们可以通过模板技巧模拟一个简单的效果。

修改列表页模板 (/plus/list_article.htm)

{dede:list} 标签之前,先获取关键词,然后手动构建一个 where 条件。

{dede:php}
    // 获取关键词
    $keyword = GetQueryString('keyword');
    // 初始化where条件
    $where = '';
    // 如果关键词存在,则添加查询条件
    if (!empty($keyword)) {
        // 注意:这里为了演示直接拼接,实际项目中应使用更安全的预处理方式
        // 但织梦的标签系统会处理,所以这里相对安全
        $where = " AND arc.title LIKE '%{$keyword}%'";
    }
    // 将条件赋值给一个模板变量
    $this->Fields['where_condition'] = $where;
{/dede:php}
<!-- 在列表页的SQL调用中使用这个条件 -->
{dede:sql sql="SELECT * FROM `dede_archives` WHERE channel=1 AND arcrank > -1 [field:where_condition/] ORDER BY id DESC LIMIT 0, 10"}
    <li>
        <a href="/plus/view.php?aid=[id]">[title]</a>
    </li>
{/dede:sql}

注意:

  • 这个例子直接在模板中拼接SQL,虽然织梦的底层函数会做一些过滤,但对于复杂的查询,最佳实践是修改PHP文件(如 arc.listview.class.php)来处理这些动态条件,而不是在模板中硬编码SQL。
  • 对于列表页的筛选功能,织梦有更标准的实现方式,即修改列表页的底层文件,在 where 子句中增加对 $_GET 参数的判断。

总结与最佳实践

方法 优点 缺点 适用场景
{dede:global} 安全、简单、规范,自动过滤 功能相对单一,不适合复杂逻辑 获取单个参数用于显示,如ID、关键词、分类ID等。
{dede:php} 灵活强大,可以执行任意PHP代码 安全性较低,容易引入XSS/SQL注入风险,破坏模板分离原则 复杂的条件判断、变量计算、循环等PHP原生逻辑。
结合 sql 动态查询,非常灵活 代码可读性差,性能不佳,安全性需特别注意 需要根据URL参数动态改变查询条件的简单场景。

核心建议:

  1. 优先使用 {dede:global name='xxx'}:这是获取 $_GET 参数最标准、最安全的方式,90% 的需求都可以用它解决。
  2. 谨慎使用 {dede:php}:只在确实需要原生PHP逻辑且无法用织梦标签实现时使用,在 php 标签内,如果变量要输出到HTML,请记得使用 htmlspecialchars() 函数进行转义,防止XSS攻击。
  3. 对于列表页筛选,修改底层文件是最佳方案:如果你需要实现一个完整的、高性能的列表筛选功能(如按价格、品牌、时间筛选),最正确的方法是修改列表页的底层处理类(通常是 arc.listview.class.php),在 GetListSql() 方法中增加对 $_GET 参数的判断和 WHERE 子句的拼接,这样既安全又高效。

希望这份详细的指南能帮助你在织梦CMS模板开发中游刃有余!

-- 展开阅读全文 --
头像
织梦为何不生成index.html?
« 上一篇 昨天
dede织梦淘宝客模板65533是什么?
下一篇 » 昨天

相关文章

取消
微信二维码
支付宝二维码

目录[+]