Code prestashop
Bonjour à tous,
Y a t-il des spécialistes (ou simples connaisseurs) du code prestashop et notamment php ? En effet je rencontre un petit problème sur l'ajout d'une fonction basique et j'aurai besoin d'aide.
Merci
Je bosse sur une boutique pour un pote à moi (en loisir). J'ai créé une fonction qui lui permet d'intégrer des documents joints (fiche technique...) depuis un csv. Cela fonctionne très bien. Néanmoins dans la table" product", "cache_has_attachments" qui permet d'afficher le fichier joint est à 0 (au lieu de 1). J'ai donc tenté d'ajouter dans ma fonction un update de cette donnée mais sans succès. Je ne sais pas si mon code est incorrect ou si cela nécessite une autre route. Pourtant quand je teste la requête dans phpmyadmin, cela fonctionne. Le code en question (dans un AdminImportController.php), je ferai un override une fois le résultat correct :
// import des fichiers par csv
$attachments = get_object_vars($product);
if (isset($attachments['attachment']) && !empty($attachments['attachment']))
foreach (explode($this->multiple_value_separator, $attachments['attachment']) as $single_attachment){
$tab_attachment = explode('|', $single_attachment);
$attachment_filename = isset($tab_attachment[0]) ? $tab_attachment[0] : '';
$attachment_name = isset($tab_attachment[1]) ? trim($tab_attachment[1]) : $attachment_filename ;
$attachment_description = isset($tab_attachment[2]) ? trim($tab_attachment[2]) : '';
if(!empty($attachment_filename)) {
$id_attachment = (int)Attachment::addAttachmentImport($attachment_filename, $attachment_name, $attachment_description);
if (isset($attachments['attachment_id_nums']) && !empty($attachments['attachment_id_nums'])) {
$tab_attachment_id_nums = explode(',',$attachments['attachment_id_nums']);
foreach ($tab_attachment_id_nums as $id_product) {
Attachment::addAttachmentProductImport($id_product, $id_attachment);
// JUSQU'ICI C'EST BON
$sql = "UPDATE `ps_product` SET `cache_has_attachments` = '1'";
Db::getInstance()->execute($sql);
// LA REQUETE NE DONNE RIEN (apres plusieurs essais.. sans ' " ..)
}
}
la requête va passer `cache_has_attachments` sur toutes les lignes. T'es sûr que c'est ce que tu veux faire ?
Sinon t'as pensé à supprimer le cache des index_class ou un truc du genre ?
assez d'accord avec les deux commentaires du dessus. Si t'as besoin de faire l'update une fois, sors le de la boucle. Et effectivement la tu set pour toutes tes rows, c'est le comportement voulu?
Maintenant si tu dis que ca marche via phpmyadmin et pas via le code, c'est que la methode execute() ne fait rien, donc je dirais, verifier que la DB est bien instanciee avec la bonne config dans un premier temps.
Oui j'ai supprimé le cache. Et je ne suis qu'en phase de test, j'essaye la requête sans WHERE (test en local).
Ce n'est pas le comportement voulu, mais simplement pour la phase de test. J'ai également testé en sortie de boucle sans succès. J'utilise une autre requête DB dans cette fonction qui roule sans problème.
justement, étant donné que je suis dans le back office de presta, comment puis je vérifier ma syntaxe ?
si c'est dans un env de test tu peux toujours dump ta variable, sinon faudrait voir aussi si execute ne retourne pas qqch
Il est aussi possible que execute ne soit que pour du read, et qu'il faille faire appel à une autre méthode
Ou un problème de droit aussi, que l'utilisateur de la db presta n'est que du read et pas du write
Essais d'activer le mode debug de PS
Editez votre fichier config.inc.php
Lors de vos procédures de debug, n’oubliez pas de modifier votre fichier config.inc.php en remplaçant
/ Debug only /
@ini_set('display_errors', 'off');
define('_PS_DEBUG_SQL_', false);
par
/ Debug only /
@ini_set('display_errors', 'on');
define('_PS_DEBUG_SQL_', true);
Cela vous permettra d’afficher les erreurs PHP et SQL.
executeS est pour le read mais pas execute. Impossible de dump car cela fout en l'air le module d'import de données. Je commence à penser que cette classe n'est pas autorisée à update la table product. J'ai demandé de l'aide sur un fofo, je vous tiens au courant. Dans le pire des cas je taperai la requête dans le gestionnaire SQL.
Après plusieurs tests, j'ai modifié ma fonction pour quelque chose de plus simple qui fonctionne tout aussi bien :
//Product attachments
if(!empty($info['file_url']))
{
$attachments = explode(",",$info['file_url']);
$attachments_ids=array();
foreach($attachments as $attachment) {
array_push($attachments_ids, Attachment::getAttachmentIDByName($attachment));
Attachment::attachToProduct($info['id'],$attachments_ids);
$query = "UPDATE `"._DB_PREFIX_."product` SET cache_has_attachments=1";
Db::getInstance()->Execute($query);
}
}
J'ai volontairement ajouté la requête $query dans la boucle. Ce qui est bizarre c'est que seule la première ligne de ma table est modifiée, alors que toutes les lignes devraient être modifiées... Et quand je teste avec un WHERE id_product='un autre id', rien ne s'actualise.
Tu ne dois accéder à ce site que si tu as au moins 18 ans ou si tu as l'âge légal pour visionner ce type de matériel dans ta juridiction locale, l’âge le plus élevé étant retenu. En outre, tu déclares et garantis que tu ne permettras aucun mineur à d'accéder à ce site ou à ces services.
En accédant à ce site, tu acceptes nos conditions d'utilisation.