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 au problème suivant. Je voudrais ajouter mon champ de formulaire seulement pour les produits qui ont un template (gabarit) particulier.

Le problème c'est que dans mon hook j'affiche les nouveaux champs si mon template correspond au template indiqué depuis la configuration du module et comme les champs de formulaire sont obligatoire alors je ne peux pas ajouter au panier un produit qui n'a pas le gabarit indiqué dans ma configuration.

product.html

{hook name="mymodule.product" product={$ID} template={$TEMPLATE}}

Sur mon formulaire :

<?php

namespace MyModule\Form;

use Symfony\Component\Validator\Constraints\NotBlank;
use Thelia\Form\CartAdd as TheliaCartAdd;
use MyModule\MyModule;

class CartAdd extends TheliaCartAdd
{

    public function buildForm()
    {
        $numberField = MyModule::getConfigValue(MyModule::CONFIG_NUMBER_FIELD);
        $moduleTemplateId = MyModule::getConfigValue(MyModule::CONFIG_TEMPLATE_ID);

        for($i = 1; $i <= $numberField; $i++) {
            $this->formBuilder
                ->add("color_$i", "text", array(
                    "required" => true,
                    'constraints' => array(
                        new NotBlank()
                    )
                ));
        }

        parent::buildForm();
    }

}

Pour le coup je ne pense pas que depuis le formulaire d'ajout au panier on puisse récupérer le produit concerné ? Si quelqu'un pouvait me confirmer ça ou me proposer une solution pour parer à ce problème si il existe.

Merci d'avance.

Offline


Dans buildForm, tu peux récupérer la request ($this->getRequest()), et voir si elle contient l'ID d'un produit.


OpenStudio Toulouse

Offline


Ouep c'est ce que j'ai fini par faire, en y injectant la requête par DI et tout roule wink

PS : Rien à voir mais comparé à Prestashop, Thelia est vraiment pensé pour les devs et ça c'est cool quand les choses sont bien faites ^^. Le seul point noir c'est la doc ^^

Offline


Merci pour le compliment smile Pour la doc, c'est vrai qu'il manque au minimum un livre de recettes, pour le genre de dev que tu veux faire, par exemple. L'extension des formulaires, c'est tellement courant...

Mais il faudrait trouver du temps pour le faire, et ça c'est une autre paire de manches.


OpenStudio Toulouse

Offline


Il faudrait que je trouve du temps pour faire un module explicatif. J'ai appris beaucoup de chose en 3 jours mais faut pas avoir peur de lire le code source. Le plus dur d'ailleurs c'est pas la doc c'est de convertir les personnes utilisant Prestashop pour utiliser Thelia smile tongue

Une question sur les boucles, j'ai cette boucle dans AdminIncludes/order-edit.html

{loop type="order_product" name="order-product" order=$order_id}
    {loop type="order_product_svg" name="order-products-svg" order_product=$ID}
        {$ID} {$CONTENT}
    {/loop}
{/loop}

Ma boucle est la suivante :

<?php

namespace MyModule\Loop;

use Thelia\Core\Template\Element\BaseLoop;
use Thelia\Core\Template\Element\LoopResult;
use Thelia\Core\Template\Element\LoopResultRow;
use Thelia\Core\Template\Element\PropelSearchLoopInterface;
use Thelia\Core\Template\Loop\Argument\Argument;
use Thelia\Core\Template\Loop\Argument\ArgumentCollection;
use MyModule\Model\OrderProductSvg;
use MyModule\Model\OrderProductSvgQuery;

class OrderProductSVGLoop extends BaseLoop implements PropelSearchLoopInterface
{

    /**
     * @param LoopResult $loopResult
     *
     * @return LoopResult
     */
    public function parseResults(LoopResult $loopResult)
    {
        /** @var OrderProductSvg $orderProductSVG */
        foreach($loopResult->getResultDataCollection() as $orderProductSVG) {
            $loopResultRow = new LoopResultRow($orderProductSVG);

            $loopResultRow
                ->set('ID', $orderProductSVG->getOrderProductId())
                ->set('CONTENT', 'content');

            $loopResult->addRow($loopResultRow);
        }

        return $loopResult;
    }

    protected function getArgDefinitions()
    {
        return new ArgumentCollection(
            Argument::createIntListTypeArgument('order_product')
        );
    }

    public function buildModelCriteria() {
        $orderId = $this->getOrderProduct();

        var_dump($orderId);
        $search = OrderProductSvgQuery::create();

        $search->filterByOrderProductId(
            $orderId
        );

        return $search;
    }
}

Ce que je voudrais c'est afficher dans la boucle seulement les OrderProductSvg avec pour id la clé primaire de OrderProduct.

Offline


Il faudrait que je trouve du temps pour faire un module explicatif

On en est tous là smile

Ce que je voudrais c'est afficher dans la boucle seulement les OrderProductSvg avec pour id la clé primaire de OrderProduct.

$search->filterByOrderProductId($orderId);

Ça c'est presque OK: vu que ton argument peut être une liste d'IDs (Argument::createIntListTypeArgument), il faudrait plutôt écrire comme suit, car $orderId est un tableau :

$search->filterByOrderProductId($orderId, Criteria::IN);

Sinon, tu laisse tel quel, et tu spécifies un argument simple :

return new ArgumentCollection(Argument::createIntTypeArgument('order_product'));

OpenStudio Toulouse

Offline


Merci ^^. Il me manquait le critère pour le tableau tongue

Apprendre l'API Thelia, Propel, Symfony ça fait pas mal de nouvelles choses. Le plus bloquant pour moi reste Propel hmm.

Pour quoi Propel et pas Doctrine (je n'utilise aucun des 2) et pourquoi Smarty au lieu de Twig ? Je pose la question par rapport à ce que propose Symfony par défaut.

Offline