#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
методе сохранения