我创建了一个像这样的自定义表单类型:
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 的正确方法是什么?
您可以通过包装
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 %}