Jump to content

modification du module printlabel pour editer des etiquettes de livraison


Recommended Posts

Bonjour,

je coince sur une requête sql :( , voici ce que je cherche à faire :) .

j'ai modifié le module printlabel de facon à avoir deux liens. 1 pour l'etiquette de transport (ça c'est d'origine)et l'autre pour une étiquette reprenant les infos du colis (n° de commande, marque du produit, référence produit et quantité. :)

le seul probleme, c'est que je n'arrive pas a construire la ligne qui appel la table "order_detail" en partant de la table "order" déjà présente dans le module (je ne sais pas si je suis bien clair là ! :P )

 

Voici ce qui existe actuellement

if(intval($_GET["id_order"]) > 0) {
$order = new Order(intval($_GET["id_order"]));
$customer = new Customer($order->id_customer);
$ad = new Address(intval($order->id_address_delivery));
 $products = $order->getProducts();

 

et voici ce que j'ai fait mais, j'ai une erreur 500 :unsure:

 

if(intval($_GET["id_order"]["id-order-detail"] ) > 0) {
$order = new Order(intval($_GET["id_order"]));
$produit = new Order_detail(intval($_GET["id_order_detail"]));
$customer = new Customer($order->id_customer);
$ad = new Address(intval($order->id_address_delivery));
 $products = $order->getProducts();

 

J'ai l'impression que je cherche à faire compliqué alors que cela est surement simple :)

 

Est ce que quelqu'un peu me dire quelle erreur je fait ? J'ai oublié quelques chose ou ce n'est pas du tout comme ça qu'il faut faire ? :(

 

Merci beaucoup pour votre aide :)

Edited by stephforum (see edit history)
Link to comment
Share on other sites

Bonjour,

Tu n'as pas besoin de id_order_detail, toutes les infos sont soit dans $order soit dans $products mais tu peux avoir les details produits de la commande avec :

$products = $order->getProductsDetail();

Normalement avec tout ça tu devrais récuperer toutes les infos voulues.

Link to comment
Share on other sites

C'est pas un email que je veux envoyé, c'est juste créer des étiquettes comprenant le détail des produits commandés :)

l'étiquette comprend :

Le numéro de commande ( ça c'est bon)

le nom du client ( ça c'est bon)

la référence article , le nom de l'article, la quantité commandé) ça, je bloque :(

Link to comment
Share on other sites

Ok désolé. Donc :

$products = $order->getProductsDetail();
foreach($products as $product)
{
  $reference=$product->reference;
  $product_name=$product->product-name;
  $product_quantity=$product->product_quantity;
}

Link to comment
Share on other sites

Bah si ça doit marcher. C'est comme ça que je fais pour récupérer les infos des produits d'une commande.

Vérifies que tu récupères bien les données.

Fait un print_r($product);

Ensuite, si les données sont bien récupérés, il te faut savoir comment les utiliser pour la création de l'étiquette.

Link to comment
Share on other sites

j'ai fait le print_r($product); ca affiche bien tout le contenu concernant le produit commandé. c'est bon signe :)

 

j'appel l'affichage de cette maniere :

 

$pdf ->Write(5,"Reférence: $reference ");

 

Tout les autres champs ( n] de commande, adresse) sont appelé de cette manière et ca marche.

doit y avoir une autre façon de faire alors ?

Edited by stephforum (see edit history)
Link to comment
Share on other sites

Encore merci Vinum :) ,

J'ai réussi a faire affiché les valeurs que je recherchais grâce à tes explications :)

Cela ne s'affichait pas car il faillais que cette partie soit sous cette forme :

 

  $reference=$product['product_reference'];

 

me reste plus qu'a faire la mise en forme :D

Link to comment
Share on other sites

Bonjour,

La fonction ou tu récupères les infos produits est elle écrite dans le même fichier que la fonction ou tu écrits le pdf ?

Si non, il faut envoyer dans ce fichier les infos que tu désires.

Enfin pour l'écriture dans le pdf, j'écrirai plutôt :

$pdf->write(5,"Référence:".$reference);

Link to comment
Share on other sites

voici une copie du fichier :)

 

