【问题标题】:Drupal save global variablesDrupal 保存全局变量
【发布时间】:2015-09-17 08:55:06
【问题描述】:

我在drupal中创建了一个表单来存储数据(对于匿名用户)所以当表单验证时我想保存它以便从所有页面访问它但是在这个函数之外不起作用变量是NULL

您能帮帮我还是有其他方法可以继续?

function myform_form_submit($form, &$form_state) {  

....
$GLOBALS ['info'] = $info;
}

【问题讨论】:

    标签: forms drupal global


    【解决方案1】:

    评估 Drupal 表单时,它会执行任何代码,包括数据库更改。但随后它将用户重定向到一个新页面,该页面丢弃了 PHP 会话,包括 $GLOBALS 等。

    更多的 Drupally 方式是使用持久变量,这些变量存储在“变量”数据库表中。

    variable_set 函数可以在这里使用。所以替换

    ### $GLOBALS['info'] = $info ### replace with:
    variable_set('mymodule_info', $info);
    

    然后当你访问它时,而不是使用 $GLOBALS,只需使用

    $info = variable_get('mymodule_info', NULL);
    

    您可以使用任何名称来指定变量。我将 NULL 作为第二个参数添加到 variable_get,以防数据库中不存在该值。

    如果数据与特定用户相关联,您可能需要执行类似的操作

    global $user;
    variable_set('mymodule_info_uid_' . $user->uid, $info);
    

    然后检索数据使用

    global $user;
    $info = variable_get('mymodule_info_uid_' . $user->uid, NULL);
    

    编辑:啊,现在我看到您正在与匿名用户打交道。在这种情况下,PHP 可以通过提供可以以相同方式使用的会话 id 来为您识别匿名用户:

    variable_set('mymodule_info_session_' . session_id(), $info);
    variable_get('mymodule_info_session_' . session_id(), NULL);
    

    这对于匿名用户的浏览会话应该是持久的。

    这种方法的问题是您需要想出一些方法来清除这些问题。您可能需要在 $info 变量中存储一个时间戳,并有一个 cron 作业从变量表中删除过期条目。

    【讨论】:

    • 谢谢我同意,但用户是匿名的,所以 $user->uid 不起作用
    • 更新为使用 session_id()
    • ok drupal 不会为匿名用户启动会话我在我的预处理页面中设置了这个// need to set something in the session or it will automatically be cleaned up. if (! isset ( $_SESSION ['nosave'] )) { drupal_session_start (); $_SESSION ['nosave'] = true; }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多