Hat jemand eine Idee, wie ich in Artikelbeschreibungen Variablen (z.B. Kategorienamen, Artikelbezeichnungen) anzeigen, oder idealerweise sogar Contentseiten anzeigen kann, die ebenfalls diese Variablen enthalten. Grund: Ich habe viele Artikel, deren Beschreibung sich nur durch den Artikelnamen und die Kategorie unterscheiden, durch Attributsetzen läßt sich das aber nicht lösen. Gruß Elmar
Hallo, ich würde für diese Artikel einfach eine separate Vorlage für die Artikeldetailseite bauen (/templates/EyeCandy/module/products_info/standard.html kopieren und anpassen), in der statt {$PRODUCTS_DESCRIPTION} ein fester Text mit den entsprechenden Smarty-Variablen an den richtigen Stellen steht.
Können die Filter-Attribute zukünftig auch als Smarty Variablen verwendet werden. Ich denke da z.B. an einen 2. Reiter "Datenblatt" in der Artikelbeschreibung...
PUSH - Ich benötige ein Array von Filterwertepaaren. Z.B.: Farbe - blau; Diese möchte ich z.B. in einer Schleife per Smarty in HTML ausgeben... Ist das möglich?
Hallo humpfle, wenn ich das richtig verstanden habe, könnte dir eventuell das hier weiter helfen: http://www.gambio-forum.de/threads/5747-MPN-Ausgabe-in-den-Artikeldetails bzw. den Weg zeigen. Grüße FMJ
So, für alle denen das interessiert: Die Filterdaten werden nun dynamisch ausgelesen und in der Artikelbeschreibung angezeigt. Hier das Ergebnis: (Link nur für registrierte Nutzer sichtbar.) Umsetzung: Unter /user_classes/overloads/ProductInfoContentView folgende Datei anlegen: fhu_ProductInfoContentView.inc.php Code: <?php class fhu_ProductInfoContentView extends fhu_ProductInfoContentView_parent { function get_html($p_coo_product, $p_current_category_id = 0) { $products_id=$p_coo_product->data['products_id']; if ($products_id) { $sql=' SELECT fd.feature_admin_name, fvd.feature_value_text FROM feature_description fd, feature_value_description fvd, products_feature_value pfv, feature_value fv WHERE fd.feature_id = fv.feature_id AND fv.feature_value_id = fvd.feature_value_id AND fvd.feature_value_id = pfv.feature_value_id AND products_id='.$products_id; $res=xtc_db_query($sql); while ($products_features=xtc_db_fetch_array($res)) { $this->set_content_data("KEY_".$products_features['feature_admin_name'], $products_features['feature_admin_name']); $this->set_content_data("VALUE_".$products_features['feature_admin_name'], $products_features['feature_value_text']); } } return parent::get_html($p_coo_product, $p_current_category_id); } } ?> Die Variablen können jetzt z.B. in der standard.html (/templates/EyeCandy/module/product_info) ausgegeben werden: Code: <div class="info clearfix"> <div class="inside"> <h1>{$PRODUCTS_NAME}</h1> <dl> {if $KEY_Produktkategorie!='' and $VALUE_Produktkategorie!=''} <dt>{$KEY_Produktkategorie}</dt> <dd class="products_categorie">{$VALUE_Produktkategorie}</dd> {/if} {if $KEY_Hersteller!='' and $VALUE_Hersteller!=''} <dt>Marke</dt> <dd class="products_marke">{$VALUE_Hersteller}</dd> {/if} ............... .... .. ... .. Der Feature Name muss dabei bekannt sein. Hier ist es z.B. Produktkategorie und Hersteller.. Verbesserungsvorschläge sind gerne willkommen! Achso: anschließend tempate- und browsercache leeren!
Soo. Kann ein Filter mehrere Werte annehmen, werden diese jetzt komma-separiert ausgegeben. Umsetzung: Code: <?php class fhu_ProductInfoContentView extends fhu_ProductInfoContentView_parent { function get_html($p_coo_product, $p_current_category_id = 0) { $products_id=$p_coo_product->data['products_id']; if ($products_id) { $sql=' SELECT fd.feature_admin_name, fvd.feature_value_text FROM feature_description fd, feature_value_description fvd, products_feature_value pfv, feature_value fv WHERE fd.feature_id = fv.feature_id AND fv.feature_value_id = fvd.feature_value_id AND fvd.feature_value_id = pfv.feature_value_id AND products_id='.$products_id; $res=xtc_db_query($sql); $feature_array = array(); while(($products_features = xtc_db_fetch_array($res) )) { if (isset($feature_array["KEY_".$products_features['feature_admin_name']]) == false){ $feature_array["KEY_".$products_features['feature_admin_name']] = $products_features['feature_admin_name']; $feature_array["VALUE_".$products_features['feature_admin_name']] = $products_features['feature_value_text']; } else { $feature_array["VALUE_".$products_features['feature_admin_name']] = $feature_array["VALUE_". $products_features['feature_admin_name']].", ".$products_features['feature_value_text']; } } foreach($feature_array as $key => $val){ $this->set_content_data($key, $val); } } return parent::get_html($p_coo_product, $p_current_category_id); } } ?> Beispiel: Filter "Für wen" -> 2 Werte: Jungs, Mädchen (Link nur für registrierte Nutzer sichtbar.) Vielleicht hat ja jemand noch eine bessere Implementierung. Ohne Umweg über ein Zwischenarray...
Jetzt bist Du ja gar nicht mehr zu bremsen... Ich habe das mal etwas optimiert, und vor allem, "generisch" gemacht, d.h., man muss nicht mehr wissen, wie die Eigenschaftsnamen sind, und die definierte Sortierfolge der Eigenschaften wird berücksichtigt. Der PHP-Teil sieht dann so aus. PHP: <?phpclass fhu_ProductInfoContentView extends fhu_ProductInfoContentView_parent{ function get_html($p_coo_product, $p_current_category_id = 0) { $products_id=$p_coo_product->data['products_id']; if ($products_id) { $features = array(); $sql=' SELECT fd.feature_name, fvd.feature_value_text FROM feature_description fd, feature_value_description fvd, products_feature_value pfv, feature_value fv WHERE fd.feature_id = fv.feature_id AND fv.feature_value_id = fvd.feature_value_id AND fvd.feature_value_id = pfv.feature_value_id AND pfv.products_id='.$products_id.' ORDER BY fv.sort_order'; $res=xtc_db_query($sql); while(($products_features = xtc_db_fetch_array($res) )) { $feature_name=$products_features['feature_name']; if ($features[$feature_name]) { $features[$feature_name].=', '; } $features[$feature_name].=$products_features['feature_value_text']; } $this->set_content_data('features', $features); } return parent::get_html($p_coo_product, $p_current_category_id); }}?> Der HTML-Teil sieht dann so aus: PHP: {if $features|count>0}<dl id="products_features"> {foreach from=$features item=feature_value key=feature_name} <dt class="feature_name">{$feature_name}:</dt> <dd class="feature_value">{$feature_value}</dd> {/foreach}</dl>{/if} Dann noch ein wenig CSS dazu: PHP: #products_features { clear:both; margin-top: 20px; margin-bottom: 20px;}#products_features .feature_name,#products_features .feature_value { float:left; margin-bottom: 5px;}#products_features .feature_name { clear: both; font-weight: bold; width: 120px;} und man bekommt so etwas wie im angefügten Bild...
Hi Avenger, danke für deinen Lösungsvorschlag. Diese Idee hatte ich zuerst auch. Aber ich möchte die Filterattribute zukünftig an unterschiedlichen Stellen abfragen und ggf. anzeigen. Beispielsweise um für das Attribut "Geschlecht" kleine Symbole für Mädchen und Jungs anzuzeigen und ähnliche Ideen. D.h. Ein Array mit allen Filtern ist in meinem Fall nicht sehr praktikabel und somit bevorzuge ich die nicht generische Lösung.
Nun, das kannst Du doch im Template immer noch tun... Meine Lösung leistet das gleiche wie Deine, nur effizienter und übersichtlicher... Statt jeden Key und Wert einzeln an das Template zu übergeben, wird das alles in einem Array an das Template übergeben. Dein Template-Beispiel würde dann z.B. so aussehen: PHP: {if $features|count>0}<dl id="products_features"> {foreach from=$features item=feature_value key=feature_name} {if $feature_name=='Produktkategorie' and $feature_value!=''} <dt>{$feature_name}</dt> <dd class="feature_value">{$feature_value}</dd> {/if} {esleif $feature_name=='Hersteller' and $feature_value!=''} <dt>Marke</dt> <dd class="feature_value">{$feature_value}</dd> {else} <dt>{$feature_name}</dt> <dd class="feature_value">{$feature_value}</dd> {/if} {/foreach}</dl>{/if} Wobei das natürlich nur dann wirklich so Sinn macht, wenn man für einen Eigenschaftswert z.B. ein Bild statt des Textes substituieren oder auch ausschließen will. Die Texte werden ja sonst generisch automatisch ausgegeben.... m.E. sollte man solche Lösungen so flexibel wie möglich gestalten, und nicht von vorne herein zu speziell anlegen.
Ich hätte gerne folgende Reihenfolge: Wo werden die Daten gespeichert? Es handelt sich dabei nicht um die Spalte "sort_order" in der Tabelle "feature_value"
Also hier nochmal der angepasste SQL Befehl mit Reihenfolge aus dem Adminbereich. Ausserdem ist ANSI JOIN ein klein wenig schneller: Code: SELECT fd.feature_admin_name, fvd.feature_value_text FROM feature_description fd INNER JOIN feature_value fv ON ( fd.feature_id = fv.feature_id ) INNER JOIN feature_value_description fvd ON ( fv.feature_value_id = fvd.feature_value_id ) INNER JOIN products_feature_value pfv ON ( fvd.feature_value_id = pfv.feature_value_id ) LEFT JOIN categories_filter cf ON ( cf.feature_id = fd.feature_id ) WHERE products_id =1570 ORDER BY cf.sort_order
Hai Avenger, wie kann ich außerhalb der "foreach" einzelne Werte abfragen/anzeigen? Der "IchStehAufmSchlauchFaktor" hat mich grad voll im Griff!
Das müsste eigentlich mit PHP: $features.feature_name funktionieren.... z.B. $features.Farbe, wenn "Farbe" eine Eigenschaft ist...
Wie könnte man sie denn zusätzlich z.B. in der "...\templates\EyeCandy\module\product_listing\product_listing_v1.html" ausgeben?
Hierzu muss die Funktion buildDataArray in der product.php (includes/classes) erweitert werden. D.h. das SQL erweitern und das Rückgabearray füllen
Ja, gute Idee..... Folgenden Code als "user_classes\overloads\product\pt_features_product.inc.php" speichern PHP: <?php/* Copyright (c) 2012 Avenger, entwicklung@powertemplate.de Overload class for method "buildDataArray" of "product" class. Store as "user_classes\overloads\product\pt_features_product.inc.php"*/class pt_features_product extends pt_features_product_parent{ function buildDataArray(&$array,$image='thumbnail') { $template_data=parent::buildDataArray($array,$image); $products_id=$array['products_id']; if ($products_id) { $features = array(); $sql=' SELECT DISTINCT fd.feature_name, fvd.feature_value_text FROM feature_description fd INNER JOIN feature_value fv ON ( fd.feature_id = fv.feature_id ) INNER JOIN feature_value_description fvd ON ( fv.feature_value_id = fvd.feature_value_id ) INNER JOIN products_feature_value pfv ON ( fvd.feature_value_id = pfv.feature_value_id ) LEFT JOIN categories_filter cf ON ( cf.feature_id = fd.feature_id ) WHERE pfv.products_id ='.(int)$products_id.' ORDER BY cf.sort_order'; $res=xtc_db_query($sql); if (xtc_db_num_rows($res)>0) { $features=array(); while(($products_features = xtc_db_fetch_array($res) )) { $feature_name=$products_features['feature_name']; if ($features[$feature_name]) { $features[$feature_name].=', '; } $features[$feature_name].=$products_features['feature_value_text']; } $template_data['PRODUCTS_FEATURES']=$features; } } return $template_data; }}?> Der Template-Teil sollte dann so aussehen: PHP: {if $module_data.PRODUCTS_FEATURES|count>0}<dl class="products_features"> {foreach from=$module_data.PRODUCTS_FEATURES item=feature_value key=feature_name} <dt class="feature_name">{$feature_name}:</dt> <dd class="feature_value">{$feature_value}</dd> {/foreach}</dl>{/if}
Hallo Avenger, wie beschrieben eingebaut erscheint diese Meldung: Parse error: syntax error, unexpected T_STRING, expecting '{' in /www/htdocs/XXXXXXX/_testshop/system/core/ClassOverloadRegistry.inc.php(131) : eval()'d code on line 1 Fatal error: Class 'pt_features_product_parent' not found in /www/htdocs/XXXXXXX/_testshop/user_classes/overloads/product/pt_features_product .inc.php on line 9