【问题标题】:symfony 1.4 dynamic add form widgets without using embeded formssymfony 1.4 动态添加表单小部件而不使用嵌入式表单
【发布时间】:2011-02-11 18:08:02
【问题描述】:

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

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

最好的方法是什么?

【问题讨论】:

  • 我希望有一种方法可以将我的所有代码放在表单类中,而不是手动创建表单元素。

标签: javascript forms dynamic symfony1 widget


【解决方案1】:

建议的方法是使用嵌入式表单,但我知道这对您没有用处(鉴于表单输入是通过 Javascript 添加的)。

我建议的一个解决方案(虽然很想看看其他人会如何解决这个问题)是从小部件架构中删除 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
    }
  }
}

您的模板中会包含该字段(手动是)。

<input type="text" name="email[]" />
<input type="text" name="email[]" />
<input type="text" name="email[]" />
<input type="text" name="email[]" />

我仍然希望看到其他人的建议,因为这对我来说也很骇人。

【讨论】:

  • 与 tihs 教程 tech.cibul.org/embedded-forms-with-symfony-1-4-and-jquery 类似的方法如何,但不使用嵌入表单,而是将普通小部件和验证器添加到表单中?这可以做到吗?我不想仅仅为一个简单的电子邮件字段创建一个表单来使用嵌入表单。
  • 我查看了您提供的文章,虽然他是通过嵌入式表单实现的,但我发现它过于复杂。该文章中提供的解决方案的优点是您不必手动处理验证。与您在没有嵌入式表单的情况下实现该解决方案的问题一样,我认为这是不可能的。
  • 由于没有人给出其他想法,我已经实现了你所说的,但我有一个问题。由于表单名称格式,我必须像这样命名我的输入:user[email][]。问题是在 doSave() 方法中,我得到“数组”作为电子邮件字段的值,而不是具有值的真实数组。
  • 您必须重写 updateObject 方法,以便将数组保存为关系。
  • 我解决了。在验证器中,我需要添加这一行 return (array)$value;在 foreach 循环之后。这样 symfony 会以数组形式返回正确的值,以便在 updateObject() 中使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多