Jump to content

[Résolu] Caractéristique : accès à l'ID de la valeur


Recommended Posts

Bonjour,

J'aimerai afficher une image en fonction des caractéristique des produits (cette fonctionnalité n'étant visiblement pas prévue alors que pas mal de personnes la réclame !).

Par exemple, pour un produit virtuel (une vidéo), je peux avoir : Stre@ming, Téléchargement, les deux

Pour chaque valeur, j'ai une image placée dans le dossier img/features de mon thème.
Mes images portent l'ID de la value (15, 16, ...). Car si je leur donne le nom de la value, j'ai un problème en multilangue (et avec les espaces, accents, ...)

Sur ma fiche produit, je peux afficher la caractéristique ainsi que sa valeur : $feature.name & $feature.value

Par contre, je ne peux pas accéder à l'ID de la valeur.

Mon code :
 

{foreach from=$features item=feature}
    {if isset($feature.name)}                
        <td><img src="{$img_dir}features/{$feature.????}.png" alt="{$feature.name} : {$feature.value}"/></td>
    {/if}
{/foreach}

Un

{$feature|@print_r}

Me donne par exemple pour la langue :
 

Array ( [name] => Langue [value] => Anglais [id_feature] => 1 ) 1

Y-a-t-il un moyen d'accéder à la colonne "id_feature_value" de la table "ps_feature_value" pour récupérer l'id et le placer dans mon chemin vers l'image ?

Merci d'avance !
 

Edited by magicJu (see edit history)
Link to comment
Share on other sites

peut être ceci, à tester car j'ai été voir vite fait mais j'ai pas vérifié si sa fonctionne

{foreach from=$features item=feature}
    {if isset($feature.name) && isset($feature.id_feature)}                
        <td><img src="{$img_dir}features/{$feature.id_feature}.png" alt="{$feature.name} : {$feature.value}"/></td>
    {/if}
{/foreach}
Link to comment
Share on other sites

Ha oui en effet désolé, je peux vous expliquer vite fait en modifiant à l'arrache car malheureusement cet ID n'est pas dans la requête, mais il faut savoir qu'on peux faire ca mieux en utilisant l'override pour être tranquille lors des mise à jours...

 

Dans classes/Product.php proche de la ligne 4000 (selon la version..) dans la fonction getFrontFeaturesStatic, ajouter simplement pf.id_feature_value dans la requête SQL, sa donne donc ceci au final

SELECT name, value, pf.id_feature, pf.id_feature_value

Et enfin ceci dans le fichier thème

{foreach from=$features item=feature}
    {if isset($feature.name) && isset($feature.id_feature_value)}                
        <td><img src="{$img_dir}features/{$feature.id_feature_value}.png" alt="{$feature.name} : {$feature.value}"/></td>
    {/if}
{/foreach}
  • Like 2
Link to comment
Share on other sites

Merci je vais essayer !!

 

La technique de l'overide m'intéresse ! Je n'ai pas envie de devoir refaire la modif à chaque fois ! Je peux trouver des info quelques part ? (mon expérience en PHP commence à dater un peu et j'ai un peu perdu ma maîtrise !)

Link to comment
Share on other sites

Désolé je suis encore en 1.4 donc je ne sais pas si sur la 1.6 cela a un peu évolué au niveau de l'override, mais bon je le serai bientôt car nous allons mettre à jours notre boutique en 1.6 ;) Dite moi déjà si sa marche, je verrai si je peux vous donner l'override à mettre

Link to comment
Share on other sites

J'ai trouvé comment faire l'overide, mais ça ne fonctionne pas !!

J'ai crée un fichier Product.php dans /overide/classes

 

A l'intérieur, j'ai mis ça :

 * @deprecated 1.5.0.1
 */
define('_CUSTOMIZE_FILE_', 0);
/**
 * @deprecated 1.5.0.1
 */
define('_CUSTOMIZE_TEXTFIELD_', 1);

class Product extends ProductCore
{

	/*
	* Select all features for a given language
	*
	* @param $id_lang Language id
	* @return array Array with feature's data
	*/
	public static function getFrontFeaturesStatic($id_lang, $id_product)
	{
		if (!Feature::isFeatureActive())
			return array();
		if (!array_key_exists($id_product.'-'.$id_lang, self::$_frontFeaturesCache))
		{
			self::$_frontFeaturesCache[$id_product.'-'.$id_lang] = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
				SELECT name, value, pf.id_feature, pf.id_feature_value
				FROM '._DB_PREFIX_.'feature_product pf
				LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = '.(int)$id_lang.')
				LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.(int)$id_lang.')
				LEFT JOIN '._DB_PREFIX_.'feature f ON (f.id_feature = pf.id_feature AND fl.id_lang = '.(int)$id_lang.')
				'.Shop::addSqlAssociation('feature', 'f').'
				WHERE pf.id_product = '.(int)$id_product.'
				ORDER BY f.position ASC'
			);
		}
		return self::$_frontFeaturesCache[$id_product.'-'.$id_lang];
	}

Le code contient donc la modification.

 

Mais je n'ai plus l'affichage correct.

 

J'ai l'impression que l'overide ne se fait pas !

 

Ai-je fait une bêtise ?

 

EDIT : J'ai essayé de supprimer le fichier classindex.php dans le cache, mais plus rien ne s'est chargé... Je l'ai donc remis ! :)

Edited by magicJu (see edit history)
Link to comment
Share on other sites

Bonsoir,

 

manque <?php et la dernière }

<?php

class Product extends ProductCore
{

	/*
	* Select all features for a given language
	*
	* @param $id_lang Language id
	* @return array Array with feature's data
	*/
	public static function getFrontFeaturesStatic($id_lang, $id_product)
	{
		if (!Feature::isFeatureActive())
			return array();
		if (!array_key_exists($id_product.'-'.$id_lang, self::$_frontFeaturesCache))
		{
			self::$_frontFeaturesCache[$id_product.'-'.$id_lang] = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS('
				SELECT name, value, pf.id_feature, pf.id_feature_value
				FROM '._DB_PREFIX_.'feature_product pf
				LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = '.(int)$id_lang.')
				LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.(int)$id_lang.')
				LEFT JOIN '._DB_PREFIX_.'feature f ON (f.id_feature = pf.id_feature AND fl.id_lang = '.(int)$id_lang.')
				'.Shop::addSqlAssociation('feature', 'f').'
				WHERE pf.id_product = '.(int)$id_product.'
				ORDER BY f.position ASC'
			);
		}
		return self::$_frontFeaturesCache[$id_product.'-'.$id_lang];
	}

}

Cordialement

Link to comment
Share on other sites

Merci Indesign

 

Le <?php y était, mais effectivement, la dernière accolade manquait ! J'ai fait ça sur un notepad sans coloration !! Quand j'ai ouvert dans Dreamweaver, il me l'a tout de suite dit!

 

Ca fonctionne nickel après avoir effacé le class_index !

 

Merci pour votre aide !

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...