include('../../config/config.inc.php');
if ($_GET["token"] != md5(Configuration::get('EXPINET_TOKEN')))
Tools::redirect('../..'.urldecode($_GET["adminfolder"]).'login.php');

if(intval($_GET["id_order"]) > 0) {
$order = new Order(intval($_GET["id_order"]));
$customer = new Customer($order->id_customer);
$ad = new Address(intval($order->id_address_delivery));

$products=$order->getProductsDetail(); // exemple proposé par vinun

foreach($products as $product)
{
  $reference=$product['product_reference'];
  $product_name=utf8_decode($product['product_name']);
  $product_quantity=$product['product_quantity'];
}
$pdf=new FPDF('L', 'mm', array(150,110)); //taille de l ' etiquette
$pdf->AddPage();
$pdf->SetDrawColor(255);
$pdf->SetAutoPageBreak(false);
$pdf->SetFont("$police",'',12);
$pdf->SetMargins(30,0,0);
$pdf->SetXY(10,120);
$pdf->write(5,"".$reference."  ".$product_name." ".$product_quantity);

$pdf->Output();
} else {
  echo "No Order identifier.<br />";
}

 

 

par contre, je me rend compte que que si la commande contient plusieurs articles différents, j'arrive seulement à afficher le dernier de la liste

Edited by stephforum (see edit history)
Link to comment
Share on other sites

Ok, donc tes données ne sont qu'à l’intérieur de la boucle foreach. Elles ne sont donc valables qu'à l'intérieur.

Il te faut les définir à l’extérieur comme cela :

$reference="";
$product_name="";
$product_quantity="";
foreach($products as $product)
{
  $reference=$product->product_reference;
  $product_name=utf8_decode($product->product_name);
  $product_quantity=$product->product_quantity;
}

Link to comment
Share on other sites

Pour que cela fonctionne, j'ai du l'ecrire comme cela :)

par contre, seule le dernier article de la commande est présent. Je pense que c'est ma mise en forme pour la création des lignes qui est pas bonnes. tu peu me le confirmer ?

 

$reference="";
$product_name="";
$product_quantity="";
foreach($products as $product)
{
  $reference=$product['product_reference'];
  $product_name=utf8_decode($product['product_name']);
  $product_quantity=$product['product_quantity'];
}

 

Quoi que je viens de faire un

print_r($product);

et en effet, seule la dernier ligne de la commande sort, je n'ai pas les autres

Edited by stephforum (see edit history)
Link to comment
Share on other sites

Normal, il faut que tu réorganises le fichier de façon à ce que le $pdf->write soit dans la boucle foreach. Sinon effectivement, tu n'auras que le dernier produit. Quelque chose du genre :

$pdf=new FPDF('L', 'mm', array(150,110)); //taille de l ' etiquette
$pdf->AddPage();
$pdf->SetDrawColor(255);
$pdf->SetAutoPageBreak(false);
$pdf->SetFont("$police",'',12);
$pdf->SetMargins(30,0,0);
$y=0;
foreach($products as $product)
{
$pdf->SetXY(10,120+$y);
  $reference=$product['product_reference'];
  $product_name=utf8_decode($product['product_name']);
  $product_quantity=$product['product_quantity'];
$pdf->write(5,"".$reference."  ".$product_name." ".$product_quantity);
$y+=10;
}

$pdf->Output();

A toi de voir exactement pour la mise en page.

Tu peux également éviter de créer de nouvelles variables et inscrire directement $product["reference"] dans le $pdf->write. Etc...

PS: IL me semble également que le bon referencement est $product["reference"] mais je peux me tromper, je n'ai pas vérifié.

Edited by Vinum (see edit history)
Link to comment
Share on other sites

