Bonjour a tous et toutes,
Avec l'aide (et la patience) de Nicolas, j'ai enfin réussi a créer un fichier PHP qui permet d'exporter une commande de la boutique en XML pour importation dans le logiciel d'UPS : WorldShip.
Je partage mon code avec vous, mais sachez qu'il vous faudra impérativement le modifier pour qu'il cadre a vos besoins...
Entre-autres, ce code export l'ID du client, le nom, l'adresse, la ville, le pays, le poids total de l'envoi et le nombre de cartons à expédier.
Je vous averti : CECI EST MON PREMIER CODE PHP , mais il fonctionne bien : Il vous suffit de le substituer a l'original dans Vues - Order - Export (n'oubliez pas de choisir le template et administration)
Voici mon code :
<?php
/**
* @package HikaShop for Joomla!
* @version 1.6.0
* @author hikashop.com
* @copyright (C) 2010-2012 HIKARI SOFTWARE. All rights reserved.
* @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
* Export Order to XML for UPS WorldShip - Vincent Simpson - simpson.vincent@wanadoo.fr
*/
defined('_JEXEC') or die('Restricted access');
?>
<?php
$db =& JFactory::getDBO(); //Connexion à la BDD pour récup données poids & salemethod plus bas... Obama Réélu !
foreach($this->orders as $order){
$order_ID = $order->order_id;
$filename = "$order->order_invoice_number.xml";
$xmlcode1 = "<?xml version=\"1.0\" encoding=\"windows-1252\"?";
$xmlcode2 = ">\n<OpenShipments xmlns=\"x-schema:OpenShipments.xdr\">\n<OpenShipment ShipmentOption=\"\" ProcessStatus=\"\">\n";
$xmlcode3 = "\n</OpenShipment>\n</OpenShipments>";
/** les headers c'est pour creer un fichier a downloader sans ecrire un fichier sur le serveur**/
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=$filename");
header("Content-Type: application/octet-stream; ");
header("Content-Transfer-Encoding: binary");
//Récuperer les données de qté et id des produits commandés afin de calculer les poids
$c = 0; //c comme compter
foreach($order->products as $k => $products){
$c++;
$var = "product_id".$c;
$var2 = "product_qty".$c;
$var3 = "salemethod".$c;
$var4 = "product_weight".$c;
$var5 = "nb_cartons_unit".$c;
$var6 = "sub_tot_cartons".$c;
$var7 = "sub_tot_weight".$c;
$$var = $products->product_id;
$$var2 = $products->order_product_quantity;
//Dans la boucle on se fait les poids et nombre de cartons dans le tableau produits tant qu'on tient le product_id
$sql = "SELECT salemethod,product_weight, COUNT(*) FROM #__hikashop_product WHERE product_id = $products->product_id GROUP BY salemethod";//Recup du produit et des quantités par produit du boucle
$db->setQuery($sql); // Joomla passe le select comme ceci pour ajouter le prefix au tableau
$results = $db->loadObjectList(); // Joomla utilise ceci pour creer un array
//boucle pour voir les array
if(count($results)) {
foreach($results as $k => $r) {
$$var3 = $r->salemethod;
$$var4 = $r->product_weight;
if ($r->salemethod == 'PER_UNIT'){ // PARTICULARITE PERSO : PER_UNIT dans ma boutique vaut 2 cartons
$$var5 = 2;
}
else {
$$var5 = 1;
}
$$var6 = $$var2 * $$var5;
$$var7 = $$var2 * $$var4;
$total_cartons = $total_cartons + $$var6;
$total_poids = $total_poids + $$var7;
}
}
}
// Je laisse ce petit boucle de test en exemple, histoire de voir les variables si besoin en est...
/*
$x = 0; // un autre compteur
while ($x < $c) {
$x++;
$tmp = ${'product_id'.$x};
$tmp2 =${'product_qty'.$x};
echo $tmp."--";
echo $tmp2."\n";
}
*/
// Pour le nom d'expedition, c'est en 3 parties, donc variable qui additionne le tout
$full_shipping_name = $order->shipping_address_firstname . " " . $order->shipping_address_middle_name . " " . $order->shipping_address_lastname;
echo $xmlcode1;
echo $xmlcode2;
echo " <ShipTo>\n";
echo " <CustomerID>$order->order_user_id</CustomerID>\n";
echo " <CompanyOrName>" . utf8_decode($full_shipping_name) . "</CompanyOrName>\n";
echo " <Attention></Attention>\n";
echo " <Address1>" . utf8_decode($order->shipping_address_street) . "</Address1>\n";
echo " <Address2>" . utf8_decode($order->shipping_address_street2) . "</Address2>\n";
echo " <Address3></Address3>\n";
echo " <CountryTerritory>" . utf8_decode($order->shipping_address_country) . "</CountryTerritory>\n";
echo " <PostalCode>$order->shipping_address_post_code</PostalCode>\n";
echo " <CityOrTown>" . utf8_decode($order->shipping_address_city) . "</CityOrTown>\n";
echo " <StateProvinceCounty>" . utf8_decode($order->shipping_address_state) . "</StateProvinceCounty>\n";
echo " <Telephone>$order->shipping_address_telephone</Telephone>\n";
echo " <ResidentialIndicator></ResidentialIndicator>\n";
echo " </ShipTo>\n";
echo " <ShipmentInformation>\n";
echo " <ServiceType>ST</ServiceType>\n";
echo " <PackageType>CP</PackageType>\n";
echo " <NumberOfPackages>$total_cartons</NumberOfPackages>\n";
echo " <ShipmentActualWeight>$total_poids</ShipmentActualWeight>\n";
echo " <DescriptionOfGoods>WINE</DescriptionOfGoods>\n"; // MODIFIER A SOUHAIT
echo " <Reference1></Reference1>\n";
echo " <Reference2></Reference2>\n";
echo " <ShipperNumber>XXXXXX</ShipperNumber>\n"; // METTEZ VOTRE ID UPS ICI (format X1234X)
echo " <BillingOption>PP</BillingOption>\n";
echo " <AdditionalDocuments>N</AdditionalDocuments>\n";
echo " </ShipmentInformation>\n";
echo " <InternationalDocumentation>\n";
echo " <InvoiceTermOfSale>DDP</InvoiceTermOfSale>\n";
echo " <InvoiceReasonForExport></InvoiceReasonForExport>\n";
echo " <InvoiceCurrencyCode></InvoiceCurrencyCode>\n";
echo " </InternationalDocumentation>\n";
echo " <Goods>\n";
echo " <DescriptionOfGood>WINE</DescriptionOfGood>\n";
echo " <Inv-NAFTA-CO-CountryTerritoryOfOrigin>FR</Inv-NAFTA-CO-CountryTerritoryOfOrigin>\n";
echo " <InvoiceUnits>1</InvoiceUnits>\n";
echo " <InvoiceUnitOfMeasure>KG</InvoiceUnitOfMeasure>\n";
echo " <Invoice-SED-UnitPrice></Invoice-SED-UnitPrice>\n";
echo " </Goods>\n";
echo $xmlcode3;
}
/*var_dump($this); */ // UTILE POUR VOIR LES VARIABLES EN COURS
exit;
Comme je suis débutant, il y a surement des lourdeurs dans ce code qui pourrait sans doute être optimisé. Laissez vos remarques et améliorations dans ce fil.
J'ai essayé de commenter un maximum de lignes pour que vous puissiez modifier facilement le code pour l'adapter a vos besoins.
UN GRAND MERCI A NICOLAS qui m'a patiemment dirigé dans la bonne direction.