Основано на разговорах здесь:
вы поместили return $this->renderText("ok!")
в метод processForm
, но не в действие (например, executeCreate
). Переместите строку возврата и проверку состояния в метод executeXXX.
редактировать 2012-01-08
Я удалил свои старые фрагменты кода, потому что они больше не нужны, поскольку вы отредактировали свой оригинальный код, эффективно включив в него мои изменения.
относительно вашего нового вопроса:
в основном symfony1 api отстой при работе с формами, поэтому у вас так много проблем.
Прежде всего, вам нужно знать, что этот API не предназначен для работы с отправкой формы AJAX, когда дело доходит до проверки - это потому, что sfForm может проверять себя, может хранить свои ошибки внутри и может отображать их как HTML - но есть нет подпрограммы (насколько я знаю) для возврата ошибок в некотором сериализуемом формате (например, массив пар fieldname => errorMessage, которые хорошо кодируются json_encodes).
Начну с вашего кода, что бы я сделал на вашем месте:
Во-первых: создайте отдельное действие только для обработки представления ajax, при условии, что вы выполняете POST-запрос
public function exucuteAjaxFormSubmission(sfWebRequest $request)
{
//this action handles ONLY ajax so we can safely set appropriate headers
$this->getResponse()->setContentType('text/json');
$form = new form();
$form->bind($request->getPostParameters());
if ($form->isValid()) {
//do your logic for positive form submission, i.e. create or update record in db
return json_encode('ok'); //notify client that everything went ok
} else {
return $this->doSomeMagicToGetFormErrorsAsAnJsonEncodedArray();
}
}
Теперь перейдем к части doSomeMagicToGetFormErrorsAsAnJsonEncodedArray
: вы хотите получить ошибки формы в формате json. Для этого мы добавим простой метод в ваш класс формы (так как это ваш «интерфейс» к логике валидации).
Немного теории: внутренне sfForm хранит ошибки проверки в структуре, называемой sfValidatorErrorSchema. sfValidatorErrorSchema хранит ошибки в двух списках - namedErrors
и globalErrors
. Именованные ошибки - это те, которые вызываются для «валидаторов поля» (т. Е. Обязательный валидатор строки в поле name
. Глобальные ошибки - это те, которые генерируются для всей формы (т. Е. Глобальные postValidators). Каждая ошибка - это объект sfValidatorError, выданный ошибочным валидатором.
предупреждение: на самом деле эта структура является рекурсивной, но вы увидите ее, только если будете использовать встроенные формы , в этом случае необходимо изменить следующую функцию, чтобы включить ситуацию, в которой sfValidatorErrorSchema может содержать другую sfValidatorErrorSchema, а не sfValidatorError. Надеюсь, вы не используете встроенные формы, потому что это в Symfony отстой даже больше, чем API простых форм.
Но достаточно разговоров, если вам нужен код, скопируйте и вставьте эти методы в класс формы:
class myForm extends sfForm {
(...)
/** a helper method to convert error schema to an array */
public function getSerializableErrors()
{
$result = array();
foreach ($this->getErrorSchema()->getNamedErrors() as $fieldName => $error) {
$result[$fieldName] = $error->getMessage();
}
foreach ($this->getErrorSchema()->getGlobalErrors() as $error) {
$result['_globals'][] = $error->getMessage();
}
return $result;
}
/** screw array, just give me ready to send json! */
public function getJsonEncodedErrors()
{
return json_encode($this->getSerializableErrors());
}
}
Теперь просто измените doSomeMagicToGetFormErrorsAsAnJsonEncodedArray
на getJsonEncodedErros
, и вы закончили с отправкой базовой формы ajax с проверкой - у вас должно быть достаточно знаний для правильной реализации вашей логики. Я проверил это на текущей версии Symfony 1.4, поэтому, если что-то пойдет не так, это может быть проблемой старой версии sf (вы не сказали мне, какую версию вы используете)