Développer avec RBS Change : [Résolu] Ajouter un filtre qui utilise "checkValue" sur le module order

  • 77400.1

    16/04/2013 13:44


    Mathias
    Rang : Expert
    Bonjour,

    suite à ce sujet, j'essaye d'implémenter le filtre qui permet de lister les commandes qui ont des produits restants à livrer dans le cas d'une expedition multiple.

    J'ai bien réussi à implémenter mon filtre sur le module order et a jouer avec la méthode getQuery() qui me renvoie bien ce que je demande :

    public function getQuery()
    {
              $query = order_OrderService::getInstance()->createQuery();
              //on récupère toutes les commandes payées
              $criteria1 = $query->createCriteria('bill');
              $criteria1->add(Restrictions::eq('status', order_BillService::SUCCESS));
              return $query;
    }


    par contre, le code au sein de la méthode checkValue(), n'est jamais pris en compte (j'ai un log fatal dans cette méthode qui ne remonte jamais dans les logs).
    j'essaye au sein de cette méthode, de tester pour chaque commande, si le nombre de produits expédiés est inférieur au nombre de produits au sein de la commande. (a priori je ne peux le faire qu'au sein de cette méthode et non pas par le biais de getQuery).

    J'ai pourtant, tester d'overrider le fichier
    override/modules/order/forms/editor/smartfolder/properties.xml

    suivi d'un :
    change.php compile-editors-config 


    pour ajouter la valeur checkValue dans le <field> de type "query" :
    <field name="query" type="query" allow="order/order::getQuery,checkValue" />


    (j'avoue avoir aussi essayé de l'ajouter en dur dans le fichier properties.xml du module sans passer par l'override, suivi de la compilation mais sans succès non plus).

    Est-ce que j'oublie une étape pour implémenter la méthode checkValue ?

    Développe sous linux Ubuntu 12.04 LTS Desktop
    Projet ecommerce core 3.6.7
  • 77400.2 en réponse à 77400.1 écrit par Mathias

    16/04/2013 15:00


    Gaël Port
    Titre : Développeur RBS Change
    Rang : Expert
    Bonjour,

    Alors les deux méthodes ne sont pas employées aux même moments. Quand on cherche à retrouver des documents on emploie getQuery, quand on cherche à savoir si un document satisfait les critères du filtre, on appelle checkValue (qui n'est donc pas employé comme un post-filtre sur les résultats de la requête).

    Chacune des deux méthodes doit donc être autonome et se suffire à elle-même.

    Dans le cas où le critère de filtre n'est pas exprimable sous forme de query il est par contre possible dans le getQuery, d'exécuter la requête, de filtrer le résultat puis de retourner un objet filter_StaticQuery contenant les identifiants des documents valides (exemple : le filtre order_PaymentStatusCustomerFilter qui réalise deux requêtes successives pour exclure de l'une les résultats de l'autre). Dans votre cas vous pouvez très bien utiliser checkValue dans cette étape de filtrage.

    Attention : cette méthode est potentiellement plus coûteuse (voire beaucoup plus selon les tests effectués) en ressources serveur que le renvoi classique d'une query, elle est donc à utiliser avec précautions et uniquement quand le filtre n'est pas exprimable directement avec une query.
  • 77400.3 en réponse à 77400.2 écrit par Gaël Port

    16/04/2013 15:17


    Mathias
    Rang : Expert
    ok, après avoir lu la class order_PaymentStatusCustomerFilter j'ai compris le fonctionnement de l'objet filter_StaticQuery.

    Je vais donc pouvoir réussir à arriver à mes fins, sachant que pour ce projet le volume n'est pas très important, cela ne devrait pas être un gros pb au niveau des ressources.

    maintenant ça m'intéresse de savoir si a tes yeux, mon besoin est exprimable sous forme de query :
    - récupérer toutes les commandes qui ont une facture payée
    - identifier celles qui ont au moins une expédition
    - identifier celles qui ont un nombre de produits expédié inférieur au nombre de produits de la commande

    par contre, je n'ai toujours pas compris, ce qui va déclencher (et comment le faire) l'utilisation de checkValue, plutôt que getQuery ou les 2...

    Développe sous linux Ubuntu 12.04 LTS Desktop
    Projet ecommerce core 3.6.7
  • 77400.4

    16/04/2013 15:44


    Gaël Port
    Titre : Développeur RBS Change
    Rang : Expert
    Alors là comme ça, c'est peut-être exprimable mais ça donnerait une requête vraiment complexe (les deux premiers critères ne posent pas de problème mais le dernier est moins simple), donc je ne suis pas convaincu que cela vaille la peine d'essayer...


    Concernant l'utilisation du checkValue c'est simplement le code appelant, selon ce qu'il vaut faire.

    Là dans le cas des commandes vous avez un dossier intelligent qui doit afficher des commande, il utilise donc naturellement le getQuery pour retrouver les commandes valides.

    Dans d'autres cas on a un objet et on veut savoir s'il vérifie le filtre, on utilise alors le checkValue. C'est notamment ce qui est fait systématiquement avec les filtres paniers pour savoir si un frais, une réduction, un mode de livraison, etc s'applique ou non au panier courant (en l'occurrence, le panier n'étant pas un document, le getQuery n'a aucun sens mais on peut avoir des documents pour lesquels on utilise l'un ou l'autre selon le contexte).


    La mention du getQuery et/ou du checkValue sur une propriété dans l'éditeur d'un document permet de spécifier les filtres à proposer. En gros si on sait qu'on ne fera que des getQuery (par exemple dans un dossier intelligent) on n'indiquera que getQuery et du coup seuls les filtres implémentant getQuery seront proposés (sans se préoccuper de savoir s'ils implémentent ou non le checkValue). Alors que si on indique les deux comme dans votre exemple plus haut, seuls les filtres implémentant les deux méthodes seront proposés.

    Cela permet dans certains cas de n'implémenter que l'un des deux tout en évitant qu'ils soient utilisés dans un contexte où l'autre serait nécessaire, ce qui aboutirait à une erreur fatale (c'est intéressant surtout quand le getQuery serait trop coûteux à mettre en œuvre alors qu'on n'a besoin du filtre que dans un cas où le checkValue suffit).
  • 77400.5 en réponse à 77400.4 écrit par Gaël Port

    16/04/2013 15:54


    Mathias
    Rang : Expert
    ok je comprends mieux, en fait je n'envisageait l'utilisation des filtres que dans le contexte de dossiers intelligents ou groupes dynamiques pour lesquels je ne touche pas au code appelant...

    c'est plus clair merci :)

    Développe sous linux Ubuntu 12.04 LTS Desktop
    Projet ecommerce core 3.6.7
 
Merci de prendre connaissance et de respecter les règles des forums.
 
1363 membres
Aucun membre connecté