织梦表单如何获取来源地址?

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

使用织梦自带变量(最简单、推荐)

织梦系统已经预定义了获取HTTP请求头信息的变量,其中就包括来源地址,你不需要做任何额外的设置,直接在表单模板文件中使用即可。

织梦表单获取来源地址
(图片来源网络,侵删)

核心变量: {dede:global name='http_referer' /}

这个变量会直接输出用户访问当前页面之前的那个页面的完整URL。

使用场景:

假设你有一个自定义的表单,模板文件是 templets/default/feedback_form.htm,你可以在表单的 <input> 标签中添加一个隐藏域,用来接收来源地址。

织梦表单获取来源地址
(图片来源网络,侵删)

示例代码:

在你的表单模板中,找到 <form> 标签,并在里面添加如下隐藏的输入框:

<form name="form1" action="/plus/diy.php" enctype="multipart/form-data" method="post">
    <!-- 其他表单字段, -->
    <input type="text" name="name" placeholder="您的姓名" />
    <textarea name="message" placeholder="留言内容"></textarea>
    <!-- 【关键部分】添加一个隐藏域来保存来源地址 -->
    <input type="hidden" name="source_url" value="{dede:global name='http_referer' /}" />
    <!-- 安全验证码 -->
    <input type="hidden" name="dede_fields" value="name,text;message,text;source_url,text" />
    <input type="hidden" name="dede_fieldshash" value="这里需要生成hash值" />
    <button type="submit">提交</button>
</form>

说明:

  1. <input type="hidden" name="source_url" value="{dede:global name='http_referer' /}" />:

    织梦表单获取来源地址
    (图片来源网络,侵删)
    • name="source_url": 这个 name 值会对应到你后台数据表中的字段名。
    • value="{dede:global name='http_referer' /}": 这里将来源地址的值赋给这个隐藏域。
  2. dede_fields:

    • 你需要在这个字段中声明你新增加的 source_url 字段,格式是 字段名,字段类型,因为来源地址是文本,所以类型是 text,用分号 分隔各个字段。
  3. dede_fieldshash:

    • 这个值是根据 dede_fields 和你在后台添加的字段生成的,用于表单提交的安全验证。直接复制粘贴你原来的hash值是不行的,必须重新生成。
    • 如何生成hash值?
      1. 先在后台添加好 source_url 字段(类型为“单行文本”)。
      2. 不做任何修改,直接去前台提交一次表单(可以随便填)。
      3. 提交后会提示“字段验证失败”,并会显示一个正确的 hash 值。
      4. 复制这个正确的 hash 值,替换掉模板中的 dede_fieldshash 的值。

使用JavaScript获取(更灵活,可处理特殊情况)

{dede:global name='http_referer' /} 可能为空,比如用户直接在浏览器地址栏输入表单地址,或者通过书签访问,这时,用JavaScript在前端获取会更可靠,因为它可以在表单提交前动态设置值。

示例代码:

在表单模板中,使用JavaScript来获取来源地址并填充到隐藏域。

<form name="form1" action="/plus/diy.php" enctype="multipart/form-data" method="post" onsubmit="return setSourceUrl()">
    <!-- 其他表单字段 -->
    <input type="text" name="name" placeholder="您的姓名" />
    <textarea name="message" placeholder="留言内容"></textarea>
    <!-- 【关键部分】一个空的隐藏域,由JS来填充 -->
    <input type="hidden" name="source_url" id="source_url_input" value="" />
    <!-- 安全验证码 -->
    <input type="hidden" name="dede_fields" value="name,text;message,text;source_url,text" />
    <input type="hidden" name="dede_fieldshash" value="这里需要生成hash值" />
    <button type="submit">提交</button>
