2012-05-04 14 views
1

私はSymfony2で新しく、うまくいけば私は十分明確です。Symfony2/formTypeでカスタムリポジトリメソッドを使用

私は、リポジトリ持っている:私は単に->add('disctrict')にオプションのリストを取得するためにfindAllFromCity()を使用するにはどうすればよい

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'; 
    } 
} 

を??

私はQuery Builderソリューションを知っていますが、コードを繰り返すことになります。

私はサービスコンテナソリューションについて読んだことがあります。私の場合はアプリですか?あなたはどのように私を見せたり、良いトラックに私を置くことができますか?

+0

[Symfony2の選択フィールドが機能していない]の可能性重複(http://stackoverflow.com/questions/16463926/symfony2-choice-フィールドノーワーキング) – mate64

答えて

4
  1. 確かに、「searchPropertyType」クラスのあなたの「findAllFromCity」メソッドにアクセスするための唯一の方法は、Doctrineのレジストリを注入することです。フォーム型クラスで

    :あなたのservices.xmlファイルで

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

    <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'オプションをつけて入力してください。フォーム型クラスで

    :もちろん

    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; 
    } 
    

、これは一例であり、それが適応させる必要があります。 クラス名fisrtは常に大文字であることを覚えておいてください。

+0

こんにちはサイモン、多くのお返事とあなたの時間をありがとう。非常に感謝します!!!!私は今日それをテストする時間がありませんが、私はそれをtomorowに戻します。とにかく今は非常に明確です。もう一度ありがとう – 123pierre

+0

こんにちは、私はいくつかの更新プログラムで新しい応答を更新しました。 それは動作しますが、それはまだ非常に混乱しています。私は実際にここでサービスを利用していますか?もし私がservice.ymlを削除したら、私はまだ働いているから! の代わりに $地区= $ this-> doctrine-> getRepository( 'FlatShanghaidefaultBundle:district') - > findByDefaultCity(); は役に立ちましたか? $ this-> get( 'search_property')??? 本当にそれはまだ私のためにとても混乱しているので、私は尋ねます。 私は本当にあなたの助けに感謝します;-) – 123pierre

3

Simonのおかげで、私は以下のように更新しました。現在作業中です!

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] 
0

私は、cでもありました繰り返されるコードについての噂。私のクエリビルダだけでなく、 "getDistrictChoices"のようなカスタム選択マッピングを作成したくありませんでした。私は自分のEntityRepositoryの中で自分のクエリーを抽象化して自分のフォームタイプでも利用できるようにしました。

ここに私がしたことがあります。

マイ形式:

class UserEditType extends AbstractType 
{ 

    /** 
    * @var Session $session 
    */ 
    private $session; 

    public function __construct(Session $session){ 
     $this->session = $session; 
    } 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) { 
     $builder 
      ->add('firstName') 
      ->add('middleName') 
      ->add('lastName') 
      ->add('username') 
      ->add('userStatus', EntityType::class, [ 
       'class' => UserStatus::class, 
       'property' => 'status', 
       'query_builder' => function(UserStatusRepository $er) { 
        return $er->createQueryBuilder('s') 
         ->orderBy('s.status'); 
       }, 
      ]) 
      ->add('agency', EntityType::class, [ 
       'class' => WorkflowGroup::class, 
       'property' => 'groupName', 
       'query_builder' => function(WorkflowGroupRepository $er) { 
        return $er->createSelectAllQB($this->session->get(AbstractController::SESSION_KEY_AGENCY_ID)); 
       }, 
      ]) 
      ->add('phoneNumber') 
      ->add('email', EmailType::class) 
      ->add('activationDate', DateType::class, [ 
       'widget' => 'single_text', 
       'format' => 'M/d/yyyy', 
       'attr' => [ 
        'data-provide' => 'datepicker', 
        'data-date-format' => 'mm/dd/yyyy', 
        'data-date-show-on-focus' => 'false', 
        'data-date-auto-format' => 'true' 
       ] 
      ]) 
      ->add('expirationDate', DateTimeType::class, [ 'widget' => 'single_text', 'format' => 'yyyy-MM-dd HH:mm' ]); 
     ; 
    } 
... 
} 

マイリポジトリ:

class WorkflowGroupRepository extends EntityRepository 
{ 
    public function createSelectAllQB($agencyId) 
    { 
     return $this->createQueryBuilder('w') 
      ->addOrderBy('w.groupName', 'ASC') 
      ->andWhere('w.agencyId = :agencyId') 
      ->setParameter('agencyId', $agencyId); 
    } 

    public function selectAll($agencyId) 
    { 
     return $this->createSelectAllQB($agencyId)->getQuery()->execute(); 
    } 
} 
関連する問題