SonataAdminBundle,按功能结果

时间:2015-08-04 11:03:07

标签: php symfony sonata-admin

在我的Symfony项目中,我使用的是SonataAdminBundle。我有一个问题: 例如,我有一个带有函数的实体:

class Entity {
protected $id;

public idBiggerThan($value) {
     return $id > $value;
}

我想创建一个过滤器,按照此函数的结果过滤列表(例如,只能选择id大于当前用户的实体)。

据我所知,这个过滤器可以在不使用此功能的情况下编写,但我有更复杂的功能,我不想编写查询。

感谢您的帮助。

UPD:我尝试过类似的东西,但它不起作用

$datagridMapper
    ->add('id', 'doctrine_orm_callback', array(
        'callback' => 
            function($queryBuilder, $alias, $field, $value) {
                if (!$value['value']) {
                    return;
                }

                $queryBuilder
                    ->where($alias . '. idBiggerThan(:current_user)')
                    ->setParameter('current_user', $this->getCurrentUser()->getId());

            },
        'field_type' => 'checkbox'
    ));

1 个答案:

答案 0 :(得分:0)

在文档中查看doctrine_orm_callback: https://sonata-project.org/bundles/doctrine-orm-admin/master/doc/reference/filter_field_definition.html


    $datagridMapper->add('title')
                ->add('enabled')
                ->add('tags', null, array(), null, array('expanded' => true, 'multiple' => true))
                ->add('author')
                ->add('with_open_comments', 'doctrine_orm_callback', array(
    //                'callback'   => array($this, 'getWithOpenCommentFilter'),
                    'callback' => function($queryBuilder, $alias, $field, $value) {
                        if (!$value['value']) {
                            return;
                        }
                        $queryBuilder->leftJoin(sprintf('%s.comments', $alias), 'c');
                        $queryBuilder->andWhere('c.status = :status');
                        $queryBuilder->setParameter('status', Comment::STATUS_MODERATE);
                        return true;
                    },
                    'field_type' => 'checkbox'
                ));