Jump to content

Comment insérer des valeurs dans un nouveau champs de la base de données ? Je bloque...


Recommended Posts

Bonjour,

Pour des raisons professionelles nous aimerions apporter quelques modifications à Prestashop et notament sur le module gérant le pannier et les commandes. Pour cela j'ai modifié le template, en y intégrant des informations diverses.

Là où je reste bloqué depuis plus de 24 heures, s'est pour inséré un enregistrement dans la table Ps_Cart_Product...Et plus précisement dans le nouveau champs que j'ai crée dans cette table ! Aprés plusieurs recherche à travers le code et les forums, ne trouvant pas ma réponses je me tourne vers ce forum :

=> www.monsite.fr/cart.php : Les données passé en POST depuis le formulaire sont bien récupérés, la variable $InfoLots comprend la valeur que je désire. :

     $idProduct = intval(Tools::getValue('id_product', NULL));
   $InfoLots = Tools::getValue('info_lots');    



=> Toujours dans Cart.php j'arrive jusqu'à cette ligne (qui semble être l'instruction pour insérer ds informations en base )sans problème, avec toujours ma valeur.

if (!sizeof($errors) AND !$cart->updateQty(intval($qty), intval($idProduct), strval($InfoLots), intval($idProductAttribute), $customizationId, Tools::getValue('op', 'up')))



=> Dans Classes/cart.php, j'arrive jusqu'au pied de la fonction ci-dessous avec toujours la valeur que je désire insérer dans mon nouveau champs de la table ps_cart_product.

public function updateQty($quantity, $id_product, $InfoLots, $id_product_attribute = NULL, $id_customization = false, $operator = 'up')
{

if (!Db::getInstance()->AutoExecute(_DB_PREFIX_.'cart_product', array('id_product' => intval($id_product),'InfoLots' => strval($InfoLots),'id_product_attribute' => intval($id_product_attribute), 'id_cart' => intval($this->id),'quantity' => intval($quantity), 'date_add' => pSql(date('Y-m-d H:i:s'))), 'INSERT'))
return false; 

(...)


}

C'est à ce moment que commence mon soucis.

Le champs dans la base de données que j'ai rajouté ne prend pas la valeur que je lui ai passé en paramètre....L'insertion n'as pas échoué - je précise - puisque tout les autres champs ont été renseigné sans problème...

Le plus "drôle" c'est que si je remplace ma variable $InfoLots par n'importe quel type de chaîne de caractére entre guillemet, ceci fonctionne sans problème....


Auriez-vous une idée du problème ? J'ai cherché dans toutes les directions, jusqu'à me rendre dans le fichier MYSQL.php pour voir la requêtes (que je n'ai d'allieur par vue). Tout sauf une requête de type INSERT Cart_Product...


Voilà !
D'avance merci pour vos réponses !
Bien Cordialement,

Link to comment
Share on other sites

Oui le nom de mon champs dans la base s'est bien ça !
Ensuite la variable '$infolots' est issue de ça :

$infolots = strval(Tools::getValue('info_lots',NULL));



La variable comme je vous dis arrivé jusqu'au pied de la fonction, la requête que j'ai réussi à voir est correct, pas de faute de syntaxe, mais l'enregistrement ne s'insére pas...Sauf un cas précis, quand je vais trop vite (page pas encore fini de charger) dans l'ajout d'élèment et que Prestashop passe au récapitulatif de la commande (sans même que je sois logé, je précise)...

Sélectionnez un lot...
option value="0033-20">15/06/2010 - Poids : 20 Kg                    
15/06/2010 - Poids : 3 Kg




J'avoue en perdre mon latin ! :/

++

Link to comment
Share on other sites

"Le plus “drôle” c’est que si je remplace ma variable $InfoLots par n’importe quel type de chaîne de caractére entre guillemet, ceci fonctionne sans problème…. "

Essayer d'exucuter la requette sur votre phpmyadmin

Link to comment
Share on other sites

Euh,
je ne sais pas si ça vient du copier-coller mais je vois une ouverture de balise option qui manque "<", je te suggère de bien vérifier les noms de tes champs, le code prend en compte la casse, alors attention...
Je pense vraiment à un soucis de syntaxe entre majuscule et minuscule..

Link to comment
Share on other sites

@bechir : J'y ai pensé. J'ai récupéré la requette pour l'envoyer dans PhpMyAdmin ! Et ça fonctionne. J'ai fais ceci une fois que j'ai été certains de récupérer la bonne valeur de ma liste déroulante (valeur qui s'insére bien dans la requête).

@BVince : J'ai tout vérifié, c'est une erreur de copier / coller. Le "name" de la liste est correct, la valeur est bien envoyé jusqu'à la requête. Y a pas d'interruption !

J'ai même enlevé l'AJAX à la fin de la page cart.php, j'ai regardé la table customization ! J'ai recherché dans les tableaux s'il fallait que déclare les champs au préalable ! Le seul ou ça fonctionne s'est quand je vais trop vite ou quand je mets un "exit" en sortie de requete dans le fichier class/db.php...


D'avance merci ! :)
++

Edit : La base de données se trouve sur des serveurs distants et le site aussi ! Je fais des push tout le temps des fichiers que je modifie !

Edit 2 : Faut-il du temps à la requête pour être executé ! un espèce de timer ? S'est une question qui m'est passé par la tête !

Link to comment
Share on other sites

Bon,
pour réaliser des vérifications dans ce genre de cas, j'ai pour habitude d'utiliser error_log (fonction php) qui me permet pendant l'exécution du code de générer un fichier sur le serveur qui va contenir ce que je veux vérifier (contenu de variable, valeurs de tableaux, requête sql). La plupart du temps, j'arrive à résoudre des problèmes comme celui ci avec cette fonction.

