Jump to content

Variable Smarty (si titre produit comporte un mot précis)


Recommended Posts

Bonjour,

Je recherche à mettre en place une variable pour détecté si un mot précis apparaît dans le titre du produit pour afficher un message personnalisé.

Dans les fait, si le titre comporte le mot (Carte électronique) ou (Module) alors afficher (Ni repris, ni échangé).

Hors je ne trouve pas quelle variable je pourrais utiliser.

 

Quelqu'un pour m'aider?

Merci

 

Link to comment
Share on other sites

Bonjour,

Je ne suis pas un expert mais voici une piste qui peut dépanner :

Dans classes/Product.php ajouter cette fonction

    public static function getProductKeywords($id_product)
    {
        // Array avec les mots clé
        $keywords = array("Carte électronique", "Module");

        // Définition de la langue
        $id_lang = Context::getContext()->language->id;

        // Requete SQL pour trouver le nom du produit selon la langue
        $sql = 'SELECT p.`id_product`, pl.`name`
                FROM `'._DB_PREFIX_.'product` p
                '.Shop::addSqlAssociation('product', 'p').'
                LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` '.Shop::addSqlRestrictionOnLang('pl').')
                WHERE p.`id_product` = '.(int)$id_product.' AND pl.`id_lang` = '.(int)$id_lang.'
                ORDER BY pl.`name`';
        $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql);

        // Teste si la chaîne contient le mot
        foreach ($keywords as $keyword) {
            if (strpos(strtolower($result['name']), strtolower($keyword)) !== false) {
                return true;
            }
        }

        return false;
    }

 

Puis dans le fichier tpl où tu souhaites ajouter "ni repri, ni échangé" ajouter

{if Product::getProductKeywords($product.id)}
  {l s='Ni repri, ni échangé' d='Shop.Theme.Actions'}
{/if}

 

Dans la fonction tu modifies la ligne

$keywords = array("Carte électronique", "Module");

attention cela prend en compte les accents ^^ 

 

 

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

Merci.

Avec cet indice j'ai réussi a utilisé un code beaucoup plus simple sans toucher aux fichiers PHP.

Voici le code: 

{if $product.name|stristr:"Carte" or $product.name|stristr:"CARTE"}
					{l s='Module ou carte électronique, ni repris, ni échangé' d='Shop.Theme.Actions'}
				{/if}

Par contre, comme c'est sensible à la case, je suis obligé d'utiliser beaucoup de variante d'écriture.
Je ne sais pas si il existe une astuce pour tout regrouper dans un code moins répétitif de type:

{if $product.name|stristr:"Carte","CARTE","etc..."}

 

Link to comment
Share on other sites

en smarty tu peux utiliser "lower" pour tout mettre en minuscule avant le traitement des données.

Essaie avec ça :

{if $product.name|lower|stristr:"Carte" or $product.name|lower|stristr:"CARTE"}

{l s='Module ou carte électronique, ni repris, ni échangé' d='Shop.Theme.Actions'}

{/if}

 

 

EDIT

Ca du coup :

{if $product.name|lower|stristr:"carte"}

{l s='Module ou carte électronique, ni repris, ni échangé' d='Shop.Theme.Actions'}

{/if}

 

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

Parfait, cela marche et m'évite des termes redondants.

Juste dernière demande, existe t'il une astuce pour éviter de prendre en compte les mots comportant ces termes?
Exemple, si mon produit possède dans son nom "carter" et bien  il sera pris en compte alors que ce n'est pas le même type de produit.
Il faudrait que la variable traite la valeur de manière stricte. stristr ou strstr semble trop flexible à ce niveau.

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...