Jump to content

Bouton création date


Recommended Posts

Bonjour, 

Je souhaiterai créer un bouton et quand je clique sur le bouton ça me crée des dates sur tout les produit de la commande en J+2 

image.thumb.png.df3de4fb1338fbaeb8e286d21029544b.png

 

J'ai créé un bouton dans adminXXXX/themes/default/template/controllers/orders/helpers/view/view.tpl

Le code du bouton 

<button type="button" class="btn btn-default submitAjoutDateLiv" style="display : block;" >
			            <i class="icon-ok"></i>
		            	{l s='Création date' d='Admin.Actions'}
	              	</button>

Mon code Js et ajax qui envoie l'id de la commande dans order.js

$('button.submitAjoutDateLiv').unbind('click').click(function(e) {
		e.preventDefault();
		
		query = 'ajax=1&token='+token+'&action=addDateLivProd&id_order='+id_order+'&';
		
		$.ajax({
			type:'POST',
			url: admin_order_tab_link,
			cache: false,
			dataType: 'json',
			data : query,
			success: function(data)
			{
				if (data.result)
				{
					console.log('ok');
				}
				else	
					jAlert(data.error);
			}
		});

		return false;

	});

Mon code dans le AdminOrdercontroller

  public function ajaxProcessaddDateLivProd(){
       
        $id_order = Tools::getValue('id_order');
        $id_order_detail= Db::getInstance()->getvalue('Select id_order_detail FROM`' . _DB_PREFIX_ .'order_detail` where id_order = '. $id_order);
        $date_liv=date("d-m-Y", strtotime("+2 day"));   //Date du jour +2 
        var_dump($id_order_detail);
        die();
        
        
    }

 

Donc l'idée est que je récupère l'id de la commande et que grâce à l'id_order je récupère tout les  id_order_detail et que ensuite avec un foreach je mets un insert pour chaque id_order_detail (je ne sais pas si c'est faisable réellement)   cependant actuellement je récupère bien l'id_order mais le var_dump me donne bool(true). Donc est-ce que quelqu'un aurait une idée pour que je puisse récupérer mes id_order_detail et que je puisse faire un insert pour chaque produit de la commande 

 

Merci d'avance de votre aide 

Ma version PS : 1.7.6.9

 

Share this post


Link to post
Share on other sites

Posted (edited)

ok dans ta function alors au lieu d un getValue, faut faire un executeS et oui y a plusieurs order_detail

        $order_details= Db::getInstance()->executeS('SELECT od.id_order_detail od.tonchampsdedatecustom FROM`' . _DB_PREFIX_ .'order_detail` od where od.id_order = '. $id_order);

de la tu va pouvoir foreach $order_details

Edited by Alexandre Carette (see edit history)

Share this post


Link to post
Share on other sites

30 minutes ago, Alexandre Carette said:

ok dans ta function alors au lieu d un getValue, faut faire un executeS et oui y a plusieurs order_detail

        $order_details= Db::getInstance()->executeS('SELECT od.id_order_detail od.tonchampsdedatecustom FROM`' . _DB_PREFIX_ .'order_detail` od where id_order = '. $id_order);

de la tu va pouvoir foreach $order_details

Super merci beaucoup je récupère bien tout les id_order_detail 

Cependant quand je clique les ou l'insert ne passe pas, est-ce que ça provient de execute () ? 

  public function ajaxProcessaddDateLivProd(){
        
        $id_order = Tools::getValue('id_order');
        $id_order_details=  Db::getInstance()->executeS('Select id_order_detail FROM`' . _DB_PREFIX_ .'order_detail` where id_order = '. $id_order);
        $date_liv=date("d-m-Y", strtotime("+2 day"));   //Date du jour +2 
        foreach( $id_order_details as $id_od ){
           $sql= Db::getInstance()->execute('INSERT INTO `' . _DB_PREFIX_ . 'order_date_liv` (`id_order_detail`, `date`) VALUES (' . (int) $id_od . ', ' . $date_liv . ')');
        }       
        
    }

 

Share this post


Link to post
Share on other sites

Posted (edited)

