Jump to content

Ranger les fabricants en fonction de la première lettre de leurs noms sur la page manufacturer_list


Recommended Posts

Bonjour amis Prestashopiens,

 

Après mettre pris pas mal la tête, je remets mon interrogation entre vos mains.

 

Enfaite j'essaye de ranger les fabricants en fonction de leur Première lettre sur la page manufacturer_list.tpl.

 

Comme un exemple vaut 1000 mots je voudrais faire quelques choses semblable à ceci

 

http://vintageking.com/brands/index/

 

 

Pourriez vous me donner deux trois pistes pour que je puisse parvenir à mes fins ? J'avouerais avoir un peu l'impression de tourner en rond avec ça !!

 

Je vous remercie d'avance !

Link to comment
Share on other sites

Bonjour,

 

suivant votre version de Prestashop, il vous faudrait aller dans : classes/Manufacturer.php

Dans ce fichier, vous trouverez la fonction "getManufacturers".

 

il faut ensuite s'assurer que l'ordre est "by name" et "ASC" sur la ligne suivante :

 

$sql.= ' ORDER BY m.`name` ASC'.($p ? ' LIMIT '.(((int)($p) - 1) * (int)($n)).','.(int)($n) : '');

 

Il me semble que la solution est de ce côté, à vous de me dire ;)

Link to comment
Share on other sites

Bonjour,

 

En regardant plus attentivement la ligne que vous m'avez donné, il s'agit d'afficher les fabriquand dans l'ordre alphabétique !

 

Or je recherche et les ranger par ordre alphabétique tout en les classant en fontion de leur premeir lettre genre

 

A----------------------------------------------

 

Atol

Atomic

Allion

 

B------------------------------------------

 

Bêta

Beru

Bornp

 

C---------------------------------------

 

etc....

 

Enfête de les compartimenter !!

 

Merci quand même :) !

 

Si quelqu'un connais la solution :)

Link to comment
Share on other sites

Salut,

 

Ton post m'intéressait mais plus pour un classement par nombre de produit.

En attendant des réponse un peu plus propre (celle-ci lancera peut-être le nettoyage :) ), j'ai une petit piste qui pourrait t'aider.

 

Dans le fichier themes/ton_theme/manufacturer-list.tpl, il faut apporter les modification suivantes :

 

1. Créer une variable tableau avec les lettres de l'alphabet... Idealement, je crois qu'il faut faire ça dans un fichier php mais je ne sais pas encore lequel (je commence seulement dans ce domaine). En attendant, j'ai réussi de façon très "sââââle" dans le fichier tpl directement (en smarty) avec LES instruction suivante :

 

 

{*Création d'un variable tableau avec les lettres de l'alphabet*}
{$alphabet[]='A'}
{$alphabet[]='B'}
{$alphabet[]='C'}
{$alphabet[]='D'}
{$alphabet[]='E'}
{$alphabet[]='F'}
{$alphabet[]='G'}
{$alphabet[]='H'}
{$alphabet[]='I'}
{$alphabet[]='J'}
{$alphabet[]='K'}
{$alphabet[]='L'}
{$alphabet[]='M'}
{$alphabet[]='N'}
{$alphabet[]='O'}
{$alphabet[]='P'}
{$alphabet[]='Q'}
{$alphabet[]='R'}
{$alphabet[]='S'}
{$alphabet[]='T'}
{$alphabet[]='U'}
{$alphabet[]='V'}
{$alphabet[]='W'}
{$alphabet[]='X'}
{$alphabet[]='Y'}
{$alphabet[]='Z'}

 

2. J'ai créé une boucle d'itération sur cette variable tableau pour "scanner" chaque valeur (a, b, c...). Dans cette boucle, j'ajoute un list-item (ou pas, dépend de ton désir au niveau du design) qui affiche la "lettre en cours".

 

{foreach $alphabet as $lettre}
  <li class="{if $smarty.foreach.$alphabet.first}first_item{elseif $smarty.foreach.alphabet.last}last_item{else}item{/if}">
<div>
  <p>
{$lettre} ----------------
  </p>
</div>
  </li>

3. Toujours dans cette boucle, je copie la boucle déjà existante du tableau $manufacturers et qui consiste à écrire tous les list-items avec le fabricant (+logo+descritpion+etc...).

 

4. Je modifie cette boucle pour y ajouter un test conditionnel qui vérifie si la première lettre du fabricant est bien la même que la "lettre en cours".

{if $manufacturer.name[0] == $lettre}

 

 

Et voilà, en bas de mon bas de mon post, tu trouveras le code entier mais cependant, il faut se méfier parce que c'est un thème personnalisé... C'est pour ça que je t'ai détailler ma démarche parce que je ne sais pas ce que ça donnera sous le thème Prestashop (ou autre).... je n'ai pas testé.

 

