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() に関連するエラーが発生しました。次に、親で適切にクエリおよびフィルタリングする方法がわかりません ((。事前に感謝します。

解決済み @Birel Noômene に感謝 最終的な答えは

    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 に答える