N'hésitez pas à me le signaler si nécessaire via le formulaire de contact.
Durant les derniers mois j’ai travaillé de manière régulière avec la solution concurrente « Magento » qui permets le chargement et la récupération d’informations sur les objets de manière très souple via n’importe quel champ.
Cette fonctionnalité n’est malheureusement pas disponible à ce jour avec Prestashop, (version 1.5.4.1 à ce jour ), mais avec le mécanisme des override, il est relativement aisé d’adapter cette logique.
Mon besoin a été motivé par la nécessité d’ajouter de nombreux champs spécifiques sur un site prestashop en cours de développement.
/!\ Cette méthode nécessite au minimum php en version 5.3 pour fonctionner.
Voici les codes à mettre en place dans le fichier override/classes/ObjectModel.php
<?php abstract class ObjectModel extends ObjectModelCore { /** * Rajout de la possibilité de récupérer un objet par n'importe quel champ * (Il est nécessaire de l'instancier avant) * * @param string $field champ de la table * @param string $value valeur du champ de la table * @return int id_object : identifiant de l'objet */ public static function getObjectIdByField($field = '', $value='') { $className = get_called_class(); return Db::getInstance()->getValue("SELECT ".$className::$definition['primary']." AS id_object FROM "._DB_PREFIX_.$className::$definition['table']." WHERE `".$field."` = '".pSQL($value)."'"); } /** * Instanciation d'un objet via n'importe quel champ * * @param string $field champ de la table * @param string $value valeur du champ de la table * @return object : instanciation de l'objet */ public static function loadObjectByField($field = '', $value='') { $className = get_called_class(); $object_id = Db::getInstance()->getValue("SELECT ".$className::$definition['primary']." AS id_object FROM "._DB_PREFIX_.$className::$definition['table']." WHERE `".$field."` = '".pSQL($value)."'"); if ( !$object_id) return false; return new $className($object_id); } } |
Voici un exemple comparatif du chargement d’un objet entre la méthode standard de prestashop et notre nouvelle méthode :
Dans mon exemple j’ai un nouveau champ « client » dans la table customer qui correspond à un code client unique
//Ancienne méthode $id_customer = Db::getInstance()->getValue("SELECT id_customer FROM "._DB_PREFIX."customer WHERE client='XXXX'"); $client = new Customer($id_customer); //Nouvelle méthode $client = Customer::loadObjectByField('client', 'XXXXX'); |