deja je pense qu'il faut faire un update et non pas un insert de ligne... et on va tout recup ce sera plus simple,

        $order_details= Db::getInstance()->executeS('SELECT * FROM`' . _DB_PREFIX_ .'order_detail` where id_order = '. $id_order);

dans le foreach on va instancier l'objet OrderDetail au lieu de faire une requete je trouve ca plus propre

foreach( $order_details as $order_detail ){

          $order_d = new OrderDetail((int)$order_detail['id_order_detail']); 
          $order_d->ton_champ_date = $date_liv;
          $order_d->update();

}    

dans le code du dessus tu oublie de faire un return de $sql, c pour ce que ta requete ne execute pas

Edited by Alexandre Carette (see edit history)

Share this post


Link to post
Share on other sites

13 minutes ago, Alexandre Carette said:

deja je pense qu'il faut faire un update et non pas un insert de ligne... et on va tout recup ce sera plus simple,

        $order_details= Db::getInstance()->executeS('SELECT * FROM`' . _DB_PREFIX_ .'order_detail` where id_order = '. $id_order);

dans le foreach on va instancier l'objet OrderDetail au lieu de faire une requete je trouve ca plus propre

foreach( $order_details as $order_detail ){

          $order_d = new OrderDetail((int)$order_detail['id_order_detail']); 
          $order_d->ton_champ_date = $date_liv;
          $order_d->update();

}    

dans le code du dessus tu oublie de faire un return de $sql, c pour ce que ta requete ne execute pas

Oui j'ai remarqué après que j'avais oublié le return mais même avec ça ne change rien.. 

 

Cependant pour ta solution si je comprends bien dans le foreach  je créer un objet de la classe order_detail 

et dans la classe order_detail je créer une variable "ton_champ_date" que j''instancie avec $date_liv (soit j+2) et je créer  une fonction update() qui elle aura seulement les insert, c'et bien cela ? 

Share this post


Link to post
Share on other sites

Posted (edited)

tu instancie l'objet OrderDetail, oui c une classe ou plutot un objet, en gros tu recupere l'enregistrement de la ligne detail de la commande via son ID : new OrderDetail(285); -> ca te permet de recup tout l objet 285.  De la  tu update la data, je ne comprend pas pk tu veux faire un insert, c'est comme si tu crée une nouvelle ligne de produit dans ta commande, la fonction $order_d->update(); update la data dans l'objet

Edited by Alexandre Carette (see edit history)

Share this post


Link to post
Share on other sites

3 minutes ago, Alexandre Carette said:

tu instancie l'objet OrderDetail, oui c une classe ou plutot un objet, en gros tu recupere l'enregistrement de la ligne detail de la commande via son ID : new OrderDetail(285); -> ca te permet de recup tout l objet 285.  De la  tu update la data, je ne comprend pas pk tu veux faire un insert, c'est comme si tu crée une nouvelle ligne de produit dans ta commande, la fonction $order_d->update(); update la data dans l'objet

Oui autant pour moi je me suis perdu dans la vision du fonctionnement. 

Mais cependant $order_d->ton_champ_date = $date_liv;  je n'ai pas de champs date dans la classe order_detail 

car la date qui est affiché provient d'une function dans la classe product que j'appelle dans view.tpl qui cette date même vient d'une table 

J'ai peur de mal comprendre.. car je comprends que je récupère l'objetX x étant l'id_d'order_detail et qu'après je dis à la la variable de cet objet de prendre la valeur de $date_liv et qu'ensuite j'update l'objet juste pour le mettre à jour et que il prenne bien en compte le changement de la date.. Mais vu que je n'ai pas de champs date je ne vois pas trop..

Share this post


Link to post
Share on other sites

Posted (edited)

ah oui ok d'accord je vois, tu aurais du faire un nouvel objet, mais bon c pas grave. donc  de ce que je comprend tu veux garder un historique des changement de date ?

du coup fait moi un screenshot de la structure de ta nouvelle table, via phpmyadmin, regarde si l'id_ta_new_table est bien en primary et en auto increment

ps le plus simple aura etait d ajouter un nouveau champs date_liv dans l'objet order_details si pas d'historique

