#php #symfony1
#php #symfony1
Вопрос:
У меня есть 2 формы: $patientForm
и $investigationForm
.
Они оба объединены в одно представление, поэтому пользователь заполняет поля, и создаются 2 записи в таблице пациентов и таблице исследований. Таблица исследований имеет внешний ключ — к имени пациента. Таким образом, у одного пациента может быть много исследований.
Итак, мне, очевидно, нужен идентификатор пациента, чтобы добавить его в запись расследования в качестве внешнего ключа. Однако идентификатор пациента не создается до тех пор, пока форма пациента не будет сохранена.
Итак, я разработал следующую функцию:
protected function processPatientInvestigation(sfWebRequest $request, sfForm $investigationForm, sfForm $patientForm)
{
$patientForm->bind($request->getParameter($patientForm->getName()), $request->getFiles($patientForm->getName()));
if ($patientForm->isValid() amp;amp; $investigationForm->isValid() ) {
$patientForm->save();
$values = $request->getParameter($investigationForm->getName());
$values['patient_id'] = $patientForm->getObject()->getId();
$investigationForm->bind($values, $request->getFiles($investigationForm->getName()));
$investigationForm->save();
}
Оператор if всегда завершается ошибкой, потому что $investigationForm
недействителен, пока я не присвою его полю формы patient_id
значение. Итак, на данный момент это значение пустое. Однако, если бы я просто взял isValid()
проверку $investigation
формы и поместил ее позже, после $patientForm
сохранения. Это означает, что если проверка не удалась и пользователь пропустил поле, то, когда они не нажимают отправить снова, вся функция будет запущена снова, что означает, что у нас будут дублирующиеся записи пациентов.
Итак, я думаю, что ответ заключается в том, чтобы поле patient_id не проверялось, поэтому оно может быть пустым и по-прежнему передавать isValid()
функцию.
Пожалуйста, дайте мне знать, если это непонятно. Надеюсь, вы можете посоветовать!
Ответ №1:
Попробуйте следующее, хотя это действительно должно быть сделано в методе forms configure.
$patientForm->getValidator('patient_id')->addOption('required', false);
Комментарии:
1. В итоге я поместил это в класс form.
Ответ №2:
Более чистым решением было бы установить все ваши правила проверки в /lib/form /*Form.class.php сам файл (вместо того, чтобы манипулировать им в вашем действии).
$this->validatorSchema['patient_id'] = new sf*Validator(array(
'required' => false
), array());
Если вы просто хотите, чтобы поле формы не было полностью проверено, используйте
$this->validatorSchema['patient_id'] = sfValidatorPass()
Ответ №3:
Я бы выбрал встроенные формы и позволил symfony правильно обрабатывать сохранение.
Комментарии:
1. Я знаю, я думаю, что мне следовало это сделать, но я поступил по-другому, и у меня не так много времени, чтобы изучать, как создавать встроенные формы сейчас.