模块挂钩函数之间的Drupal全局变量

时间:2015-06-02 07:58:55

标签: php drupal drupal-7 drupal-hooks

任何人都可以建议如何最好地设置一个临时变量,并在钩子之间使用范围?

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

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

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

我希望函数共享的信息是一个简单的布尔值,应该在文件上传完成/解除后立即销毁,因此使用 variable_set 将其持久保存到数据库是一种过度杀伤力。我认为会话 Cookie 方法最好。

更新

Globals方法:

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钩子中设置GLOBALS [processed],并在hook_form_alter中立即确认该值。

但是,将值重新分配给测试的尝试失败。重新分配的值是我希望在 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。

2 个答案:

答案 0 :(得分:0)

  

使用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')以删除变量。

答案 1 :(得分:0)

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