Jump to content

Affiche le transporteur dans l admin section commande


S79

Recommended Posts

Bonsoir à tous.
Je voudrais bien afficher le nom du transporteur dans l'admin, dans le tableau affichant toutes les commandes.
Vu que nous avons souvent des commande expédier en express, il serait bine de voir cela directement cote admin. je suis sur que cela pourrait interesse bien d autres personnes!
Voir photo piece jointe.

Avez vous une idée comment faire et quel(s9fichier(s) il faudrait changer?

Merci d'avance!
JAcques

31532_8jCDYGTNoTLqGhXYpoeX_t

Link to comment
Share on other sites

c'est faisable dans le fichier /adminxxx/tab/AdminOrders.php

au début du fichier dans le constructeur figurent les requêtes et les jonctions ,dans

 $this->_join =  .....



ainsi que les champs à afficher

$this->fieldsDisplay = array(....


Comme l' id_carrier est stocké dans la table order mais pas le nom , il va te falloir intercaler un join supplémentaire entre deux lignes :

LEFT JOIN ......
LEFT JOIN `'._DB_PREFIX_.'carrier` ca ON (ca.`id_order_state` = a.`id_carrier`) 
LEFT JOIN ......



ensuite , dans fieldDisplay tu insères ta colonne , également entre deux autres lignes de code (la nouvelle colonne est codée sur la troisième des lignes suivantes) :

         $this->fieldsDisplay = array(
       'id_order' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25),
       'caname' => array('title' => $this->l('CARRIER'), 'align' => 'center', 'width' => 30),
.....

Link to comment
Share on other sites

MErci pour cette reponse si rapide!

Malheureument, en admin dans commande je recois l info "Requete SQL invalide"

C est ca qui pose problem, car quand je l efface du fichier, CARRIER apparait bien dans la dmin mais naturellemnt pas le nom: "LEFT JOIN `'._DB_PREFIX_.'carrier` ca ON (ca.`id_order_state` = a.`id_carrier`)


MERCI ENCORE POUR TON AIDE!!!

Ci-dessous le morceau de mon code:

IF((SELECT COUNT(so.id_order) FROM `'._DB_PREFIX_.'orders` so WHERE so.id_customer = a.id_customer AND so.valid = 1) > 1, 0, 1) as new,
(SELECT COUNT(od.`id_order`) FROM `'._DB_PREFIX_.'order_detail` od WHERE od.`id_order` = a.`id_order` GROUP BY `id_order`) AS product_number';
$this->_join = 'LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = a.`id_customer`)
LEFT JOIN `'._DB_PREFIX_.'order_history` oh ON (oh.`id_order` = a.`id_order`)
LEFT JOIN `'._DB_PREFIX_.'order_state` os ON (os.`id_order_state` = oh.`id_order_state`)
LEFT JOIN `'._DB_PREFIX_.'carrier` ca ON (ca.`id_order_state` = a.`id_carrier`)
LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = '.intval($cookie->id_lang).')';
$this->_where = 'AND oh.`id_order_history` = (SELECT MAX(`id_order_history`) FROM `'._DB_PREFIX_.'order_history` moh WHERE moh.`id_order` = a.`id_order` GROUP BY moh.`id_order`)';

$statesArray = array();
$states = OrderState::getOrderStates(intval($cookie->id_lang));

foreach ($states AS $state)
$statesArray[$state['id_order_state']] = $state['name'];
$this->fieldsDisplay = array(
'id_order' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25),
'caname' => array('title' => $this->l('CARRIER'), 'align' => 'center', 'width' => 50),
'new' => array('title' => $this->l('New'), 'width' => 25, 'align' => 'center', 'type' => 'bool', 'filter_key' => 'new', 'tmpTableFilter' => true, 'icon' => array(0 => 'blank.gif', 1 => 'news-new.gif'), 'orderby' => false),
'customer' => array('title' => $this->l('Customer'), 'widthColumn' => 160, 'width' => 140, 'filter_key' => 'customer', 'tmpTableFilter' => true),
'total_paid' => array('title' => $this->l('Total'), 'width' => 70, 'align' => 'right', 'prefix' => '', 'suffix' => '', 'price' => true, 'currency' => true),
'payment' => array('title' => $this->l('Payment'), 'width' => 100),
'osname' => array('title' => $this->l('Status'), 'widthColumn' => 250, 'type' => 'select', 'select' => $statesArray, 'filter_key' => 'os!id_order_state', 'filter_type' => 'int', 'width' => 200),
'date_add' => array('title' => $this->l('Date'), 'width' => 90, 'align' => 'right', 'type' => 'datetime', 'filter_key' => 'a!date_add'),
'id_pdf' => array('title' => $this->l('PDF'), 'callback' => 'printPDFIcons', 'orderby' => false, 'search' => false));
parent::__construct();

