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

Php 模块钩子函数之间的Drupal全局变量,php,drupal,drupal-7,drupal-hooks,Php,Drupal,Drupal 7,Drupal Hooks,有人能建议如何最好地设置一个临时变量,该变量的作用域在钩子之间使用吗? 我有一个自定义模块,用于检查和警告尝试上载的文件是否与系统上的现有文件匹配 我正在使用hook\u form\u alter识别特定的上传表单,并使用hook\u file\u validate检查文件是否以前上传过 我的问题是这两个钩子不共享一个公共参数-我需要将信息从hook\u form\u alter传递回hook\u validate 我希望函数共享的信息是一个简单的布尔值,应该在文件上传完成/取消后立即销毁它,因

有人能建议如何最好地设置一个临时变量,该变量的作用域在钩子之间使用吗?

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

我正在使用hook\u form\u alter识别特定的上传表单,并使用hook\u file\u validate检查文件是否以前上传过

我的问题是这两个钩子不共享一个公共参数-我需要将信息从hook\u form\u alter传递回hook\u validate

我希望函数共享的信息是一个简单的布尔值,应该在文件上传完成/取消后立即销毁它,因此使用variable_set将其持久化到数据库是一种过分的做法。我认为会话cookie方法也不是最好的

更新:

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';
    }
}
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';
    }
}
全球方法:

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';
    }
}
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';
    }
}
上面的代码在init hook中设置GLOBALS[processed],并在hook\u form\u alter中立即确认该值

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

勾选表单更改验证方法:

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';
    }
}
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';
    }
}
我试图添加一个自定义验证功能,但上传的图像仍然发生在我打算停止它的地方。我的代码如下:

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

使用变量_set将其持久化到数据库是过分的

我不认为它们是过分的(你可以很容易地删除变量),正如@2pha所提到的,不推荐使用全局变量。我认为您可以使用
variable\u set($name,$value)
variable\u get($name)
variable\u del($name)
而不用担心,除非您需要超级优化您的站点数据库查询。如果你真的不想使用变量函数,那么也许和cache_get()可以工作,因为你可以给它一个

编辑,变量方法:

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';
    }
}
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';
    }
}

…在成功或提交回调函数时,运行变量del($account->id()。'u processed')删除变量。

可能
$GLOBALS['processed']
是用
static
关键字在别处初始化的…?

您可以使用php的全局变量或$\u全局变量来存储全局值。使用全局变量不是一个好方法。为什么要使用钩子文件验证?你不能在hook\u form\u alter中添加你自己的自定义验证函数吗?我决定不使用变量函数的一个原因是因为该站点有许多编辑角色用户。很可能有两个或两个以上的人试图上传一个文件,而我的复制检查功能将发挥作用。我需要每个用户的“已处理”值都是唯一的,而userB没有机会检索userA的值。只需预先添加或附加用户的uid:
variable\u set($user->uid.\u variable\u name',$your\u value)