4

ここで質問しましたフォームタイプでリポジトリカスタム関数を使用する方法ですが、誰も答えなかったので、少し掘り下げて少し進めましたが、まだこのエラーが発生します:

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 フレームワークは代わりにエンティティ フィールドを期待していると思います選択フィールドのですが、それを修正する方法がわかりません。また、$this->getDoctrine() を CategoryType() への引数として指定して、コントローラーの formCreate 呼び出しを変更します。

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

2 に答える 2

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

于 2013-05-09T19:21:14.473 に答える