Classifique a exibição de lista no Sonata Admin por campos de entidade relacionados
Usando o Sonata Admin Bundle, que é um ótimo complemento para o Symfony, deparei-me com o problema descrito a seguir.
Digamos que temos três entidades: Cidade, Estado e País. Todos eles têm as propriedadesid
ename
. Cidade tem uma relação muitos-para-um com o Estado e Estado tem uma relação muitos-para-um com o País. Todos eles precisam codificar métodos que exibem o valor do nome da propriedade.
Podemos criar uma exibição de lista para a entidade City no Sonata Admin da seguinte maneira:
função protegida configureListFields (ListMapper $ listMapper) {$ listMapper -> addIdentifier ('id') -> add ('name') -> add ('state') -> add ('state') -> add ('state.country'); }
Para ilustração, a visualização pode ser assim:
|-----||--------------------||--------------------||--------------------|
| Id ^|| Name ^ || State || State Country |
|-----||--------------------||--------------------||--------------------|
| 1 || New York || New York || USA |
| 2 || Acapulco || Guerrero || Mexico |
| 3 || Calgary || Alberta || Canada |
| 4 || Tijuana || Baja California || Mexico |
| 5 || Vancouver || British Columbia || Canada |
| 6 || Los Angeles || California || USA |
|-----||--------------------||--------------------||--------------------|
Por padrão, a lista é classificável pelas colunasEu iria eNome, o sinal ^ deve representar isso. Eu gostaria de poder classificar a lista pelos campos da entidade relacionada e ter um link apontando para a ação show da entidade relacionada.
Aqui está como eu consegui a classificação porEstado:
//...
->add('state', null, array(
'route' => array('name' => 'show'),
'sortable' => true,
'sort_field_mapping' => array('fieldName' => 'name'), // property name of entity State
'sort_parent_association_mappings' => array(array('fieldName' => 'state')) // property state of entity City
))
//...
Agora a exibição em lista é classificável pela propriedadenome da entidadeEstado e todos os campos na colunaEstado aponte para a página do programa para o estado atual:
|-----||--------------------||--------------------||--------------------|
| Id ^|| Name ^ || State ^ || State Country |
|-----||--------------------||--------------------||--------------------|
| 3 || Calgary || Alberta || Canada |
| 4 || Tijuana || Baja California || Mexico |
| 5 || Vancouver || British Columbia || Canada |
| 6 || Los Angeles || California || USA |
| 2 || Acapulco || Guerrero || Mexico |
| 1 || New York || New York || USA |
|-----||--------------------||--------------------||--------------------|
Como faço para classificar a exibição de lista peloPaís (Cidade-> Estado-> País)? Algo assim:
|-----||--------------------||--------------------||--------------------|
| Id ^|| Name ^ || State ^ || State Country |
|-----||--------------------||--------------------||--------------------|
| 3 || Calgary || Alberta || Canada |
| 5 || Vancouver || British Columbia || Canada |
| 2 || Acapulco || Guerrero || Mexico |
| 4 || Tijuana || Baja California || Mexico |
| 6 || Los Angeles || California || USA |
| 1 || New York || New York || USA |
|-----||--------------------||--------------------||--------------------|
Quando tento algo parecido com o trecho de código acima:
//...
->add('state.country', null, array(
'route' => array('name' => 'show'),
'sortable' => true,
'sort_field_mapping' => array('fieldName' => 'country.name'), // property name of entity Country
'sort_parent_association_mappings' => array(array('fieldName' => 'state.country')) // property country of entity State
))
//...
um erro de exceção é lançado. Eu tentei combinações diferentes, mas todas sem sucesso.
Eu poderia fazer:
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->addIdentifier('id')
->add('name')
->add('state.name')
->add('state.country.name')
;
}
e resolva o problema de classificação, mas não há links para as entidades.
A documentação oficial é muito boa, mas falta esse tópico. Então, como classificar uma exibição de lista por entidades hierárquicas?