THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline

#1 Créateur d'un produit

(29-03-2016 14:47:54)


Bonjour,

J'aimerai savoir s'il est possible de renseigner lors de la création d'un produit le créateur de celui-ci.
J'ai vu que dans la base de donnée, dans la table product, il y a une colonne nommée "version_created_by".
Est-ce que cette colonne correspond au créateur du produit ? si oui comment la remplir ? Elle reste à NULL ...

Merci d'avance,

Judi95

Offline

#2 Re: Créateur d'un produit

(30-03-2016 07:46:43)


Bonjour,

Je reformule ma question.
J'aimerai savoir où se trouve le création et l'implémentation de la variable list_product qui est envoyé à le vue categories.html pour afficher les produits dans le catalogue.
L'idée serai de filtrer les produits à afficher dans la vue et donc de rajouter une condition lors du remplissage de list_product.
Pourriez-vous m'indiquer dans quel fichier je dois ajouter ma condition ?

Cordialement,

Judi95

Offline

#3 Re: Créateur d'un produit

(30-03-2016 07:52:37)


Les produits ne sont pas affichés par un variable. Ils sont affichés par une boucle "produit" {loop type="product" ... } ... {/loop}. Pour les filtrer, il faut utiliser les paramètres fournis par la boucle.

Voir la doc de la boucle pour plus de détails : http://doc.thelia.net/en/documentation/ … oduct.html


OpenStudio Toulouse

Offline

#4 Re: Créateur d'un produit

(30-03-2016 08:04:05)


Bonjour,

J'ai lu cette doc, cependant, j'aimerai filtrer suivant un autre paramètre.. J'ai ajouter en bd dans la table product l'identifiant du créateur du produit.
Comment puis-je faire pour que l'utilisateur voit seulement les produit qu'il a créé lui.
Je pensais faire le test : si l’identifiant de session est le même que l'identifiant du créateur du produit, alors on affiche le produit.
Cependant je n'arrive pas à récupérer mes variable pour faire cette condition dans categories.html...

Cordialement,

Judi95

Offline

#5 Re: Créateur d'un produit

(30-03-2016 08:33:28)


