我有一个如下表格:
class ItemType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
// ...
->add('tags','text',array(
'required' => false,
'attr' => array('name' => 'tags'),
'mapped' => false))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'MyBundle\ItemBundle\Entity\Item',
'cascade_validation' => true,
));
}
}
Run Code Online (Sandbox Code Playgroud)
我的编辑动作
public function editAction(Request $request, $id) {
$em = $this->getDoctrine()->getManager();
$entity = $em->getRepository('MyBundleItemBundle:Item')->find($id);
$form = $this->createForm(new ItemType(), $entity);
//$form->get('tags')->setValue('test text');
// ^- this is what i would like to do -^
// ...
}
Run Code Online (Sandbox Code Playgroud)
在我编辑项目时,如何在渲染之前更改控制器内的表单字段值?
注意:这是Symfony <2.6但我认为无论版本如何,相同的整体问题都适用
首先,请考虑此表单类型,该表单类型旨在将一个或多个实体表示为隐藏字段(为简洁起见,省略了名称空间)
class HiddenEntityType extends AbstractType
{
/**
* @var EntityManager
*/
protected $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
if ($options['multiple']) {
$builder->addViewTransformer(
new EntitiesToPrimaryKeysTransformer(
$this->em->getRepository($options['class']),
$options['get_pk_callback'],
$options['identifier']
)
);
} else {
$builder->addViewTransformer(
new EntityToPrimaryKeyTransformer(
$this->em->getRepository($options['class']),
$options['get_pk_callback']
)
);
}
}
/**
* See class docblock for description of options
*
* {@inheritdoc}
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'get_pk_callback' => function($entity) {
return $entity->getId(); …Run Code Online (Sandbox Code Playgroud) 根据本教程,我正在尝试嵌入Tag表单集合.和实体有多对多的关系.ServiceTagService
表单正确呈现.但是当我提交表格时,我得到了
无法确定属性"tagList"的访问类型
错误.我不明白为什么通过调用方法Tag没有将新对象添加到Service类中addTag().
服务类型
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', TextType::class, array(
'label' => 'Title'
))
;
$builder->add('tagList', CollectionType::class, array(
'entry_type' => TagType::class,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false
)));
}
Run Code Online (Sandbox Code Playgroud)
服务类
{
....
/**
* @ORM\ManyToMany(targetEntity="Tag", mappedBy="serviceList",cascade={"persist"})
*/
private $tagList;
/**
* @return ArrayCollection
*/
public function getTagList()
{
return $this->tagList;
}
/**
* @param Tag $tag
* @return …Run Code Online (Sandbox Code Playgroud) 使用Symfony2 实体字段类型应指定property选项:
$builder->add('customers', 'entity', array(
'multiple' => true,
'class' => 'AcmeHelloBundle:Customer',
'property' => 'first',
));
Run Code Online (Sandbox Code Playgroud)
但有时这还不够:想想两个同名的客户,所以显示电子邮件(唯一)是强制性的.
另一种可能性是__toString()在模型中实现:
class Customer
{
public $first, $last, $email;
public function __toString()
{
return sprintf('%s %s (%s)', $this->first, $this->last, $this->email);
}
}
Run Code Online (Sandbox Code Playgroud)
后者的缺点是你被迫在所有形式中以相同的方式显示实体.
有没有其他方法可以使这更灵活?我的意思是像回调函数:
$builder->add('customers', 'entity', array(
'multiple' => true,
'class' => 'AcmeHelloBundle:Customer',
'property' => function($data) {
return sprintf('%s %s (%s)', $data->first, $data->last, $data->email);
},
));
Run Code Online (Sandbox Code Playgroud) 我的问题的简短版本:
如何在Symfony2中编辑子表单的实体?
= - = - = - = - = - = - =长而详细的版本= - = - = - = - = - = - = - =
我有一个实体订单
<?php
class Order
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Customer")
* @ORM\JoinColumn(name="customer_id", referencedColumnName="id", nullable=false)
**/
private $customer;
/**
* @var \DateTime
*
* @ORM\Column(name="date", type="date")
*/
private $date;
/**
* @ORM\ManyToOne(targetEntity="\AppBundle\Entity\OrderStatus")
* @ORM\JoinColumn(name="order_status_id", referencedColumnName="id", nullable=false)
**/
private $orderStatus; …Run Code Online (Sandbox Code Playgroud) 我正在使用symfony2并有一个表单来保存一个用户与某些规则的关系.这些规则由公司的管理员用户设置.在这种形式中,在我选择要更新的用户之后,我必须选择该用户具有权限的规则.
问题是我可能有多个具有相同名称的规则(它是另一个实体),但值不同.所以,当我构建selectbox时,我必须显示名称和值,如:
但现在我只能使用下面的代码显示" - $ value":
$form = $this->createFormBuilder()->add('myinput', 'entity', array(
'class' => 'myBundle:Rule',
'property' => 'childEntity.name',
'label' => 'Filas Permitidas',
'expanded' => false,
'multiple' => true,
'choices' => $this->getDoctrine()
->getRepository('MyBundle:Rule')
->findAll(),
'required' => true,
))->getForm();
Run Code Online (Sandbox Code Playgroud)
所以,作为我想要的财产$myEntity->getChildEntity()->getName()和$myEntity->getValue().
有办法做到这一点吗?
我正在使用Twig在Symfony 2.3中构建一个项目.我想在表格行块中添加一个类.我使用的表单主题文件包含:
{% block form_row %}
<div class="form-row">
{{ form_label(form) }}
{{ form_widget(form) }}
{{ form_errors(form) }}
</div>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
现在我的一些表单行要添加一个额外的类form-row-split.我无法弄清楚如何正确地做到这一点.我几乎工作的方式是:
{% block form_row %}
{% set attr = attr|merge({'class': 'form-row' ~ (attr.class is defined ? ' ' ~ attr.class : '') ~ (errors|length > 0 ? ' error' : '')} ) %}
<div {{ block('widget_container_attributes') }}>
{{ form_label(form) }}
{{ form_widget(form) }}
{{ form_errors(form) }}
</div>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
(注意,我已经将error类逻辑留在那里,因为它需要保留).然后在表单构建器中:
$builder
->add('first_name', 'text', array( …Run Code Online (Sandbox Code Playgroud) 在渲染窗口小部件时,是否可以在Twig中自定义HTML'id'属性
{{ form_widget(form.NAME_OF_THE_FIELD) }}?
传球{'attr': {'id': 'SOMETHING'}}不起作用......
感谢帮助!
我有一个声明的表单nameType.php,视图呈现所有字段,但我想手动添加另一个字段.
形成:
<form action="{{ path('create') }}" method="post" {{ form_enctype(form) }}>
{{ form_widget(form) }}
<input type="text" value="2">
</form>
Run Code Online (Sandbox Code Playgroud)
并获取控制器中的值:
$form->bindRequest($request);
Run Code Online (Sandbox Code Playgroud)
如何收集控制器中输入的值?
这是一个我一直在讨厌的问题.请知道我还不是Symfony2专家,所以我可能在某个地方犯了一个菜鸟错误.
Field1:标准Symfony2 text字段类型
Field2:compound带text字段+ checkbox字段的自定义字段类型字段)

我的目标:在autoValue实地工作中加入限制autoValue's text input child
约束不起作用的原因可能是因为NotBlank期望字符串值并且此表单字段的内部数据是数组array('input'=>'value', 'checkbox' => true).此数组值将转换回具有自定义的字符串DataTransformer.但我怀疑在根据已知约束验证字段后会发生这种情况.
正如您在注释代码中看到的那样,我已经能够在文本输入上获得约束,但是只有当硬编码到autoValue的表单类型中时,我才能根据主要字段的约束进行验证.
控制器和字段的我(简化)示例代码:
.
设置快速表单以进行测试.
<?php
//...
// $entityInstance holds an entity that has it's own constraints
// that have been added via annotations
$formBuilder = $this->createFormBuilder( $entityInstance, array(
'attr' => array(
// added to disable html5 validation
'novalidate' => 'novalidate'
)
));
$formBuilder->add('regular_text', 'text', array(
'constraints' => array(
new \Symfony\Component\Validator\Constraints\NotBlank() …Run Code Online (Sandbox Code Playgroud) symfony-forms ×10
symfony ×9
php ×4
doctrine-orm ×2
constraints ×1
forms ×1
symfony-2.3 ×1
symfony-2.4 ×1
twig ×1
unit-testing ×1