Un pont avec Prestashop ...

Hello,

aujourd'hui j'ai dû afficher dans PluXml
les images des produits présents sur un site tournant sous Prestashop ( raz le bol de PS :( )
( elles sont affichées dans le footer genre "En direct de la boutique" )
Note: il y a un sous-domaine pour PluXml et un autre pour Prestashop ...

Avant toute chose:
je ne suis pas très fier de moi sur ce coup là,
appeler une base SQL dans du PluXml,
ça dénature le projet.
Mais avant qu'il y ait une version de PluXml en mode catalogue,
le client lui n'attend pas, alors bon

ps: les modos ont le droit de me taper dessus et me bannir pour la peine :D

Pour se faire:
1/ Créer un dossier dans plugins ( ex: import_ps )
2/ Créer un fichier produits.php dans lequel coller le code:
<?php
// Module récupérant TOUTES les images des produits présents dans la base de donnée de Prestashop
// PluXml et Prestashop présents sur un même nom de domaine principal
//
// Par DanielSan le 21.07.2011

// Déclaration des paramètres de connexion
$host = 'serveur';
$user = 'Utilisateur';
$bdd = 'Nom de la base';
$passwd  = 'Mot de passe';
$url_shop = 'http://shop.mon-site.com/'; // url de la boutique
$img_attribut = 'home'; // attribut des images responsable de leur taille > home / large / etc ...

// Connexion au serveur
mysql_connect($host, $user,$passwd) or die("erreur de connexion au serveur");
mysql_select_db($bdd) or die("erreur de connexion a la base de donnees");


// lancement de la requête

// on lit la table 'ps_product_lang' comportant les infos sur l'id_produit, son nom, etc ...
// et on ne sélectionne que la ligne en français ( ps_product_lang.id_lang="2" )

// on lit la table 'ps_img' comportant les infos sur l'id_produit, l'id_image ...
// et on ne sélectionne que la ligne ou l'image est en défaut ( ps_image.cover="1" )

// on croise les 2 tables ( ps_product_lang.id_product = ps_image.id_product )
// pour ne sortir que l'image du produit nommé en français et qui a une image en défaut

$sql = '
SELECT ps_product_lang.id_product, ps_product_lang.link_rewrite, ps_product_lang.name, ps_image.id_image
FROM ps_product_lang, ps_image
WHERE ps_product_lang.id_lang="2" AND ps_image.cover="1"
AND ps_product_lang.id_product = ps_image.id_product
';

// on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

echo "<ul>\n";
// on va scanner toutes les lignes trouvées
// et les afficher sous forme de liste
while ($data = mysql_fetch_array($req)) {
        // on affiche les résultats
        echo "\t<li>\n";
            echo "\t<a href=\"".$url_shop."product.php?id_product=".$data['id_product']."\" title=\"Voir ".$data['name']."\">\n";
                echo "\t\t\t<img src=\"".$url_shop."img/p/".$data['id_image']."/".$data['id_image']."-".$img_attribut.".jpg\" alt=\"".$data['name']."\"><br>\n";
            echo "\t</a>\n";
            echo "\t\t\t".$data['name']."\n";
        echo "\t</li>\n";
}
echo "</ul>\n";
mysql_free_result ($req);
mysql_close ();

?>
La suite se corse car j'y suis allé franco.
A l'endroit où vous souhaitez insérer votre liste d'images,
mettez un beau
<?php include_once('plugins/import_ps/produits.php');?>
:P

Vous en pensez quoi ?
C'est la première fois que je dois aller interroger une base SQL,
j'ai découvert ça ce matin :cool:

Alors:
1/ s'il y en a qui font tourner un Prestashop en parallèle de PluXml,
ça donne quoi ? ça tourne aussi chez vous ?
2/ mon code est-il suffisamment sécurisé ?
3/ Existe-t-il une méthode plus jolie pour l'insertion dans le template ?
4/ quel moyen pour faire un plugin afin de décider
d'afficher X nombre de produits, les derniers produits rajoutés, etc ...
4/ autre chose ?

Cordialement,

_____
D.San

Réponses

  • StéphaneStéphane Member, Former PluXml Project Manager
    la requete sql ne pose pas de probleme coté sécurité car il n'y a pas de paramètres venant d'un formulaire. la requete est en dure donc pas trop de risque d'sql injection.

    en revanche au debut de ton fichier vaut mieux mettre le code suivant, pour éviter d'appeler le code en direct sans passer par pluxml.
    <?php if(!defined('PLX_ROOT')) exit; ?>
    
    C'esdt mieux aussi de protéger ce que tu affiches à l'écran avec un htmlspecialchars
    <?php echo htmlspecialchars($data['name'], ENT_QUOTES);
    
    pour faire un plugin: guide du développeur

    Consultant PluXml

    Ancien responsable du projet (2010 à 2018)

  • c'est vrai que sur ce coup j'ai oublié de vérifier l’existence et la mise en forme.
    Chouette un guide du dév., j'avais pas vu.
    Merci.
Connectez-vous ou Inscrivez-vous pour répondre.