2012-04-19 16 views
4

私は多くのステータスコードでエンティティトランザクションを持っています。 ユーザーは、これらのステータスコードをSonataAdminの文字列として見ることができるようにします。ユーザーは、これらのステータスコードに基づいてフィルタリングすることもできます。SonataAdminでカスタムDataGridフィルタを作成するにはどうすればいいですか

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

関連する問題