Jump to content

Recommended Posts

Bonjour

 

J'ai sur mon site 2 transporteurs: TNT et envoimoinscher ainsi que la possibilité de retirer les produits à la boutique.

Le choix de Mondial Relay via Envoimoinscher n'est proposé que lorsque le transporteur est ajouté dans la fiche produit coté BO.

N'y a t'il pas moyen d'activer ce transporteur pour tous les produits de la boutique?

 

merci d'avance

Share this post


Link to post
Share on other sites

Bonjour,

 

A ma connaissance, si aucun transporteur n'est associé à un produit, Prestashop considère que TOUS les transporteurs lui sont associés. Il semble donc que votre module Mondial Relay ne soit pas vraiment conforme à cette logique.

 

Sinon pour répondre précisément à votre question, non il n'est pas possible en natif de faire de l'association en masse des transporteurs aux produits.

 

Il existe des solutions payantes qui le permettent (me contacter en privé pour plus d'info), ou encore la solution de le faire avec une requête SQL si vous êtes un peu technique, de type INSERT INTO   dans la table product_carrier.  C'est assez simple, elle n'a que trois colonnes, id_product, id_carrier_reference et id_shop.

La difficulté (nécessite de savoir faire une sous requete) : Il faut inserer une ligne par produit et donc ajouter ajouter une sous requête SELECT sur la table product qui va lire tous les identifiants produits.

 

Crdlt

Franck

Share this post


Link to post
Share on other sites
  • 4 months later...

Effectivement, avec une requete on peut faire ça, voici le détail :

La table products contient la liste des produits,
La table carrier contient la liste des transporteurs
La table products_carrier contient le lien entre le produit et le transporteur. Autrement dit, quel transporteur peut être selectionné pour quel produit.

Pour commencer, vérifiez que cette requete renvoie bien les transporteurs que vous voulez ajouter (tous les transporteurs actifs et non supprimés)

select * from carrier where active=1 and deleted=0

Si vous voulez voir ce qui va être inséré, vous pouvez effectuer la requete suivante. Elle affiche l'ID de chaque produit associé à chaque transporteur.

select p.id_product,c.id_reference from product p, carrier c where c.active=1 and c.deleted=0

Il y a la notion de magasin, par défaut cette valeur vaut 1. Avant tout, sauvegardez votre base de données

Pour finir, la requete d'insertion sera :

insert into product_carrier(id_product,id_carrier_reference,id_shop) select p.id_product,c.id_reference,1 from product p, carrier c where c.active=1 and c.deleted=0
Edited by Modock (see edit history)

Share this post


Link to post
Share on other sites
  • 1 year later...

Bonjour,

Merci Modock pour la requête !

Pour ceux qui sont en multiboutique comme moi, voici la requête permettant d'intégrer les transporteurs en masse pour toutes les boutiques.
 

insert into product_carrier(id_product,id_carrier_reference,id_shop) select p.id_product,c.id_reference,s.id_shop from product p, shop s, carrier c where c.active=1 and c.deleted=0

Comme le faisait remarquer Franck Bugnet, lorsqu'un produit n'a aucun transporteur de sélectionné, prestashop condière pour celui-ci que tous les transporteurs sont disponibles. De ce fait la requête SQL ci-dessus n'a pas grand intérêt en l'état.

Par contre, pour ma part je l'ai utilisée pour ajouter tous les transporteurs sauf un (Lettre Suivie) que je veux pouvoir sélectionner uniquement pour quelques produits au cas par cas. Il n'est également pas utile d'exclure les transporteurs inactifs, car étant justement inactifs, ils ne seront pas disponibles (mais au moins le jour où vous le réactivez, pas besoin de revenir toucher la base).

Voici donc la requête :
Je prends donc tous les transporteurs qui ne sont pas supprimés et qui ne s'appellent pas 'Lettre Suivie' (on peut aussi filtrer avec l'ID).

insert into product_carrier(id_product,id_carrier_reference,id_shop) select p.id_product,c.id_reference,s.id_shop from product p, shop s, carrier c where c.deleted=0 and and c.name!='Lettre Suivie'

A+

Edited by François38 (see edit history)

Share this post


Link to post
Share on other sites
  • 3 months later...

Bonjour, merci pour l'astuce elle vient de m'être très utile (même cas de figure que François38). Je suis sous 1.6.1.15.

 

Le dernier bout de requête donné par François38 n'était pas bon chez moi, car mes tables ne se nomment pas pareil.

Je voulais aussi écarter 3 transporteurs, par leur ID, donc voici le code qui a fonctionné :

insert into ps_product_carrier(id_product,id_carrier_reference,id_shop) select p.id_product,c.id_reference,s.id_shop from ps_product p, ps_shop s, ps_carrier c where c.deleted=0 and c.id_carrier!=227 and c.id_carrier!=221 and c.id_carrier!=195

A+

Edited by kokoon (see edit history)

Share this post


Link to post
Share on other sites
  • 7 months later...

