Кто-нибудь может посоветовать, как лучше установить временную переменную с областью действия, которая будет использоваться между хуками?
У меня есть пользовательский модуль с целью проверки и предупреждения, если попытка загрузки файла совпадает с существующим файлом в системе.
я использую hook_form_alter определить конкретную форму загрузки и hook_file_validate проверить, был ли файл ранее загружен.
Моя проблема в том, что эти два крючка не имеют общего параметра — мне нужно передать информацию из hook_form_alter обратно в hook_validate.
Информация, которую я хочу, чтобы функции разделяли, является простым логическим значением, которое должно быть уничтожено сразу же после завершения загрузки файла, поэтому использование variable_set сохранять его в базе данных — это излишне. Я не верю сессия или же печенье подход также лучше.
ОБНОВЛЕНИЕ:
Глобальный подход:
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';
}
}
Приведенный выше код устанавливает GLOBALS [обработано] в ловушке инициализации, и это значение немедленно подтверждается в ловушке hook_form_alter.
Однако попытка переназначить значение проверенный выходит из строя. Переназначенное значение — это то, что я надеялся увидеть в hook_file_validate но я все еще получаю начальное значение тестирование.
Подход проверки 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 test возвращает больше 0.
использование variable_set для сохранения его в базе данных является излишним
Я не согласен с тем, что они излишни (вы можете легко удалять переменные), и, поскольку @ 2pha уже упоминали, что глобальные переменные не рекомендуются. Я думаю, что вы могли бы использовать variable_set($name, $value)
, variable_get($name)
, а также variable_del($name)
не беспокоясь, если вам не нужно супер-оптимизировать запросы базы данных ваших сайтов. если ты действительно не хотите использовать функции variable_ *, тогда возможно cache_set () и cache_get () может работать, потому что вы можете дать ему временный статус.
Изменить, подход переменных:
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')
удалить переменную.
может быть $GLOBALS['processed']
был инициализирован с static
ключевое слово в другом месте ….?