THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline

#1 Livraison via fournisseur

(07-06-2021 14:27:17)


Hello ici!

Je suis en train de développer plein de modules pour gérer des produits livrables par le fournisseur directement. (produits non stockés par la boutique)

J'ai donc créé un module qui permet de déterminer des règles de mode de livraison. Exemple :
- Si tous les produits du panier font partis du fournisseur X alors on empêche la livraison Chronopost
- Si aucun produit du panier fait parti du fournisseur X alors on empêche la livraison "fournisseur"

Le souci qui se pose pour l'instant (j'ai pas tout fini...)

1/ C'est que si 10 fournisseurs, alors je créé 10 modules de livraison à domicile (je voulais faire comme chronopost en remplaçant les différents "sous-modes" de livraison par le nom des fournisseurs mais ça devenait galère pour gérer les "sous-modes" dans les règles de livraison en sachant que tous les modules de livraison n'ont pas de sous-modes etc...) : jusque là pas de souci...

Sauf que dans mon BO, je vais pas m'y retrouver si tous mes modules de livraison à domicile sont nommés "Livraison à domicile"... et si je mets "Livraison à domicile (Fournisseur 1)", "Livraison à domicile (Fournisseur 2)", "Livraison à domicile (Fournisseur 3)", ... pour l'acheteur ça fera bizarre côté front.

Existe-t-il un moyen (côté front) de changer le nom du module à l'affichage ?

2/ Comment je fais pour récupérer dans le front (à plusieurs endroits) les ID des modules de livraison à exclure (dans une variable) depuis une fonction de mon module ?
Exemple :

fonction_de_mon_module(){
   //parcoure produits...
   //vérification des règles
   //retourne list d'IDs à exclure
}

et en front sur les pages "cart" (estimation des frais...) et "order/delivery" (ajax/order-delivery-module-list.html) mettre $RESTRICTED_DELIVERY_EXCLUDE dans ma loop delivery (pour l'estimation je sais pas si y'a possibilité ...)

Last edited by Elyos (07-06-2021 14:50:25)


Aide les autres, ils t'aideront en retour.

Offline


Elyos wrote:

2/ Comment je fais pour récupérer dans le front (à plusieurs endroits) les ID des modules de livraison à exclure (dans une variable) depuis une fonction de mon module ?
Exemple :

fonction_de_mon_module(){
   //parcoure produits...
   //vérification des règles
   //retourne list d'IDs à exclure
}

et en front sur les pages "cart" (estimation des frais...) et "order/delivery" (ajax/order-delivery-module-list.html) mettre $RESTRICTED_DELIVERY_EXCLUDE dans ma loop delivery (pour l'estimation je sais pas si y'a possibilité ...)

Faut utiliser Smarty :

<service id="restricted_delivery.exclude.smarty.plugin" class="RestrictedDelivery\Smarty\Plugins\RestrictedDeliveryExclude" scope="request">
	<argument type="service" id="request" />
	<argument type="service" id="event_dispatcher"/>
	<tag name="thelia.parser.register_plugin" />
</service>
class RestrictedDeliveryExclude extends AbstractSmartyPlugin
{
...
}

Reste à trouver comment parcourir le panier ^^' (et la question n°1)

Last edited by Elyos (07-06-2021 15:13:22)


Aide les autres, ils t'aideront en retour.

Offline


Les modules de livraison ont une méthode isvalid(). Si elle renvoie true, le module sera proposé au client. Si elle renvoie false, il ne sera pas proposé.

A toi d'analyser ton panier dans cette méthode, et de renvoyer true ou false en fonction du contenu du panier.

Pour la 1ere question, met les détails dans le titre ("Livraison à domicile (Fournisseur 2)"), et le libellé client dans le résumé ("Livraison à domicile"), et affiche $CHAPO au lieu de $TITLE en front.


OpenStudio Toulouse

Offline


informatique prog m'avais fait un peut ca sur mon module de transport, car je fait partir de chez moi ou d'un collègue

on a fini par faire une checkbox dans la fiche produit, ou je sélectionne les transporteurs que je veux, et le client ne voit rien, mais moi je le vois dans la back office

https://github.com/InformatiqueProg/CarriersDelivery

Offline


roadster31 wrote:

Les modules de livraison ont une méthode isvalid(). Si elle renvoie true, le module sera proposé au client. Si elle renvoie false, il ne sera pas proposé.

A toi d'analyser ton panier dans cette méthode, et de renvoyer true ou false en fonction du contenu du panier.