Note aussi, qu'à mon avis, cette façon de faire enfreint pas mal de règle "déontologique" du développement sous PS... Disons que c'est une solution de secours en attendant que quelqu'un viennent soit donner une meilleur solution, soit indiquer ce qui est MAL et ce qui est BIEN :)

 

Finalement, il faudra encore travailler sur le principe de "pagination"... En effet, si tu as plus de 10 produit, il affichera toutes les lettres de l'alphabet (même celles qui sont vides) de A à Z... mais sur toutes les pages... Donc, si, en page 1, tu étais à la lettre S, il recommencera quand même à la lettre A sur la page 2...

 

J'espère qu'une bonne âme nous permettra de faire évoluer ce bout de code.

 

cordialement,

 

 

code entier du template :

 

{*
* 2007-2011 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to [email protected] so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
*  @author PrestaShop SA <[email protected]>
*  @copyright  2007-2011 PrestaShop SA
*  @version  Release: $Revision: 6594 $
*  @license	http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
*  International Registered Trademark & Property of PrestaShop SA
*
*
*
* DIRTY VERSION - MODIFIED BY IANN ASH (but i am not proud of it ! :-)
*}

{capture name=path}{l s='Manufacturers'}{/capture}
{include file="$tpl_dir./breadcrumb.tpl"}

<div class="mainContent">
<h1>{l s='Manufacturers'}</h1>

{if isset($errors) AND $errors}
{include file="$tpl_dir./errors.tpl"}
{else}
<p>{strip}
<span class="bold">
{if $nbManufacturers == 0}{l s='There are no manufacturers.'}
{else}
{if $nbManufacturers == 1}{l s='There is'}{else}{l s='There are'}{/if} 
{$nbManufacturers} 
{if $nbManufacturers == 1}{l s='manufacturer.'}{else}{l s='manufacturers.'}{/if}
{/if}
</span>{/strip}
</p>

{if $nbManufacturers > 0}

{*Création d'un variable tableau avec les lettres de l'alphabet*}
{$alphabet[]='A'}
{$alphabet[]='B'}
{$alphabet[]='C'}
{$alphabet[]='D'}
{$alphabet[]='E'}
{$alphabet[]='F'}
{$alphabet[]='G'}
{$alphabet[]='H'}
{$alphabet[]='I'}
{$alphabet[]='J'}
{$alphabet[]='K'}
{$alphabet[]='L'}
{$alphabet[]='M'}
{$alphabet[]='N'}
{$alphabet[]='O'}
{$alphabet[]='P'}
{$alphabet[]='Q'}
{$alphabet[]='R'}
{$alphabet[]='S'}
{$alphabet[]='T'}
{$alphabet[]='U'}
{$alphabet[]='V'}
{$alphabet[]='W'}
{$alphabet[]='X'}
{$alphabet[]='Y'}
{$alphabet[]='Z'}

<ul id="manufacturers_list">

{*
Boucle d'itération sur la variable tableau avec un test pour déterminer
si le fabricant correspond à cette lettre. Si oui, afficher le fabricant.

*}
{foreach $alphabet as $lettre}
  <li class="{if $smarty.foreach.$alphabet.first}first_item{elseif $smarty.foreach.alphabet.last}last_item{else}item{/if}">
<div>
  <p>
{$lettre} ----------------
  </p>
</div>
  </li>
  {foreach from=$manufacturers item=manufacturer name=manufacturers}
{if $manufacturer.name[0] == $lettre}
  <li class="{if $smarty.foreach.manufacturers.first}first_item{elseif $smarty.foreach.manufacturers.last}last_item{else}item{/if}">
  <div class="left_side">
  <!-- logo -->
  <div class="logo">
  {if $manufacturer.nb_products > 0}<a href="{$link->getmanufacturerLink($manufacturer.id_manufacturer, $manufacturer.link_rewrite)|escape:'htmlall':'UTF-8'}" title="{$manufacturer.name|escape:'htmlall':'UTF-8'}">{/if}
  <img src="{$img_manu_dir}{$manufacturer.image|escape:'htmlall':'UTF-8'}-manuf_medium.jpg" alt=""  />
  {if $manufacturer.nb_products > 0}</a>{/if}
  </div>
  <!-- name -->
  <h3>
  {if $manufacturer.nb_products > 0}<a href="{$link->getmanufacturerLink($manufacturer.id_manufacturer, $manufacturer.link_rewrite)|escape:'htmlall':'UTF-8'}">{/if}
  {$manufacturer.name|truncate:60:'...'|escape:'htmlall':'UTF-8'}
  {if $manufacturer.nb_products > 0}</a>{/if}
  </h3>
  <p class="description rte">
  {if $manufacturer.nb_products > 0}<a href="{$link->getmanufacturerLink($manufacturer.id_manufacturer, $manufacturer.link_rewrite)|escape:'htmlall':'UTF-8'}">{/if}
  {$manufacturer.description}
  {if $manufacturer.nb_products > 0}</a>{/if}
  </p>
  </div>

  <div class="right_side">
  {if $manufacturer.nb_products > 0}<a href="{$link->getmanufacturerLink($manufacturer.id_manufacturer, $manufacturer.link_rewrite)|escape:'htmlall':'UTF-8'}">{/if}
  <span>{$manufacturer.nb_products|intval} {if $manufacturer.nb_products == 1}{l s='product'}{else}{l s='products'}{/if}</span>
  {if $manufacturer.nb_products > 0}</a>{/if}

  {if $manufacturer.nb_products > 0}
  <a class="button" href="{$link->getmanufacturerLink($manufacturer.id_manufacturer, $manufacturer.link_rewrite)|escape:'htmlall':'UTF-8'}">{l s='view products'}</a>
  {/if}
  </div>
  <br class="clear"/>
  </li>
{/if}
  {/foreach}
{/foreach}
</ul>
{include file="$tpl_dir./pagination.tpl"}
{/if}
{/if}
</div>

