THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline


Bonjour,

Suite à mon développement de modules liée au panier (avec l'aide de roadster31) j'ai un comportement que je voudrais éviter.

Lorsque l'event CART_ADDITEM est appelé je persiste des données dans une table cart_item_svg qui contient en clé primaire l'id du cart_item.
- Le problème survient lorsque je ne suis pas connecté
- J'ajoute mon produit, ma donnée est persisté dans cart_item_svg
- Je fais étape suivante dans le panier pour me connecté et le tuple sur la table cart est supprimé pour persister une nouvelle donnée
- Ce qui fait que ma clé primare sur cart_item_svg n'est plus bonne car la clé primare de cart_item est aussi un nouveau tuple

Comment éviter ce comportement, ou tout simplement recréer mon tuple dans ma nouvelle table ?

Ces events devraient m’intéresser mais comment les exploiter et lequel est le plus pertinent ?

/** Persist a cart */
const CART_PERSIST = "cart.persist";

/** Restore a current cart in the session, either by reloading it from the database, or creating a new one */
const CART_RESTORE_CURRENT = "cart.restore.current";

/** Create a new, empty cart in the session, and attach it to the current customer, if any. */
const CART_CREATE_NEW = "cart.create.new";

/**
 * sent when a new existing cat id duplicated. This append when current customer is different from current cart
 */
const CART_DUPLICATE = "cart.duplicate";

const CART_ITEM_DUPLICATE = "cart.item.duplicate";

Merci d'avance.

Last edited by Rtransat (24-10-2016 16:52:45)

Offline


Abonne toi à CART_ITEM_DUPLICATE avec un priorité élevée. Tu vas alors pouvoir dupliquer ta donnée avant que l'original ne soit supprimé avec le cart item :

    public function cartItemDuplicate(CartItemDuplicationItem $event)
    {
        if (null !== $machin = MachinChoseQuery::create()->findOneByCartItemId($event->getOldItem()->getId())) {
            $truc = new MachinChose();

            $truc
                ->setBidule($machin->getBidule())
                ...
                ->setCartItemId($event->getNewItem()->getId())
                ->save();
        }
    }

Et voilà.


OpenStudio Toulouse

Offline


Merci pour ton aide, ça fonctionne au poil smile. J'aurais pas pensé à cet événement là personnellement.

Petite question rapide, dans l'admin (AdminIncludes/product-edit.html) je voudrais récupérer dans mon formulaire le template_id, il y a possibilité de faire ça simplement ?
J'ai mon propre event que je dispatch dans mon controller, je lui envoie le product_id ($this->getRequest()->getProductId()) mais pour récupérer le template_id à part faire une requête dans mon event je ne vois pas comment faire si il y a bien sur un moyen plus simple pour le faire.

Offline


à part faire une requête dans mon event je ne vois pas comment faire

Mon non plus, il te faut faire une requeête pour récupérer le Product, à partir duquel tu pourra récupérer le template id avec getTemplateId().


OpenStudio Toulouse

Offline


C'est bien ce que je me disais. Bah je vais faire cette fameuse requête alors. C'est même peut-être inutile de récupérer mon templateId dans mon cas. Je vais y réfléchir.

Un autre problème survient, j'ai mon formulaire qui hérite de BaseForm et lorsque la validation échoue j'ai une erreur du type :

InvalidArgumentException in BaseLoop.php line 302:
[Le paramètre "category" est absent dans la boucle type: category-path, nom: category_path ]

Qu'est ce que fait la catégorie ici ?

Et lorsque le formulaire est bien remplie, les données sont sauvegardées mais j'ai un redirect sur la page d'accueil de la boutique.

class ProductController extends BaseAdminController
{

    public function addAction()
    {
        $form = $this->createForm('mymodule.product.form');

        $error_message = null;

        try {
            $validateForm = $this->validateForm($form);

            $data = $validateForm->getData();

            $event = new ProductEvent(
                $this->getRequest()->getProductId(),
                $data['svg'],
                $data['total_color_fields']
            );

            $this->dispatch('mymodule.product.create', $event);

            return $this->generateSuccessRedirect($form);

        } catch (\Exception $e) {
            $error_message = $e->getMessage();

            Tlog::getInstance()->error("Failed to validate MyModuleProduct form: $error_message");
        }


        $this->setupFormErrorContext(
            'Fail to process Product form data',
            $error_message,
            $form
        );

        return $this->render("product-edit");

    }
}

Offline


1) Aucune idée.

2) Ça retourne quoi $this->generateSuccessRedirect($form); ?


OpenStudio Toulouse

Offline


C'est résolu pour la "2". Je viens de comprendre le champ success_url qui est liée à la méthode generateSuccessRedirect ^^.

Par contre pour afficher les valeurs de mes champs stockés en base (pour l'édition), il faut passer par une loop obligatoirement ? (Je m'inspire du module View)