Jump to content

Agir sur les attributs du produt


Recommended Posts

Bonjour, je dois développer un module ou l'utilisateur peut entrer les valeurs qu'il désir pour les attributs du produit (exemple longueur 125 et largeur 52) et pas être bloqué par les valeurs entrées dans le BO.

J'ai réussi à créer les attributs, à modifier les champs select du produit dans le front et que cela agisse sur le prix.

Mais cela rest de l'affichage et lors de l'ajout dans le panier je n'y arrive plus, car pour ajouter dans le panier prestashop utilise les données de la BBD( normal !) et du coup mes nouvelles valeurs sont perdus !!!

Si quelqu'un à un solution ou une idée...

Merci d'avance.

Link to comment
Share on other sites

Je me répond à moi même...

L'idée de faire une table est bonne mais le problème est de réussir à enregistrer les données dans cette table?!

Si quelqu'un a une idée !!! Franchement elle sera le bien venu !!!

Merci d'avance.

Link to comment
Share on other sites

Je continu (ça peut éviter à d'autre de ce prendre la tête !!!)

Donc mon problème est d'enregistrer mes valeurs (voir premier post) pour ça j'utilise l'ajax

Voilà mon code :

 

$(document).ready(function(){

$('body#product p#add_to_cart input').unbind('click').click(function(){

ajaxMetreCarree();

});

});

 

function ajaxMetreCarree(){

 

var id_prod = document.getElementById('product_page_product_id').value;

var id_comb = document.getElementById('idCombination').value;

var px = document.getElementById('prix').value;

var qantity = document.getElementById('quantity_wanted').value;

var val_long = document.getElementById('group_'+idLong).value;

var val_lar = document.getElementById('group_'+idLar).value;

var action = $('#buy_block').attr('action');

var baseDir=action.substring(0,action.lastIndexOf("/"))

baseDir = baseDir+'/modules/metreCarree/';

 

var request = $.ajax({

url: baseDir+"ajaxMetreCarree.php",

type: "POST",

async: true,

cache: false,

data:{add:"1",idProd:id_prod,id_long:idLong,id_lar:idLar,idComb:id_comb,valLong:val_long,valLar:val_lar,prix:px,qty:qantity},

dataType: "html"

});

request.done(function(msg){

$("#surfaceWanted").append(msg);

});

request.fail(function(jqXHR, textStatus){

alert("Requete echouee : " + textStatus );

});

 

}

 

Mais ça veux pas fonctionner est me renvoi l'alerte : "Requete echouee : error"

Alors j'ai jQuery 1.7.1 car les fonctions done() et fail() ne fonctione pas avec le jQuery natif de prestashop mais le problème était le même avec 1.4 et les fonctions success et error.

 

Si une âme charitable à une idée ou même une piste car je ne sais plus trop quoi faire...

Merci d'avance.

Link to comment
Share on other sites

bonjour goujon

si tu veut ajouter une table ou la relier avec la table cart tu doit faire ton code dans hook cart

tu module doit être installer dans le hook cart

exemple

 

public function install()

{

if (!parent::install() OR !$this->registerHook('cart') OR !$this->registerHook('header'))

return false;

return true;

}

 

public function hookCart($params)

{

ton traitement

}

Link to comment
Share on other sites

Merci benhammida ! J'ai pu avancer avec les info que tu m'as donné !

J'arrive a faire fonctionner l'ajax et enregistrer les info dans ma table.

Mais j'ai encore beaucoup de boulot...

Je vais faire en sorte de tenir à jour ce post pour les gens que cela pourrait intéresser.

A plus !

Link to comment
Share on other sites

Toujours sur mon problème mais différent.

Je doit générer un fichier XML pour récupérer mais donnée que j'ai mis dans ma table mais tous les tuto que je trouve sur l'ajax me dise de mettre la fonction header() de php.

Seulement comme je dois inclure le fichier de mon module pour récupérer mes valeur, la fonction header() ne fonctionne plus si l'include est placé avant et le fichier de mon module ne renvoi rien si il est placé après la fonction header().

Le code pour expliquer :

header('Content-Type: text/xml');

include(dirname(__FILE__).'/metreCarree.php');//Include ne renvoi rien !!!

$ajaxMetreCarree = new metreCarree();

$res = $ajaxMetreCarree->blockCartUpdate();

echo $res;

 

include(dirname(__FILE__).'/metreCarree.php');

$ajaxMetreCarree = new metreCarree();

$res = $ajaxMetreCarree->blockCartUpdate();

header('Content-Type: text/xml');//Header ne fonctionne plus !!!

echo $res;

Si vous avez la solution, je suis preneur...

Merci d'avance

Link to comment
Share on other sites

Salut,

 

je ne comprends pas trop bien ce que les tutos veulent dire par là ne sachant pas desquels tu parles mais pratiquant l'écriture de fichier par ajax, je peux te dire que tu n'as pas besoin de la fonction header de php...

si tu veux juste écrire un fichier xml, donne lui une nom "toto.xml", crée le fichier s'il n'existe pas ('w+') et écris dedans en commençant par le header (celui-là a un sens) xml et hop, c'est fait

 

la fonction header de php ne te sert que si tu veux forcer le téléchargement du fichier au lieu, ou après l'avoir créer pas si tu fais juste un lien dessus

 

dans le cas où tu utilises les header pour forcer le téléchargement (à savoir, comportement capricieux dans fierfox par ex pour certains types de fichier qu'au lieu de proposer en téléchargement il va tout simplement ouvrir) il faut que le fichier que tu includes ne comporte strictement aucune sortie html, ne serait-ce qu'un espace avant la balise ouvrante de php, pas de echo, print ou autre

 

a priori ce genre de truc se ferait plutôt (en mode objet) en appelant un controller (ou une fonction dans un controller) qui ne fait qu'écrire ton fichier et rien d'autre avant de faire appel aux headers php (dans l'idéal, mais bon..., la partie gestion des données et écriture se faisant dans un model utilisé par le controller)

 

have swing

Link to comment
Share on other sites

hello,

 

non, pas nécessairement, perso, je préfère aussi stocker mes données dans des tables, je veux juste dire que quand, en cliquant sur un lien tu veux générer un fichier xml (ou à l'ouverture de la page d'un module), tu n'as pas besoin dans ton code, d'utiliser les headers php pour écrire le fichier, ces headers ne te servant que si tu veux envoyer le fichier dans le buffer, directement en téléchargement, plutôt que le créer sur le serveur

 

have swing

Link to comment
Share on other sites

Merci encore de prendre du temps pour m'aider !

Le problème est que pour récupérer mes données (d'une table ou d'un fichier xml) il faut que je fasse un include() du fichier de mon module et cela plante mon retour vers l'ajax.

 

Ce code ne me renvoi rien :

include(dirname(__FILE__).'\metreCarree.php');

$ajaxMetreCarree = new metreCarree();

echo 8;

 

Ce code me renvoi 8 :

/*include(dirname(__FILE__).'\metreCarree.php');

$ajaxMetreCarree = new metreCarree();*/

echo 8;

 

En sachant que "echo 8;" est un debug normalement, j'ai le résultat retourné par une fonction.

D'ou l'obligation de l' include()...

Je sais pas trop comment faire...

Link to comment
Share on other sites

hello,

 

deux petites choses en regardant ton code

1 - même en travaillant sur windows (sauf bien sûr, mais rassure-moi, ce n'est pas le cas :) en bossant sur un iis) le chemin vers ton fichier ne doit pas contenir de backslashes (\) mais bien des slashes (/)

2 - on dirait bien que le fichier que tu include est dans le même dossier que le fichier que tu "attaques" avec l'ajax, si oui, ne repasse pas par le nom du dossier, include 'metreCarree.php'; devrait suffire

 

have swing

Link to comment
Share on other sites

Bonne année !!!

1- le backslashe n'est qu'un reste de test de désespoir (quand on sait plus trop ou attaqué !!!)

2- oui en effet je peux passé directement le nom du fichier sans redonner le chemin complet, mais ça change rien à mon problème...

Link to comment
Share on other sites

J'ai enfin résolu un de mes problème !!!!!!!!!!!!!!!!!!!

voilà le code si cela peut aider :

 

include('../../config/config.inc.php');

include(_PS_CLASS_DIR_.'FrontController.php');

$fc = new FrontControllerCore();

$fc->init();

include('metreCarree.php');

$ajaxMetreCarree = new metreCarree();

echo $ajaxMetreCarree->blockCartUpdate();

 

Tous est dans les 4 premières lignes. En appelant la méthode init() de FrontController ça marche !!!

Cette méthode étant très grosse (et j'ai pas mal de boulot) je sais pas pourquoi ça marche.

 

A plus !

Link to comment
Share on other sites

hello,

 

happy new year à toi :)

 

content de voir que tu as résolu le problème, la solution que tu as trouvé me fait penser qu'en fait tu attaquait une page ajax qui faisait tout, c'est ça ? si oui, ça explique le truc, là, tu as simplement détourné sauvagement le mvc en transformant ta page en controller :) c'est ce que je te disais dans un message précédent, a priori le truc se fait avec un controller, qui appelle ou pas une view (pas dans ton cas) et utilise ou pas (dans l'idéal oui mais bon...) un model pour aller chercher les données et les écrire dans le fichier

 

en fait, en includant le frontcontroller principal et en l'initiant tu as juste fait hors de sa place habituelle :)

 

bon courage pour la suite

 

have swing

Link to comment
Share on other sites

  • 3 months later...

Hello tout le monde,

 

Aller le petit coup de main car je viens de trouver la solution ce matin et je suis de bonne humeur :)

 

Dans le product.tpl :

 

- remplacer vers la ligne 120

 

//]]>
</script>

 

... par

 

// Increment produits
function add( nom ) {
document.getElementById( nom ).value ++;
}
function substract( nom ) {
if ( document.getElementById( nom ).value > 0 )
document.getElementById( nom ).value --;
}
function isNumberKey(evt)
{
var charCode = (evt.which) ? evt.which : event.keyCode
if (charCode > 31 && (charCode < 48 || charCode > 57))
return false;
return true;
}
//]]>
</script>

 

- ajouter après

 

<!-- quantity wanted -->
  <p id="quantity_wanted_p"{if (!$allow_oosp && $product->quantity <= 0) OR $virtual OR !$product->available_for_order OR $PS_CATALOG_MODE} style="display: none;"{/if}>
<label>{l s='Quantity :'}</label>
<input type="text" name="qty" id="quantity_wanted" class="text" value="{if isset($quantityBackup)}{$quantityBackup|intval}{else}{if $product->minimal_quantity > 1}{$product->minimal_quantity}{else}1{/if}{/if}" size="1" maxlength="2" {if $product->minimal_quantity > 1}onkeyup="checkMinimalQuantity({$product->minimal_quantity});"{/if} onkeypress="return isNumberKey(event);" />
  </p>

 

... ce code

 

<div style="float: left;margin-left: 5px;margin-top: 2px;width: 10px;" id="btnincrement">
<a style="cursor: pointer;" class="incrementbtn" onClick="add('quantity_wanted');" ><img src="{$img_dir}more.png" alt="{l s='Add'}" width="10" height="10" /></a>
<a style="cursor: pointer;" class="incrementbtn" onClick="substract('quantity_wanted');"><img src="{$img_dir}less.png" alt="{l s='Subtract'}" width="10" height="10" /></a>
  </div>

 

Tout fonctionne parfaitement, enjoy :D

Arnaud

  • Like 1
Link to comment
Share on other sites

  • 2 months later...

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