sinon a partir du moment ou tu cree une nouvelle table dans la bdd, faudrais faire un objet pour etre propre

Edited by Alexandre Carette (see edit history)

Share this post


Link to post
Share on other sites

6 minutes ago, Alexandre Carette said:

ah oui ok d'accord je vois, tu aurais du faire un nouvel objet, mais bon c pas grave. donc  de ce que je comprend tu veux garder un historique des changement de date ?

du coup fait moi un screenshot de la structure de ta nouvelle table, via phpmyadmin, regarde si l'id_ta_new_table est bien en primary et en auto increment

Non pas forcément, c'est juste que j'ai pas pensé à ajouter un champ date_liv dans la table order_detail et que ça me paraissait plus simple de créer une nouvelle table  tout simplement. Car là le but est de créer grace au bouton la date en j+2 et de pouvoir la changer seulement en cas ou ce serait une date différente.

Tiens le screen de la structure de la table.

image.thumb.png.48f2a6faaca904261aed027f66ce6dca.png

2 minutes ago, Alexandre Carette said:

sinon a partir du moment ou tu cree une nouvelle table dans la bdd, faudrais faire un objet pour etre propre

Oui c'est vrai.. 

Share this post


Link to post
Share on other sites

18 minutes ago, Alexandre Carette said:

ok donc au lieu de faire un INSERT INTO tu fais un

UPDATE ps_ta_new-table SET Date = $DateLiv WHERE id_order_detail = $order_detail['id_order_detail']

c vite fait faut refacto bien sur

 

Ce qui donne un truc comme ça ? 

image.thumb.png.b254f06a01735311788a47a1f4497c56.png

 

Qu'entends tu par refacto ? 

Share this post


Link to post
Share on other sites

21 minutes ago, Alexandre Carette said:

ton return faut le mettre dans le foreach il va s executer sur chaque ligne de id_order_detail qu il trouve, la tu ne l execute qu une seul fois

Je m'étais dit ça aussi mais les  retour dans les boucles je me suis tâté. 

 return Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.'order_date_liv` odl SET odl.Date ='.$DateLiv.' WHERE  odl.id_order_detail = '.$order_detail['id-order_detail'] );

donc normalement cette ligne c'est mieux 

Mais ça me mets ça...

image.png.c9fce0d2fb284c13c76166b37ee2adb6.png

Share this post


Link to post
Share on other sites

Posted (edited)

Le code  du foreach et le     $order_detail['id-order_detail'] c'était un mauvais copier coller du $id_order_detail dans la boucle for mais j'ai toujours la même erreur de syntaxe 

 foreach( $id_order_details as $id_order_detail ){
        return Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.'order_date_liv` odl SET odl.Date ='.$date_liv.' WHERE  odl.id_order_detail = '.$id_order_detail['id-order_detail'] );
        }       

 

Edited by Bllidz (see edit history)

Share this post


Link to post
Share on other sites

54 minutes ago, Alexandre Carette said:

fait des var dump, die pour tester toute tes varaibles,

egalement teste ta requete sur phpmyadmin (pas en format php mais SQL), il va te dire ce qu 'il ne va pas, cdt

Le update passe bien  fin il n'y a pas d'erreur mais par contre dans ma BDD ça ne fait rien, ça ne rajoute pas un tuple 

Share this post


Link to post
Share on other sites

7 minutes ago, Alexandre Carette said:

fait un

echo "<pre>";
var_dump($id_order_details)
echo "</pre>";
die();

verifie le typage des champs met des (int)$var sur tes variables le cas echéant

cdt

Cependant le update que je fais via phpmyadmin , ça ne me met pas d'erreur, mais ça ne me rajoute pas de nouvelle ligne dans la bdd donc ça provient surement de là ? 

Share this post


Link to post
Share on other sites

Just now, Alexandre Carette said:

si tu veux rajouter des ligne faut faire des INSERT en sql

Justement d'où mon insert à la base, car de base à la création d'une commande y'a tout les lignes de produit sauf la date qui est dans ma table . Et justement mon bouton doit les créer la date de chaque produit  à j+2 

Share this post


Link to post
Share on other sites

6 minutes ago, Alexandre Carette said:

