【发布时间】:2023-04-06 16:20:01
【问题描述】:
谁能建议如何最好地设置一个临时变量,其范围可在钩子之间使用?
我有一个自定义模块,用于检查尝试上传的文件是否与系统上的现有文件匹配并发出警告。
我正在使用 hook_form_alter 来识别特定的上传表单,并使用 hook_file_validate 来检查文件之前是否已上传。
我的问题是这两个钩子不共享一个公共参数 - 我需要将信息从 hook_form_alter 传递回 hook_validate。
我希望函数共享的信息是一个简单的布尔值,应在文件上传完成/关闭时立即销毁,因此使用 variable_set 将其持久保存到数据库是多余的。我也不认为 session 或 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';
}
}
上面的代码在 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