Ok je vais regarder ça.

roadster31 wrote:

Pour la 1ere question, met les détails dans le titre ("Livraison à domicile (Fournisseur 2)"), et le libellé client dans le résumé ("Livraison à domicile"), et affiche $CHAPO au lieu de $TITLE en front.

Ah bah oui pas bête!

gimly wrote:

informatique prog m'avais fait un peut ca sur mon module de transport, car je fait partir de chez moi ou d'un collègue

on a fini par faire une checkbox dans la fiche produit, ou je sélectionne les transporteurs que je veux, et le client ne voit rien, mais moi je le vois dans la back office

https://github.com/InformatiqueProg/CarriersDelivery


Je vais jeter un oeil, mais comme j'ai déjà pas mal avancé... je pense que je vais continuer sur mon module wink


Aide les autres, ils t'aideront en retour.

Offline


roadster31 wrote:

Les modules de livraison ont une méthode isvalid(). Si elle renvoie true, le module sera proposé au client. Si elle renvoie false, il ne sera pas proposé.

A toi d'analyser ton panier dans cette méthode, et de renvoyer true ou false en fonction du contenu du panier.

Dans ce cas, je dois modifier les modules de livraison ? Si, par exemple, je ne veux pas proposer le module Chronopost si certains produits dans le panier ? Je peux passer par mon module de restriction pour indiquer que le module Chronopost n'est pas à proposer ?


Aide les autres, ils t'aideront en retour.

Offline


A toi de voir ¯\_(ツ)_/¯


OpenStudio Toulouse

Offline


roadster31 wrote:

A toi de voir ¯\_(ツ)_/¯


lol

bah le souci c'est que je ne sais pas comment faire pour que la fonction isValid() renvoie "false" depuis un autre module... ^^"


Aide les autres, ils t'aideront en retour.

Offline


Bon bah déjà j'arrive pas à affecter une valeur à une variable...

<services>
	<service id="restricted_delivery.exclude_delivery.smarty.plugin" class="RestrictedDelivery\Smarty\Plugins\RestrictedDeliveryExcludeDelivery" scope="request">
		<argument type="service" id="request" />
		<argument type="service" id="event_dispatcher"/>
		<tag name="thelia.parser.register_plugin" />
	</service>
</services>
/**
 * @return array|SmartyPluginDescriptor[]
 */
public function getPluginDescriptors()
{
	return array(
		new SmartyPluginDescriptor("function", "restrictedDeliveryExcludeDelivery", $this, "restrictedDeliveryExcludeDelivery"),
	);
}


/**
 * @param $params
 * @param $smarty
 */
public function restrictedDeliveryExcludeDelivery($params, $smarty)
{
	
	$cart = $this->getRequest()->getSession()->getSessionCart($this->dispatcher);
	$smarty->assign('restrictedDeliveryExcludedDelivery', 'prout');
}

