Symfony: несколько форм - PullRequest
       3

Symfony: несколько форм

0 голосов
/ 15 апреля 2011

У меня есть следующая (упрощенная) таблица:

Service:
  product_name
  number_of_clients

После того, как кто-то выберет и сохранит Службу A с 3 клиентами и Службу B с 2 клиентами, я должен отобразить страницу с подробностями для Службы A и полей ввода(имя и адрес электронной почты) для 3 клиентов, затем данные для службы B и поля ввода для 2 клиентов.На этой странице информация о клиентах сохраняется в другой таблице в базе данных (навязанная структура БД).

Как создать произвольное количество форм для отображения под каждой службой и как правильно получить доступ к даннымв представленном виде впоследствии?Все формы редактируются и сохраняются одновременно, а не по отдельности.

Я просмотрел Расширенные формы , но это не сильно помогло.

Ответы [ 2 ]

1 голос
/ 16 апреля 2011

Вот пример с этой простой схемой. Вы должны быть в состоянии приспособить его к вашим потребностям.

//schema.yml

Client:
  columns:
    name: string(255)
    service_id: integer
  relations:
    Service:
      local: service_id
      foreign: id
      foreignAlias: Clients

Service:
  columns:
    name: string(255)

//routing.yml

//i added this route to split 'new' action in 2 steps
service_choose:
  url: /service/choose
  param: {module: service, action: choose}

service:
  class: sfDoctrineRouteCollection
  options:
    model: Service
    module: service

//create a module based on service route collection (there's a task) and add choose action:
  public function executeChoose(sfWebRequest $request)
  {
    $form = new ServiceChooseForm();
    if (($method = $this->request->getMethod()) == 'POST')
    {
      $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));

      if ($form->isValid())
      {
        $total_clients = $form->getValue('total_clients');
        $this->redirect('@service_new?total_clients='.$total_clients);
      }      
    }
    $this->form = $form;
    $this->setTemplate('choose');
  }

Вам также необходимо создать собственную форму sfForm для действия выбора, в которой вы устанавливаете количество клиентов.

class ServiceChooseForm extends sfForm
{
  public function configure()
  {
    $this->widgetSchema->setNameFormat('service[%s]');

    $this->setWidget('total_clients', new sfWidgetFormInput());
    $this->setValidator('total_clients', new sfValidatorInteger());
  }
}
//ServiceForm embeds your new clients forms based on total_clients option.
class ServiceForm extends BaseServiceForm
{
  public function configure()
  {
    //clients sub form
    $clientsForm = new sfForm();
    for ($i=0; $i<$this->getOption('total_clients',2); $i++)
    {
      $client = new Client();
      $client->Service = $this->getObject();

      $clientForm = new ClientForm($client);
      $clientsForm->embedForm($i, $clientForm);      
    }
    $this->embedForm('newClients', $clientsForm);
  }
}

Еще несколько настроек:

//chooseSuccess template, poinst a form to the same action:
<h1>New Service</h1>

<form action="<?php echo url_for('service_choose') ?>" method="post">
  <table>
    <tfoot>
      <tr>
        <td colspan="2">
          <?php echo $form->renderHiddenFields(false) ?>
          <input type="submit" value="Continue" />
        </td>
      </tr>
    </tfoot>
    <tbody>
      <?php echo $form ?>
    </tbody>
  </table>
</form>

//_form partial:

<form action="<?php echo url_for('@service_create?total_clients='. $form->getOption('total_clients')) ?>" method="post">

Вот и все. Надеюсь, вы можете собрать все это вместе =)

0 голосов
/ 15 апреля 2011

Извиняюсь, если я даю слишком простой ответ на ваш вопрос, но вы, конечно, можете по-разному называть / объявлять формы на основе одного и того же класса форм:

$form_1 = $form_2 = $form_3 = new someForm();

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

Затем вы можете получить доступ к данным для каждого отправленного объекта формы отдельно (возможно, через цикл или аналогичную конструкцию), так же, как вы бы сделали с одной формой.

...