2017-03-06 11 views
0

これはSymfonyCMFの最初の簡単なプロジェクトです。 私のプロジェクトでは、(phpcrの言葉で)たくさんの 'プロフィール'文書があります。各プロファイルは特定の「部門」(親文書)に属します。 (phpcrでは各ドキュメントに親ドキュメントが必要です) 管理パネル(SonataAdmin)では、configureListFields関数を使用してすべての 'プロファイル'を一覧表示できます。私はconfigureDatagridFilters関数を使って 'profile'プロパティでそれらをフィルタリングできます。 しかし、親の「部署」文書によって「プロフィール」をフィルタリングする方法を理解できません。SonataAdminの親文書でフィルタする方法Doctrine2 PHPCR Admin

protected function configureDatagridFilters(DatagridMapper $datagridMapper) 
    { 
     $datagridMapper 

      ->add('parent', 'doctrine_phpcr_callback', array(
       'callback' => function($queryBuilder, $alias, $field, $data) { 
        if (!$data || !is_array($data) || !array_key_exists('value', $data)) { 
         return; 
        } 

        $queryBuilder = $proxyQuery->getQueryBuilder(); 
        $eb = $queryBuilder->expr(); 

        $queryBuilder->andWhere($eb->eq($field, $data['value'])); 

        return true; 
       }, 
       'field_type' => 'checkbox' 
      )) 
     ; 
    } 

しかし、最初に私は$ proxyQuery、$ queryBuilder-> exprの()に関連したエラーを得た:

 protected function configureDatagridFilters(DatagridMapper $datagridMapper) 
    { 
     $datagridMapper 
      ->add('name','doctrine_phpcr_string') 
      ->add('title', 'doctrine_phpcr_string') 
      ->add('parent') <--- Need to filter by parent ! 
      ; 
    } 

がSonataAdmin documentationからカスタムコールバックフィルタ機能を実装しようとしました。第二に、私は((適切に親によって照会およびフィルタする方法は考えている。 ありがとう事前に。

解決しようありがとうを@BilelNoômene に、最終的な答えは

protected function configureDatagridFilters(DatagridMapper $datagridMapper) 
{ 

    $datagridMapper->add('parent', 'doctrine_phpcr_callback', array('callback' => 
     function ($proxyQuery, $alias, $field, $data) { 
      if (!$data || !is_array($data) || !array_key_exists('value', $data) || !$data['value']) { 
       return; 
      } 


      $queryBuilder = $proxyQuery->getQueryBuilder(); 

      $queryBuilder->from($alias) 
       ->joinInner() 
       ->left()->document(Profile::class, $alias)->end() 
       ->right()->document(Department::class, 'd')->end() 
       ->condition()->child($alias, 'd')->end(); 

      $queryBuilder->andWhere()->same($data['value']->getId(), 'd')->end(); 

      return true; 
     } 
    ), DocumentType::class, array('class'=>Department::class)); 

    parent::configureDatagridFilters($datagridMapper); 
} 

答えて

0

ドキュメントの一例です正常に動作していないようです。あなたのケースでは、このコードを試してみてください。

public function configureDatagridFilters(DatagridMapper $datagridMapper) 
{ 
    $datagridMapper->add('parent', 'doctrine_phpcr_callback', array('callback' => 
     function ($proxyQuery, $alias, $field, $data) { 
      if (!$data || !is_array($data) || !array_key_exists('value', $data) || !$data['value']) { 
       return; 
      } 

      $queryBuilder = $proxyQuery->getQueryBuilder(); 

      $queryBuilder->from($alias) 
       ->joinInner() 
       ->left()->document(Profile::class, $alias)->end() 
       ->right()->document(Department::class, 'd')->end() 
       ->condition()->child($alias, 'd')->end(); 
      $queryBuilder->andWhere()->same($data['value']->getId(), 'd')->end(); 

      return true; 
     } 
    ), 'phpcr_document', array('class' => Department::class)); 

    parent::configureDatagridFilters($datagridMapper); 
} 
+0

型 『phpcr_document』 5をロードできませんでした」 'ごresponceをいただき、ありがとうございます。しかし、エラーが出ます00内部サーバーエラー - InvalidArgumentException " –

+0

コンボボックスで部門をリストする方法を考え出し、 'phpcr_document' - > 'DocumentType :: class'を変更しました。しかし、別のエラー 'QueryBuilderノード' From 'を取得するには、少なくとも「1」のタイプの子ノードを「source」持っていなければなりません。 "0"が与えられました。 –

関連する問題