Link to comment
Share on other sites

            IF((SELECT COUNT(so.id_order) FROM `'._DB_PREFIX_.'orders` so WHERE so.id_customer = a.id_customer AND so.valid = 1) > 1, 0, 1) as new,
           (SELECT COUNT(od.`id_order`) FROM `'._DB_PREFIX_.'order_detail` od WHERE od.`id_order` = a.`id_order` GROUP BY `id_order`) AS product_number';
        $this->_join = 'LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = a.`id_customer`)
        LEFT JOIN `'._DB_PREFIX_.'order_history` oh ON (oh.`id_order` = a.`id_order`)
       LEFT JOIN `'._DB_PREFIX_.'order_state` os ON (os.`id_order_state` = oh.`id_order_state`)
       LEFT JOIN `'._DB_PREFIX_.'carrier` ca ON (ca.`id_order_state` = a.`id_carrier`)
       LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = '.intval($cookie->id_lang).')';
       $this->_where = 'AND oh.`id_order_history` = (SELECT MAX(`id_order_history`) FROM `'._DB_PREFIX_.'order_history` moh WHERE moh.`id_order` = a.`id_order` GROUP BY moh.`id_order`)';

       $statesArray = array();
       $states = OrderState::getOrderStates(intval($cookie->id_lang));

       foreach ($states AS $state)
           $statesArray[$state['id_order_state']] = $state['name'];
        $this->fieldsDisplay = array(
       'id_order' => array('title' => $this->l('ID'), 'align' => 'center', 'width' => 25),
       'caname' => array('title' => $this->l('CARRIER'), 'align' => 'center', 'width' => 50),
       'new' => array('title' => $this->l('New'), 'width' => 25, 'align' => 'center', 'type' => 'bool', 'filter_key' => 'new', 'tmpTableFilter' => true, 'icon' => array(0 => 'blank.gif', 1 => 'news-new.gif'), 'orderby' => false),
       'customer' => array('title' => $this->l('Customer'), 'widthColumn' => 160, 'width' => 140, 'filter_key' => 'customer', 'tmpTableFilter' => true),
       'total_paid' => array('title' => $this->l('Total'), 'width' => 70, 'align' => 'right', 'prefix' => '', 'suffix' => '', 'price' => true, 'currency' => true),
       'payment' => array('title' => $this->l('Payment'), 'width' => 100),
       'osname' => array('title' => $this->l('Status'), 'widthColumn' => 250, 'type' => 'select', 'select' => $statesArray, 'filter_key' => 'os!id_order_state', 'filter_type' => 'int', 'width' => 200),
       'date_add' => array('title' => $this->l('Date'), 'width' => 90, 'align' => 'right', 'type' => 'datetime', 'filter_key' => 'a!date_add'),
       'id_pdf' => array('title' => $this->l('PDF'), 'callback' => 'printPDFIcons', 'orderby' => false, 'search' => false));
       parent::__construct();

Link to comment
Share on other sites

En relisant ce que tu as entré , tu as aussi oublié une parenthèse. Il ne faut pas non plus oublié un espace à la fin de la ligne JOIN insérée , ça évite les erreurs sql ...

