1

私は Symfony2 を初めて使用しますが、うまくいけば十分に明確です。

私はリポジトリを持っています:

class districtRepository extends EntityRepository
{
     public function findAllFromCity($idCity)
    {


            return $this->createQueryBuilder('d')
                        ->where('d.city = :city')
                        ->setParameter('city', $idCity)
                        ->orderBy('d.name', 'ASC');
                        ->getQuery()
                        ->getResult();

    }
}

そしてフォームタイプ

class searchPropertyType extends AbstractType
{

    public function getDefaultOptions(array $options)
    {
        // return array('validation_constraint' => $collectionConstraint
       return array ('required'=>false, 'csrf_protection' => true); 
    }


    public function buildForm(FormBuilder $builder, array $options)
    {

        $em = $this->getDoctrine()->getEntityManager();

        $builder
            ->add('keywords')
            ->add('disctrict')    
            ->add('price_min')
            ->add('price_max')
            ->add('type')                                             
            ->add('date_from' , 'date', array('widget' => 'single_text'))
            ->add('date_to' , 'date', array('widget' => 'single_text'))
        ;


    }

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

findAllFromCity()でオプションのリストを取得するにはどうすればよいです->add('disctrict')か??

Query Builder ソリューションは知っていますが、コードを繰り返す必要があります。

サービス コンテナ ソリューションについて読みました。私の場合は適用されますか?方法を教えてもらえますか、それとも私を良い軌道に乗せることができますか??

4

3 に答える 3

4
  1. 実際、「searchPropertyType」クラスの「findAllFromCity」メソッドにアクセスする唯一の方法は、Doctrine レジストリーを注入することです。

    フォームタイプクラスで:

    use Symfony\Bridge\Doctrine\RegistryInterface;
    
    class searchPropertyType extends AbstractType
    {
        private $doctrine;
    
        public function __construct(RegistryInterface $doctrine)
        {
            $this->doctrine = $doctrine;
        }
    

    services.xml ファイルで:

    <service id="my_project.form.type.search_property" class="{mynamespace}\searchPropertyType" public="false">
        <tag name="form.type" />
        <argument type="service" id="doctrine" />
    </service>
    
  2. このメソッドを使用するには、「choices」または「choice_list」オプションで「choice」タイプを使用する必要があります。

    フォームタイプクラスで:

    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            // ...
            ->add('disctrict', 'choice', $this->getDistrictChoices($options['city_id']))
            // ...
        ;
    }
    
    private function getDistrictChoices()
    {
        $choices = array();
        $districts = $this->doctrine->getRepository('MyBundle:District')->findAllFromCity($cityId);
    
        foreach ($dictricts as $dictrict) {
            $choices[$district->getId()] = $district->getName();
        }
    
        return $choices;
    }
    

もちろん、これは一例であり、適応させる必要があります。覚えておいてください: クラス名の最初の文字は常に大文字です。

于 2012-05-04T08:45:50.603 に答える
3

サイモンのおかげで、私は次のように更新しました、そしてそれは今働いています!

searchController:

public function basicsearchAction(Request $request)
{   
    $form = $this->createForm(new searchPropertyType($this->getDoctrine()));

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

}

searchPropertyType

public function buildForm(FormBuilder $builder, array $options)
    {

        $builder
            ->add('keywords')
            ->add('district', 'choice', array('choices'=>$this->getDistrictChoices(), 'multiple'=>true) )     
            ->add('price_min')
            ->add('price_max')
            ->add('type', 'entity', array('class'=>'FlatShanghaidefaultBundle:propertytype', 
                                          'property'=>'name', 
                                          'multiple'=>true              

                ))


            ->add('date_from' , 'date', array('widget' => 'single_text'))
            ->add('date_to' , 'date', array('widget' => 'single_text'))
        ;


    }

    private function getDistrictChoices()
{
    $choices = array();
    $districts = $this->doctrine->getRepository('FlatShanghaidefaultBundle:district')->findByDefaultCity();

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


    return $choices;
}

service.yml

services:
    search_property:
        class:        FlatShanghai\propertyBundle\Form\searchPropertyType
        arguments:    [doctrine]
于 2012-05-08T02:54:36.467 に答える