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');