如何在 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 过滤器的主要内容,如果未能解决你的问题,请参考以下文章