Link to comment
Share on other sites

Je commence à trouver des pistes avec Error_Log. En fait ma variable n'est effectivement pas renseigné. Ce que je ne comprends pas c'est pourquoi quand je fait un exit, celle-ci contient une valeur. Comprendra qui pourra...

Comme passer des variables en POST ? Sous prestashop, faut-il les déclarer quelques part ?

Link to comment
Share on other sites

Normalement, il suffit que la FORM contienne un INPUT ou autre SELECT avec un NAME, à partir de là, la valeur est postée par le formulaire, peux tu me rappeler sur quel formulaire tu travailles ? le fichier TPL que tu modifies ?
Je vais sûrement te trouver la solution...

Link to comment
Share on other sites

Bonsoir,

Je crois avoir trouvé la solution. C'est super tordu mais ça à l'air de fonctionner ! Il fallait que je rajoute dans l'URL ajax le nom du champs en question. Grâce ça je récupère ma valeur, en GET dans le fichier cart.php et donc en base de donnée...!


        $.ajax({
           type: 'GET',
           url: baseDir + 'cart.php',
           async: true,
           cache: false,
           dataType : "json",
           data: 'add&ajax=true&id_lot=4&qty;=' + ( (quantity && quantity != null) ? quantity : '1') + '&id;_product=' + idProduct + '&token;=' + static_token + ( (parseInt(idCombination) && idCombination != null) ? '&ipa;=' + parseInt(idCombination): ''),
           success: function(jsonData)
           {



Par contre est-ce la bonne méthode ? Et seconde question qu'elle est le lien entre Product.php et ce fichier, comment se débrouille t-il à récupérer les valeurs ? J'avoue ne pas avoir creuser encore la chose...


Pour répondre à ta question je travaille sur le fichier : http://preprod.xxxxxxxx.com/product.php?id_product=3.


D'avance merci pour tes réponses !
Voila ! :)
++

Link to comment
Share on other sites

Par contre je n'arrive pas à voir le lien entre le fichier product.php => www.site.Fr/cart.php => ajax.cart.js !

Maitrisant pas sur le bout des doigts AJAX et prestashop, as tu une idée de comment je pourrais récupérer la valeur de mon formulaire dans le ajax.cart.js ? Depuis quelle page est-il apellé ?


    add : function(idProduct, info_lots, idCombination, addedFromProductPage, callerElement, quantity, whishlist){
       if (addedFromProductPage && !checkCustomizations())
       {
           alert(fieldRequired);
           return ;
       }

       //disabled the button when adding to do not double add if user double click
       if (addedFromProductPage)
       {
           $('body#product p#add_to_cart input').attr('disabled', 'disabled').removeClass('exclusive').addClass('exclusive_disabled');
           $('.filled').removeClass('filled');
       }
       else
           $('.ajax_add_to_cart_button').attr('disabled', 'disabled');

       //send the ajax request to the server
       $.ajax({
           type: 'GET',
           url: baseDir + 'cart.php',
           async: true,
           cache: false,
           dataType : "json",
           data: 'add&ajax=true&id;_lot=' + ( (info_lots && info_lots != null) ? info_lots : '0') + '&qty;=' + ( (quantity && quantity != null) ? quantity : '1') + '&id;_product=' + idProduct + '&token;=' + static_token + ( (parseInt(idCombination) && idCombination != null) ? '&ipa;=' + parseInt(idCombination): ''),
           success: function(jsonData)
           {
(...)



D'avance merci ! :)
++

Link to comment
Share on other sites

Si tu veux poster tes informations à l'aide du blockcart ajax, le formulaire est posté dans cart.php, puis redirigé vers /modules/blockcart/blockcart.php pour utiliser la fonction ajax.cart.js, d'ailleurs tu le vois dans l'entête du fichier blockcart.tpl, il y a un include du fichier JS.
Les informations son aussi transitées vers le fichier blockcart-json.tpl.
Voilà pour mes premières recherches mais je t'avoue que j'ai pas poussé plus loin pour savoir exactement comment passer une nouvelle variable....En espérant que ça puisse t'aider.

Link to comment
Share on other sites

Bonsoir,

Comme convenu je mets la réponse qui pourra servir à d'autres sans aucun doute ! Comme je disais plus haut ceci passe par le fichier Ajax-cart.js.

Si vous désirez intégrer un nouvel élèment, que ce dernier puisse rentrer en base de données, vous devez tout d'abord modifiez le haut du fichier, en y ajoutant la valeur (ID du contrôle) que vous désirez voir passer dans l'URL plus bas dans ce même fichier...

Ligne 13 :

//for product page 'add' button...
$('body#product p#add_to_cart input').unbind('click').click(function(){
ajaxCart.add( $('#product_page_product_id').val(), $('#info_lots').val(), $('#idCombination').val(), true, null, $('#quantity_wanted').val(), null);
return false;
});



URL qui apellera la page cart.php à la racine du site qui contiendra la valeur de votre nouvelle variable.

$.ajax({
type: 'GET',
url: baseDir + 'cart.php',
async: true,
cache: false,
dataType : "json",
data: 'add&ajax=true&id;_lot=' + ( (info_lots && info_lots != null) ? info_lots : '0') + '&qty;=' + ( (quantity && quantity != null) ? quantity : '1') + '&id;_product=' + idProduct + '&token;=' + static_token + ( (parseInt(idCombination) && idCombination != null) ? '&ipa;=' + parseInt(idCombination): ''),
success: function(jsonData)
{



Le tour est joué, vous reste plus qu'à modifier le fichier cart.php, classes/cart.php, pour y intégrer cette nouvelle valeur, si cela n'est pas déjà fait (Cf. post réponses précédentes).

Bonne soirée...

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