Symfony1 动态嵌入表单的更好方法symfony?

Symfony1 动态嵌入表单的更好方法symfony?,symfony1,Symfony1,我使用Symfony的表单框架已经有一段时间了。但我想知道是否有人有更好的方法来动态嵌入表单 当我嵌入一个表单(见下图)时,问题就出现了,我需要给它一个数组索引,正如Fabian在本文中解释sfForm对象如何像多维数组一样 如果我想让用户能够单击一个按钮并嵌入另一个表单,如果他们多次单击按钮,我如何实现以下目标: <input type="parent[child][]" /> <input type="parent[child][]" /> <input typ

我使用Symfony的表单框架已经有一段时间了。但我想知道是否有人有更好的方法来动态嵌入表单

当我嵌入一个表单(见下图)时,问题就出现了,我需要给它一个数组索引,正如Fabian在本文中解释sfForm对象如何像多维数组一样

如果我想让用户能够单击一个按钮并嵌入另一个表单,如果他们多次单击按钮,我如何实现以下目标:

<input type="parent[child][]" />
<input type="parent[child][]" />
<input type="parent[child][]" />

我想你可以看看一个医生式的植根关系
即使您不需要在条令表单中嵌入相关记录,它也可能有用。

嘿,我找到了一种方法!这里棘手的部分是重写sfWidgetFormSchema::generateName方法

class myWidgetFormSchema extends sfWidgetFormSchema
{

  /**
   * Generates a name.
   *
   */
  public function generateName($name)
  {
    $name = parent::generateName($name);
    //match any [number] and replace it with []
    $name = preg_replace('/\[\d+\]/','[]', $name);
    return $name;
  }
}
现在,您只需要将其设置为“包装器”表单。下面是我的“主有许多从”模式示例:


现在您可以轻松地使用jQuery克隆行,而不用担心索引!干杯。

这似乎很棒:

以我的经验,我只听过AJAX方法——事实上,我现在正在开发这样一个模块。避免这种情况的动机是什么?我意识到在JS代码中可以复制AJAX功能,而不必实际使用AJAX——AJAX所做的只是返回一堆带有表单字段的HTML,例如。不确定这是否解决了您的问题。谢谢。Geeez很抱歉我花了这么长时间才投赞成票。我更喜欢允许用户使用jQuery克隆行。缪奇更好。。。。。
$parentForm = new ParentForm($parent)        

$child = new child();
$child->setParent($parent);

$sfForm = new sfForm();
$sfForm ->embedForm($someIndex, new ChildForm($child));

$parentForm->embedForm('child', $sfForm);
class myWidgetFormSchema extends sfWidgetFormSchema
{

  /**
   * Generates a name.
   *
   */
  public function generateName($name)
  {
    $name = parent::generateName($name);
    //match any [number] and replace it with []
    $name = preg_replace('/\[\d+\]/','[]', $name);
    return $name;
  }
}
  public function configure()
  {
    $this->getWidgetSchema()->setFormFormatterName('list');
    $this->widgetSchema->setNameFormat('master[%s]');

    $slavesForm = new sfForm();
    $slavesForm->setWidgetSchema(new myWidgetFormSchema);
    $slavesCount = $this->getOption('slaves_count', 2);
    for ($i = 0; $i < $slavesCount; $i++)
    {
      $slave = new Slave();
      $slave->Master = $this->getObject();
      $form = new SlaveForm($slave);
      $slavesForm->embedForm($i, $form);
    }
    $this->embedForm('new_slaves', $slavesForm);
  }
  public function executeCreate(sfWebRequest $request)
  {
    $schema = $this->getRequest()->getParameter('master');

    $this->form = new MasterNewForm(null, array('slaves_count'=> count($schema['new_slaves'])));

    $this->processForm($request, $this->form);

    $this->setTemplate('new');
  }