Pour ceux qui ne sont pas très familier ou débutant en sql et ce type d'insertion à partir du résultat d'un SELECT (comme moi ! ), dans le cas ou l'on souhaite seulement ajouter un nouveau transporteur pour l'ensemble du catalogue produit, il faut juste rajouter dans la clause WHERE l'id du carrier à ajouter(que vous trouverez dans la table ps_carrier).

Notez qu'il ne faut qu'aucun produit du catalogue ne soit déjà assigné à ce transporteur via le backoffice pour que la requête puisse s'executer ou alors ajouter une condition dans votre requête pour ne pas appliquer l'update sur les produits déjà assignés au transporteur en question.

INSERT into ps_product_carrier(id_product,id_carrier_reference,id_shop) 
SELECT p.id_product,c.id_reference,1 
FROM ps_product p, ps_carrier c where c.active=1 and c.deleted=0 and c.id_carrier = 154

Merci en tout cas à ceux qui ont répondus. Je trouve étrange que PrestaShop ne propose pas, par défaut, ce type d'édition de masse en backoffice. 

Edited by Emmanuel Autin (see edit history)

Share this post


Link to post
Share on other sites

Bonjour , je suis interessé par le procédé, dans quel fichier faire cette requete ?

J'ai regarder dans plusieurs fichiers (admincarriercontroller, adminproductcontroller) mais je ne trouve aucun lien avec la table "ps_product_carrier".

Dans quel fichier est appelé la fonction?

 

merci

Share this post


Link to post
Share on other sites

Je viens d'essayer simplement en creéant un fichier php et en mettant en place la requete.

Cela fonctionne bien sauf que:

Dans l'administration les transporteurs ne s'affichent pas dans la colonne "transporteur selectionné" , du coup on ne sait pas quel transporteur est associé.Est -il possible de les voir dans cette colonne?

Cela m'emb^éte de devoir faire la requete dans un fichier que je vais du coup devoir appeler tous les jours via une tache cron.

Est-possible de placer cette requete dans un fichier (controller ou classes) par exmple lors de la création du transporteur?

 

Merci

 

Share this post


Link to post
Share on other sites

Bonjour,

1) J'ai résolu le problème de l'affichage dans l'administration, j'avais fait une modification du fichier AdminProductsController et je ne l'avais pas supprimé.

2) A votre avis tache cron obligatoire en sachant que dans ma requète je vérifie le poids du produit (si poids du produit est égale à2kh alors on affihce tel transporteur) , serait -t-il possible d'éviter une tache cron et de spécifier une condition dans un fichier (peut-être Product.php) ?

 

Merci pour vos retours

Share this post


Link to post
Share on other sites

Bonjour,

Vous n'avez pas accès à la base de donnée ?

La requête s'effectue simplement dans la table ps_product_carrier via l'onglet SQL de phpmyadmin.

Le nouveau transporteur s'affiche dans la colonne de droite dans l'onglet livraison de chaque produit.

 

Edited by Emmanuel Autin (see edit history)

Share this post


Link to post
Share on other sites

Si mais seulement mes produits sont quotidiemment rentrés dans via un import d'un fichier CSV . et jrentre des nouveaux produits très souvent.(cela peut être une cinquante) donc he cherche un moyen pour automatiser cette partie.

Share this post


Link to post
Share on other sites

Bonjour, je n'ai pas de réponse pour pixAN navré mais j'ai besoin d'un conseil pour la requête sql.

Peut-on faire un "update" plutôt qu'un insert into ? Car j'ai déjà des données et j'ai logiquement des "duplicate entry".

Quelqu'un aurait-il une soluce svp ?

Edit : suffit de vider la table en fait, résolu.

Edited by kokoon (see edit history)

Share this post


Link to post
Share on other sites
  • 2 years later...
On 3/20/2018 at 12:32 PM, Emmanuel Autin said:

Pour ceux qui ne sont pas très familier ou débutant en sql et ce type d'insertion à partir du résultat d'un SELECT (comme moi ! ), dans le cas ou l'on souhaite seulement ajouter un nouveau transporteur pour l'ensemble du catalogue produit, il faut juste rajouter dans la clause WHERE l'id du carrier à ajouter(que vous trouverez dans la table ps_carrier).

Notez qu'il ne faut qu'aucun produit du catalogue ne soit déjà assigné à ce transporteur via le backoffice pour que la requête puisse s'executer ou alors ajouter une condition dans votre requête pour ne pas appliquer l'update sur les produits déjà assignés au transporteur en question.


INSERT into ps_product_carrier(id_product,id_carrier_reference,id_shop) 
SELECT p.id_product,c.id_reference,1 
FROM ps_product p, ps_carrier c where c.active=1 and c.deleted=0 and c.id_carrier = 154

Merci en tout cas à ceux qui ont répondus. Je trouve étrange que PrestaShop ne propose pas, par défaut, ce type d'édition de masse en backoffice. 

Tu pourrais m'indiquer comment le faire pour seulement une catégorie ? 
Merci 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More