23 Jan 2019

Front-office Prestashop 1.7 : Sélection d’une déclinaison impossible

Je suis intervenu sur le site d’un client pour un bug peu courant. Lors d’un choix d’une déclinaison, automatiquement la déclinaison par défaut était à nouveau sélectionné. Cela est arrivé sur une des premières versions de Prestashop 1.7. Nous allons voir comment corriger le problème.

Configuration des déclinaisons dans le back-office de Prestashop 1.7

Tout d’abord il faut regarder si votre configuration côté admin est bonne. Pour cela il faut vous rendre dans Paramètres de la boutique > produit.
Dans la colonne fiche produit il faut s’assurer que “Séparateur des attributs dans les liens des produits” soit bien “-” comme ceci :

separateur-declinaison-produit-prestashop-1-7

Problème dans le ProductController du thème

En fouillant un peu sur certains forums Prestashop et en comparant des fichiers Prestashop 1.7 (entre différentes versions), j’ai remarqué que certains éléments étaient inexistants dans le Prestashop du client. Je pense que ce bug a été remonté et l’équipe de Presta a dû corriger le problème sur les dernières versions.

Dans votre fichier, controllers > ProductController.php allez à la ligne 945.
Remplacez la fonction getIdProductAttribute par :

private function getIdProductAttribute($useGroups = false)
{
$requestedIdProductAttribute = (int) Tools::getValue('id_product_attribute');

if ($useGroups === true) {
$groups = Tools::getValue('group');

if (!empty($groups)) {
$requestedIdProductAttribute = (int) Product::getIdProductAttributesByIdAttributes(
$this->product->id,
$groups
);
}
}

if (!Configuration::get('PS_DISP_UNAVAILABLE_ATTR')) {
$productAttributes = array_filter(
$this->product->getAttributeCombinations(),
function ($elem) {
return $elem['quantity'] > 0;
}
);
$productAttribute = array_filter(
$productAttributes,
function ($elem) use ($requestedIdProductAttribute) {
return $elem['id_product_attribute'] == $requestedIdProductAttribute;
}
);

if (empty($productAttribute) && !empty($productAttributes)) {
return (int)array_shift($productAttributes)['id_product_attribute'];
}
}

return $requestedIdProductAttribute;
}

Télécharger le fichier ProductController.php pour Prestashop 1.7