Javascript symfony 1.4不使用嵌入表单的动态添加表单小部件
我有一个symfony表单,需要通过jquery动态添加几个字段(小部件)。假设我有一个用户表单,我希望用户能够设置多个电子邮件地址 “电子邮件”只是一个简单的小部件,不是一个表单,所以使用嵌入表单,就像网络上的大多数教程一样,没有意义Javascript symfony 1.4不使用嵌入表单的动态添加表单小部件,javascript,forms,dynamic,symfony1,widget,Javascript,Forms,Dynamic,Symfony1,Widget,我有一个symfony表单,需要通过jquery动态添加几个字段(小部件)。假设我有一个用户表单,我希望用户能够设置多个电子邮件地址 “电子邮件”只是一个简单的小部件,不是一个表单,所以使用嵌入表单,就像网络上的大多数教程一样,没有意义 最好的方法是什么?建议的方法是使用嵌入式表单,但我知道这对您没有什么用处(因为表单输入是通过Javascript添加的) 我建议的一种解决方案(尽管我很想知道其他人会如何解决这个问题)是从widget模式中删除email字段,只将其添加到您的验证模式中(使用自定
最好的方法是什么?建议的方法是使用嵌入式表单,但我知道这对您没有什么用处(因为表单输入是通过Javascript添加的) 我建议的一种解决方案(尽管我很想知道其他人会如何解决这个问题)是从widget模式中删除
email
字段,只将其添加到您的验证模式中(使用自定义回调)
未经测试,但可作为指导
class YourForm extends sfForm {
public function configure() {
$this->setValidators(array(
'email' => new sfValidatorCallback(array(
'callback' => array($this, 'my_email_validator')
))
));
}
public function my_email_validator($validator, $value) {
$email_validator = new sfValidatorEmail();
try {
foreach($value as $email) { // multiple fields with the same name
$email_validator->clean($email); // throws exception when not valid
}
}
catch(sfValidatorError $e) {
// $email is invalid - notify user or whatever
// you could also rethrow a sfValidatorError so that the form->isValid
// would return false
}
}
}
您的模板中将包含字段(手动是)
我仍然希望看到其他人的建议,因为这在我看来也有点黑客味。建议的方法是使用嵌入式表单,但我知道这对您没有什么用处(因为表单输入是通过Javascript添加的) 我建议的一种解决方案(尽管我很想知道其他人会如何解决这个问题)是从widget模式中删除
email
字段,只将其添加到您的验证模式中(使用自定义回调)
未经测试,但可作为指导
class YourForm extends sfForm {
public function configure() {
$this->setValidators(array(
'email' => new sfValidatorCallback(array(
'callback' => array($this, 'my_email_validator')
))
));
}
public function my_email_validator($validator, $value) {
$email_validator = new sfValidatorEmail();
try {
foreach($value as $email) { // multiple fields with the same name
$email_validator->clean($email); // throws exception when not valid
}
}
catch(sfValidatorError $e) {
// $email is invalid - notify user or whatever
// you could also rethrow a sfValidatorError so that the form->isValid
// would return false
}
}
}
您的模板中将包含字段(手动是)
我仍然希望看到其他人的建议,因为这在我看来也有点骇人听闻。类似于tihs教程的一个方法,但不使用嵌入表单,而是在表单中添加普通的小部件和验证程序,怎么样?这能做到吗?我不想只为一个简单的电子邮件字段创建一个表单来使用嵌入表单。我查看了您提供的文章,虽然他是通过嵌入表单实现的,但我发现它太复杂了。本文中提供的解决方案的优点是,您不必手动处理验证。至于你提出的在没有嵌入表单的情况下实现该解决方案的问题,我认为这是不可能的。因为没有人给出其他想法,我已经实现了你所说的,但我有一个问题。由于表单名称格式,我必须将输入命名为:user[email][]。问题是,在doSave()方法中,我得到的是“Array”作为email字段的值,而不是包含这些值的实际数组。您必须重写
updateObject
方法,以便将数组另存为关系。我解决了它。在验证器中,我需要添加此行return(array)$value;在foreach循环之后。通过这种方式,symfony将正确的值作为数组返回,以便在updateObject()中使用。如果使用类似于tihs教程的方法,但不使用嵌入的表单,而是将普通的小部件和验证器添加到表单中,怎么样?这能做到吗?我不想只为一个简单的电子邮件字段创建一个表单来使用嵌入表单。我查看了您提供的文章,虽然他是通过嵌入表单实现的,但我发现它太复杂了。本文中提供的解决方案的优点是,您不必手动处理验证。至于你提出的在没有嵌入表单的情况下实现该解决方案的问题,我认为这是不可能的。因为没有人给出其他想法,我已经实现了你所说的,但我有一个问题。由于表单名称格式,我必须将输入命名为:user[email][]。问题是,在doSave()方法中,我得到的是“Array”作为email字段的值,而不是包含这些值的实际数组。您必须重写updateObject
方法,以便将数组另存为关系。我解决了它。在验证器中,我需要添加此行return(array)$value;在foreach循环之后。通过这种方式,symfony将正确的值作为数组返回,以便在updateObject()中使用。我更喜欢将所有代码放在表单类中,而不是手动创建表单元素。我更喜欢将所有代码放在表单类中,而不是手动创建表单元素。