Jump to content

tri des valeurs Caractéristiques dans BO


Recommended Posts

Bonjour,

Quelqu'un peut-il me dire comment classer les valeurs des caractéristiques dans le back office par ordre croissant ? En effet j'ai une caractéristique Nombre de pages = et j'ai la liste des valeurs qui s'affichent dans l'ordre de création alors que ce sont des chiffres ?

Merci par avance.

Prestashop 1.2.5

Link to comment
Share on other sites

Hello,

Tu peux trier tes caractéristiques dans l'ordre que tu souhaites en utilisant la même astuce que pour les catégories.

Pour cela ouvres Classes>>product.php et remplaces ces lignes:

static public function getFrontFeaturesStatic($id_lang, $id_product)
   {
       return Db::getInstance()->ExecuteS('
       SELECT name, value, pf.id_feature
       FROM '._DB_PREFIX_.'feature_product pf
       LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = '.intval($id_lang).')
       LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.intval($id_lang).')
       WHERE pf.id_product = '.intval($id_product));
   } 



Par celles-ci:

static public function getFrontFeaturesStatic($id_lang, $id_product)
   {
       $result=Db::getInstance()->ExecuteS('
       SELECT name, value, pf.id_feature
       FROM '._DB_PREFIX_.'feature_product pf
       LEFT JOIN '._DB_PREFIX_.'feature_lang fl ON (fl.id_feature = pf.id_feature AND fl.id_lang = '.intval($id_lang).')
       LEFT JOIN '._DB_PREFIX_.'feature_value_lang fvl ON (fvl.id_feature_value = pf.id_feature_value AND fvl.id_lang = '.intval($id_lang).')
       WHERE pf.id_product = '.intval($id_product).' order by name');

      $resultsArray = array();
       foreach ($result AS $row)
       {
           $row['name'] = product::hideFeaturePosition($row['name']);
           $resultsArray[] = $row;
       }
       return $resultsArray;
   }


   static public function hideFeaturePosition($name)
   {
       return preg_replace('/^[0-9]+\./', '', $name);
   } 



Ensuite tu n'as plus qu'à ajouter 1., 2., 3.,... devant le nom de tes caractéristiques pour qu'elles apparaissent dans l'ordre que tu souhaites (comme pour les catégories). Chez moi ça fonctionne impecc ;)

Link to comment
Share on other sites

Bonjour,

J'avais déjà fait cette modification et effectivement cela marche pour l'ordre des caractéristiques. Mais ce n'est pas ce que je cherchais. Je cherche à obtenir LES VALEURS des caractéristiques par ordre croissant. Exemple : lorsque je vais dans la fiche produit>caractéristiques>Nombre de pages : j'ai les nombres complètement dans le désordre (affichage par ordre de création) : c'est compliqué pour rien de rechercher dans la liste en désordre.

Merci quand-même pour la réponse.

Link to comment
Share on other sites

Bonjour par ici :)

Je viens d'utiliser votre code de modification pour le tri.
J'utilise un moteur de recherche en module qui affiche des tri par caractéristiques.
Celui-ci affiche le nom des caractéristiques avec le préfixe 01.nom_de_la_caractéristique

Voici l'extrait de code :

function getAllCategory() {
       global $cookie;
       $result = Db::getInstance()->ExecuteS('
       SELECT c.`id_category`, cl.`name`, cl.`link_rewrite`
       FROM `' . _DB_PREFIX_ . 'category` c
       LEFT JOIN `' . _DB_PREFIX_ . 'category_lang` cl ON c.`id_category` = cl.`id_category`
       WHERE `id_lang` = ' . intval($cookie->id_lang) . ' AND c.`id_category` != 1 
       AND `active` = 1 
       ORDER BY `name` ASC');

       /* Modify SQL result */
       $resultsArray = array ();
       foreach ( $result as $row ) {
           $row ['name'] = Category::hideCategoryPosition($row ['name']);
           $resultsArray [] = $row;
       }
       return $resultsArray;
   }



Comment pallier à l'affichage du préfixe de tri ?

Merci de votre aide !

Link to comment
Share on other sites

  • 1 year later...
  • 2 weeks later...
  • 1 month later...

Bonjour,

 

J'ai lu tout le post mais dans classes / product.php je n'ai pas les mêmes lignes exactement (prestashop v1.4.3) :

 

public static function getFrontFeaturesStatic($id_lang, $id_product)
{
	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
		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.')
		WHERE pf.id_product = '.(int)$id_product);
	}
	return self::$_frontFeaturesCache[$id_product.'-'.$id_lang];
}

public function getFrontFeatures($id_lang)
{
	return self::getFrontFeaturesStatic($id_lang, $this->id);
}

public static function getAttachmentsStatic($id_lang, $id_product)
{
	return Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
	SELECT *
	FROM '._DB_PREFIX_.'product_attachment pa
	LEFT JOIN '._DB_PREFIX_.'attachment a ON a.id_attachment = pa.id_attachment
	LEFT JOIN '._DB_PREFIX_.'attachment_lang al ON (a.id_attachment = al.id_attachment AND al.id_lang = '.(int)($id_lang).')
	WHERE pa.id_product = '.(int)($id_product));
}

public function getAttachments($id_lang)
{
	return self::getAttachmentsStatic($id_lang, $this->id);
}

 

Si je remplace cette section par le code donné plus haut par Divine, la page produit ne s'affiche pas (page blanche), comment faire ?

Merci d'avance :)

