Bewertung: 5 / 5

Stern aktivStern aktivStern aktivStern aktivStern aktiv
 

In JoomShopping 3.x.x soll auf der Hauptseite des Shops anstelle der sonst üblichen Auflistung aller Kategorien das Produkt des Monats angezeigt werden. In dem folgenden Beitrag werde ich eine einfache Möglichkeit aufzeigen, wie durch eine Anpassung der mainpage.php im Ordner Category des im Shop verwendeten Templates dieser Effekt erzielt werden kann.

Angebot des Monats auf der Startseite

Wenn ein Besucher auf einen mit JoomShopping erstellten Shop kommt, wird bisher zuerst eine Übersicht aller Produktkategorien im Hauptinhaltsbereich angezeigt. Das kommt daher, weil die Joomshooping Komponente in Joomla immer zuerst den Category-Controller lädt, wenn nichts anderes ausgewählt oder im Shop selber angeklickt wurde. Ist dazu noch keine Kategorie gewählt, wird von JoomShooping aus den statischen Texten der erste Textblock (zur Anzeige auf der Hauptseite) als Kategorie-Beschreibung angezeigt. Darunter werden dann alle Eltern-Kategorien des Shops gelistet.

Die Änderungen um das Produkt des Monats anzuzeigen werden in drei Schritten erfolgen.

  1. Ändern des Template mainpage.php im Ordner Category
  2. Hinzufügen eines neuen Produktlabels
  3. Zuweisen des Labels zu einem Produkt

Schritt 1: Ändern des Templates

Zuerst müssen wir das Template mainpage.php im Ordner Category zur Ausgabe aller Kategorien ändern. Bitte dazu den folgenden Code übernehmen.

<?php if ($this->params->get('show_page_heading') &amp;&amp; $this->params->get('page_heading')) {?>
<div class="shophead<?php print $this->params->get('pageclass_sfx');?>"><h1><?php print $this->params->get('page_heading')?></h1></div>
<?php }?>
<div class="jshop">
<?php print $this->category->description?>
<?php 
 
$product = null;
$imageSrc = "";
$imageLowSrc = "";
$attr = null;
$shippinginfo = SEFLink('index.php?option=com_jshopping&amp;controller=content&amp;task=view&amp;page=shipping');
$config = JSFactory::getConfig();
 
if ($this->category->category_id == 0) 
{
 $labels = JTable::getInstance('productLabel', 'jshop');
 $listLabels = $labels->getListLabels();
 $select = &amp;JTable::getInstance('product', 'jshop');
 $labelId = 0;
 
 foreach($listLabels as $key => $label)
 {
 if (strtolower($label->name) == "offer")
 {
 $labelId = $key;
 break;
 }
 }
 
 $products = $select->getProductLabel($labelId, 1);
 
 foreach($products as $value)
 {
 if ($labelId == 0) break;
 
 $value->product_link = SEFLink('index.php?option=com_jshopping&amp;controller=product&amp;task=view&amp;category_id='.$value->category_id.'&amp;product_id='.$value->product_id);
 $value->buy_link = SEFLink('index.php?option=com_jshopping&amp;controller=cart&amp;task=add&amp;category_id='.$value->category_id.'&amp;product_id='.$value->product_id);        
 $select->product_id = $value->product_id;
 $productImages = $select->getImages();
 
 foreach($productImages as $image)
 {
 $picture = $image->image_full;
 $picture = (isset($picture)) ? $picture : $this->noimage;
 $imageSrc = $config->image_product_live_path."/".$picture;
 $imageLowSrc = $config->image_product_live_path."/".$value->product_thumb_image;
 $imagePath = $config->image_product_path."/".$picture;
 list($width, $height, $type, $attr) = getimagesize($imagePath);
 
 break;
 }
 
 $product = $value;
 }
}
 
