【问题标题】:Symfony 2.7 choice callback not working in formSymfony 2.7 选择回调无法正常工作
【发布时间】:2016-04-05 08:49:47
【问题描述】:

我有一个具有多项选择属性的类:

...

/**
 * @ORM\Column(type="array", name="majority_types")
 * @Constraints\Choice(callback="getAvailableMajorityTypes", multiple="true")
 */
private $majorityTypes;

...

public static function getAvailableMajorityTypes()
{
    return array(
        self::SIMPLE_MAJORITY,
        self::UNANIMITY_MAJORITY,
        self::THREE_FIFTHS_MAJORITY,
        self::ONE_THIRD_MAJORITY,
        self::FOUR_FIFTHS_MAJORITY
    );
}

...

我也有这个类的表单类:

...

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ...
        ->add('majorityTypes', ChoiceType::class, array(
            'multiple' => true,
        ))
        ...
        ->getForm();
}

/**
 * @param OptionsResolver $resolver
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'MyClass',
    ));
}

但来自getAvailableMajorityTypes 的选择不会呈现。

我只是按照以下步骤操作:http://symfony.com/doc/master/reference/constraints/Choice.html#supplying-the-choices-with-a-callback-function,但由于某种原因它不起作用。

编辑:

我发现使用静态选择作为注释都不起作用(choices={"foo1", "foo2"})。它工作的唯一方法是在创建表单时直接在add 方法中传递选项。我还没有发现问题。

【问题讨论】:

    标签: php symfony doctrine


    【解决方案1】:

    如果我参考你的话:

    但来自getAvailableMajorityTypes 的选择没有呈现。

    您似乎对在表单的选择字段中呈现选项和Choice 约束感到困惑。

    您只在代码中实现了约束,但您还需要将选项添加到您的选择中。像这样:

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ...
            ->add('majorityTypes', ChoiceType::class, array(
                'multiple' => true,
                'choices' => YourEntity::getAvailableMajorityTypes()
            ))
    

    【讨论】:

    • 从问题的最后一部分开始:唯一可行的方法是在创建表单时直接在 add 方法中传递选项。这就是你的建议。不是吗?
    • 确实如此。您尝试的其他事情与提交表单的验证有关,而不是 html 表单的呈现。
    • 有道理。
    【解决方案2】:

    我从未使用过此注释,但在文档中回调是公共静态的:

    // src/AppBundle/Entity/Author.php
    namespace AppBundle\Entity;
    
    class Author
    {
        public static function getGenders()
        {
            return array('male', 'female');
        }
    }
    

    如果您遵循文档并将您的方法设为静态,那么注释应该可以工作。

    【讨论】:

    • 是的,这是一头雾水。无论如何,它仍然不起作用。好像从来没有调用过回调,好像我把回调重命名为不存在的方法一样,没有报错。
    猜你喜欢
    • 1970-01-01
    • 2014-10-31
    • 2017-04-07
    • 1970-01-01
    • 2013-10-06
    • 2016-01-24
    • 1970-01-01
    • 2015-01-17
    相关资源
    最近更新 更多