A bien y réfléchir , je crois que le mieux , c'est encore que je t'envoie un fichier modifié .
(Ici c'est une version 1.3.1 du fichier )
Mieux vaut à la limite , que tu copies et colles directement à partir de ce source.

Pour info , ici j'ai nommé la table oc au lieu de ca , pour l'homogénéité , donc la ligne du champ , plus loin c'est ocname et non caname .
Enfin bref , tu as tout dans le fichier....

AdminOrders.php

Link to comment
Share on other sites

Merci..super sympa.
Juste quil fallaitencore rajouter à la ligne 30: oc.`name` AS `caname`,



[/code] $this->table = 'order';
$this->className = 'Order';
$this->view = true;
$this->colorOnBackground = true;
$this->_select = '
a.id_order AS id_pdf,
CONCAT(LEFT(c.`firstname`, 1), \'. \', c.`lastname`) AS `customer`,
osl.`name` AS `osname`,
oc.`name` AS `caname`,
os.`color`,
IF((SELECT COUNT(so.id_order) FROM `'._DB_PREFIX_.'orders` so WHERE so.id_customer = a.id_customer AND so.valid = 1) > 1, 0, 1) as new,
(SELECT COUNT(od.`id_order`) FROM `'._DB_PREFIX_.'order_detail` od WHERE od.`id_order` = a.`id_order` GROUP BY `id_order`) AS product_number';
$this->_join = 'LEFT JOIN `'._DB_PREFIX_.'customer` c ON (c.`id_customer` = a.`id_customer`)
LEFT JOIN `'._DB_PREFIX_.'order_history` oh ON (oh.`id_order` = a.`id_order`)
LEFT JOIN `'._DB_PREFIX_.'carrier` oc ON (oc.`id_carrier` = a.`id_carrier`)
LEFT JOIN `'._DB_PREFIX_.'order_state` os ON (os.`id_order_state` = oh.`id_order_state`)
LEFT JOIN `'._DB_PREFIX_.'order_state_lang` osl ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = '.intval($cookie->id_lang).')';
$this->_where = 'AND oh.`id_order_history` = (SELECT MAX(`id_order_history`) FROM `'._DB_PREFIX_.'order_history` moh WHERE moh.`id_order` = a.`id_order` GROUP BY moh.`id_order`)';
[/code]

Link to comment
Share on other sites

Bien vu ! Je n'avais pas testé.
Je n'ai pas non plus règlé la largeur des colonnes ...
Ben pense à mettre [Résolu] à ton topic pour faire plaisir à nos amis modérateurs, et éventuellement reposter ton fichier mis à jour, si ça intéressait quelqu'un d'autre d'avoir le transporteur dans l'admin commandes.

Link to comment
Share on other sites

  • 1 year later...

Bonjour,

 

J'ai fais la même manip' que vous pour avoir le transporteur dans la liste des commandes il y a cependant un bug, en effet le filtrage par transporteur indique une erreur SQL.

 

Dans le where il y a "Where 'caname' = %test% or ça devrait être ca.name mais je ne parviens pas à le résoudre.

 

Avez vous le même bug et êtes vous parvenu à le résoudre?

 

Merci de votre aide.

  • Like 1
Link to comment
Share on other sites

  • 9 months later...

Bonjour, tous le monde.

Merci pour cette modif, cela est très utile.

Je me demander maintenant comment remplacer le nom du transporteur par son logo?

Cela servira à gagné de la place en largeur car pour Mondial Relay cela dépasse sur la droite.

 

Merci d'avance

 

PS: je suis en 1.4.5.1

Link to comment
Share on other sites

  • 3 months later...

Bonjour,

 

J'ai fais la même manip' que vous pour avoir le transporteur dans la liste des commandes il y a cependant un bug, en effet le filtrage par transporteur indique une erreur SQL.

 

Dans le where il y a "Where 'caname' = %test% or ça devrait être ca.name mais je ne parviens pas à le résoudre.

 

Avez vous le même bug et êtes vous parvenu à le résoudre?

 

Merci de votre aide.

 

Bonjour,

 

Pour résoudre le problème du filtrage il faut juste modifier

 

'caname' => array('title' => $this->l('Transporteur'), 'align' => 'center', 'width' => 30

 

Par

 

'caname' => array('title' => $this->l('Transporteur'), 'align' => 'center', 'width' => 30, 'filter_key' => 'caname', 'tmpTableFilter' => true),

 

Si ca peut t'aider.

Cyril

Link to comment
Share on other sites

  • 2 weeks later...
  • 1 month later...

Bonjour à tous,

 

Merci pour toutes ces belles explications qui m'ont beaucoup servies !

 

Pour faire suite à la demande de Destockpc.com, auriez-vous une solution pour ajouter à la place du nom complet du transporteur, un petit logo ?

 

Par exemple si 'Transporteur' = "Colissimo" ALORS charger 'logo_colossimo.png'

 

Merci pour vos éventuelles réponses.

 

A+

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

  • 1 month later...
  • 1 month later...

Ce topic est vraiment intéressant en effet, moi aussi je customize le AdminOrdersController.php et là le besoin du moment c'est de cacher les commandes déjà livrées.

 

Il doit falloir mettre une boucle avec condition "if" et se servir des id_order_state == 5 (5 étant le id du order_state "livré").

 

Mais je ne saurais aller plus loin sans un peu d'aide, merci d'avance aux petits génies du code qui passent par ici :ph34r:

Link to comment
Share on other sites

  • 2 months later...

2 demandes en attente ! Personne pour nous éclairer ? :)

 

 

Bonjour à tous,

 

Merci pour toutes ces belles explications qui m'ont beaucoup servies !

 

Pour faire suite à la demande de Destockpc.com, auriez-vous une solution pour ajouter à la place du nom complet du transporteur, un petit logo ?

 

Par exemple si 'Transporteur' = "Colissimo" ALORS charger 'logo_colossimo.png'

 

Merci pour vos éventuelles réponses.

 

A+

 

&

 

Ce topic est vraiment intéressant en effet, moi aussi je customize le AdminOrdersController.php et là le besoin du moment c'est de cacher les commandes déjà livrées.

 

Il doit falloir mettre une boucle avec condition "if" et se servir des id_order_state == 5 (5 étant le id du order_state "livré").

 

Mais je ne saurais aller plus loin sans un peu d'aide, merci d'avance aux petits génies du code qui passent par ici :ph34r:

Link to comment
Share on other sites

  • 2 months later...

Bonjour abahou, oui il s'agit bien du nom de fichier avec controller que tu cherches !

 

Moi le soucis que j'ai c'est qu'au niveau de l'affichage j'y suis arrivé, j'ai récupérer le détails commande et la quantité.

 

La ou j'ai le problème c'est que je n'arrive pas à afficher plus que le dernier article...

Je m'explique :

 

Admettons que j'ai une commande avec 1 ipod 32Go et une housse d'ipod en affichage je ne vais avoir que la housse... Pareil pour la quantité il ne me met qu'un.

 

Pour le bout de code c'est celui ci :

je fais un callback sur la récupération des informations détails en espérant me servir de la fonction détail pour faire un tableau et lister les différents articles plutôt que le dernier seul.

 

<?php
class AdminOrdersController extends AdminOrdersControllerCore
{
public function __construct()
{
 parent::__construct();
 $this->_select .= ', od.product_name
   ,od.product_quantity';
 $this->_join .= ' LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON (od.`id_order_detail` = a.`id_order`)';
 $this->fields_list['product_name'] = array(
  'title' => $this->l('Détail de la commande'),
  'width' => 200,
  'callback' => 'detail'
 );
 $this->fields_list['product_quantity'] = array(
  'title' => $this->l('Quantité'),
  'width' => 70
 );
}
public function detail($product_name)
{
  return $product_name;
}
}
?>

Avez vous des solutions ?

D'avance merci :)

Link to comment
Share on other sites

j'ai testé votre override.

En effet il ne retourne qu'un produit et qu'une quantité. :huh:

 

Il manque peut-être une structure de contrôle foreach pour passer en boucle à travers le contenu.

Dans le controllers > admin > AdminOrdersController.php)

 foreach ($productList as $key => $id_order_detail)

