Bonjour,
Dans une de mes listes j'aimerai pouvoir trier des champs faisant appels à des méthodes de mon entité, par exemple :
Pour une entité Company:
Dans la liste des entreprise je peux afficher le résultat de ces méthodes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 /** * @ORM\OneToMany(targetEntity="Purchase", mappedBy="company") */ private $purchases; public function getPurchases() { return $this->purchases; } public function getNbPurchases() { return $this->getPurchases()->count(); } public function getQuota() { $quota = 0; $purchases = $this->getPurchases(); foreach ($purchases as $purchase) { $quota += $purchase->getPack()->getQuota(); } return $quota; }
J'aimerai donner la possibilité à l'utilisateur de trier et filtrer la liste en fonction du nombre d'achat et du quota.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 protected function configureListFields(ListMapper $listMapper) { $listMapper ->add('nbPurchases', 'integer', array( 'label' => 'Nombre d\'achat', )) ->add('quota', 'integer', array( 'label' => 'Quota', ))
Pour le tri je n'ai rien trouvé ........ impossible d'utiliser 'sortable' => true (nbPurchases et quota ne sont pas des attributs de l'entité company)
Pour le filtre j'ai réussi à créer un filtre pour nbPurchases en utilisant doctrine_orm_callback :
Par contre pour le quota je n'ai pas réussi avec cette méthode : quota n'est pas un attribut de l'entité company.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 ->add('nbPurchases', 'doctrine_orm_callback', array( 'label' => 'Nombre d\'achat', 'callback' => function($queryBuilder, $alias, $field, $value) { if (!$value || !isset($value['value']) || !isset($value['value']['type']) || !$value['value']['type']) { return; } $operators = array( NumberType::TYPE_EQUAL => '=', NumberType::TYPE_GREATER_EQUAL => '>=', NumberType::TYPE_GREATER_THAN => '>', NumberType::TYPE_LESS_EQUAL => '<=', NumberType::TYPE_LESS_THAN => '<', ); $operator = $operators[$value['value']['type']]; $queryBuilder->andWhere('SIZE('.$alias.'.purchases) '.$operator.' :size'); $queryBuilder->setParameter('size', $value['value']['value']); }, 'field_type' => 'sonata_type_filter_number', ))
Quelqu'un sait-il comment trier et filtrer des champs virtuels avec sonata admin ?
Merci.
Partager