2012-04-19 60 views
4

我有一個具有多個狀態代碼的實體事務。 我希望用戶能夠在SonataAdmin中將這些狀態碼看作字符串。用戶還應該能夠根據這些狀態碼進行過濾。如何在SonataAdmin中創建自定義數據網格過濾器

Entity Transaction 
{ 
    const TRANSACTION_STATUS_WAITING = 1; 
    const TRANSACTION_STATUS_PENDING = 2; 
    const TRANSACTION_STATUS_CONFIRMED = 3; 

    /** 
    * Set status 
    * 
    * @param smallint $status 
    */ 
    public function setStatus($status) 
    { 
     $this->status = $status; 
    } 

    /** 
    * Get status 
    * 
    * @return smallint 
    */ 
    public function getStatus() 
    { 
     return $this->status; 
    } 

    public function getStatusAsString() 
    { 
     switch($this->status){ 
      case(self::TRANSACTION_STATUS_WAITING): return "Waiting for Merchant"; 
      case(self::TRANSACTION_STATUS_PENDING): return "Pending Confirmation"; 
      case(self::TRANSACTION_STATUS_CONFIRMED): return "Confirmed"; 
     } 
    } 
} 

我已經配置我的索納塔列表映射是這樣的:

protected function configureListFields(ListMapper $listMapper) 
{ 
    $listMapper 
     ->addIdentifier('id') 
     ->add('statusAsString', null, array('sortable' => true, 'label' => 'Status')) 
} 

這工作完全正常:

但是我不能使用相同的過濾器。

如果我試試這個:

protected function configureDatagridFilters(DatagridMapper $datagridMapper) 
{ 
    $datagridMapper 
     ->add('user') 
     ->add('status') // Works well 
     ->add('statusAsString', null, array('label' => 'Status')) // Doesn't work: 
    ; 
} 

這是行不通的。它給出了以下錯誤 - >

Notice: Undefined index: statusAsString in ..../Sonata\DoctrineORMAdminBundle\Guesser\FilterTypeGuesser.php 

我該如何使它工作?

回答

26

這對我來說是一個臨時解決方案。如果有人有更好的解決方案,請分享。

$datagridMapper 
     ->add('status', 'doctrine_orm_string', array(), 
      'choice', array('choices' => Transaction::getStatusList()) 
     ); 

在實體

public static function getStatusList() 
    { 
     return array(
      self::TRANSACTION_STATUS_WAITING => "Waiting", 
      self::TRANSACTION_STATUS_PENDING_CONFIRMATION => "Pending Confirmation", 
      self::TRANSACTION_STATUS_CONFIRMED => "Confirmed", 
      self::TRANSACTION_STATUS_PAYMENT_REQUESTED => "Payment Requested",); 
    } 
3

類似的東西

protected function configureDatagridFilters(DatagridMapper $datagridMapper) 
{ 
    $datagridMapper 
     ->add('codes', 'doctrine_orm_callback', array(
      'label'   => 'Код', 
      'callback'  => array($this, 'getCodesFilter'), 
      'field_type' => 'genemu_jquerychosen', 
      'field_options' => array(
       'class'  => 'Mtools\ClientBundle\Entity\Client', 
       'widget' => 'entity', 
       'multiple' => false, 
      ) 
     ); 
} 

public function getCodesFilter($queryBuilder, $alias, $field, $value) 
{ 
    if (!$value) { 
     return; 
    } 
    $queryBuilder->leftJoin(sprintf('%s.codes', $alias), 'c'); 
    $queryBuilder->andWhere('c.code = :code'); 
    $queryBuilder->setParameter('code', $value['value']); 
} 
+1

感謝隊友。其實,我很快就解決了這個問題。我在實體中創建了另一個靜態方法,該方法返回數組中的選擇列表。然後我在我的DataGrid窗體中使用它。 – Amit 2012-06-25 06:59:13

相關問題