et dans mon template {$restrictedDeliveryExcludedDelivery} me retourne rien... (pas d'erreur non plus)


Apparemment ma fonction "restrictedDeliveryExcludeDelivery" n'est pas appelée... mais le plugin est bien enregistré car j'obtiens bien le __wrap__restrictedDeliveryExcludeDelivery

Last edited by Elyos (08-06-2021 14:43:27)


Aide les autres, ils t'aideront en retour.

Offline


Je dois oublier quelque chose mais je vois pas quoi mad mad mad


Aide les autres, ils t'aideront en retour.

Offline


Dans la fonction suivante tu ne renvoie pas de valeur

/**
 * @param $params
 * @param $smarty
 */
public function restrictedDeliveryExcludeDelivery($params, $smarty)
{
	
	$cart = $this->getRequest()->getSession()->getSessionCart($this->dispatcher);
	$smarty->assign('restrictedDeliveryExcludedDelivery', 'prout');
}

Il faut que ta fonction renvoie un résultat si tu veux afficher quelque chose à l'endroit où ton tag apparaît dans le template

/**
 * @param $params
 * @param $smarty
 */
public function restrictedDeliveryExcludeDelivery($params, $smarty)
{
	
	$cart = $this->getRequest()->getSession()->getSessionCart($this->dispatcher);
        // $smarty->assign('restrictedDeliveryExcludedDelivery', 'prout');
       return 'prout';
}

Jettes un coup d'oeil à la documentation Smarty concernant les plugins :-)

Last edited by Nog (08-06-2021 16:18:30)

Offline


Nog wrote:

Dans la fonction suivante tu ne renvoie pas de valeur

...

Il faut que ta fonction renvoie un résultat si tue veux afficher quelque chose à l'endroit où ton tag apparaît dans le template

...

Non pas mieux...

Surtout que je me suis calqué sur le module ChronopostHomeDelivery qui lui fonctionne ^^'

Après le module ChronopostHomeDelivery mets dans "ses propres" templates {mavar} et  non {$mavar} ...

C'est peut être le fait que ce ne soit pas dans les propres templates du module que ça ne marche pas...?

Last edited by Elyos (08-06-2021 16:15:32)


Aide les autres, ils t'aideront en retour.

Offline


Puis si je mets un

die('prout')

dans ma fonction ça ne fait rien...


Aide les autres, ils t'aideront en retour.

Offline


Je remonte un peu le fil et tombe la dessus

et dans mon template {$restrictedDeliveryExcludedDelivery} me retourne rien... (pas d'erreur non plus)

Le plugin Smarty te permet de créer un tag personnalisé, a priori tu t'en sers dans un template avec la syntaxe suivante

{restrictedDeliveryExcludedDelivery param1="foo" param2="bar"}

Last edited by Nog (08-06-2021 16:34:11)

Offline


unknown tag 'restrictedDeliveryExcludedDelivery'


Aide les autres, ils t'aideront en retour.

Offline


et si dans

/**
 * @return array|SmartyPluginDescriptor[]
 */
public function getPluginDescriptors()
{
	return array(
		new SmartyPluginDescriptor("function", "restrictedDeliveryExcludeDelivery", $this, "restrictedDeliveryExcludeDelivery"),
	);
}

tu remplaces letype de plugin de "function" à "modifier" comme suit

/**
 * @return array|SmartyPluginDescriptor[]
 */
public function getPluginDescriptors()
{
	return array(
		new SmartyPluginDescriptor("modifier", "restrictedDeliveryExcludeDelivery", $this, "restrictedDeliveryExcludeDelivery"),
	);
}

Offline


Pas mieux ^^"


Aide les autres, ils t'aideront en retour.

Offline


Ton plugin est sur Github ?

Offline


Non ("pas encore")

Tu veux voir quoi ?


Aide les autres, ils t'aideront en retour.

Offline


Avoir une vue d'ensemble, voir si la configuration est OK etc...

J'ai moi même développé il y a quelque temps un plugin Smarty après avoir "potasser" des plugins d'autres modules et n'ai pas rencontré de difficultés particulières...

Offline


Je te l'envoie en MP wink


Aide les autres, ils t'aideront en retour.

Offline


Recu. J'y jette un coup d'oeil.

Offline


Merci wink


Aide les autres, ils t'aideront en retour.

Offline


Je t'ai renvoyé une version avec le tag Smarty fonctionnel.

L'activation du module provoque une erreur en BO sur mon Thelia 2.4.4 / MySQL 5.7.26 / PHP 7.3.9

Fatal error: Uncaught Error: Call to a member function hasCompositePrimaryKey() on null in /Applications/MAMP/htdocs/windy/core/vendor/thelia/propel/src/Propel/Generator/Model/Table.php:789 Stack trace: #0 /Applications/MAMP/htdocs/windy/core/vendor/thelia/propel/src/Propel/Generator/Model/Database.php(835): Propel\Generator\Model\Table->setupReferrers() #1 /Applications/MAMP/htdocs/windy/core/vendor/thelia/propel/src/Propel/Generator/Model/Database.php(802): Propel\Generator\Model\Database->setupTableReferrers() #2 /Applications/MAMP/htdocs/windy/core/vendor/thelia/propel/src/Propel/Generator/Model/Schema.php(247): Propel\Generator\Model\Database->doFinalInitialization() #3 /Applications/MAMP/htdocs/windy/core/vendor/thelia/propel/src/Propel/Generator/Manager/AbstractManager.php(338): Propel\Generator\Model\Schema->doFinalInitialization() #4 /Applications/MAMP/htdocs/windy/core/vendor/thelia/propel/src/Propel/Generator/Manager/AbstractManager.php(151): Propel\Generator\Mana in /Applications/MAMP/htdocs/windy/core/vendor/thelia/propel/src/Propel/Generator/Model/Table.php on line 789

J'ai supprimé de ton code tout ce qui ne concernait pas le plugin Smarty pour faciliter le "debuguage".

Last edited by Nog (10-06-2021 17:11:58)

Offline


Étrange...

Je vais regarder ça merci wink


Aide les autres, ils t'aideront en retour.