Jump to content

Question sur la classe Product


Recommended Posts

Bonjour à tous,

j'ai ajouté un champ à la table produit, le champ "fragile".

J'ai overridé la classe :

class Product extends ProductCore{
	
	public $fragile;

	public function __construct($id_product = null, $full = false, $id_lang = null, $id_shop = null, \Context $context = null) { 
	 
			Product::$definition['fields']['fragile'] = array('type' => self::TYPE_BOOL,'required' => false, 'size' => 1);
			parent::__construct($id_product, $full, $id_lang, $id_shop, $context);
	}

}

Dans un de mes modules qui modifie les produits en masse, je passe un produit à fragile = 1.

Dans la table, c'est OK, la modif se fait bien.

Mais là où je comprends pas c'est que si j'appelle la classe après le update de la table, je n'ai pas la modif.

Db::getInstance()->execute('update ps_product SET fragile = 1 WHERE id_prodict = 1200')

// la table est modifiée

$prod = new Product(1200);
echo $prod->fragile;
// Et là ça donne 0

Qu'est ce que j'ai raté ?

Link to comment
Share on other sites

Oui c'est bien le cas. Si sur une page de test, je fais

$prod = new Product(1200);

echo $prod->fragile

Ca me le retourne bien.

Mon problème se situe au niveau d'un module d'édition de masse de produits. Si je modifie le param fragile, j'ai bien la requête update mais si je test new Product tout de suite après le execute->requete, mon fragile n'a pas changé (alors que le champ a bien changé dans la table).

Truc de ouf.

Link to comment
Share on other sites

Possible, cache sql mais j'ai de sérieux doutes car ce même fonctionnement existe nativement dans prestashop (validateOrder par exemple) et n'a jamais posé de soucis.

Tu es absolument certain que la bdd est à jour ?

Tu n'as ce champ que dans ps_product, pas aussi dans ps_product_shop ?

Tu as vérifié avec le mode debug que tu n'as pas une erreur SQL ?

Tu n'as pas dans le contructeur de ton Product un code qui reset fragile à une valeur 0 ?

 

Link to comment
Share on other sites

Merci de t'être penché sur ma question, Doekia.

Je vais encore vérifier mais après plusieurs tests, j'ai l'impression que mon override de la classe Product ne fonctionne pas sur ma version 1.7.1.2 alors que sur une autre de mes boutiques (version 1.7.2.4) l'override fonctionne très bien.

Ce serait quand même l'hallu...

Link to comment
Share on other sites

Bon, je confirme. Question de version et d'override.

Par contre j'ai quand même un problème de séquence.

Fonction myUpdate du module A

public function myUpdate($id_product){

//traitements et mise à jour de la table product via requête update. C'est OK et vérifié

$Product = new Product($id_product);
//Appel du hook
Hook::exec('actionProductUpdate', array('id_product' => (int)$id_product, 'product' => $Product));
}

Dans un module B, la fonction hookActionProductUpdate normalement appelée par la fonction ci-dessus.

    public function hookActionProductUpdate($params){
		$id_product = $params['id_product'];
		echo $params->fragile;
    }

Et le résultat est 0 quand j'ai passé fragile à 1 et 1 quand je l'ai passé à 0. Il y a un décalage entre le exec du module A et l'exécution du hook dans le B.

Donc ma question: entre le Hook::exec du module A et le hook du module B, que se passe-t-il ? Le exec est-il mal formulé ? Y-a-t-il un problème de position des hooks ?

Je sèche...

Link to comment
Share on other sites

Oui la position des hooks importe.

Je lis ton code là tel qu'il est est j'espère que c'est parce que tu en as raccourci les traitements, sinon ce que je lis n'a aucun sens

Pourquoi faire 2 modules qui sont visiblement complémentaires

Et tu ne peux pas relancer un hook au sein de ce même hook, c'est une boucle infinie.

 

Link to comment
Share on other sites

Oui, tout est raccourci ici.

Le module A est une édition rapide de masse qui me permet de modifier des paramètres produits par simple clic sur des coches, genre fragile O/N.

Le module B crée un fichier csv transmis via FTP à ma plateforme logistique dès qu'il y a une modif produit (ou une créa). Il fonctionne principalement avec la fiche produit classique mais je veux aussi qu'il joue avec le module d'édition rapide.

 

Link to comment
Share on other sites

Je ne comprends pas, tu veux de l'aide, tu montre du code et ce code n'a aucun sens

Comment pourrions nous t'aider ?

    public function hookActionProductUpdate($params){
        $id_product = $params['id_product'];
        echo $params->fragile;
    }

Il sort de quel chapeau ce params ? si c'est celui passé à la fonction, c'est un tableau, tu ne peux pas l'interroger comme un objet

 

Fait toi une fleur, commence par activer tous les debug possible, passe ton code dans lint, ne fait pas des echo dans un hook non display (d'ailleurs ne jamais faire d'écho, c'est le meilleur moyen de ne rien comprendre. utilise xdebug, et les directives p() ça va te faire gagner un temps fou pour enlever les bugs de ton code avant de chercher si le bug n'est pas ailleurs.

 

 

Link to comment
Share on other sites

Woaw ! Tu décoiffes !

En fait ce n'est pas ça qui compte. C'est une manière de dire que le paramètre "fragile" que je récupère n'est pas celui qui vient d'être transmis par le exec.

Je ne fais pas un "echo", j'ai fait un fwrite d'un fichier témoin dans lequel j'affiche le print_r du tableau. 

J'aurais pu écrire, et c'est vrai que c'eût été plus juste

$params['product']->fragile

Je peux difficilement activer le debug car le site est en exploitation et tourne à plein régime. 

Je voudrais seulement comprendre pourquoi lorsque j'appelle le hook avec exec et APRES avoir update la table, le tableau new Product() qui est envoyé dans params n'est pas le reflet de ce qui vient d'être modifié. 

Toutes mes excuses pour m'être mal exprimé.

Link to comment
Share on other sites

Je fais ce simple test, sur une page à part, qui explique que mon hook::exec échoue...bien que je ne comprenne toujours pas pourquoi:

//Début du test: fragile vaut 0 pour ce produit dans la table
$id_product = 2212;
Db::getInstance()->execute("update ps_product SET fragile=1 WHERE id_product=".$id_product);

$prod = new Product($id_product);
echo "fragile : " . $prod->fragile;
//affiche 0 alors que le champ BDD vaut 1 la requête ayant bien été exécutée.

Donc quand je charge la classe après l'update la donnée n'est pas à jour alors que la table oui. 

Pourquoi ? Cache SQL ? Je ne sais plus où chercher...

Link to comment
Share on other sites

Oui mais, tu t'efforces d'éviter le framework à moitié, or ce dernier contient moult cache (misère), notamment dans product properties, donc code comme tu le devrait en mettant ta propriété dans l'ObjectModel puis $p->fragile = 1; $p->save(); $p = new Product(xx); au demeurant inutile ou code tout en dehors du framework: Db::execute(update) et Db::executeS(select)

 

  • Thanks 1
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...