これは、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);
}