任何人都可以建议如何最好地设置一个临时变量,并在钩子之间使用范围?
我有一个自定义模块,目的是检查并警告尝试的文件上传是否与系统上的现有文件匹配。
我使用 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。
答案 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
关键字初始化的...。