Jump to content

Variable de la langue courante


Recommended Posts

Bonjour,

 

Je viens de remarquer un léger bug dans PS v1.5.3.1

La seule langue active est le français (id_lang=5)

 

J'ai créé une fiche produit avec le nom "produit1".

J'ai dupliqué cette fiche produit et j'ai renommé cette fiche en "produit2".

 

Lorsqu'on duplique une fiche produit, je viens de me rendre compte qu'il fallait penser à également renommer le nom du produit pour toutes les langues car en éditant le champ "nom" en BO il n'y a que l'entrée correspondant au français qui a été modifiée. Autrement dit je conserve le nom "produit1" dans les autres langues que le français pour le "produit2". Bref jusque là c'est compréhensible.

 

Mon problème se situe au niveau de l'affichage des prix dégressifs sur les fiches produits. J'ai appliqué 3 règles de prix pour mon "produit2". Je viens de remarqué que dans la colonne "produit" le nom du produit affiché est cela de la langue anglaise qui, comme expliqué juste au dessus, est resté "produit1". Il faut donc modifier en BO le nom de mon "produit2" pour la langue anglaise et remplacer "produit1" par "produit2".

 

J'ai donc cherché à comprendre d'où venait ce problème. Donc dans product.tpl j'ai le code suivant permettant d'afficher les prix dégressifs :

<div id="quantityDiscount">
	<h3>{l s='Quantity discount'}</h3>
	<table class="std">
        <thead>
            <tr>
                <th>{l s='product'}</th>
                <th>{l s='from (qty)'}</th>
                <th>{l s='discount'}</th>
            </tr>
        </thead>
		<tbody>
            {foreach from=$quantity_discounts item='quantity_discount' name='quantity_discounts'}
            <tr id="quantityDiscount_{$quantity_discount.id_product_attribute}">
                <td>
                    {if (isset($quantity_discount.attributes) && ($quantity_discount.attributes))}
                        {$product->getProductName($quantity_discount.id_product, $quantity_discount.id_product_attribute)}
                    {else}
                        {$product->getProductName($quantity_discount.id_product)}
                    {/if}
                </td>
                <td>{$quantity_discount.quantity|intval}</td>
                <td>
                    {if $quantity_discount.price >= 0 OR $quantity_discount.reduction_type == 'amount'}
                       -{convertPrice price=$quantity_discount.real_value|floatval}
                   {else}
                       -{$quantity_discount.real_value|floatval}%
                   {/if}
                </td>
            </tr>
            {/foreach}
        </tbody>
	</table>
</div>

Le nom du produit s'affiche donc grâce à $product->getProductName (l.489 ou l.491)

 

J'ai donc ouvert classes/Product.php et j'ai regardé la fonction suivante :

/**
	 * Gets the name of a given product, in the given lang
	 *
	 * @since 1.5.0
	 * @param int $id_product
	 * @param int $id_product_attribute Optional
	 * @param int $id_lang Optional
	 * @return string
	 */
	public static function getProductName($id_product, $id_product_attribute = null, $id_lang = null)
	{
		// use the lang in the context if $id_lang is not defined
		if (!$id_lang)
			$id_lang = (int)Context::getContext()->language->id;

		// creates the query object
		$query = new DbQuery();

		// selects different names, if it is a combination
		if ($id_product_attribute)
			$query->select('IFNULL(CONCAT(pl.name, \' : \', GROUP_CONCAT(DISTINCT agl.`name`, \' - \', al.name SEPARATOR \', \')),pl.name) as name');
		else
			$query->select('DISTINCT pl.name as name');

		// adds joins & where clauses for combinations
		if ($id_product_attribute)
		{
			$query->from('product_attribute', 'pa');
			$query->join(Shop::addSqlAssociation('product_attribute', 'pa'));
			$query->innerJoin('product_lang', 'pl', 'pl.id_product = pa.id_product AND pl.id_lang = '.(int)$id_lang);
			$query->leftJoin('product_attribute_combination', 'pac', 'pac.id_product_attribute = pa.id_product_attribute');
			$query->leftJoin('attribute', 'atr', 'atr.id_attribute = pac.id_attribute');
			$query->leftJoin('attribute_lang', 'al', 'al.id_attribute = atr.id_attribute AND al.id_lang = '.(int)$id_lang);
			$query->leftJoin('attribute_group_lang', 'agl', 'agl.id_attribute_group = atr.id_attribute_group AND agl.id_lang = '.(int)$id_lang);
			$query->where('pa.id_product = '.(int)$id_product.' AND pa.id_product_attribute = '.(int)$id_product_attribute);
		}
		else // or just adds a 'where' clause for a simple product
		{
			$query->from('product_lang', 'pl');
			$query->where('pl.id_product = '.(int)$id_product);
		}

		return Db::getInstance()->getValue($query);
	}

On remarque que d'après le code vu dans product.tpl, je rentre dans la condition "if (!$id_lang)" car la variable $id_lang n'est pas passée (l.4907).

 

Et c'est là que je bloque.

 

1/ Soit il faut passer la variable $id_lang au niveau de  "$product->getProductName($quantity_discount.id_product)" dans product.tpl (l.489 ou l.491)

Dans ce cas : quelle variable utiliser pour indiquer à PS que je souhaite passer l'id de la langue courante (le français dans mon cas)

 

2/ Soit il faut indiquer au niveau de "$id_lang = (int)Context::getContext()->language->id;" dans classes/Product.php que l'id doit être celui de la langue courante (le français dans mon cas) l.4908.

Dans ce cas : comment faire ?

 

J'aimerais résoudre mon problème proprement ci-possible et ne pas avoir à le faire de manière bête et disciplinée en renommant la version anglaise du nom de mon produit car ce n'est tout simplement pas logique d'afficher le nom dans une langue qui n'est pas active sur Prestashop...

 

Merci d'avance :)

Edited by jlweb (see edit history)
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...