Décidément!! rien n'y fait. pas moyen d'arriver à faire quelques chose :( Pas moyen de dé-superposer les lignes d'articles commandés.

 

J'ai regardé la doc pour l'utilisation de cell et multicell mais mal-grès les différents exemples, j'ai l'impression qu'il faut tout ré-écrire et ça, ca va etre trop gros pour moi :unsure:

Au pire,si je n'y arrive pas, je vais le tenter sans le format pdf pour la mise en forme

Link to comment
Share on other sites

Il n'y a aucune raison que tu n'y arrives pas. Si tu fais comme je t'ai montré:

$y=10;

{

$pdf->setXY(10,$y);

....

.....

$y+=10;

}

Normalement cela fonctionne.

De même en utilisant cell, il n'y a pas besoin de tout réécrire. C'est simplement de la mise en page.

Dans l'exemple, les lignes seront écrites à :

setxy(10,10);

setxy(10,20);

setxy(10,30); etc...

En tout cas, mois c'est comme ça que je fais pour écrire mes pdf et il n'y a aucun problème.

Donc il y'a quelque chose que tu fais mal mais quoi?

Edited by Vinum (see edit history)
Link to comment
Share on other sites

je dois avoir une m**** quelque part! c'est pas possible ?? ça reste toujours superposé.

 

 

foreach($products as $product)
{
$Y=10;
$pdf->SetFont("$police",'',12);
$pdf->SetXY(10,30,$Y); // Si j'enleve le 30, cela remonte le texte en haut
$reference=$product['product_reference'];
$product_name=utf8_decode($product['product_name']);
$product_quantity=$product['product_quantity'];
//$pdf->write(5,"".$reference." ".$product_quantity);
$pdf->write(5,"$reference $product_quantity ");
$Y+=10;

}

 

Tu vois quelques choses ?

Link to comment
Share on other sites

Tu regardes mal les exemples que je t'ai montré dans un précédent post.

Tu definis Y dans la boucle donc à chaque fois, tu initialises Y avec la même valeur. Donc effectivement le texte est toujours écrit à la même place. De même pour la police. Tu dois faire comme ça:

$pdf->SetFont("Arial","",12);
$y=10;
foreach($products as $product)
{
$pdf->SetXY(10,$y);
$reference=$product['product_reference'];
$product_name=utf8_decode($product['product_name']);
$product_quantity=$product['product_quantity'];
//$pdf->write(5,"".$reference." ".$product_quantity);
$pdf->write(5,"$reference $product_quantity ");
$y+=10;
}

 

PS: Pour la font, je ne pense pas que $police fonctionne. Il faut que tu donnes le nom d'une font valide.

Edited by Vinum (see edit history)
Link to comment
Share on other sites

Halala!!! j'ai passé l'après midi à chercher ce qui était devant les yeux :wacko: . Ya des fois, je me mettrai des claques!!! :P

Merci beaucoup Vinum. C'est super gentil d'offrir un peu de ton temps à aider les novices ;)

Grace à toi, je vais enfin pouvoir finir ce fichier pour imprimer des étiquettes qui vont mettre bien utiles :D

Dès que c'est fini, je mettrai le code à la suite pour ceux que ça intéresse :)

Link to comment
Share on other sites

  • 2 weeks later...

 

Halala!!! j'ai passé l'après midi à chercher ce qui était devant les yeux :wacko: . Ya des fois, je me mettrai des claques!!! :P

Merci beaucoup Vinum. C'est super gentil d'offrir un peu de ton temps à aider les novices ;)

Grace à toi, je vais enfin pouvoir finir ce fichier pour imprimer des étiquettes qui vont mettre bien utiles :D

Dès que c'est fini, je mettrai le code à la suite pour ceux que ça intéresse :)

 

bonjour, avez vous réussi? car moi aussi j'essaye de modifier pour avoir mes articles sous forme de ticket de caisse à partir de ce module et je galère.

 

merci d'avance

Link to comment
Share on other sites

Bonjour,

J'ai pris du temps afin de tester le fichier en prod :) , je vous met le code du fichier nouvellement créé ainsi que la ligne de code à ajouter dans le fichier printlabel.php ligne 123 juste avant </fieldset>';

 

 <img src="../modules/'.$this->name.'/logo.gif" />'.$this->l(' Imprimer un bon de livraison : ').'</a><a  href="../modules/'.$this->name.'/download-livraison.php?id_order='.$params["id_order"].'&adminfolder='.urlencode(substr($_SERVER["SCRIPT_NAME"], strlen(__PS_BASE_URI__) - 1, - strlen("index.php"))).'&token='.md5(Configuration::get('EXPINET_TOKEN')).'" target="blank" ><b>' .$this->l(' Click here ').'</b></a><br />

 