Edited by indesign (see edit history)
  • Like 1
Link to comment
Share on other sites

Pour le moment j'ai réussi à récupérer les quantités d'articles acheté (avec un SUM() sur product_quantity) donc rien de bien compliqué et pour le souci de ligne dupliquée j'ai réglé ça avec un GROUP BY id_order.

Le soucis restant c'est que je n'affiche qu'un seul article alors qu'il y en a plus à l'achat ... :(

voici le code sachant que la fonction 'detail' sert toujours à rien ! :)...

 

<?php
class AdminOrdersController extends AdminOrdersControllerCore
{
public function __construct()
{
 parent::__construct();
 $this->_select .= ', od.product_name
   , SUM(od.product_quantity) AS NumberOfOrders
   , count(od.product_quantity) AS CountOrder';
 $this->_join .= ' LEFT JOIN `'._DB_PREFIX_.'order_detail` od ON (od.`id_order` = a.`id_order`)';
 $this->_group .= 'GROUP BY od.`id_order`';
 $this->fields_list['product_name'] = array(
  'title' => $this->l('Détail de la commande'),
  'width' => 200,
  'callback' => 'detail',
 );
 $this->fields_list['NumberOfOrders'] = array(
  'title' => $this->l('Quantité'),
  'align' => 'center',
  'width' => 70
 );
}
 /*   public function processFilter()
{
 parent::processFilter();
 $this->_filter = str_replace('`product_name`', 'ca.name', $this->_filter);
}*/
public function detail($product_name)
{
 return $product_name;
}
}
?>

  • Like 1