Link to comment
Share on other sites

Je vous mets le code de ma page avec la solution ;) !!!

 

{*
* 2007-2012 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Academic Free License (AFL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/afl-3.0.php
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to [email protected] so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
*  @author PrestaShop SA <[email protected]>
*  @copyright  2007-2012 PrestaShop SA
*  @version  Release: $Revision: 14008 $
*  @license    http://opensource.org/licenses/afl-3.0.php  Academic Free License (AFL 3.0)
*  International Registered Trademark & Property of PrestaShop SA
*}
{capture name=path}{l s='Manufacturers'}{/capture}
{include file="$tpl_dir./breadcrumb.tpl"}
<h1>{l s='Manufacturers'}</h1>
{if isset($errors) AND $errors}
{include file="$tpl_dir./errors.tpl"}
{else}
<p>{strip}
 <span class="bold">
  {if $nbManufacturers == 0}{l s='There are no manufacturers.'}
  {else}
   {if $nbManufacturers == 1}{l s='There is'}{else}{l s='There are'}{/if} 
   {$nbManufacturers} 
   {if $nbManufacturers == 1}{l s='manufacturer.'}{else}{l s='manufacturers.'}{/if}
  {/if}
 </span>{/strip}
</p>
{if $nbManufacturers > 0}
 <ul id="manufacturers_list">
 {assign var=first value=''}
   {foreach from=$manufacturers item=manufacturer name=manufacturers}
  {if $manufacturer.name[0]!=$first}
  <br/>
  <h2 class="letterManufacturer">{$manufacturer.name[0]}</h2>
  {assign var=first value=$manufacturer.name[0]}
  {/if}

	    <li class="clearfix {if $smarty.foreach.manufacturers.first}first_item{elseif $smarty.foreach.manufacturers.last}last_item{else}item{/if}">
   <div class="left_side">
 <!-- name -->
 <h3>
  {if $manufacturer.nb_products > 0}<a href="{$link->getmanufacturerLink($manufacturer.id_manufacturer, $manufacturer.link_rewrite)|escape:'htmlall':'UTF-8'}">{/if}
  {$manufacturer.name|truncate:60:'...'|escape:'htmlall':'UTF-8'}
  {if $manufacturer.nb_products > 0}</a>{/if}
 </h3>
   </div>
   <div class="right_side">
   {if $manufacturer.nb_products > 0}<a href="{$link->getmanufacturerLink($manufacturer.id_manufacturer, $manufacturer.link_rewrite)|escape:'htmlall':'UTF-8'}">{/if}
 <span>{$manufacturer.nb_products|intval} {if $manufacturer.nb_products == 1}{l s='product'}{else}{l s='products'}{/if}</span>
   {if $manufacturer.nb_products > 0}</a>{/if}
   {if $manufacturer.nb_products > 0}
 <a class="button" href="{$link->getmanufacturerLink($manufacturer.id_manufacturer, $manufacturer.link_rewrite)|escape:'htmlall':'UTF-8'}">{l s='view products'}</a>
   {/if}
   </div>
   <!--<br class="clear"/>-->
  </li>
 {/foreach}
 </ul>
    <div class="clear"></div>
    {include file="$tpl_dir./pagination.tpl"}
{/if}
{/if}

 

Merci encore à tout le monde pour l'aide !

Link to comment
Share on other sites

  • 3 months later...

C'est très lourd, si on a beaucoup de fabricant c'est problématique, puisqu'on exécute 26 fois la requête, je pense que l'idée de comparer à chaque étape le première lettre de la marque avec la première lettre de la marque précédente, et d'inclure une div, s'il y a une différence. On peut faire ça puisque les fabricants sont déjà donné dans l'ordre alphabétique (c.f "function getManufacturers" dans la classe "Manufacturers"). Je vais y travailler et je vous tiens au courant. Bon courage!

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