ok j ai compris alors il faut bien faire un INSERT INTO

Yep cependant mon insert remplis bien sur phpmyadmin mais via le bouton rien ne se passe.. 

Share this post


Link to post
Share on other sites

Peut-être mettre dans values ('.$id_order_detail['id_order_detail']. ', ' .$date_liv.')' ce serait mieux ? 

Mais même après avoir testé ça n'a rien changé 

Share this post


Link to post
Share on other sites

Posted (edited)

donc faut typer en int, la c un string sur l id

dans ton foreach tu fais

$id = (int)$id_order_detail[''id_order_detail'];

dans ta requete au lieu de mettre $id_order_detail[''id_order_detail'], tu met $id

 

en gros t envoi un string alors qu en bdd ton champs id est de type INT

Edited by Alexandre Carette (see edit history)

Share this post


Link to post
Share on other sites

La requête actuelle 

 

   foreach( $id_order_details as $id_order_detail ){
            $id = (int)$id_order_detail['id_order_detail'];
            $sql= Db::getInstance()->execute('INSERT INTO `' . _DB_PREFIX_ . 'order_date_liv` (`id_order_detail`, `Date`) VALUES ('.$id. ', ' .$date_liv.')' );
           
          
            return $sql ;
        }       

 

donc ça doit donner ca ? 

   foreach( $id_order_details as $id_order_detail ){
            $id = (int)$id_order_detail['id_order_detail'];
            $sql= Db::getInstance()->execute('INSERT INTO `' . _DB_PREFIX_ . 'order_date_liv` (`id_order_detail`, `Date`) VALUES ('.$id. ', "' .$date_liv.'"'')' );
           

            return $sql ;
        }       

 

Share this post


Link to post
Share on other sites

Bah c'est quand j'ajoute un produit... J'ai vidé le cache mais maintenant quand j'ajoute un produit dans la commande ça m'ajoute le dernier produit de la commande.. 

image.thumb.png.6f06ee8c9d8242267d39124fe301d6a2.png

exemple là ca ne va pas m'ajouter l'illustration mais le COST 

Et pour le insert toujours bloqué... il ne se fait pas .. 

Share this post


Link to post
Share on other sites

6 minutes ago, Bllidz said:

Bah c'est quand j'ajoute un produit... J'ai vidé le cache mais maintenant quand j'ajoute un produit dans la commande ça m'ajoute le dernier produit de la commande.. 

image.thumb.png.6f06ee8c9d8242267d39124fe301d6a2.png

exemple là ca ne va pas m'ajouter l'illustration mais le COST 

Et pour le insert toujours bloqué... il ne se fait pas .. 

et quand je recharge la page il disparait.. 

Share this post


Link to post
Share on other sites

1 minute ago, Alexandre Carette said:

bon je vais faire ta fonctrionnalité sur ma preprod et je te filerai le code car la c'est sans fin ;)

cdt

D'accord bah merci d'avance ! 

 

cdt 

Share this post


Link to post
Share on other sites

1- On va faire un override de la classe OrderDetail.php dans /override/classes/order

<?php
/**
 * 2007-2019 PrestaShop and Contributors
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Open Software License (OSL 3.0)
 * that is bundled with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * https://opensource.org/licenses/OSL-3.0
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to [email protected] so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
 * versions in the future. If you wish to customize PrestaShop for your
 * needs please refer to https://www.prestashop.com for more information.
 *
 * @author    PrestaShop SA <[email protected]>
 * @copyright 2007-2019 PrestaShop SA and Contributors
 * @license   https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
 * International Registered Trademark & Property of PrestaShop SA
 */
class OrderDetail extends OrderDetailCore
{

    public $date_liv;

    public function __construct($id = null, $id_lang = null, $id_shop = null){

        self::$definition['fields']['date_liv'] = array('type' => self::TYPE_DATE, 'validate' => 'isDate');
        parent::__construct($id, $id_lang, $id_shop);

    }


}

2 - En bdd on ajoute le nouveau champ date_liv de type date en NULL

 

 

 

3- On fait un override de AdminOrdersController dans /override/controllers/admin

<?php
/**
 * 2007-2019 PrestaShop and Contributors
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Open Software License (OSL 3.0)
 * that is bundled with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * https://opensource.org/licenses/OSL-3.0
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to [email protected] so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade PrestaShop to newer
 * versions in the future. If you wish to customize PrestaShop for your
 * needs please refer to https://www.prestashop.com for more information.
 *
 * @author    PrestaShop SA <[email protected]>
 * @copyright 2007-2019 PrestaShop SA and Contributors
 * @license   https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
 * International Registered Trademark & Property of PrestaShop SA
 */
use PrestaShop\PrestaShop\Adapter\StockManager;
use PrestaShop\PrestaShop\Adapter\SymfonyContainer;

/**
 * @property Order $object
 */
class AdminOrdersController extends AdminOrdersControllerCore
{

	/* Modif Alex */
	public function ajaxProcessupdateDateLivProd()
	{
		$id_order_detail = Tools::getValue('id_order_detail');

		$date_liv = Tools::getValue('date_liv');

		var_dump($date_liv);
		die();

	}
	/* Modif Alex */

	/* Modif Alex */
	public function ajaxProcessaddDateLivProd()
	{
        $id_order = Tools::getValue('id_order');


     

		$order_details=  Db::getInstance()->executeS('SELECT id_order_detail FROM`' . _DB_PREFIX_ .'order_detail` where id_order = '. (int)$id_order);

	

        $date_liv = date("Y-m-d", strtotime("+2 days"));   //Date du jour +2 



        

		foreach( $order_details as $order_detail ){

			$order_d = new OrderDetail((int)$order_detail['id_order_detail']); 
			$order_d->date_liv = $date_liv;
			$order_d->update();
			echo "date liv save !";

		}    

	}
	/* Modif Alex */

}

 

Capture_forum.JPG

Share this post


Link to post
Share on other sites

Salut avant de tester j'ai un problème j'ai retiré tout ce que j'avais fais  car j'avais un problème il m'était impossible de rajouter un produit ou de créer une commande. Après avoir tout enlevé (les fonctions ajaxprocess)  de  j'ai toujours ce problème , il me dise " Unknown column 'date_prod_liv' in 'field list'" ce qui est normal vu que date_prod_liv n'est pas dans la table order cependant je ne comprends pas pourquoi il essaie de modifier date_liv_prod dans la table order ?? 

l'erreur en question 

image.thumb.png.25b062e8d3e2e3ec5c14aa193831b8d1.png

Edited by Bllidz (see edit history)

Share this post


Link to post
Share on other sites

19 minutes ago, Alexandre Carette said:

Salut, a quel moment tu as cette erreur ?

cdt

C'était un problème dans un override dans order donc réglé 😉

 

Quote

public function ajaxProcessupdateDateLivProd() {

$id_order_detail = Tools::getValue('id_order_detail');

$date_liv = Tools::getValue('date_liv'); var_dump($date_liv);

die();

}

Mais pour cette fonction il manque pas un update dans un objet  et sa création car là on récupère juste les données sans jamais les implémenter (si je ne dis pas de bétises bien sûr)  ? 

Share this post


Link to post
Share on other sites

28 minutes ago, Bllidz said:

C'était un problème dans un override dans order donc réglé 😉

 

Mais pour cette fonction il manque pas un update dans un objet  et sa création car là on récupère juste les données sans jamais les implémenter (si je ne dis pas de bétises bien sûr)  ? 

ah oui completement, le travail est a moitié fait c'était juste pour te montrer la logique du truc ;)

Normalement tu devras t en sortir avec tout ca ...

Edited by Alexandre Carette (see edit history)

Share this post


Link to post
Share on other sites

4 hours ago, Alexandre Carette said:

ah oui completement, le travail est a moitié fait c'était juste pour te montrer la logique du truc ;)

Normalement tu devras t en sortir avec tout ca ...

Oui merci beaucoup pour toute ton aide ! 

Et je pense que créer un objet d' orderDetail et instancier la date_liv de cet objet est dans mes cordes.

En tout cas merci ! 

  • Like 1

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
 Share

×
×
  • Create New...

Important Information

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