et voici le code du fichier à créer ( je l'ai appelé " download-livraison.php")

 

<?php
require ('../../tools/fpdf/fpdf.php');
//download-label.php?id_order=
//------------------------------------------------------
//------------------------------------------------------------
//define('PS_ADMIN_DIR', getcwd());
include('../../config/config.inc.php');
if ($_GET["token"] != md5(Configuration::get('EXPINET_TOKEN')))
Tools::redirect('../..'.urldecode($_GET["adminfolder"]).'login.php');

if(intval($_GET["id_order"]) > 0) {
$order = new Order(intval($_GET["id_order"])); /* origine */
$customer = new Customer($order->id_customer);
$carrier = new Carrier(intval($order->id_carrier));  //rechercher transporteur
 //$products = $order->getProducts();
$products=$order->getProductsDetail(); 

//print_r($product); 
$norder=($_GET["id_order"]);
$entreprise=utf8_decode($ad->company);
   $prenom=ucfirst(utf8_decode($ad->firstname));
   $nom=mb_strtoupper(utf8_decode($ad->lastname));
$nomboutique=Configuration::get('PS_SHOP_NAME');
$police=Configuration::get('POLICE');

$pdf=new FPDF('L', 'mm', array(150,110)); //taille de l ' etiquette
$pdf->AddPage();
$pdf->SetDrawColor(255);
$pdf->SetAutoPageBreak(true);
//nom de l'entreprise
$pdf->SetFont("arial",'',10);
$pdf->SetMargins(20,0,0); // marge coté gauche
$pdf->SetXY(5,3); // deplacement horizontal gauche droite , hauteur  du texte
$pdf ->Write(5,"$nomboutique"); //espace entre ligne
//numero de commande, nom, prenom
$pdf->SetFont("arial",'',14);
$pdf->SetMargins(5,0,0); // marge coté gauche
$pdf->SetXY(5,10); // deplacement horizontal gauche droite , hauteur  du texte
$pdf ->Write(5,"Cmde. n° : $norder "); //espace entre ligne
$pdf->SetFont("arial",'',12);
$pdf->SetXY(5,15); // deplacement horizontal gauche droite , hauteur  du texte
$pdf ->Write(5,"$nom $prenom "); //espace entre ligne
$pdf->SetXY(50,10); // deplacement horizontal gauche droite , hauteur  du texte
//$pdf ->Write(5," $transport "); //espace entre ligne
$pdf->Cell(0,5,substr($transport,0,35),1,1,'L');

$pdf->SetFont("arial",'',12);
//$pdf->SetMargins(5,0,0); // marge coté gauche
$pdf->SetXY(5,25); //deplacement horizontal gauche droite , hauteur  du texte
$pdf ->Write(5,"Référence");
$pdf->SetXY(30,25); //deplacement horizontal gauche droite , hauteur  du texte
$pdf ->Write(5,"Qté");
$pdf->SetXY(45,25); //deplacement horizontal gauche droite , hauteur  du texte
$pdf ->Write(5,"Nom du produit");

//detail du bon de livraison
$pdf->SetFont("Arial",'',10);
$Y=30;
foreach($products as $product)
{
$pdf->SetXY(5,$Y); // deplacement horizontal gauche droite , hauteur  du texte
$reference=$product['product_reference'];
$product_name=utf8_decode($product['product_name']);
$product_quantity=$product['product_quantity'];
$pdf->write(5,"".$reference);
$pdf->SetXY(30,$Y); // deplacement horizontal gauche droite , hauteur  du texte
$pdf->write(5,"".$product_quantity);
$pdf->SetXY(45,$Y); // deplacement horizontal gauche droite , hauteur  du texte
$pdf->Cell(0,5,substr($product_name,0,35),1,1,'L');
$Y+=5;
}

$pdf->Output();
} else {
  echo "No Order identifier.<br />";
}

?>

 

Il n'est pas très propre, je vous le donne comme ça <_< , j'ai quelques amélioration de personnalisation à lui apporter :)

Link to comment
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...