Symfony2选择字段不起作用

时间:2013-05-09 14:15:32

标签: symfony symfony-forms

我在这里问了一个问题How to use Repository custom functions in a FormType但是没有人问过,所以我做了一点挖掘并稍微提高了一点,但我仍然得到这个错误:

Notice: Object of class Proxies\__CG__\Kpr\CentarZdravljaBundle\Entity\Category 
could not be converted to int in /home/kprhr/public_html/CZ_Symfony/vendor/symfony/symfony/src/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php line 457 

现在这就是我的CategoryType的样子:

<?php

namespace Kpr\CentarZdravljaBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Bridge\Doctrine\RegistryInterface;

class CategoryType extends AbstractType
{
    private $doctrine;

    public function __construct(RegistryInterface $doctrine)
    {
        $this->doctrine = $doctrine;
    }
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Kpr\CentarZdravljaBundle\Entity\Category',
            'catID' => null,
        ));
    }
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $someId = $builder->getData()->getId();
        $param = ($someId) ? $someId : 0;
        $catID = $options['catID'];
        $builder->add('name', 'text', array('attr'   =>  array('class' => 'span6')));
        $builder->add('file', 'file', array('image_path' => 'webPath', 'required' => false));
        $builder->add('parent', 'choice', array(
                    'choices' => $this->getAllChildren($catID),
                    'required' => false,
                    'attr'   =>  array('data-placeholder' => '--Izaberite Opciju--'),
                    ));
        $builder->add('tags', 'tag_selector', array(
            'required'  => false,
        ));
        $builder->add('status', 'choice', array(
            'choices'   => array('1' => 'Aktivna', '0' => 'Neaktivna'),
            'required'  => true,
        ));
        $builder->add('queue', 'text', array('attr'   =>  array('class' => 'span3')));
    }
    private function getAllChildren($catID)
    {
        $choices = array();
        $children = $this->doctrine->getRepository('KprCentarZdravljaBundle:Category')->findByParenting($catID);

        foreach ($children as $child) {
            $choices[$child->getId()] = $child->getName();
        }

        return $choices;
    }

    public function getName()
    {
        return 'category';
    }

}

我正在从CategoryType访问CategoryRepository函数findByParenting($ parent),我从getAllChildren函数($ catID)中获取了准确数据的数组,但错误就在那里,我认为Symfony框架正在期待实体字段而不是选择字段,但不知道如何解决它。 我还改变了控制器中的formCreate调用,将$ this-&gt; getDoctrine()作为CategoryType()的参数:

$form = $this->createForm(new CategoryType($this->getDoctrine()), $cat, array('catID' => $id));

2 个答案:

答案 0 :(得分:9)

好的,我设法解决了这个难题。答案很简单,我所要做的就是改变

$builder->add('parent', 'choice', array(
 'choices' => $this->getAllChildren($catID),
 'required' => false,
 'attr'   =>  array('data-placeholder' => '--Izaberite Opciju--'),
));

到此:

 $builder->add('parent', 'entity', array(
                'class' => 'KprCentarZdravljaBundle:Category',
                'choices' => $this->getAllChildren($catID),
                'property' => 'name',
                'required' => false,
                'attr'   =>  array('data-placeholder' => '--Izaberite Opciju--'),
                ));

更改getAllChildren(..)函数,使其返回对象

private function getAllChildren($catID)
{
    $choices = array();
    $children = $this->doctrine->getRepository('KprCentarZdravljaBundle:Category')->findByParenting($catID);

    foreach ($children as $child) {
        $choices[$child->getId()] = $child->getName();
    }

    return $choices;
}

我把它改为:

private function getAllChildren($catID)
{
    $children = $this->doctrine->getRepository('KprCentarZdravljaBundle:Category')->findByParenting($catID)

    return $children;
}

非常感谢用户redbirdo指出实体字段上的选项选项。

答案 1 :(得分:1)

看起来你做的事太复杂了 当你写Symfony framework is expecting an entity field instead of choice field时,你是正确的。

为此,请替换:

$builder->add('parent', 'choice', array(
     'choices' => $this->getAllChildren($catID),
     'required' => false,
     'attr'   =>  array('data-placeholder' => '--Izaberite Opciju--'),
));

由:

$builder->add('users', 'entity', array(
    'class' => 'KprCentarZdravljaBundle:Category',
    'property' => 'name',
    'query_builder' => function(EntityRepository $er) use($catID) {
        return $er->findByParenting($catID);
    },
    'required' => false,
    'empty_value' => '--Izaberite Opciju--'
));

(除非在其他地方使用,否则不再需要getAllChildren($catID)

http://symfony.com/doc/current/reference/forms/types/entity.html