if ($product) {
?>
<h2><?php print $product->name?></h2>
 <table class = "product">
 <tr>
 <td class="image">
 <div style="padding: 2px;">
 <?php if ($product->label_id &amp;&amp; getNameImageLabel($product->label_id)){?>
 <div class="product_label">
 <img src="<?php print $config->image_labels_live_path."/".getNameImageLabel($product->label_id); ?>" alt="<?php print getNameImageLabel($product->label_id, 2)?>" />
 </div>
 <?php }?>
 </div>
 <a href="<?php print $product->product_link?>"><img src="<?php print $imageSrc; ?>" lowsrc="<?php print $imageLowSrc; ?>" <?php print $attr; ?> title="<?php print htmlspecialchars($product->name); ?>" alt="<?php print htmlspecialchars($product->name); ?>" /></a>
 <?php if ($this->allow_review){?>
 <table class="review_mark"><tr><td>
 <?php print showMarkStar($product->average_rating);?>
 </td></tr></table>
 
 <div class="count_commentar">
 <?php print sprintf(_JSHOP_X_COMENTAR, $product->reviews_count);?>
 </div>
 <?php }?>
 </td>
 <td valign="top" style="padding-left:10px">
 <div class="description">
 <?php print $product->short_description?>
 </div>
 <?php if ($product->manufacturer->name){?>
 <div class="manufacturer_name"><?php print _JSHOP_MANUFACTURER;?>: <?php print $product->manufacturer->name?></div>
 <?php }?>
 <?php if ($product->product_quantity <=0 &amp;&amp; !$config->hide_text_product_not_available){?>
 <div class = "not_available"><?php print _JSHOP_PRODUCT_NOT_AVAILABLE;?></div>
 <?php }?>
 <?php if ($product->product_old_price > 0){?>
 <div class="old_price"><?php print formatprice($product->product_old_price)?></div>
 <?php }?>
 <?php if ($product->product_price > 0 || !$config->user_as_catalog){?>
 <div class = "jshop_price"><?php if ($product->show_price_from) print _JSHOP_FROM." ";?><?php print formatprice($product->product_price);?></div>
 <?php }?>
 <?php if ($config->show_tax_in_product &amp;&amp; $product->tax > 0){?>
 <span class="taxinfo"><?php print productTaxInfo($product->tax);?></span>
 <?php }?>
 <?php if ($config->show_plus_shipping_in_product){?>
 <span class="plusshippinginfo"><?php print sprintf(_JSHOP_PLUS_SHIPPING, $shippinginfo);?></span>
 <?php }?>
 <?php if ($product->basic_price_info['price_show']){?>
 <div class="base_price"><?php print _JSHOP_BASIC_PRICE?>: <?php print formatprice($product->basic_price_info['basic_price'])?> / <?php print $product->basic_price_info['name'];?></div>
 <?php }?>
 <?php if ($config->product_list_show_weight &amp;&amp; $product->product_weight > 0){?>
 <div class="productweight"><?php print _JSHOP_WEIGHT?>: <?php print formatweight($product->product_weight)?> <?php print _JSHOP_WEIGHT_UNIT?></div>
 <?php }?>
 <?php if ($product->delivery_time != ''){?>
 <div class="deliverytime"><?php print _JSHOP_DELIVERY_TIME?>: <?php print $product->delivery_time?></div>
 <?php }?>
 <?php if (is_array($product->extra_field)){?>
 <div class="extra_fields">
 <?php foreach($product->extra_field as $extra_field){?>
 <div><?php print $extra_field['name']; ?>: <?php print $extra_field['value']; ?></div>
 <?php }?>
 </div>
 <?php }?>
 <div class="buttons">
 <?php if ($product->buy_link){?>
 <a href="<?php print $product->buy_link?>"><?php print _JSHOP_BUY?></a> &amp;nbsp;
 <?php }?>
 <a href="<?php print $product->product_link?>"><?php print _JSHOP_DETAIL?></a>
 </div>
 </td>
 </tr>
 </table>
 
<?php }else{ ?>
<div class="jshop_list_category">
<?php if (count($this->categories)){?>
<table class = "jshop">
 <?php foreach($this->categories as $k=>$category){?>
 <?php if ($k%$this->count_category_to_row==0) print "<tr>"; ?>
 <td class = "jshop_categ" width = "<?php print (100/$this->count_category_to_row)?>%">
 <table class = "category">
 <tr>
 <td class="image">
 <a href = "<?php print $category->category_link;?>"><img class = "jshop_img" src = "<?php print $this->image_category_path;?>/<?php if ($category->category_image) print $category->category_image; else print $this->noimage;?>" alt="<?php print htmlspecialchars($category->name);?>" title="<?php print htmlspecialchars($category->name);?>" border="0" /></a>
 </td>
 </tr>
 <tr>
 <td>
 <a class = "product_link" href = "<?php print $category->category_link?>"><?php print $category->name?></a><br />
 <?php print $category->short_description;?>
 </td>
 </tr>
 </table>
 </td>
 <?php if ($k%$this->count_category_to_row==$this->count_category_to_row-1) print '</tr>'; ?>
 <?php } ?>
 <?php if ($k%$this->count_category_to_row!=$this->count_category_to_row-1) print '</tr>'; ?>
</table>
<?php } ?>
</div>
<?php } ?>
</div>
 