Link to comment
Share on other sites

  • 4 weeks later...

J'ai fait ça sur la 1.4, ça fonctionne pour le tri par numérotation (sans affichage de la numérotation)

 

remplacer :

public static function getFrontFeaturesStatic($id_lang, $id_product)
{
	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
		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.')
		WHERE pf.id_product = '.(int)$id_product);
	}
	return self::$_frontFeaturesCache[$id_product.'-'.$id_lang];
}

 

par :

 

public static function getFrontFeaturesStatic($id_lang, $id_product)
{
	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
		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.')
		WHERE pf.id_product = '.(int)$id_product.'
		ORDER BY `name`');

		$resultsArray = array();
       	foreach (self::$_frontFeaturesCache[$id_product.'-'.$id_lang] AS $row)
       	{
			$row['name'] = product::hideFeaturePosition($row['name']);
			$resultsArray[] = $row;
		}
		return $resultsArray;
	}
	//return self::$_frontFeaturesCache[$id_product.'-'.$id_lang];
}

public static function hideFeaturePosition($name)
   {
       return preg_replace('/^[0-9]+./', '', $name);
   }

 

je vais maintenant essayer de faire marcher l'ajout d'une rubrique :) (voiture.01.hauteur, voiture.11.largeur, velo.01.selle,...)

 

n'hésitez pas si mon code n'est pas optimisé à apportez vos améliorations !

Link to comment
Share on other sites

Donc après quelques heures avec les expressions régulières, les forums et un peu d'optimisations :

 

1 - Remettre la classe Product.php comme à l'original

 

2 - Dans "override/classes/", créer un fichier "Product.php", nous pourrons y placer ici les modifications de la classe sans toucher a l'originale (quand même plus propre ^^)

 

3 - coller ça dans le document VIERGE :

<?php
class Product extends ProductCore
{
public function getFrontFeatures($id_lang)
   {
       return self::getFrontFeaturesStatic($id_lang, $this->id);
   }

public static function getFrontFeaturesStatic($id_lang, $id_product)
   {

	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
		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.')
		WHERE pf.id_product = '.(int)$id_product.'
		ORDER BY `name`');

		$resultsArray = array();
       	foreach (self::$_frontFeaturesCache[$id_product.'-'.$id_lang] AS $row)
       	{
			$row['name'] = product::hideFeaturePosition($row['name']);
			$resultsArray[] = $row;
		}
		return $resultsArray;
	}
   }


   static public function hideFeaturePosition($name)
   {
       return preg_replace('/[a-zA-Z0-9_]+_+[0-9]+./', '', $name);
   }
}
?>

 

4 - Attention vous "DEVEZ" maintenant écrire les caractéristique comme ça :

voiture_01.Type de Pneu, voiture_10.Taille des jantes, velo_01.garantie,...

 

Ça va être assez long et galère au début, mais ça vous permet après d'être à l'aise dans vos caractéristique si vous en avez beaucoup.

Si vous avez peu de caractéristique vous pouvez remplacer le code(a la fin de la classe) par :

 

return preg_replace('/^[0-9]+./', '', $name);

 

Celui-la vous permet de classer uniquement par 01.type de pneu, 10.Taille des jantes, 20.garantie.

 

Après vous avez aussi la possibilité de faire vos propre règle à l'aide des expressions régulières ^^

Link to comment
Share on other sites

  • 2 years later...

Donc après quelques heures avec les expressions régulières, les forums et un peu d'optimisations :

 

1 - Remettre la classe Product.php comme à l'original

 

2 - Dans "override/classes/", créer un fichier "Product.php", nous pourrons y placer ici les modifications de la classe sans toucher a l'originale (quand même plus propre ^^)

 

3 - coller ça dans le document VIERGE :

<?php
class Product extends ProductCore
{
public function getFrontFeatures($id_lang)
    {
        return self::getFrontFeaturesStatic($id_lang, $this->id);
    }

public static function getFrontFeaturesStatic($id_lang, $id_product)
    {

		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
			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.')
			WHERE pf.id_product = '.(int)$id_product.'
			ORDER BY `name`');
			
			$resultsArray = array();
        	foreach (self::$_frontFeaturesCache[$id_product.'-'.$id_lang] AS $row)
        	{
				$row['name'] = product::hideFeaturePosition($row['name']);
				$resultsArray[] = $row;
			}
			return $resultsArray;
		}
    }
   
    
    static public function hideFeaturePosition($name)
    {
        return preg_replace('/[a-zA-Z0-9_]+_+[0-9]+./', '', $name);
    }
 }
?>
4 - Attention vous "DEVEZ" maintenant écrire les caractéristique comme ça :

voiture_01.Type de Pneu, voiture_10.Taille des jantes, velo_01.garantie,...

 

Ça va être assez long et galère au début, mais ça vous permet après d'être à l'aise dans vos caractéristique si vous en avez beaucoup.

Si vous avez peu de caractéristique vous pouvez remplacer le code(a la fin de la classe) par :

 

return preg_replace('/^[0-9]+./', '', $name);
Celui-la vous permet de classer uniquement par 01.type de pneu, 10.Taille des jantes, 20.garantie.

 

Après vous avez aussi la possibilité de faire vos propre règle à l'aide des expressions régulières ^^

 

 

Merci pour cet overide mais pour faire une classification des valeurs et non des attributs (ce script est bien pour les attributs ???), comment faire afin d'avoir un buton de choix de tri ?

 

Merci d'avance.

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