【问题标题】:Drupal global variables between module hook functions模块挂钩函数之间的 Drupal 全局变量
【发布时间】:2023-04-06 16:20:01
【问题描述】:

谁能建议如何最好地设置一个临时变量,其范围可在钩子之间使用?

我有一个自定义模块,用于检查尝试上传的文件是否与系统上的现有文件匹配并发出警告。

我正在使用 hook_form_alter 来识别特定的上传表单,并使用 hook_file_validate 来检查文件之前是否已上传。

我的问题是这两个钩子不共享一个公共参数 - 我需要将信息从 hook_form_alter 传递回 hook_validate。

我希望函数共享的信息是一个简单的布尔值,应在文件上传完成/关闭时立即销毁,因此使用 variable_set 将其持久保存到数据库是多余的。我也不认为 sessioncookie 方法是最好的。

更新:

全局方法:

function duplicate_uploads_warning_init(){
    $GLOBALS['processed'] = 'testing';
}

function duplicate_uploads_warning_file_validate($file){
    drupal_set_message("PROCESSED[file-validate]: {$GLOBALS['processed']}", 'warning');
}

function duplicate_uploads_warning_form_alter(&$form, &$form_state, $form_id){
    if( $form_id == 'file_entity_add_upload' ){
        drupal_set_message("PROCESSED[form-alter]: {$GLOBALS['processed']}", 'error');
        $GLOBALS['processed'] = 'tested';
        $form['#validate'][] = 'duplication_validate';
    }
}

上面的代码在 init hook 中设置了 GLOBALS[processed] 并且该值立即在 hook_form_alter 中确认。

但是,尝试将值重新分配给 tested 失败。重新分配的值是我希望在 hook_file_validate 中看到的,但我仍然得到 testing 的初始值。

Hook_form_alter 验证方法:

我尝试添加自定义验证功能,但图像的上传仍然发生在我打算停止它的地方。我的代码如下:

function duplication_validate($form, &$form_state) {
    $data = duplicates($form_state['complete form']['upload']['#file']->filename);
    if( sizeof($data) > 0 ){
        form_set_error('test', 'testing validation');
        return false;
    }
}

我可以确认我的 $data 变量有内容并且 sizeof 测试返回大于 0。

【问题讨论】:

  • 可以使用php的全局变量或者$_GLOBAL变量来存储全局值。
  • 使用全局变量不是一个好方法。你为什么使用 hook_file_validate ?就不能在 hook_form_alter 中添加自己的自定义验证函数吗?

标签: php drupal drupal-7 drupal-hooks


【解决方案1】:

使用 variable_set 将其持久化到数据库是多余的

我不同意它们是矫枉过正(您可以轻松删除变量),并且正如@2pha 所提到的,不推荐使用全局变量。我认为您可以使用variable_set($name, $value)variable_get($name)variable_del($name) 而不必担心,除非您需要超级优化您的站点数据库查询。如果您真的不想使用 variable_* 函数,那么 cache_set() 和 cache_get() 可能会起作用,因为您可以给它一个 temporary status

编辑,变量方法:

function duplicate_uploads_warning_init(){
    $account = \Drupal::currentUser();
    variable_set($account->id() . '_processed', 'testing');
}

function duplicate_uploads_warning_file_validate($file){
    $account = \Drupal::currentUser();
    $processed_var = variable_get($account->id() . '_processed');
    drupal_set_message("PROCESSED[file-validate]: {$processed_var}", 'warning');
}

function duplicate_uploads_warning_form_alter(&$form, &$form_state, $form_id){
    if( $form_id == 'file_entity_add_upload' ){
        $account = \Drupal::currentUser();
        $processed_var = variable_get($account->id() . '_processed');
        drupal_set_message("PROCESSED[form-alter]: {$processed_var}", 'error');
        variable_set($account->id() . '_processed', 'tested');
        $form['#validate'][] = 'duplication_validate';
    }
}

...并在成功或#submit 回调函数中运行variable_del($account->id() . '_processed') 以删除变量。

【讨论】:

  • 我决定不使用 variable_* 函数的一个原因是该站点有许多编辑角色用户。很有可能有两个或更多人尝试上传文件,而我的重复检查功能将启动。我需要每个用户的“已处理”值是唯一的,而 userB 没有机会检索 userA 的值。
  • 只需前置或附加用户的 uid:variable_set($user->uid . '_variable_name', $your_value);
【解决方案2】:

也许$GLOBALS['processed'] 在其他地方用static 关键字初始化......?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2012-06-03
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    相关资源
    最近更新 更多