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