На лету / динамическая проверка 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);

Я надеюсь, что это полезно для других.

Другие вопросы по тегам