Liste der Unterkategorie in der product_listing.html anzeigen

Author: Ing. Michael Fürst (office@bluegate.at)
Web: http://www.bluegate.at
Publiziert: März 2009

Problemstellung

Bei xt:Commerce 3.0.4 SP 2.1 werden Unterkategorien auf der Produktlisting-Seite nur angezeigt, wenn sich in der geöffneten Kategorie Unterkategorien befinden allerdings nicht direkt Produkte abgelegt sind.

  • Sind sowohl Produkte als auch Unterkategorien vorhanden, wird das Template-File /templates/<TEMPLATE>/module/product_listing/product_listing_v1.html angezeigt.

  • Sind ausschließlich Unterkategorien vorhanden, so zeigt der Shop das Template File /templates/<TEMPLATE>/module/categorie_listing/categorie_listing.html an. Dieses File zeigt die Unterkategorien oberhalb der eigentlichen Produkte an.

Es gibt derzeit keine mir bekannte (simple) Lösung, um die Unterkategorien auch anzuzeigen, wenn sich Produkte in der gewählten Kategorie befinden.

Lösung

Ich habe mich für den Lösungsweg über die product_listing.html entschieden. Dieser sieht vor, dass die Unterkategorien einfach als Smarty Array für das File product_listing.html bereitgestellt und dort angezeigt werden.

1) product_listing.php erweitern

Im ersten Schritt muss das File /includes/modules/product_listing.php erweitert werden. Hier lese ich die Unterkategorien aus und lege sie als Array in einer Smarty Variable ab.

Fügen Sie folgenden Block an der entsprechenden Stelle ein (ca. Zeile 70):

/includes/modules/product_listing.php
        ......
	$listing_query = xtDBquery($listing_split->sql_query);
	while ($listing = xtc_db_fetch_array($listing_query, true)) {
		$rows ++;
		$module_content[] =  $product->buildDataArray($listing);		
	}
	
	
	//********** BLOCK EINFÜGEN **********************//
        //********** ERMITTELN DER SUBKATEGORIEN *********//
                require_once (DIR_FS_INC.'xtc_get_categories.inc.php');
	$subCatArray=xtc_get_categories('', $current_category_id);
	
	if (!is_array($subCatArray)) {
		$module_smarty->assign('category_content', false);
	} else {
		foreach($subCatArray as $key => $value) {
			$catPath = xtc_category_link($value['id'],$value['text']).'<br>';
			$subCatArray[$key]['link'] = xtc_href_link(FILENAME_DEFAULT, $catPath);
		}
		$module_smarty->assign('category_content', $subCatArray);
	}
	//********** ENDE BLOCK EINFÜGEN **********************//
	
} else {
.....

Dieser Block liest die Subkategorien aus, generiert die entsprechenden Kategorie-Links und speichert den Array als Smarty Variable "category_content".

2) Inhalt in product_listing.html ausgeben

Im zweiten Schritt muss der soeben in der Smarty Variable abgelegte Inhalt im Template File natürlich ausgegeben werden. Hierzu muss folgender Block im Template File /templates/<TEMPLATE>/module/product_listing/product_listing_v1.html eingefügt werden:

product_listing_v1.html
{************ NEUER BLOCK ************************}
{if $category_content}
{************* SUBCAT LISTING ********************}
<div class="subCategories">
	<h2>Weitere Unterkategorien:</h2>
        {foreach name=subcat item=category_data from=$category_content}
	    <a href="{$category_data.link}">{$category_data.text}</a>, 
        {/foreach}
</div>
{************* ENDE SUBCAT LISTING ********************}
{/if}
{************ ENDE NEUER BLOCK ************************}

Platzieren Sie den Block an jener Stelle, an der Sie die Kategorieliste ausgeben möchten.

3) Layout im Stylesheet festlegen

Zu guter Letzt kann das Layout nun noch über das Stylesheet deklariert werden. Hierzu fügen Sie folgende Zeilen in Ihr Stylesheet (normalerweise /templates/<TEMPLATE>/stylesheet.css) ein:

stylesheet.css
div.subCategories {padding: 15px; background: #EAE9E9; border:#949494 1px solid;}
div.subCategories h2 {color: #000; font-size: 14px; margin-top:0}

Die Darstellung kann natürlich noch frei nach Ihren Wünschen angepasst werden.

Zum Abschluss laden Sie die geänderten Dateien noch auf Ihren Shopserver hoch. Ab sofort werden in Ihrem Shop Unterkategorien auch in der product_listing.html angezeigt.