Falls Sie nun doch nicht das Label als "Offer" bezeichnen wollen, dann ändern Sie die entsprechende Stelle im Code und nutzen ab dann Ihre eigene Bezeichnung.

Schritt 2: Anlegen des Produktlabels

Da in JoomShooping keine Möglichkeit wie in ezPublish besteht, nachträglich Dokumentklassen mit zusätzlichen Attributen zu versehen, können wir also nicht einfach dem Produkt noch eine weitere Eigenschaft "Angebot des Monats" mitgeben. Es gibt auch keine Möglichkeit, einen Angebotszeitraum zu definieren, um eventuell automatisch die Anzeige zu wechseln.

Eine Lösung wäre das Hinzufügen eines neues Produkt-Labels oder Etiketts. Ich habe mich für ein Produktetikett mit dem Namen "Offer" entschieden und dazu auch noch ein neues Label Bild hochgeladen.

Das geschieht über JoomShopping - Options - Product labels.

Schritt 3: Hinzufügen des Produktlabels

Nun wird das Produkt des Monats aus der Liste aller Produkte ausgewählt. Sie können dazu auch noch den Filter benutzen, falls Sie schon jetzt nach Labels vorselektieren wollen.

 

Wählen sie ein Produkt nun aus und bearbeiten Sie es. Dazu gehen Sie auf die Auswahl Info / Details und weisen dem Produkt das Label "Offer" zu.

 

Nun wird anstelle der Kategorie-Übersicht der Eltern-Kategorien das Produkt des Monats auf der Hauptseite unter dem statischen Haupttext angezeigt. Es spielt keine Rolle, ob noch weitere Produkte das Label "Offer" tragen. Das in der Datenbank zuerst gefundene Produkt wird als Produkt des Monats angezeigt. Die Bildgröße in unserem Beispiel ist die Originalgröße, als lowsrc Image wird das Vorschaubild des Produktes vorgeladen, wenn das Produktbild selber eine größere Downloadzeit beansprucht.

Alternativen:

Sinnvoll wäre das Beispiel als Komponente für Joomla zu entwickeln. Dann kann dem Produkt des Monats individuell ein Label zugewiesen werden, das Layout ist besser anpassbar und es kann ein Zeitraum definiert werden, in dem das Produkt auf der Hauptseite erscheint. Ein Text-Plugin für JoomShopping zu entwickeln, um auf das Produkt des Monats bereits im statischen Haupttext hinzuweisen, wird von JoomShopping nicht unterstützt, da in JoomShopping ein eigenes CMS verwendet wird (daher dieser Unsinn mit den statischen Texten in JoomShopping, wodurch z.B. alle wichtigen Artikel im Shop wie AGB etc. doppelt geschrieben werden müssen).