Лучший способ динамически встраивать формы Symfony? - PullRequest
3 голосов
/ 05 марта 2011

Я уже некоторое время использую платформу форм Symfony.Но хотелось бы знать, есть ли у кого-то лучший подход к динамическому встраиванию форм.

Проблема возникает, когда я встраиваю форму (см. Ниже), мне нужно дать ей индекс массива, поскольку Фабиан объясняет, как sfFormОбъект похож на многомерный массив в этой статье Расширенные формы .

Если я хочу дать пользователю возможность нажать кнопку и встроить другую форму, как я могу добиться следующего, если они нажимают кнопку несколько раз:

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

...повторяется, сколько раз пользователь нажимает кнопку.Я могу использовать быстрый JavaScript для копирования и вставки элементов формы в DOM.

Вместо этого:

<input type="parent[child][1]" />
<input type="parent[child][2]" />
<input type="parent[child][3]" />

... повторяется, сколько раз пользователь нажимает кнопку.Требуется метод javascript для подсчета количества нажатий кнопки пользователем, т. Е. Для установки правильного индекса массива.Также требует, чтобы Ajax вызывал функцию PHP, которая встраивает форму с этим индексом массива.Я хотел бы избежать использования этого метода, если это возможно.

Как я встраиваю форму:

$parentForm = new ParentForm($parent)        

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

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

$parentForm->embedForm('child', $sfForm);

Ответы [ 3 ]

1 голос
/ 12 мая 2011

Я думаю, что вы можете взглянуть на ahDoctrineEasyEmbeddedRelationsPlugin http://www.symfony -project.org / плагины / ahDoctrineEasyEmbeddedRelationsPlugin Может быть, это будет полезно, даже если вам не нужно вставлять соответствующие записи в форму доктрины.

0 голосов
/ 11 октября 2012
0 голосов
/ 12 мая 2011

Эй, я нашел способ сделать!Сложная задача - переопределить метод 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;
  }
}

Теперь вам нужно только установить это в форму «обертки».Вот мой пример со схемой «Мастер имеет много подчиненных»:

  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);
  }

Обратите внимание на опцию 'slaves_count', которую я передаю из executeCreate следующим образом:

  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');
  }

Теперь вы можете легко использовать jQueryклонировать строки и не беспокоиться об индексе!Приветствия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...