如何在SonataAdmin中创建自定义DataGrid筛选器

Ami*_*mit 6 symfony symfony-sonata

我有一个包含大量状态代码的实体交易.我希望用户能够在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";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经配置了我的Sonata List Mapper,如下所示:

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

哪作得很好:

但是我无法使用与过滤器相同的功能.

如果我试试这个:

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

这不起作用.它给出以下错误 - >

Notice: Undefined index: statusAsString in ..../Sonata\DoctrineORMAdminBundle\Guesser\FilterTypeGuesser.php 
Run Code Online (Sandbox Code Playgroud)

我怎样才能使它工作?

Ami*_*mit 26

这对我来说是一个临时解决方案.如果有人有更好的解决方案,请分享.

$datagridMapper
       ->add('status', 'doctrine_orm_string', array(),
             'choice', array('choices' => Transaction::getStatusList())
       );
Run Code Online (Sandbox Code Playgroud)

在实体中

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",);
    }
Run Code Online (Sandbox Code Playgroud)