Artikel sortieren nach Preis

Begonnen von dobra, Mai 15, 2015, 15:55:30

« vorheriges - nächstes »

0 Mitglieder und 1 Gast betrachten dieses Thema.

dobra

Die Sortierung nach Preis (Beispiel im Demo-Styleshop)  funktioniert mit sort.ipl nicht richtig wenn man kleine Preise hat und beim sortieren auch die Kommastellen berücksichtigt werden müssen.

Lösung:

Callback::AddSQLCondition  in std.all anpassen

original (berücksichtigt die Kommastellen nicht
if ($sfield == 1) { ## sortieren nach Preis
if ($sdirection == 1) {
$sqlstr = " ORDER BY ($pre\ITEM.PRICE + 0.0) ASC ";
} else {
$sqlstr = " ORDER BY ($pre\ITEM.PRICE + 0.0) DESC ";
}
}


ändern auf (Kommastellen werden berücksichtigt)
if ($sfield == 1) {
if ($sdirection == 1) {
$sqlstr = " ORDER BY ((REPLACE($pre\ITEM.PRICE,',','.'))+0.0) ASC ";
} else {
$sqlstr = " ORDER BY ((REPLACE($pre\ITEM.PRICE,',','.'))+0.0) DESC ";
}
}
mfG
dobra

dobra

sehr viel eleganter (und wesentlich schneller, da die Seite nicht neu geladen werden muss) geht das Sortieren mit jQuery :)

Voraussetzung:

jQuery ist bereits eingebunden
Bei der Produktausgabe sind die erforderlichen Klassen definiert
(hier im Beispiel rot markiert - kann natürlich auch anders heißen - dann muss das in Script angepasst werden)

<ul id="products">
   <!--spmacro:loopitem-->      
      <li class="sortit">
         <h3>produkt</h3>
            image, ergaenz, etc ##beliebig
         <span class="price">__preis__</span>
      </li>
   <!--spmacro:enditem-->
</ul>

function Sorter(listSelector,itemSelector,orderSelector,order)
{
  var items=$(listSelector).clone(true).find(itemSelector);

  items.sort(($.grep(items,function(e){return isNaN($(e).find(orderSelector).eq(0).text());}).length)
              ?(function(a,b)
              {
                var c=(order=='desc')?[b,a]:[a,b];
                return ($(c[0]).find(orderSelector).eq(0).text()>$(c[1]).find(orderSelector).eq(0).text())?1:-1;
              })
              :(function(a,b)
              {
                var c=(order=='desc')?[b,a]:[a,b];
                return ($(c[0]).find(orderSelector).eq(0).text()-$(c[1]).find(orderSelector).eq(0).text());
              })
            );
   
   for(var i=0;i<items.length;++i)
   {
     $(listSelector+' '+itemSelector).eq(i).replaceWith(items[i]);
   }
}

  function price_desc() {
    Sorter('#products','li.sortit','.price','desc');
  }
  function price_asc() {
    Sorter('#products','li.sortit','.price','asc');
  }
  function art_desc() {
    Sorter('#products','li.sortit','h3','desc');
  } 
  function art_asc() {
    Sorter('#products','li.sortit','h3','asc');
  }


Ausgabe mit
Artikel: <a href="javascript:void(0)" onclick="art_asc();">aufsteigend</a>  ### Text oder Image sowie natürlich beliebige Formatierung möglich
   <a href="javascript:void(0)" onclick="art_desc();">absteigend</a>
   
Preis: <a href="javascript:void(0)" onclick="price_asc();">aufsteigend</a> 
   <a href="javascript:void(0)" onclick="price_desc();">absteigend</a>

mfG
dobra

ahe

Zur Soritierung mit jQuery sei aber noch angemerkt, dass das nur sauber funktioniert wenn man alle Artikel auf einer Seite anzeigt.
Wenn man mit __weitereseiten__ arbeitet jedoch nicht, da dann immer nur der sichtbare Teil neu sortiert würde.
MfG ahe