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:

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;
}
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
 
protected function configureListFields(ListMapper $listMapper)
{
    $listMapper
        ->add('nbPurchases', 'integer', array(
            'label' => 'Nombre d\'achat',
        ))
        ->add('quota', 'integer', array(
            'label' => 'Quota',
        ))
J'aimerai donner la possibilité à l'utilisateur de trier et filtrer la liste en fonction du nombre d'achat et du 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 :

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',
))
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.

Quelqu'un sait-il comment trier et filtrer des champs virtuels avec sonata admin ?
Merci.