2012-01-12 85 views
7

「排序依據」字段我有一個產品管理類。產品實體與類別實體具有多對一關係,即產品與類別關聯。奏鳴曲管理員 - 在相關表格

在對產品的管理「列表」頁面,我需要按類別名稱(按字母順序),每個產品所關聯排序。

設置默認的字段進行排序很容易,如果該字段的實體本身(見Sonata admin bundle order對於如何做到這一點)。但我無法弄清楚如何按照相關表中的字段排序。

任何幫助表示讚賞。

回答

6

這似乎是一個解決辦法,但它的工作原理。你必須添加一個連接覆蓋的createQuery()方法,不是指定一個默認sortBy覆蓋$ datagridValues:

<?php 
use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery; 

class ExpenseAdmin extends Admin 
{ 
    protected $datagridValues = array(
     '_page'  => 1, 
     '_sort_order' => 'ASC', // sort direction 
     '_sort_by' => 'c.name' // field name 
    ); 

    /** 
    * @return \Sonata\AdminBundle\Datagrid\ProxyQueryInterface 
    */ 
    public function createQuery($context = 'list') 
    { 
     $query = parent::createQuery($context); 

     return new ProxyQuery($query 
      ->join(sprintf('%s.category', $query->getRootAlias()), 'c')); 
    } 
} 
+0

我仍然需要嘗試,但它似乎正是我所需要的。謝謝。 – agentar 2012-01-16 14:40:42

5

Asume name是實體Category由至極要排序的屬性。你可以這樣做你ProductAdmin.php

protected function configureListFields(ListMapper $listMapper) 
{ 

    $listMapper->add('category.name', null, array(
      'sortable' => true, 
    )); 
    ... 
} 

這種方式,您利用在列表的標題,由索納塔產生的順序鏈接。

編輯

如果你也想在產品列表中的類別名稱的鏈接,快速編輯Category實體,假設你已經創建了一個CategoryAdmin類,你應該寫你這樣的代碼:

protected function configureListFields(ListMapper $listMapper) 
{ 

    $listMapper->add('category', null, array(
      'sortable' => 'category.name', 
    )); 
    ... 
} 

而在你Category類,你應該實現__toString()方法是這樣的:

public function __toString() 
{ 
    return $this->getName(); 
} 
+0

這曾與'KnpLabs/DoctrineBehaviors'平移' - >加( '姓名',null,數組( 'associated_property'=> 'EntityTranslation', '可排序'=> 'translations.name'))' – kunicmarko20 2016-09-05 09:55:58

相關問題