标签: symfony-forms

Doctrine不会更新简单的数组类型字段

短篇小说(编辑)

可以存储数组而不是映射的关联.在Symfony2中,使用集合字段类型相当容易.例如,使用此技术,您可以存储填充数组事件字段的文本字段数组.然而,为了更新数组,有一个技巧,这个技巧由@Vadim Ashikhman在接受的答案中精美地解释.

很长的故事

有时,存储数组而不是映射关联是有用且更有效的.但是,一旦创建,如果该数组的大小没有改变,更新此数组仍然很复杂?

许多人都有类似的问题,但没有人找到解决这个问题的正确方法.

存储一个数组

团队可以组织许多活动.这些事件只是使用Doctrine而不是使用OneToMany关联存储在数组中.因此,实体事件不与Doctrine映射.

实体事件(未与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)

php doctrine symfony-forms symfony doctrine-orm

13
推荐指数
2
解决办法
1万
查看次数

在Symfony2表单输入中设置带有转换的占位符属性

我正在使用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)

有什么建议可以解决这个问题吗?

谢谢,

symfony-forms symfony twig fosuserbundle

13
推荐指数
2
解决办法
3万
查看次数

将验证组设置为symfony 2中的嵌入表单

如何在嵌入表单中设置验证组?我有两个实体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的验证组?

symfony-forms symfony symfony-2.1 symfony-2.3

13
推荐指数
1
解决办法
5102
查看次数

Symfony3 Form组件尝试将null传递给PHP 7中的类型提示方法

在我的实体类中,我已经为setter和getter的返回类型定义了所有预期的参数类型.稍后,当我有一个使用所述类的表单时,如果表单中的某些字段为空,则会出现错误,因为表单组件尝试将null传递给setter而不是string.

我提交表单时收到以下异常:

给出的字符串"string","NULL"的预期参数

500内部服务器错误 - InvalidArgumentException

抛出异常 vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php at line 254

有没有办法将"null"值转换为空字符串,然后再将其传递给对象,让验证者争论呢?

php symfony-forms symfony php-7

13
推荐指数
2
解决办法
2557
查看次数

传递给Symfony\Component\Form\FormRenderer :: renderBlock()的参数1必须是...\FormView的实例,...的实例给出

整个错误是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)

php forms symfony-forms symfony symfony-3.3

13
推荐指数
2
解决办法
9613
查看次数

级联验证不在表单的第三层上工作

我有一个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)

php symfony-forms symfony symfony-2.1

12
推荐指数
1
解决办法
3668
查看次数

如何覆盖FOS用户捆绑表单标签

我很难覆盖Symfony2使用的FOS用户包所使用的标签.

我已经覆盖了Form类,但是没有像"setOption"这样的元素的选项,只有getter.

我可以删除一个元素,然后用适当的标签再次添加它,但这似乎是一种矫枉过正.是否有任何好的方法可以覆盖表单元素或者只是翻译键?

symfony-forms symfony fosuserbundle

12
推荐指数
1
解决办法
1万
查看次数

构建一个表单,其中包含一个doctrine集合中每个实体的复选框

我正在为过滤的实体集合显示一个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)

在控制器中,使用一组实体作为初始数据创建表单 …

symfony-forms symfony symfony-2.2

12
推荐指数
1
解决办法
2万
查看次数

从类型twig模板中的FormType访问变量

我创建了一个这样的自定义表单类型:

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)

symfony-forms symfony twig symfony-2.4

12
推荐指数
1
解决办法
5839
查看次数

Symfony2和Selectize.js:在实体字段类型中保留新项目的最清晰方法?

在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,它允许我添加新标签到选择框.但在提交表单后,新标签不会保存.

所以我的问题是 - 从选择框(实体字段类型)中保留新项目的最清晰方法什么

php entity symfony-forms symfony selectize.js

12
推荐指数
1
解决办法
1108
查看次数