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

Poster un commentaire
anonyme
anonyme
4 ans

Fais péter

floriqn
floriqn
4 ans

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 ' " ..)

}

}

Offerzo
Offerzo
4 ans

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 ?

IDoc
IDoc
4 ans

Il manque peut etre une clause conditionnelle dans ta requête (Ex: WHERE sdp = 'tamaman')

anonyme
anonyme
4 ans

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.

floriqn
floriqn
4 ans

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

floriqn
floriqn
4 ans

J'ai testé avec un WHERE mais sans succès.

floriqn
floriqn
4 ans

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.

anonyme
anonyme
4 ans

T'as verifie que c'etait pas un probleme de syntaxe?

floriqn
floriqn
4 ans

justement, étant donné que je suis dans le back office de presta, comment puis je vérifier ma syntaxe ?

anonyme
anonyme
4 ans

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

Pefy
Pefy
4 ans

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.

floriqn
floriqn
4 ans

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.

floriqn
floriqn
4 ans

Tout cela est déjà activé, aucune trace ni erreur de la requête.

floriqn
floriqn
4 ans

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.

Cette page est réservée aux ADULTES

Tu es sur le point d'accéder à un site web qui contient du matériel explicite (pornographie).

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.