2017-03-06 29 views
0

這是我在SymfonyCMF上的第一個簡單項目。 在我的項目中,我有很多'profile'文檔(以phpcr爲單位)。每個配置文件都屬於特定的「部門」(母文檔)。 (在phpcr中,每個文檔必須有父文檔。) 在管理面板(SonataAdmin)中,我可以使用configureListFields函數列出所有'配置文件'。我可以使用configureDatagridFilters函數通過'profile'屬性來過濾它們。 但是,不能弄清楚如何通過其父'部門'文件過濾「檔案」。如何在SonataAdmin中通過父文檔進行過濾Doctrine2 PHPCR管理員

 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實現自定義的回調過濾功能:

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()。其次,我不知道如何正確地查詢和過濾器由家長((。 Thanx提前。

解決的感謝名單,以@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 00內部服務器錯誤 - InvalidArgumentException「' –

+0

找出如何列出組合框中的Departments,更改'phpcr_document' - >'DocumentType :: class'。但是,獲取另一個錯誤'QueryBuilder節點「From」必須至少有「1」個類型爲「source」的子節點。給出「0」。 –