我会按照从最推荐、最安全不推荐、有风险的顺序为你介绍几种方法。

dedecms 在模板里引入php文件
(图片来源网络,侵删)

使用 {dede:include} 标签(最常用、最推荐)

这是 Dedecms 官方提供的、用于在模板中引入其他模板文件(或包含PHP代码的文件)的标准方法,它是最灵活、最规范的方式。

适用场景

  • 引入一个独立的模板文件(如 head.htm, footer.htm)。
  • 引入一个包含PHP逻辑和HTML混合的文件。

语法

{dede:include file='文件路径' ismake='是否为绝对路径'}

参数说明

dedecms 在模板里引入php文件
(图片来源网络,侵删)
  • file必需参数,要引入的文件路径。
    • 相对路径:相对于 templets/你的模板目录/ 的路径,引入 include/ 目录下的 side.php 文件,就写 include/side.php
    • 绝对路径:如果你想引入 templets/system/ 目录下的文件,可以设置 ismake='yes',然后写完整路径,如 templets/system/float.htm,但通常不推荐这样做,不利于模板迁移。
  • ismake:可选参数,默认为 nono 表示相对路径,yes 表示绝对路径。

示例

假设你的模板文件是 article_article.htm,你想在文章内容下方引入一个 "相关文章" 的列表,而这个列表的逻辑和HTML都写在 include/related_articles.php 文件中。

  1. 创建 include/related_articles.php 文件 这个文件里可以写PHP代码,也可以直接写HTML,DedeCMS 在解析时会先执行其中的PHP代码。

    <!-- include/related_articles.php -->
    <?php
    // 获取当前文章的ID
    $arcID = $aid;
    // 调用DedeCMS的内置函数来获取相关文章
    // 这里只是示例,具体SQL或函数根据你的需求来写
    $relatedItems = array();
    // 假设我们有一个简单的逻辑来获取相关文章
    // 在实际项目中,你可能会查询数据库或使用DedeCMS提供的标签
    $dsql = new DedeSql(false);
    $sql = "SELECT * FROM `dede_archives` WHERE id != $arcID ORDER BY rand() LIMIT 5";
    $dsql->SetQuery($sql);
    $dsql->Execute('me');
    while ($row = $dsql->GetArray('me')) {
        $relatedItems[] = $row;
    }
    ?>
    <div class="related-articles">
        <h3>相关文章</h3>
        <ul>
            <?php if (!empty($relatedItems)): ?>
                <?php foreach ($relatedItems as $item): ?>
                    <li>
                        <a href="<?php echo GetOneArchive($item['id']); ?>">
                            <?php echo $item['title']; ?>
                        </a>
                    </li>
                <?php endforeach; ?>
            <?php else: ?>
                <li>暂无相关文章</li>
            <?php endif; ?>
        </ul>
    </div>
  2. 在模板文件 article_article.htm 中引入 在你想要显示相关文章的位置,加入以下标签:

    dedecms 在模板里引入php文件
    (图片来源网络,侵删)
    <!-- article_article.htm -->
    <article>
        {dede:field.body/}
    </article>
    <!-- 引入我们创建的相关文章文件 -->
    {dede:include file='include/related_articles.php'/}
    <footer>
        <!-- 页脚内容 -->
    </footer>

优点

  • 官方支持:最标准、最稳定的方式。
  • 灵活:可以引入任何类型的文件,只要服务器能解析。
  • 安全:DedeCMS会对引入路径进行一定的安全检查,比直接使用 requireinclude 函数更安全。

使用 {dede:php} 标签(用于执行内联PHP代码)

如果你的PHP代码逻辑比较简单,不想创建单独的文件,可以直接在模板文件中使用这个标签。

适用场景

  • 在模板中执行一些简单的PHP变量计算、条件判断等。
  • 不建议在这里写复杂的数据库查询或业务逻辑,会使模板难以维护。

语法

{dede:php}
    // 在这里写你的PHP代码
    // 注意:这里的代码可以直接访问DedeCMS的全局变量,如 $arcID, $typeid 等
{/dede:php}

示例: 在文章模板中,根据文章ID的奇偶数给文章内容添加不同的CSS类。

<article class="{dede:php}
    if ($arcID % 2 == 0) {
        echo 'even-content';
    } else {
        echo 'odd-content';
    }
{/dede:php}">
    {dede:field.body/}
</article>

优点

  • 方便快捷,适合简单逻辑。
  • 代码和模板放在一起,逻辑直观。

缺点

  • 可维护性差:如果PHP代码变多,会使模板文件变得臃肿和混乱。
  • 违反关注点分离原则:模板应该只负责展示,不应该包含复杂的业务逻辑。

直接使用 PHP 函数(不推荐,有安全风险)

这是最直接的方法,但也是最危险的方法,它完全绕过了DedeCMS的安全机制。

适用场景

  • 仅在完全可控的本地开发环境,且你非常清楚风险时,用于快速调试。
  • 绝不用于生产环境。

语法

<?php
    // 直接在这里写PHP代码
    require_once('/path/to/your/file.php');
    // 或者
    $result = your_custom_function();
?>

示例

<div class="custom-box">
    <?php
        // 假设这是一个自定义的函数,在extend.func.php中定义
        echo getCustomAd();
    ?>
</div>

巨大风险

  1. 安全漏洞:直接使用 require, include, file_get_contents 等函数,如果文件路径由用户输入控制(如 ?id=../config.php),极易导致 文件包含漏洞,导致网站被黑客控制。
  2. 路径问题:相对路径是基于当前执行脚本的,而不是模板文件所在的位置,很容易出错。
  3. 破坏模板结构:直接使用PHP标签会破坏DedeCMS模板的标签解析机制,可能导致其他标签失效。

总结与最佳实践

方法 优点 缺点 推荐度 适用场景
{dede:include} 安全、灵活、官方推荐 需要创建单独文件 ⭐⭐⭐⭐⭐ 绝大多数情况下的首选,引入独立的模板或逻辑文件。
{dede:php} 方便,适合简单逻辑 可维护性差,混合业务逻辑 ⭐⭐⭐ 简单的变量处理、条件判断,避免复杂代码。
直接PHP 直接、快速 极高风险、不安全 强烈不推荐,仅用于本地临时调试。

最佳实践建议

  1. 优先使用 {dede:include}:将你的PHP代码和HTML放在一个独立的文件中(例如在 templets/你的模板/include/ 目录下),然后在模板中用 {dede:include} 引入,这是最清晰、最安全、最易于维护的方式。
  2. 将复杂逻辑封装到函数:如果某个功能需要在多个模板中复用,不要在每个模板里都写一遍,最好的做法是:
    • extend.func.php 文件中定义一个自定义函数。
    • 在模板中使用 {dede:php} 调用这个函数,或者使用DedeCMS的 {dede:field function='myFunction()' /} 标签来调用。
  3. 保持模板的纯粹性:尽量让 .htm 模板文件只包含HTML和DedeCMS标签,避免直接嵌入大段的PHP代码。

{dede:include} 的文件路径再强调一下: 如果你的模板目录是 /templets/default/{dede:include file='include/header.php'} 实际上引入的是 /templets/default/include/header.php,这个规则一定要记清楚。