Link to comment
Share on other sites

merci et oui j'ai un peu réfléchi lol ...

Le soucis est vraiment sur le listing des articles car il me récupère les infos dans le select et du coup je n'arrive pas à récupérer plusieurs éléments.

J'ai testé un concat mais c'est pas du tout ce que je veux ! :)

  • Like 1
Link to comment
Share on other sites

oui idéalement j'aimerais faire qu'ici, comme les produits dont on récupère tous les attributs avec leurs valeurs associées , faire de même avec le détails des commandes.

dans order_detail la colonne product_name récupère le nom du produit et ses valeurs associées.

J'aimerais en faire de même quand je liste les commandes, récupérer tout les articles achetés et pas un seul :/

Link to comment
Share on other sites

J'aimerais en faire de même quand je liste les commandes, récupérer tout les articles achetés et pas un seul :/

C'est bien ce que j'avais compris depuis le début. ;)

 

Et en mettant le contenu de tous les produits dans une listbox

comme dans Attribuer des caractéristiques à ce produit > prise casque

 

post-459329-0-26776700-1377445797_thumb.png

Edited by indesign (see edit history)
  • Like 1
Link to comment
Share on other sites

Avez vous un skype ou la possibilité de tchatter si ça ne vous dérange pas trop? je pense qu'on pourrais avancer peut etre plus vite car j'ai saisi l'idée mais pas comment la faire? :/

au cas ou mon skype c'est : lotfi69coralie

Link to comment
Share on other sites

Désolé, pas de skype :(

 

j'ai saisi l'idée mais pas comment la faire? :/

Je donne des idées, des conseils, des pistes... mais après j'avoue, humblement, je ne suis pas fort en PHP <_<

 

Regarde le controllers > admin > AdminFeaturesController.php ou les classes qui lui sont associéees

Feature.php et/ou FeatureValue.php

 

Tu trouveras peut-être ton bonheur...

 

AdminFeaturesController.php

	/**
 * AdminController::getList() override
 * @see AdminController::getList()
 */
public function getList($id_lang, $order_by = null, $order_way = null, $start = 0, $limit = false, $id_lang_shop = false)
{
	if ($this->table == 'feature_value')
		$this->_where .= ' AND a.custom = 0';

	parent::getList($id_lang, $order_by, $order_way, $start, $limit, $id_lang_shop);

	if ($this->table == 'feature')
	{
		$nb_items = count($this->_list);
		for ($i = 0; $i < $nb_items; ++$i)
		{
			$item = &$this->_list[$i];

			$query = new DbQuery();
			$query->select('COUNT(fv.id_feature_value) as count_values');
			$query->from('feature_value', 'fv');
			$query->where('fv.id_feature ='.(int)$item['id_feature']);
			$query->where('fv.custom =0');
			$res = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query);
			$item['value'] = (int)$res;
			unset($query);
		}
	}
}

