如何在 SonataAdmin 中创建自定义 DataGrid 过滤器

Posted

技术标签:

【中文标题】如何在 SonataAdmin 中创建自定义 DataGrid 过滤器【英文标题】:How can I create a custom DataGrid filter in SonataAdmin 【发布时间】:2012-04-30 17:50:36 【问题描述】:

我有一个带有许多状态代码的实体事务。 我希望用户能够在 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 

我怎样才能让它工作?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

类似的东西

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']);

【讨论】:

谢谢伙计。实际上,我很快就解决了这个问题。我在实体中创建了另一个静态方法,该方法返回数组中的选择列表。然后我在我的 DataGrid 表单中使用它。

以上是关于如何在 SonataAdmin 中创建自定义 DataGrid 过滤器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 中创建自定义关系?

如何在 QML 中创建自定义对象?

如何在 Facebook SDK 中创建自定义分享按钮

如何在 WordPress 中创建自定义表单?

如何在 React Native 中创建自定义日历?

如何在 JavaScript 中创建自定义错误?