How can I create a custom DataGrid filter in SonataAdmin

symfony, symfony-sonata

Solution

This worked as a temporary solution for me. If anyone has a better solution, please share.

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

In the entity

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",);
    }

Problem

I have an entity Transaction with numerous status codes. I want the user to be able to see these status codes as strings in SonataAdmin. The user should also be able to filter on the basis of these status codes. ``` 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"; } } } ``` I have configured my Sonata List Mapper like this: ``` protected function configureListFields(ListMapper $listMapper) { $listMapper ->addIdentifier('id') ->add('statusAsString', null, array('sortable' => true, 'label' => 'Status')) } ``` which works perfectly fine: However I am unable to use the same as a Filter. If I try this: ``` protected function configureDatagridFilters(DatagridMapper $datagridMapper) { $datagridMapper ->add('user') ->add('status') // Works well ->add('statusAsString', null, array('label' => 'Status')) // Doesn't work: ; } ``` This doesn't work. It gives the following error -> ``` Notice: Undefined index: statusAsString in ..../Sonata\DoctrineORMAdminBundle\Guesser\FilterTypeGuesser.php ``` How can I make it work?

Original source