可以存储数组而不是映射的关联.在Symfony2中,使用集合字段类型相当容易.例如,使用此技术,您可以存储填充数组事件字段的文本字段数组.然而,为了更新数组,有一个技巧,这个技巧由@Vadim Ashikhman在接受的答案中精美地解释.
有时,存储数组而不是映射关联是有用且更有效的.但是,一旦创建,如果该数组的大小没有改变,更新此数组仍然很复杂?
许多人都有类似的问题,但没有人找到解决这个问题的正确方法.

团队可以组织许多活动.这些事件只是使用Doctrine而不是使用OneToMany关联存储在数组中.因此,实体事件不与Doctrine映射.
<?php
namespace Acme\TestBundle\Entity;
...
class Event
{
/**
* @Assert\NotBlank
*/
private $name;
public function setName($name)
{
$this->name = $name;
}
public function getName()
{
return $this->name;
}
}
Run Code Online (Sandbox Code Playgroud)
<?php
namespace Acme\TestBundle\Entity;
...
/**
* @ORM\Entity()
* @ORM\HasLifecycleCallbacks
* @ORM\Table(name="teams")
*/
class Team
{
/**
* @ORM\Column(type="array")
* @var array
*/
protected $events;
public function addEvent($event)
{
if (!in_array($event, $this->events, true)) {
$this->events[] = $event;
}
return …Run Code Online (Sandbox Code Playgroud) 我正在使用FOSUserBundle来管理我的用户.为了注册用户,我重用了满足我需求的包的形式.不过,我需要设置我的字段的一些属性.这是通过像这样的小枝很容易做到的:
{{ form_widget(form.username, { 'attr': {'class': "span12",
'placeholder': "Username"} }) }}
Run Code Online (Sandbox Code Playgroud)
现在,我的目标是在占位符上进行自动翻译,因此我提出了以下代码:
{{ form_widget(form.username, { 'attr': {'class': "span12",
'placeholder': "{{'security.login.usernameplaceholder'|trans}}"} }) }}
Run Code Online (Sandbox Code Playgroud)
此前代码生成的输入占位符值等于{{'security.login.usernameplaceholder'| trans}}
为了摆脱这个问题,我尝试为此设置变量,但symfony产生了错误!
{% set usernameplaceholder = {{'security.login.usernameplaceholder'|trans}} %}
{{ form_widget(form.username, { 'attr': {'class': "span12",
'placeholder': usernameplaceholder} }) }}
Run Code Online (Sandbox Code Playgroud)
有什么建议可以解决这个问题吗?
谢谢,
如何在嵌入表单中设置验证组?我有两个实体A和B以及每个实体的表格(FormA,FormB)我在FormB中嵌入FormA表格
class FormB extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('A', new FormA());
}
public function setDefaultOptions(OptionsResolverInterface $resolver) {
$resolver->setDefaults(array(
'data_class' => 'Acme\TestBundle\Entity\B',
'validation_groups'=>function(FormInterface $form) {
// set validation group for FormA here
},
'cascade_validation'=>true
));
}
}
Run Code Online (Sandbox Code Playgroud)
如何从FormB设置FormA的验证组?
在我的实体类中,我已经为setter和getter的返回类型定义了所有预期的参数类型.稍后,当我有一个使用所述类的表单时,如果表单中的某些字段为空,则会出现错误,因为表单组件尝试将null传递给setter而不是string.
我提交表单时收到以下异常:
给出的字符串"string","NULL"的预期参数
500内部服务器错误 - InvalidArgumentException
抛出异常 vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php at line 254
有没有办法将"null"值转换为空字符串,然后再将其传递给对象,让验证者争论呢?
整个错误是missiong命名空间Symfony\Component\Form,由于标题最大字符而被3个点替换.
所以,我正在遵循文档中提供的步骤,我无法找到我得到的错误的来源.如果有人能提供帮助,我会非常感激.
这是我的AuthController的方法
/**
* @Route("/register", name="registrationPage")
*/
public function showRegistrationPage(Request $request)
{
return $this->render('auth/register.html.twig', [
'register_form' => $this->createForm(RegisterType::class, (new UserInformation()))
]);
}
Run Code Online (Sandbox Code Playgroud)
这是方法,我在其中声明表单
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('firstname', TextType::class, ['attr' => ['class' => 'form-control']])
->add('secondname', TextType::class, ['attr' => ['class' => 'form-control']])
->add('email', EmailType::class, ['attr' => ['class' => 'form-control']])
->add('password', PasswordType::class, ['attr' => ['class' => 'form-control']])
->add('password_confirmation', PasswordType::class, [
'label' => 'Confirm Password',
'attr' => ['class' => 'form-control'],
'mapped' =>false …Run Code Online (Sandbox Code Playgroud) 我有一个3层的表单:First Layer是游戏的容器:
class GameListType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('games', 'collection', array(
'required' => false,
'allow_add' => true,
'prototype' => true,
'by_reference' => false,
'type' => new GameBetType(),
))
;
}
public function setDefaultOptions(OptionsResolverInterface $resolver) {
parent::setDefaultOptions($resolver);
$resolver->setDefaults(array(
'cascade_validation' => true,
));
}
}
Run Code Online (Sandbox Code Playgroud)
第二层是游戏本身,因为我不打算改变游戏,但是赌注,它只包括赌注的形式:
class GameBetType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('bet', new BetType());
}
public function setDefaultOptions(\Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver) {
parent::setDefaultOptions($resolver);
$resolver->setDefaults(array(
'data_class' => 'Strego\TippBundle\Entity\Game',
'cascade_validation' => true,
)); …Run Code Online (Sandbox Code Playgroud) 我很难覆盖Symfony2使用的FOS用户包所使用的标签.
我已经覆盖了Form类,但是没有像"setOption"这样的元素的选项,只有getter.
我可以删除一个元素,然后用适当的标签再次添加它,但这似乎是一种矫枉过正.是否有任何好的方法可以覆盖表单元素或者只是翻译键?
我正在为过滤的实体集合显示一个html表,我希望在每一行中显示一个复选框作为表单的一部分,该表单将选定的实体添加到会话变量中.
我认为每个复选框都应该有实体id作为其值,我将从表单字段数据中获取一个id数组(好的,所以值应该是对实体的间接引用,但是为了简单).
我尝试创建一个带有单个实体类型字段的表单Type,映射到实体的id属性并嵌入另一个具有集合类型字段的表单Type中.
class FooEntitySelectByIdentityType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('foo_id', 'entity', array(
'required' => false,
'class' => 'MeMyBundle:FooEntity',
'property' => 'id',
'multiple' => true,
'expanded' => true
));
}
# ...
Run Code Online (Sandbox Code Playgroud)
和
class FooEntitySelectionType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('identity', 'collection', array(
'type' => new FooEntitySelectByIdentityType,
'options' => array(
'required' => false,
'multiple' => true,
'expanded' => true,
'attr' => array('class' => 'foo')
),
));
}
# ...
Run Code Online (Sandbox Code Playgroud)
在控制器中,使用一组实体作为初始数据创建表单 …
我创建了一个这样的自定义表单类型:
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';
}
}
Run Code Online (Sandbox Code Playgroud)
在另一种form(GameType)类型中,我使用它:
$builder
->add('flash', new PositioningFlashType(), array(
'mapped' => false,
'game' => $options['game']
))
Run Code Online (Sandbox Code Playgroud)
在控制器内部我想创建整个表单:
private function createEditForm(Game $entity)
{
$form = $this->createForm(new GameType(), $entity, array(
'action' => …Run Code Online (Sandbox Code Playgroud) 在Symfony2中BandType,我添加了实体Tag:
->add('tags', 'entity', [
'label' => 'Tags',
'class' => 'DbBundle:Tag',
'property' => 'title',
'multiple' => true,
])
Run Code Online (Sandbox Code Playgroud)
这会生成多个select元素,我可以从数据库中选择现有的标签(Doctrine).但我需要动态添加新标签,这些标签尚不存在.
在客户端,我使用jQuery插件Selectize.js,它允许我添加新标签到选择框.但在提交表单后,新标签不会保存.
所以我的问题是 - 从选择框(实体字段类型)中保留新项目的最清晰方法是什么?
symfony ×10
symfony-forms ×10
php ×5
symfony-2.1 ×2
twig ×2
doctrine ×1
doctrine-orm ×1
entity ×1
forms ×1
php-7 ×1
selectize.js ×1
symfony-2.2 ×1
symfony-2.3 ×1
symfony-2.4 ×1
symfony-3.3 ×1