Pour récupérer l'ID de l'admin connecté, utilise la substitution "admin" ( http://doc.thelia.net/en/documentation/ … admin.html ) exemple: {admin attr="id"}

Pour récupérer l'ID du créateur du produit, je suppose que tu dois étendre la boucle product.


OpenStudio Toulouse

Offline

#6 Re: Créateur d'un produit

(30-03-2016 08:40:00)


En effet j'ai récupéré l'identifiant de la personne connecté.
J'ai une variable version_created_by qui contient l'identifiant du créateur du produit.
Ma boucle est :
{loop name="product_list" type="product" visible="*" category_default=$category_id order=$product_order page=$page backend_context="on" limit=#max_displayed_products#}

Comment puis-je l'étendre avec ma nouvelle variable ? Je l'a rajoute à la suite ?

Offline

#7 Re: Créateur d'un produit

(30-03-2016 08:48:55)


Ma variable est remplie dans ma classe product mais je n'arrive pas à l'envoyé à la vue ou à la mettre dans le loop

Offline

#8 Re: Créateur d'un produit

(30-03-2016 09:35:30)


"envoyer à la vue", en Thelia, ça corrspond à rendre la variable disponible dans la loop.

Tu dois donc étendre la boucle "product". Si tu es en 2.3, tu peux utiliser le système d'override (http://doc.thelia.net/en/documentation/loop/extend.html).

Si tu es en 2.2, tu dois créer un module, dans lequel tu va créer une loop qui extends la boucle produit (e.g. la classe Thelia\Core\Template\Loop\Product), et implémente uniquement la méthode addOutputFields() pour ajouter ton champ supplémentaire.

    protected function addOutputFields(LoopResultRow $loopResultRow, $item)
    {
        $loopResultRow->set("CREATOR_ID", $item->->getVersionCreatedBy());
    }

Dans le config.xml du module, tu vas remplacer la boucle product standard de Thelia par ta boucle à toi :

<loops>
        <loop class="Your\Own\Loop\Class" name="product"/>
</loops>

Et le tour est joué.


OpenStudio Toulouse

Offline

#9 Re: Créateur d'un produit

(30-03-2016 14:21:29)


Je suis en 2.2 mais si c'est plus simple en 2.3 autant faire la mise à jour.
Où puis-je trouver la version 2.3 ? sur le GitHub ?

Offline

#10 Re: Créateur d'un produit

(30-03-2016 15:02:21)


La 2.3 est encore en alpha (alpha 2), mais la beta ne devrait pas tarder...


OpenStudio Toulouse

Offline

#11 Re: Créateur d'un produit

(30-03-2016 16:03:37)


J'ai donc choisis la solution avec la 2.2 ^^
J'ai créer un module. Dedans j'ai :
une classe vide
un dossier Lopp avec une classe

namespace Provider\Loop;


use Thelia\Core\Template\Element\LoopResultRow;
use Thelia\Core\Template\Loop\Product;

class CarouselLoop extends Product
{
    protected function addOutputFields(LoopResultRow $loopResultRow, $item)
    {
        $loopResultRow->set("CREATOR_ID", $item->getVersionCreatedBy());
    }

}

Un dossier Config avec un config.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<config xmlns="http://thelia.net/schema/dic/config"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://thelia.net/schema/dic/config http://thelia.net/schema/dic/config/thelia-1.0.xsd">

    <loops>
        <loop name="product" class="provider\Loop\OrderLoop" />
    </loops>
</config>

Je n'arrive pas a voir comment personnaliser le contenu de la fonction :
$loopResultRow->set("CREATOR_ID", $item->getVersionCreatedBy());
CREATOR_ID correspond au nom de mon nouvel argument du loop et $item->getVersionCreatedBy() correspond à sa valeur ?

Offline

#12 Re: Créateur d'un produit

(30-03-2016 16:52:56)


Erreur dans le config.xml :

dans le config.xml class="provider\Loop\OrderLoop"

dans ta classe: class CarouselLoop


OpenStudio Toulouse

Offline

#13 Re: Créateur d'un produit

(30-03-2016 19:31:36)


Corrigé. Merci ^^
Le module s'installe et s'active correctement.
Ai-je bien compris le fonctionnement ?
$loopResultRow->set("CREATOR_ID", $item->getVersionCreatedBy());
CREATOR_ID correspond au nom de mon nouvel argument du loop et $item->getVersionCreatedBy() correspond à sa valeur ?

Offline

#14 Re: Créateur d'un produit

(30-03-2016 20:02:27)


Tu viens d'ajouter une variable à la boucle. Donc dans ton template, dans un boucle "product" tu peux maintenant utiliser $CREATOR_ID.


OpenStudio Toulouse

Offline

#15 Re: Créateur d'un produit

(31-03-2016 07:46:04)


Et $item->getVersionCreatedBy() correspond à la valeur dans ma variable ?
La valeur se trouve actuellement en base de données, puis-je coder dans la classe une fonction qui va chercher cette valeur ainsi que le getter  $item->getVersionCreatedBy()  ?

Offline

#16 Re: Créateur d'un produit

(31-03-2016 08:02:30)


Je ne comprend pas ta question.

getVersionCreatedBy() est fourni en standard par Propel avec le behavior "versionnable" : http://propelorm.org/documentation/beha … nable.html

Donc $item->getVersionCreatedBy() te renvoie le contenu de la colonne version_created_by de la table product.


OpenStudio Toulouse

Offline

#17 Re: Créateur d'un produit

(31-03-2016 11:00:43)


Ah d'accord ! Je n'avais pas compris.
Il ne me reste plus qu'a remplir cette colonne en base de données alors ! Super !
Pour cela je doit faire un SELECT qui me retourne plusieurs ligne.
J'ai donc voulu faire un Foreach mais il n'arrive pas a entrer dedans...

 

$sql1 = 'SELECT `order_id`, `product_ref` FROM `order_product` WHERE `order_id`=' . $pk;
        var_dump($sql1);
        $stmt = $con->prepare($sql1);
        $stmt->execute();

        foreach($stmt as $row) {

       }

il faut que j'ajoute à une Array les résultats de $row['product_ref'] mais si déjà il ne passe pas dans la boucle, il ne peut pas empiler les résultats...
Voyez-vous d'où peut venir l'erreur ?

Offline

#18 Re: Créateur d'un produit

(31-03-2016 11:15:49)


Je ne comprends pas ce que tu fais. Pourquoi une requete SQL ? Utilise la boucle que tu viens de coder !


OpenStudio Toulouse

Offline

#19 Re: Créateur d'un produit

(31-03-2016 11:25:15)


En fait c'est un peu compliqué...
J'ai réussi à mettre pour chaque produit l'identifiant de l'administrateur qui l'a créé.
Maintenant il faut que je fasse de même avec les commandes.
Dans une commande on a des produits. Il faut que je regarde si ces produits appartiennent tous au même administrateur, si oui, je dois rentrer dans la table order l'identifiant de l'administrateur concerné.

Pour cela je récupère les produits de la commande qui vient d'être créée, je passe donc par order_product pour faire le joint entre la commande et le créateur des produits de la commande.
Je fais une boucle pour tous les produits de la commande : je vais chercher le créateur de chaque produit.
En suite il faut que je regarde si les produits de la commande proviennent tous du même administrateur ou non.
Si oui, il faut que j'ajoute dans la table order l'identifiant de l'administrateur concerné.

En mode brouillon ça donne ça ...:

$ref_product = array();
        $sql1 = 'SELECT `order_id`, `product_ref` FROM `order_product` WHERE `order_id`=' . $pk;
        var_dump($sql1);
        $stmt = $con->prepare($sql1);
       // $stmt->execute();
        var_dump("ok");
        foreach($stmt->execute() as $row) {
        var_dump('foreaach');

            $sql2 = sprintf('SELECT `id`,`ref`, `version_created_by` FROM `product` WHERE `ref`=(%s)',
               $row['product_ref']
            );

            foreach ($con->query($sql2) as $row2) {
                array_push($ref_product, $row2['version_created_by']);
            }
        }

        var_dump($ref_product);

        $valeur_precedante = $ref_product[1];
        $idem_fournisseur = false;
        foreach ($ref_product as $value) {
            if ($valeur_precedante == $value) {
                $idem_fournisseur = true;
            } else {
                $idem_fournisseur = false;
                break;
            }
        }
        var_dump($idem_fournisseur);

        if ($idem_fournisseur == true) {
            $sql3 = sprintf(
                'INSERT INTO `order` (%s) VALUES (%s)',
               '`VERSION_CREATED_BY`',
                $_SESSION['_sf2_attributes']['thelia.admin_user']->getId()
            );

Il y a encore du boulot.... Mais rien que le premier foreach me bloque ...

Offline

#20 Re: Créateur d'un produit

(31-03-2016 11:26:35)


la boucle que j'ai créer va en effet me servir mais pour le moment la colonne VersionCreatedBy est vide dans ma table Order donc ça va me retourner null ...

Offline

#21 Re: Créateur d'un produit

(31-03-2016 11:34:38)


Avec Thelia 2, tu ne dois pas utiliser  directement de requêtes SQL. Il te faut passer par l'API Propel : http://propelorm.org/documentation

Exemple : pour retrouver les produits d'une commande, au lieu d'écrire

$ref_product = array();
        $sql1 = 'SELECT `order_id`, `product_ref` FROM `order_product` WHERE `order_id`=' . $pk;
        var_dump($sql1);
        $stmt = $con->prepare($sql1);
       // $stmt->execute();
        var_dump("ok");
        foreach($stmt->execute() as $row) {
        var_dump('foreaach');

            $sql2 = sprintf('SELECT `id`,`ref`, `version_created_by` FROM `product` WHERE `ref`=(%s)',
               $row['product_ref']
            );

            foreach ($con->query($sql2) as $row2) {
                array_push($ref_product, $row2['version_created_by']);
            }
        }

tu vas écrire :

$ref_product = [];

$orderProducts = OrderProductQuery::create()->filterByOrderId($pk)->find();

foreach ($orderProducts as $orderProduct) {
   if (null !== $product = ProductQuery::create()->findOneByRef($orderProduct->getRef())) {
       array_push($ref_product, $product->getVersionCreatedBy())
   }
}

etc...

OpenStudio Toulouse

Offline

#22 Re: Créateur d'un produit

(31-03-2016 12:19:54)


Oula d'accord j'étais loin !
En gros la ta requête va chercher la liste de tous les produits d'une commande avec

 $orderProducts = OrderProductQuery::create()->filterByOrderId($pk)->find();  

Puis tu boucles sur tous les produits trouvés pour la commande,

 foreach ($orderProducts as $orderProduct) 

Et tu vas chercher un par un les produits qui on pour référence $orderProduct->getRef()

  ProductQuery::create()->findOneByRef($orderProduct->getRef()) 

J'ai tout compris ?

Offline

#23 Re: Créateur d'un produit

(31-03-2016 12:30:16)


La doc Propel esr très détaillée.


OpenStudio Toulouse

Offline

#24 Re: Créateur d'un produit

(31-03-2016 12:48:38)


D'accord merci beaucoup je vais regarder.
(cependant je n'arrive toujours pas à rentrer dans votre foreach...)

Offline

#25 Re: Créateur d'un produit

(31-03-2016 13:52:43)


Ah j'ai trouvé ma faute !
Je me trouve donc dans la fonction DoInsert de Order.
Mais en fait je n'arrive pas à récupérer l'id de la commande en cour d'insertion....