Forms Drupal保存全局变量

Forms Drupal保存全局变量,forms,drupal,global,Forms,Drupal,Global,我在drupal中创建了一个表单来存储数据(对于非匿名用户),因此当表单为validate时,我希望保存它以从所有页面访问它,但在该函数之外不起作用,变量为NULL 你能帮我吗?或者你有别的方法继续吗 function myform_form_submit($form, &$form_state) { .... $GLOBALS ['info'] = $info; } 当计算Drupal表单时,它会执行任何代码,包括数据库更改。但随后它将用户重定向到一个新页面,该页面将丢弃PHP

我在drupal中创建了一个表单来存储数据(对于非匿名用户),因此当表单为validate时,我希望保存它以从所有页面访问它,但在该函数之外不起作用,变量为NULL

你能帮我吗?或者你有别的方法继续吗

function myform_form_submit($form, &$form_state) {  

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

当计算Drupal表单时,它会执行任何代码,包括数据库更改。但随后它将用户重定向到一个新页面,该页面将丢弃PHP会话,包括$GLOBALS和其他内容

更简单的方法是使用持久变量,它们存储在“variables”数据库表中

该函数可在此处使用。因此,替换

### $GLOBALS['info'] = $info ### replace with:
variable_set('mymodule_info', $info);
然后当您访问它时,不要使用$GLOBALS,只需使用

$info = variable_get('mymodule_info', NULL);
可以使用任何名称指定变量。我将NULL作为第二个参数添加到变量_get中,以防该值在数据库中不存在

如果数据与特定用户关联,则可能需要执行以下操作

global $user;
variable_set('mymodule_info_uid_' . $user->uid, $info);
然后检索使用的数据

global $user;
$info = variable_get('mymodule_info_uid_' . $user->uid, NULL);
编辑:啊,现在我看到你在和匿名用户打交道。在这种情况下,PHP可以通过提供会话id为您识别匿名用户,该id可以以相同的方式使用:

variable_set('mymodule_info_session_' . session_id(), $info);
variable_get('mymodule_info_session_' . session_id(), NULL);
对于匿名用户的浏览会话,这应该是持久的


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

谢谢,我同意,但用户是annonym,因此$user->uid将不会工作更新以使用会话\u id()ok drupal不为匿名用户启动会话我在预处理页面中设置了这个
//需要在会话中设置一些内容,否则它将自动被清除。如果(!isset($_会话['nosave']){drupal_会话['nosave']开始();$_会话['nosave']=true;}