0

这是我在 SymfonyCMF 上的第一个简单项目。在我的项目中,我有很多“个人资料”文档(就 phpcr 而言)。每个配置文件都属于特定的“部门”(父文档)。(在 phpcr 中,每个文档都必须有父文档。)在管理面板(SonataAdmin)中,我可以使用 configureListFields 函数列出所有“配置文件”。我可以使用 configureDatagridFilters 函数通过“配置文件”属性过滤它们。但是,无法弄清楚如何通过其父“部门”文档过滤“个人资料”。

        protected function configureDatagridFilters(DatagridMapper $datagridMapper)
    {
        $datagridMapper
            ->add('name','doctrine_phpcr_string')
            ->add('title', 'doctrine_phpcr_string')
            ->add('parent') <--- Need to filter  by parent !
          ;
    }

尝试从 SonataAdmin文档中实现自定义回调过滤器功能:

    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
    {
        $datagridMapper

            ->add('parent', 'doctrine_phpcr_callback', array(
                'callback' => function($queryBuilder, $alias, $field, $data) {
                    if (!$data || !is_array($data) || !array_key_exists('value', $data)) {
                        return;
                    }

                    $queryBuilder = $proxyQuery->getQueryBuilder();
                    $eb = $queryBuilder->expr();

                    $queryBuilder->andWhere($eb->eq($field, $data['value']));

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

但是,首先我得到了一个与 $proxyQuery 相关的错误,$queryBuilder->expr()。其次我不知道如何正确查询和过滤父((。谢谢提前。

向@Bilel Noômene 解决了thanx 最终答案是

    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{

    $datagridMapper->add('parent', 'doctrine_phpcr_callback', array('callback' =>
        function ($proxyQuery, $alias, $field, $data) {
            if (!$data || !is_array($data) || !array_key_exists('value', $data) || !$data['value']) {
                return;
            }


            $queryBuilder = $proxyQuery->getQueryBuilder();

            $queryBuilder->from($alias)
                ->joinInner()
                ->left()->document(Profile::class, $alias)->end()
                ->right()->document(Department::class, 'd')->end()
                ->condition()->child($alias, 'd')->end();

            $queryBuilder->andWhere()->same($data['value']->getId(), 'd')->end();

            return true;
        }
    ), DocumentType::class, array('class'=>Department::class));

    parent::configureDatagridFilters($datagridMapper);
}
4

1 回答 1

0

该文档的示例似乎无法正常工作。对于您的情况,请尝试此代码。

public function configureDatagridFilters(DatagridMapper $datagridMapper)
{
    $datagridMapper->add('parent', 'doctrine_phpcr_callback', array('callback' =>
        function ($proxyQuery, $alias, $field, $data) {
            if (!$data || !is_array($data) || !array_key_exists('value', $data) || !$data['value']) {
                return;
            }

            $queryBuilder = $proxyQuery->getQueryBuilder();

            $queryBuilder->from($alias)
                ->joinInner()
                ->left()->document(Profile::class, $alias)->end()
                ->right()->document(Department::class, 'd')->end()
                ->condition()->child($alias, 'd')->end();
            $queryBuilder->andWhere()->same($data['value']->getId(), 'd')->end();

            return true;
        }
    ), 'phpcr_document', array('class' => Department::class));

    parent::configureDatagridFilters($datagridMapper);
}
于 2017-03-11T21:23:36.267 回答