symfony — не сохраняются встроенные формы и виджеты форм

#symfony1 #symfony-1.4 #symfony-forms

#symfony1 #symfony-1.4 #symfony-forms

Вопрос:

У меня есть встроенная форма, для которой я пытаюсь настроить виджеты.

В настоящее время я просто выводю форму в _form.php шаблоне, подобном:

 <?php echo $form ?> 
  

Это здорово, но я хотел бы, чтобы поля моей формы располагались в определенном порядке, поэтому я решил попробовать:

 <?php echo $form['firstname']->renderRow() ?> 
<?php echo $form['lastname']->renderRow() ?> 
<?php echo $form['email_address']->renderRow() ?> 
  

Это выдает ошибку недопустимого виджета.

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

 <?php
class labSupportForm extends sfGuardUserAdminForm
{
   public function configure()
   {
     $form = new labSupportProfileForm($this->getObject()->getProfile());
     $this->embedForm('profile', $form);

   unset($this['is_super_admin'], $this['is_admin'], $this['permissions_list'], $this['groups_list']);

   $this->widgetSchema['profile'] = $form->getWidgetSchema();
   $this->validatorSchema['profile'] = $form->getValidatorSchema();
 }

 public function save($con = null)
 {
   $user = parent::save($con);
   if (!$user->hasGroup('Lab Support'))
   {
     $user->addGroupByName('Lab Support');
     $user->save();
   }
   return $user;
 }
}
  

и:

 <?php
class labSupportProfileForm extends sfGuardUserProfileForm
{
  public function configure()
  {
    unset($this['email_new'],
          $this['validate_at'],
          $this['validate'],
          $this['address_1'],
          $this['address_2'],
          $this['city'],
          $this['country'],
          $this['postcode'],
          $this['created_at'],
          $this['updated_at'],  
          $this['user_id'],   
          $this['is_super_admin'], 
          $this['is_admin'], 
          $this['permissions_list'], 
          $this['groups_list']);
   }
}
  

Но если я добавлю виджет / средство проверки в labSupportForm и сохраню, firstname значение не сохранится.

Я делаю здесь что-то не так, поскольку я бы подумал, что это значение сохранится.

Спасибо

Комментарии:

1. Вам не нужно писать $this-> widgetSchema[‘profile’] = $form->getWidgetSchema(), это автоматически обрабатывается методом embedForm, то же самое для схемы валидатора.

Ответ №1:

Когда вы отображаете форму по полям, вы должны явно вызвать $form->renderHiddenFields(). Например:

 <?php echo form_tag_for($form, '@url') ?>
  <table>
    <tfoot>
      <tr>
        <td colspan="2">
          <input type="submit" value="Save" />
          <?php echo $form->renderHiddenFields() ?>
        </td>
      </tr>
    </tfoot>
    <tbody>
      <?php echo $form['username']->renderRow() ?>
      <?php echo $form['profile_form']->renderRow() ?>
    </tbody>
  </table>
</form>
  

Кроме того, остерегайтесь называть имя встроенной формы таким же, как имя отношения (например, «профиль»), иначе у вас возникнут проблемы при ее сохранении. Просто добавьте суффикс ‘_form’, и вы будете в безопасности:

 $this->embedForm('profile_form', $form);
  

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

       <?php echo $form['username']->renderRow() ?>
      <?php echo $form['profile_form']['first_name']->renderRow() ?>
      <?php echo $form['profile_form']['last_name']->renderRow() ?>
  

Или вы можете сделать это автоматически для всех полей встроенной формы:

     <?php foreach ($form['profile_form'] as $field): ?>
      <?php if (!$field->isHidden()): ?>
        <?php echo $field->renderRow() ?>
      <?php endif; ?>
    <?php endforeach; ?> 
  

Ответ №2:

Вызовите $this->saveEmbeddedForms() в labSupportForm методе сохранения