На лету / динамическая проверка CakePhp 3 и FormHelper
Я создаю "редактор форм" в CakePHP.
Интерфейс позволяет пользователю выбирать проверки для применения к полям, например, Числовой, Электронная почта и т. Д.
Таким образом, мне нужно динамически создать проверку для модели на основе пользовательского ввода. Для этого я могу использовать объект проверки: https://book.cakephp.org/3.0/en/core-libraries/validation.html
Я хочу воспользоваться возможностями FormHelper, например, автоматически выводить сообщения об ошибках для полей.
Я могу увидеть, как использовать жестко закодированный валидатор из модели, чтобы сделать это, установив валидатор в опции контекста для Form->create() - но как мне использовать объект $Validator customer, который был динамически создан?
Разъяснение:
У меня есть код в моем контроллере:
//get the form configuration
$form = $this->Forms->get($id, ['contain'=>['FormFields'=>['Validations']]]);
//set up validation based on the configuration
$validator = new Validator();
foreach($form->form_fields as $field){
...
if($field->required) $validator->notBlank($field->field_name);
}
$table = TableRegistry::get($form->type);
$table->setValidator($validator);
К сожалению, setValidator() не является методом TableRegistry.
Если я установлю проверку в модели, мне понадобится параметр $id для поиска правильной конфигурации формы.
1 ответ
Я добавил следующий код в мою модель:
protected $validator = null;
public function validationDefault(Validator $validator){
if($this->validator != null) return $this->validator;
return $validator;
}
public function setValidator(Validator $validator){
$this->validator = $validator;
}
Таким образом, валидатор по умолчанию может быть эффективно установлен с помощью метода setValidator.
Тогда в моем контроллере:
//get the form configuration
$form = $this->Forms->get($id, ['contain'=>['FormFields'=>['Validations']]]);
//set up validation based on the configuration
$validator = new Validator();
foreach($form->form_fields as $field){
...
if($field->required) $validator->notBlank($field->field_name);
}
$table = TableRegistry::get($form->type);
$table->setValidator($validator);
Я надеюсь, что это полезно для других.