J’ai récemment fait face à un problème, car je souhaitais remontée un champ produit spécifique dans les informations du panier sur prestashop 1.7
( La modification décrite fonctionne également sur prestashop 1.6.1.x )

Après analyse, il s’avère que les informations disponibles sont remontées depuis la fonction getProducts de la classe Cart.

L’ensemble des champs remontés sont listé dans la requête sql de remontée des produits, et il n’est pas possible de récupérer nos nouveaux champs.

// Build query
$sql = new DbQuery();
 
// Build SELECT
$sql->select('cp.`id_product_attribute`, cp.`id_product`, cp.`quantity` AS cart_quantity, cp.id_shop, cp.`id_customization`, pl.`name`, p.`is_virtual`,
pl.`description_short`, pl.`available_now`, pl.`available_later`, product_shop.`id_category_default`, p.`id_supplier`,
p.`id_manufacturer`, m.`name` AS manufacturer_name, product_shop.`on_sale`, product_shop.`ecotax`, product_shop.`additional_shipping_cost`,
product_shop.`available_for_order`, product_shop.`show_price`, product_shop.`price`, product_shop.`active`, product_shop.`unity`, product_shop.`unit_price_ratio`,
stock.`quantity` AS quantity_available, p.`width`, p.`height`, p.`depth`, stock.`out_of_stock`, p.`weight`,
p.`available_date`, p.`date_add`, p.`date_upd`, IFNULL(stock.quantity, 0) as quantity, pl.`link_rewrite`, cl.`link_rewrite` AS category,
CONCAT(LPAD(cp.`id_product`, 10, 0), LPAD(IFNULL(cp.`id_product_attribute`, 0), 10, 0), IFNULL(cp.`id_address_delivery`, 0), IFNULL(cp.`id_customization`, 0)) AS unique_id, cp.id_address_delivery,
product_shop.advanced_stock_management, ps.product_supplier_reference supplier_reference');
 
// Build FROM
$sql->from('cart_product', 'cp');
 
...

Vous pouvez consulter le fichier complet ici : https://github.com/PrestaShop/PrestaShop/blob/1.7.3.x/classes/Cart.php#605

La bonne nouvelle c’est que la requête est effectuée via un objet Dbquery, ce qui va nous permettre d’interférer assez facilement avec la requête.

Pour ajouter une fonctionnalité de modification de cette requête nous allons donc créer une surcharge de la classe Cart qui va reprendre la function getProducts de la classe parente et rajouter le contenu suivant :

// Nouveau hook pour pouvoir modifier la requête de récupération des produits
Hook::exec('actionCartGetProductsSqlQuery',['query' => &$sql]);

juste avant l’exécution de la requête dans la ligne

$result = Db::getInstance()->executeS($sql);

Via ce hook nouvellement créé auquel l’instance de l’objet DqQuery est passé en paramètre, il est à présent possible de faire un peu prêt tout sur cette requête.
La variable étant passée par référence, les modifications sur la requête sont appliquées directement.

Pour ajouter un champ il suffira donc de créer un module et de le greffer sur le hook actionCartGetProductsSqlQuery

/**
 * Nouveau Hook pour modifier la requête de sélection des produits du panier
 * Cf. override du cart
 * @param array $params => 'query' => &DbQuery
 */
public function hookActionCartGetProductsSqlQuery($params)
{
    $params['query']->select('p.marque');
}