Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript symfony 1.4不使用嵌入表单的动态添加表单小部件_Javascript_Forms_Dynamic_Symfony1_Widget - Fatal编程技术网

Javascript symfony 1.4不使用嵌入表单的动态添加表单小部件

Javascript symfony 1.4不使用嵌入表单的动态添加表单小部件,javascript,forms,dynamic,symfony1,widget,Javascript,Forms,Dynamic,Symfony1,Widget,我有一个symfony表单,需要通过jquery动态添加几个字段(小部件)。假设我有一个用户表单,我希望用户能够设置多个电子邮件地址 “电子邮件”只是一个简单的小部件,不是一个表单,所以使用嵌入表单,就像网络上的大多数教程一样,没有意义 最好的方法是什么?建议的方法是使用嵌入式表单,但我知道这对您没有什么用处(因为表单输入是通过Javascript添加的) 我建议的一种解决方案(尽管我很想知道其他人会如何解决这个问题)是从widget模式中删除email字段,只将其添加到您的验证模式中(使用自定

我有一个symfony表单,需要通过jquery动态添加几个字段(小部件)。假设我有一个用户表单,我希望用户能够设置多个电子邮件地址

“电子邮件”只是一个简单的小部件,不是一个表单,所以使用嵌入表单,就像网络上的大多数教程一样,没有意义


最好的方法是什么?

建议的方法是使用嵌入式表单,但我知道这对您没有什么用处(因为表单输入是通过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()中使用。我更喜欢将所有代码放在表单类中,而不是手动创建表单元素。我更喜欢将所有代码放在表单类中,而不是手动创建表单元素。