Edited by indesign (see edit history)
  • Like 1
Link to comment
Share on other sites

Pour le coup Lofti ton problème est résolu, je te laisse le soin de poster toi même l'override kivabien

 

Allez tiens je me cite moi même et je poste l'override pour ceux que ça intéresse :

 

<?php
/**
* @author Broceliande
*/
class AdminOrdersController extends AdminOrdersControllerCore{
public function renderList()
{
 if (!($this->fields_list && is_array($this->fields_list)))
  return false;
 $this->getList($this->context->language->id);
 $helper = new HelperList();

 // Empty list is ok
 if (!is_array($this->_list))
 {
  $this->displayWarning($this->l('Bad SQL query', 'Helper').'<br />'.htmlspecialchars($this->_list_error));
  return false;
 }
 $this->setHelperDisplay($helper);
 $helper->tpl_vars = $this->tpl_list_vars;
 $helper->tpl_delete_link_vars = $this->tpl_delete_link_vars;
 // For compatibility reasons, we have to check standard actions in class attributes
 foreach ($this->actions_available as $action)
 {
  if (!in_array($action, $this->actions) && isset($this->$action) && $this->$action)
   $this->actions[] = $action;
 }
 $helper->is_cms = $this->is_cms;

 $list=parent::renderList();  
 foreach ($this->_list as &$line) {
  $orderProducts="";
  $id_order = (int)$line['id_order'];
  $sql = "select distinct product_name from "._DB_PREFIX_."order_detail where id_order=".$id_order;
  $result = Db::getInstance()->executeS($sql);
  foreach ($result as $row){
   $orderProducts.=$row['product_name']." - ";
  }
  $line['products']=$orderProducts;  
 }
 $this->fields_list['products'] = array(
  'title' => $this->l('Produits'),
  'width' => 200
 );
 $list = $helper->generateList($this->_list, $this->fields_list);
 return $list;

}
}
?>

  • Like 2
Link to comment
Share on other sites

Oui merci car je n'ai pas eu le temps entre faire à manger et le reste lol .

 

Encore un énorme merci pour ton aide et ce bout de code fonctionne à merveille ! Il vous listera les articles acheté selon la commande !

Que demandez de plus ! :)

 

J'en profite pour remercier tous ceux qui m'ont aidé car j'ai pu comprendre bien des choses graceà vous !

  • Like 1
Link to comment
Share on other sites

Je post en rappel ou info supplémentaire pour ceux qui ne savent pas mais si certain ont tout fait correctement et que rien ne se passe, il faut supprimer ou renommer selon vos envie le fichier class_index.php dans le dossier classes.

Pour ma part je l'ai renommer en old.class_index.php

Link to comment
Share on other sites

  • 1 year later...

Bjr,

je me permet de remonter ce post car j'ai essayé de mettre en place l'affichage du transporteur dans la back office des commandes sur une presta 1.6.0.14 mais l'overide ne semble pas fonctionner! sur la 1.6.0.9 cela marche très bien.

Quelqu'un aurait il une explication au problème ou existe t-il une autre solution pour cette version de Presta?

merci

Link to comment
Share on other sites

  • 10 months later...

Bjr,

je me permet de remonter ce post car j'ai essayé de mettre en place l'affichage du transporteur dans la back office des commandes sur une presta 1.6.0.14 mais l'overide ne semble pas fonctionner! sur la 1.6.0.9 cela marche très bien.

Quelqu'un aurait il une explication au problème ou existe t-il une autre solution pour cette version de Presta?

merci

bonjour à tous,

 

Petit up concernant le dernier post, je cherche moi aussi une solution pour afficher le numero de suivit dans la liste des commandes de presta 1.6

 

merci beaucoup de votre aide

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...