2

私には友達とカテゴリーがあります - 各友達にはカテゴリーがあります。ホームページには、すべての友人のリストが表示され、すべてのカテゴリと送信ボタンを含むドロップダウン メニューがあります。カテゴリを選択してクリックすると、このカテゴリの友人のみが表示されます。

これはCategory.phpです:

<?php

namespace EM\MyFriendsBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * EM\MyFriendsBundle\Entity\Category
 * @ORM\Entity
 * @ORM\Table(name="categories")
 * @ORM\Entity(repositoryClass="EM\MyFriendsBundle\Entity\SameRepository")
 */
class Category 
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=100)
     * @Assert\NotBlank()
     * @Assert\MinLength(
     *         limit=3,
     *         message="The name is too short." )
     */
    protected $name;

    /**
     * @ORM\Column(type="string", length=225, nullable=true)
     */
    protected $description;

     /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="categories")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;

    /**
     * @ORM\OneToMany(targetEntity="Friend", mappedBy="category")
     * @ORM\OrderBy({"name" = "ASC"})
     */
    protected $friends;

    public function __construct()
    {
        $this->friends = new \Doctrine\Common\Collections\ArrayCollection();
    } 

    public function getId()
    {
        return $this->id;
    }

    public function setName($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }

    public function setDescription($description)
    {
        $this->description = $description;
    }

    public function getDescription()
    {
        return $this->description;
    }

    public function setUser(\EM\MyFriendsBundle\Entity\User $user)
    {
        $this->user = $user;
    }

    public function getUser()
    {
        return $this->user;
    }

    public function addFriend(\EM\MyFriendsBundle\Entity\Friend $friend)
    {
        $this->friends[] = $friend;
    }

    public function getFriends()
    {
        return $this->friends;
    }
} 

ChooseCatType.php :

<?php

namespace EM\MyFriendsBundle\Entity;

use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\AbstractType;

class ChooseCatType extends AbstractType
{
    protected $user;

    function __construct($user) 
    {
        $this->user = $user;
    }

    public function buildForm(FormBuilder $builder, array $options)
    {
        $user = $this->user;

        $builder->add('name', 'entity', array(
            'class' => 'EMMyFriendsBundle:Category',
            'property' => 'name',
            'empty_value' => 'All friends',
            'required' => false,
            'query_builder' => function ($repository) use ($user)
                { return $repository->createQueryBuilder('cat')
                                    ->select('cat')
                                    ->where('cat.user = :user')
                                    ->orderBy('cat.name', 'ASC')
                                    ->setParameter('user', $user);
                }, ));
    }

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

これがコントローラーのアクションです。

public function filterAction(Request $request)
   {
       $this->init();

       $cat = new Category();

       $dd_form = $this->createForm(new ChooseCatType($this->user), $cat);

       if($request->getMethod() == 'POST') { 
           $dd_form->bindRequest($request);

           if($cat->getName() == null) {      
               return $this->redirect($this->generateUrl('home_display'));
           }

           $filter = $cat->getName()->getId();

           if ($dd_form->isValid()) {   
               $friends = $this->em->getRepository('EMMyFriendsBundle:Friend')
                   ->filterFriends($filter);

               if(!$friends) {
                   $this->setFlash('There are no frieds in this category.', 'error');
                   return $this->redirect($this->generateUrl('home_display'));
               }
           }

           return $this->render('EMMyFriendsBundle:Home:filtered_home.html.twig', array(
                   'friends' => $friends, 'category' => $cat->getName()->getName(), 
                   'dd_form' => $dd_form->createView()));   
       }

       return $this->redirect($this->generateUrl('home_display'));
   }
}

どこでinit()セット$this->em = $this->getDoctrine()->getEntityManager();$this->user = $this->get('security.context')->getToken()->getUser();

エラー: が表示されますが、エラーの原因Expected argument of type string, object givenと修正方法がわかりません。何か助けてください。本当に感謝します。$dd_form->bindRequest($request);前に置くexit;とプログラムが終了するため、この行で発生すると思いますが、後に置くとエラーが表示されます。

もう1つのことは、削除すると

@Assert\MinLength(
         *         limit=3,
         *         message="The name is too short." )

これはCategory.phpの name プロパティの上にあり、すべてが完璧に機能します。

どんなアイデアも役に立ちます!御時間ありがとうございます!

もう 1 つ、使用するカテゴリの ID を取得する必要があるのはなぜ$cat->getName()->getId();ですか? だけであるべきだと思った$cat->getId()が、そうではなかった。

4

1 に答える 1

3

「エンティティ」フィールド タイプを使用すると、返されるのはエンティティであるため、このフィールドが「名前」と呼ばれることは意味がありません。したがって、ビルダーを次のように変更します。

$builder->add('category', 'entity', array(
...

次に、このフォーム ビルダーに Category オブジェクトを渡す必要はありません。これは通常、フォームが各フィールドをオブジェクト プロパティに接続するときに行われますが、そうではありません。このフォームを使用して、Category オブジェクトの「category」プロパティを取得していません。これは、フォーム データから取得できる Category オブジェクトを返す単なるフォームです。したがって、コントローラーを次のように変更します。

public function filterAction(Request $request)
   {
       $this->init();

       $dd_form = $this->createForm(new ChooseCatType($this->user));

       if($request->getMethod() == 'POST') { 
           $dd_form->bindRequest($request);

           if ($dd_form->isValid()) {   
               $data = $form->getData();
               $cat = $data['category'];

               $filter = $cat->getId();
               $friends = $this->em->getRepository('EMMyFriendsBundle:Friend')
                   ->filterFriends($filter);

               if(!$friends) {
                   $this->setFlash('There are no frieds in this category.', 'error');
                   return $this->redirect($this->generateUrl('home_display'));
               }
               return $this->render('EMMyFriendsBundle:Home:filtered_home.html.twig', array(
                   'friends' => $friends, 'category' => $cat->getName(), 
                   'dd_form' => $dd_form->createView()));   
           }

       }

       return $this->redirect($this->generateUrl('home_display'));
   }
}
于 2012-09-19T10:46:29.467 に答える