</form>
<script type="text/javascript">
    // 在表单提交时执行此函数
    function setSourceUrl() {
        // 获取来源地址
        var referer = document.referrer;
        // 如果来源地址为空(比如直接访问),可以设置一个默认值
        if (!referer) {
            referer = "直接访问"; // 或者 window.location.href
        }
        // 将获取到的值填充到隐藏域中
        document.getElementById('source_url_input').value = referer;
        // 返回 true,让表单正常提交
        return true;
    }
</script>

JavaScript document.referrer 说明: document.referrer 属性返回载入当前文档的文档的URL,如果用户从直接地址栏输入或使用书签进入,则 document.referrer 为空字符串。

这种方法的优点:

  • 更可靠:即使织梦变量为空,JS也能尝试获取。
  • 可自定义:可以对来源地址进行处理,比如只取域名,或者添加默认值。

修改PHP处理文件(最强大,但有一定风险)

如果你需要对来源地址进行更复杂的处理,或者想在PHP后端统一处理所有表单的来源地址,你可以修改织梦的核心处理文件 plus/diy.php

⚠️ 警告: 修改核心文件意味着在下次织梦升级时,你的修改可能会被覆盖,请务必提前备份文件。

操作步骤:

  1. 备份文件:备份 plus/diy.php
  2. 编辑文件:打开 plus/diy.php 文件。
  3. 添加代码:找到处理表单数据的逻辑部分,通常在 if($dopost == 'send') 这个判断语句内,在将数据插入数据库之前,添加获取来源地址并赋值的代码。

示例代码:

plus/diy.php 中找到类似下面的代码段:

// ... 前面的代码 ...
if($dopost == 'send')
{
    // 获取表单提交的数据
    $fieldarr = array();
    $dtype = '';
    $dede_fields = empty($dede_fields) ? '' : trim($dede_fields);
    $dede_fieldshash = empty($dede_fieldshash) ? '' : trim($dede_fieldshash);
    // ... 原有的字段处理逻辑 ...
    // 【关键部分】在这里添加获取来源地址的代码
    // 检查POST数据中是否已经包含了来源地址(由JS或方法一提供)
    if(empty($source_url))
    {
        // 如果没有,则从HTTP头中获取
        $source_url = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '直接访问';
    }
    // 将来源地址添加到要插入数据库的数据数组中
    // 假设你的数据库字段名是 `source_url`
    $fieldarr['source_url'] = $source_url;
    // ... 后续将 $fieldarr 插入数据库的代码 ...
    // $inquery = "INSERT INTO `{$diy->table}` (`{$inaddfield}`) VALUES (`${inaddvalue}`);";
    // 你需要确保 $inaddfield 和 $inaddvalue 变量中包含了 `source_url` 字段。
    // 这通常意味着你仍然需要在模板中通过隐藏域传递这个字段,或者在这里动态构建SQL语句。
}

这种方法的复杂性: 这种方法比较复杂,因为它不仅要获取数据,还要确保这个新字段能被正确地拼接到最终的SQL插入语句中,对于大多数用户来说,方法一和方法二已经足够,且更安全、更易于维护。


总结与推荐

方法 优点 缺点 推荐度
织梦自带变量 最简单,无需额外代码,直接调用。 依赖浏览器,可能为空(直接访问时)。 ★★★★★ (首选)
JavaScript 灵活可靠,可处理空值,前端可控。 需要一点JS知识,用户禁用JS则无效(概率极低)。 ★★★★☆ (推荐备选)
修改PHP文件 功能最强大,后端统一处理,逻辑最严谨。 有风险,升级会覆盖,修改复杂,需要PHP基础。 ★★☆☆☆ (不推荐普通用户使用)

对于绝大多数情况,强烈推荐使用方法一,如果发现方法一在某些情况下(如直接访问)无法获取到值,再考虑使用方法二,将两者结合使用可以达到最佳效果。

-- 展开阅读全文 --
头像
织梦CMS百度编辑器怎么用?
« 上一篇 今天
dede小助手helper是什么?有何用?
下一篇 » 今天

相关文章

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

目录[+]