我创建了一个这样的自定义表单类型:
class PositioningFlashType extends AbstractType
{
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'game' => new Game()
));
}
public function getParent()
{
return 'form';
}
/**
* Returns the name of this type.
*
* @return string The name of this type
*/
public function getName()
{
return 'positioning_flash';
}
}
在另一种形式(GameType
)类型中我使用它:
$builder
->add('flash', new PositioningFlashType(), array(
'mapped' => false,
'game' => $options['game']
))
在控制器内部我想创建整个表单:
private function createEditForm(Game $entity)
{
$form = $this->createForm(new GameType(), $entity, array(
'action' => $this->generateUrl('game_update', array('id' => $entity->getId())),
'method' => 'PUT',
'edit' => true,
'game' => $entity
));
$form->add('submit', 'submit', array('label' => 'Speichern'));
return $form;
}
所以基本上,我想要做的就是将Game
实例传递给PositioningFlashType
并在其内部的模板中我想要访问此game
实例这样:
value="{{ asset('data/swf/backendtool.swf') }}?game={{ game.id }}
但是symfony会抛出一个错误,说没有定义变量game
。
将变量从控制器传递给嵌套FormType的正确方法是什么?
答案 0 :(得分:23)
您可以通过包装buildView()
来添加自定义视图变量。
/* ... */
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;
/* ... */
class PositioningFlashType extends AbstractType
{
/* ... */
public function buildView(FormView $view, FormInterface $form, array $options)
{
parent::buildView($view, $form, $options);
$view->vars = array_merge($view->vars, array(
'game' => $options['game']
));
}
/* ... */
}
您现在game
下的form.vars
。只需覆盖您的自定义表单小部件即可执行您需要执行的任何操作。
{% block positioning_flash_widget %}
{% spaceless %}
{# ... #}
<input value="{{ form.vars.game.id }}" />
{% endspaceless %}
{% endblock %}