Wie kann man in der Datei "../includes/classes/product.php" die Funktionen: "getAlsoPurchased()" und "getCrossSells()" überladen? Das Ziel ist es diese Ansichten mit einer Zeile mit "products_model", also Art-Nr.: zu erweitern. Um Listenansichten (List und Kachel) zu überladen benutze ich den folgenden Overload: ../GXUserComponents/overloads/product/cp_art_nr_product.inc.php" mit dem Inhalt: PHP: <?phpclass cp_art_nr_product extends cp_art_nr_product_parent{ function buildDataArray(&$array, $image = 'thumbnail') { global $xtPrice, $main; $t_data_array=parent::buildDataArray($array, $image); //Additional info in $t_data_array $t_data_array['PRODUCTS_MODEL']=$array['products_model']; //Additional info in $t_data_array return $t_data_array; }} Zur zeit um die beiden Funktionen zu überladen, benutze ich die komplette Funktionen erweitert mit dem gewünschten Feld und das funktioniert auch: PHP: function getAlsoPurchased() { // BOF YOOCHOOSE if(defined('YOOCHOOSE_ACTIVE') && YOOCHOOSE_ACTIVE) { require_once (DIR_WS_INCLUDES . 'yoochoose/recommendations.php'); require_once (DIR_WS_INCLUDES . 'yoochoose/functions.php'); return recommendData(getAlsoPurchasedStrategy(), $this->pID, MAX_DISPLAY_ALSO_PURCHASED); } // EOF YOOCHOOSE global $xtPrice; $module_content = array(); $t_query=parent::getAlsoPurchased(); $fsk_lock = ""; if($_SESSION['customers_status']['customers_fsk18_display'] == '0') { $fsk_lock = ' and p.products_fsk18!=1'; } $group_check = ""; if(GROUP_CHECK == 'true') { $group_check = " and p.group_permission_" . $_SESSION['customers_status']['customers_status_id'] . "=1 "; } // BOF GM_MOD: $t_query = "SELECT p.products_fsk18, p.products_id, p.products_price, p.products_tax_class_id, p.products_image, p.products_model, pd.gm_alt_text, pd.products_name, pd.products_meta_description, p.products_vpe, p.products_vpe_status, p.products_vpe_value, pd.products_short_description FROM " . TABLE_ORDERS_PRODUCTS . " opa, " . TABLE_ORDERS_PRODUCTS . " opb, " . TABLE_ORDERS . " o, " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd WHERE opa.products_id = '" . $this->pID . "' AND opa.orders_id = opb.orders_id AND opb.products_id != '" . $this->pID . "' AND opb.products_id = p.products_id AND opb.orders_id = o.orders_id AND p.products_status = '1' AND pd.language_id = '" . (int)$_SESSION['languages_id'] . "' AND opb.products_id = pd.products_id AND o.date_purchased > DATE_SUB(NOW(),INTERVAL " . MAX_DISPLAY_ALSO_PURCHASED_DAYS . " DAY) " . $group_check . " " . $fsk_lock . " GROUP BY p.products_id ORDER BY o.date_purchased desc LIMIT " . MAX_DISPLAY_ALSO_PURCHASED; $t_query = xtc_db_query($t_query); while($orders = xtc_db_fetch_array($t_query, true)) { $module_content[] = $this->buildDataArray($orders); } return $module_content; } da soll nur "p.products_model" zusätzlich abgerufen werden. Aber das ist doch nicht Sinn der Überladung. Hat jemand eine Idee, wie ich diese beide Funktionen überladen kann?
Welche html-Datei muss ich bearbeiten um in der Artikelansicht bei "Kunden, welche diesen Artikel bestellten, haben auch folgende Artikel gekauft:" zusätzliche Daten (z.B. EAN) einzufügen. Die products.php habe ich bereits geändert. Danke
Um einen Feld wie "products_ean" in der Listenansichten, "default", "tiled", "also purchased", "UnsereEmpfehlung", "new" und "special" anzeigen zu lassen, müssen diese Informationen zuerst mal per Overload für die HTML-Dateien zur Verfügung stehen. Das geht wie folgt: PHP: <?phpclass cp_art_nr_product extends cp_art_nr_product_parent{ function buildDataArray(&$array, $image = 'thumbnail') { global $xtPrice, $main; $t_data_array=parent::buildDataArray($array, $image); //Additional info in $t_data_array $t_data_array['PRODUCTS_MODEL']=$array['products_model']; //Additional info in $t_data_array return $t_data_array; } function getAlsoPurchased() { // BOF YOOCHOOSE if(defined('YOOCHOOSE_ACTIVE') && YOOCHOOSE_ACTIVE) { require_once (DIR_WS_INCLUDES . 'yoochoose/recommendations.php'); require_once (DIR_WS_INCLUDES . 'yoochoose/functions.php'); return recommendData(getAlsoPurchasedStrategy(), $this->pID, MAX_DISPLAY_ALSO_PURCHASED); } // EOF YOOCHOOSE global $xtPrice; $module_content = array(); $t_query=parent::getAlsoPurchased(); $fsk_lock = ""; if($_SESSION['customers_status']['customers_fsk18_display'] == '0') { $fsk_lock = ' and p.products_fsk18!=1'; } $group_check = ""; if(GROUP_CHECK == 'true') { $group_check = " and p.group_permission_" . $_SESSION['customers_status']['customers_status_id'] . "=1 "; } // BOF GM_MOD: $t_query = "SELECT p.products_fsk18, p.products_id, p.products_price, p.products_tax_class_id, p.products_image, p.products_model, p.products_ean, pd.gm_alt_text, pd.products_name, pd.products_meta_description, p.products_vpe, p.products_vpe_status, p.products_vpe_value, pd.products_short_description FROM " . TABLE_ORDERS_PRODUCTS . " opa, " . TABLE_ORDERS_PRODUCTS . " opb, " . TABLE_ORDERS . " o, " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd WHERE opa.products_id = '" . $this->pID . "' AND opa.orders_id = opb.orders_id AND opb.products_id != '" . $this->pID . "' AND opb.products_id = p.products_id AND opb.orders_id = o.orders_id AND p.products_status = '1' AND pd.language_id = '" . (int)$_SESSION['languages_id'] . "' AND opb.products_id = pd.products_id AND o.date_purchased > DATE_SUB(NOW(),INTERVAL " . MAX_DISPLAY_ALSO_PURCHASED_DAYS . " DAY) " . $group_check . " " . $fsk_lock . " GROUP BY p.products_id ORDER BY o.date_purchased desc LIMIT " . MAX_DISPLAY_ALSO_PURCHASED; $t_query = xtc_db_query($t_query); while($orders = xtc_db_fetch_array($t_query, true)) { $module_content[] = $this->buildDataArray($orders); } return $module_content; } /** * * * Get Cross sells * * */ function getCrossSells() { global $xtPrice; $t_query = "SELECT products_xsell_grp_name_id FROM " . TABLE_PRODUCTS_XSELL . " WHERE products_id = '" . $this->pID . "' GROUP BY products_xsell_grp_name_id"; $cs_groups = xtc_db_query($t_query); $cross_sell_data = array(); if(xtc_db_num_rows($cs_groups, true) > 0) { while($cross_sells = xtc_db_fetch_array($cs_groups, true)) { $fsk_lock = ''; if($_SESSION['customers_status']['customers_fsk18_display'] == '0') { $fsk_lock = ' AND p.products_fsk18!=1'; } $group_check = ""; if(GROUP_CHECK == 'true') { $group_check = " AND p.group_permission_" . $_SESSION['customers_status']['customers_status_id'] . "=1 "; } // BOF GM_MOD: $cross_query = " SELECT p.products_fsk18, p.products_tax_class_id, p.products_id, p.products_image, p.products_model, p.products_ean, pd.products_name, pd.products_short_description, pd.products_meta_description, p.products_fsk18, p.products_price, pd.gm_alt_text, p.products_vpe, p.products_vpe_status, p.products_vpe_value, xp.sort_order FROM " . TABLE_PRODUCTS_XSELL . " xp, " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd WHERE xp.products_id = '" . $this->pID . "' AND xp.xsell_id = p.products_id " . $fsk_lock . $group_check . " AND p.products_id = pd.products_id AND xp.products_xsell_grp_name_id='" . $cross_sells['products_xsell_grp_name_id'] . "' AND pd.language_id = '" . (int)$_SESSION['languages_id'] . "' AND p.products_status = '1' ORDER BY xp.sort_order ASC"; $cross_query = xtDBquery($cross_query); if(xtc_db_num_rows($cross_query, true) > 0) { $cross_sell_data[$cross_sells['products_xsell_grp_name_id']] = array('GROUP' => xtc_get_cross_sell_name($cross_sells['products_xsell_grp_name_id']), 'PRODUCTS' => array()); } while($xsell = xtc_db_fetch_array($cross_query, true)) { $cross_sell_data[$cross_sells['products_xsell_grp_name_id']]['PRODUCTS'][] = $this->buildDataArray($xsell); } } return $cross_sell_data; } } /** * * get reverse cross sells * */ function getReverseCrossSells() { global $xtPrice; $fsk_lock = ''; if($_SESSION['customers_status']['customers_fsk18_display'] == '0') { $fsk_lock = ' and p.products_fsk18!=1'; } $group_check = ""; if(GROUP_CHECK == 'true') { $group_check = " and p.group_permission_" . $_SESSION['customers_status']['customers_status_id'] . "=1 "; } // BOF GM_MOD: $t_query = "SELECT p.products_fsk18, p.products_tax_class_id, p.products_id, p.products_image, p.products_model, pd.products_name, pd.products_short_description, pd.products_meta_description, p.products_fsk18, p.products_price, pd.gm_alt_text, p.products_vpe, p.products_vpe_status, p.products_vpe_value, xp.sort_order FROM " . TABLE_PRODUCTS_XSELL . " xp, " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd WHERE xp.xsell_id = '" . $this->pID . "' AND xp.products_id = p.products_id " . $fsk_lock . $group_check . " AND p.products_id = pd.products_id AND pd.language_id = '" . (int)$_SESSION['languages_id'] . "' AND p.products_status = '1' ORDER BY xp.sort_order ASC"; $cross_query = xtc_db_query($t_query); while($xsell = xtc_db_fetch_array($cross_query, true)) { $cross_sell_data[] = $this->buildDataArray($xsell); } return $cross_sell_data; }} ?> Allerdings, wie oben erwähnt, suche ich eine bessere Methode um die Funktionen "getAlsoPurchased()", "getCrossSells()" und "get ReverseCrossSells()" zu überladen. Obwohl, ist es manchmal nicht anderes möglich. Man muss die ganze Funktion kopieren, erweitern und als Overload benutzen. Um die Listenansicht beim Aufruf einer Kategorie zu erweitern (Vorausgesetzt man setzt den Swiper nicht ein), reicht es, wenn man die HTML-Datei "/SHOP-ORDNER/templates/Honeygrid/snippets/product_listing/product.html" kopiert, als "product-USERMOD.html" speichert und dann an den gewünschten Stellen erweitert. HTML: <div class="title"> <a href="{$p_url}"{if $p_meta} title="{$p_meta}"{/if} class="product-url"> {$p_headline} <!-- BOF EAN-Feld --> <span class="products_model hidden-grid" style="font-size:12px; color:grey;">{$txt.text_products_model}{$module_data.PRODUCTS_MODEL}</span> <!-- EOF --> </a> </div> Der Code ist nur für den Listenansicht "default". Hier muss der Tag "span" die class "hidden-grid" bekommen, damit es nur in "Default-Modus" angezeigt wird und nicht in dem "Tiled-Modus" Für den "Tiled-Modus" (In der selben Datei, weiter unten) sieht der Code dann so aus: HTML: <div class="price"> <span class="current-price-container"{if $p_meta} title="{$p_meta}"{/if}> {$p_price}{if $p_vpe}<br /><span class="gm_products_vpe products-vpe">{$p_vpe}</span>{/if} </span> <!-- BOF EAN-Feld --> <span class="gm_products_vpe products-vpe hidden-list"> {$txt.text_products_model} {$module_data.PRODUCTS_MODEL} </span> <!-- EOF --> </div> Hier bekommt der Tag "span" die class "hidden-list", damit es in der Listenansicht "default" nicht sichtbar wird. Nun, möchtet man die Listenansichten "UnsereEmpfehlung", "AlsoPurchased" und "CrossSells" auch erweitern, dann muss man die HTML-Datei "/SHOP-ORDNER/templates/Honeygrid/snippets/product_listing/product_grid_only.html" kopieren, als "product_grid_only-USERMOD.html" speichern und folgendermaßen erweitern: HTML: <div class="price"> <span class="current-price-container"{if $p_meta} title="{$p_meta}"{/if}> {$p_price}{if $p_vpe}<br /><span class="gm_products_vpe products-vpe">{$p_vpe}</span>{/if} </span> <!-- BOF Erweiterung--> <span class="gm_products_vpe products-vpe hidden-list"> {$txt.text_products_model} {$PRODUCT.PRODUCTS_MODEL} </span> <!-- EOF --> </div> Hier wird es nur einmal eingetragen. Startseite: Cross Sells: Also Purchased: Hat man in der Template-Einstellungen "Swiper" auf On: dann muss man auch diese HTML-Datei erweitern: "/SHOP-ORDNER/templates/Honeygrid/snippets/product_listing/product_listing_swiper.html". Kopieren, als "product_listing_swiper-USERMOD.html" speichern und erweitern: HTML: {foreach item=PRODUCT from=$content_data.SWIPER_DATA.products} {product_images product_id=$PRODUCT.PRODUCTS_ID p_name=$PRODUCT.PRODUCTS_NAME p_image=$PRODUCT.PRODUCTS_IMAGE out=p_imgs } {product_ribbons showManufacturerImages=$PRODUCT.showManufacturerImages showProductRibbons=$PRODUCT.showProductRibbons product_id=$PRODUCT.PRODUCTS_ID out=ribbons} {include file="get_usermod:{$content_data.SWIPER_DATA.productTemplate}" is_swiper="true" showRating=$content_data.SWIPER_DATA.showRating ribbons=$ribbons p_image=$PRODUCT.PRODUCTS_IMAGE p_imgs=$p_imgs p_url=$PRODUCT.PRODUCTS_LINK p_img_title=$PRODUCT.PRODUCTS_IMAGE_ALT p_img_alt=$PRODUCT.PRODUCTS_IMAGE_ALT p_meta=$PRODUCT.SHORTENED_META_DESCRIPTION p_name_full=$PRODUCT.PRODUCTS_NAME p_headline=$PRODUCT.HEADLINE p_short_desc=$PRODUCT.SHORTENED_PRODUCTS_DESCRIPTION p_price=$PRODUCT.PRODUCTS_PRICE p_vpe=$PRODUCT.PRODUCTS_VPE p_model=$PRODUCT.PRODUCTS_MODEL <!-- Hier die Erweiterung --> p_shipping_name=$PRODUCT.DELIVERY data_index=$PRODUCT.INDEX p_id=$PRODUCT.PRODUCTS_ID } {/foreach} Auch die Sprachdatei muss erweitert werden. Dazu eine PHP-Datei in der folgende Ordner anlegen: "/SHOP-ORDNER/lang/german/user_sections/product/product_listing.lang.inc.php". Man kann auch den Ordner "product" ganz weg lassen und die Datei "product_listing.lang.inc.php" direkt in dem Ordner "user_sections" speichern. Ich mag es so, da ich die Dateien schneller zu ordnen kann. PHP: <?php$t_language_text_section_content_array = array( 'text_products_model' => 'Art-Nr.: '); Das war es auch. Viel Erfolg.
Also, die products.php habe ich überladen, aber egal wo ihc etwas in der honeygrid/ snippets/ product_listing/ product.html oder product_grid-only.html eintrage, auf den Seiten products_new.php und specials.php und auch uf der Startseite, wenn keine swiper aktiviert sind, kommt keine Anzeige.
Denk daran, dass in der Datei product.html heißt die Erweiterung: {$module_data.PRODUCTS_MODEL} in der Datei product_grid_only.html heißt es aber: {$PRODUCT.PRODUCTS_MODEL}
Hallo, ich habe den gleichen Wunsch, alles gemacht wie beschrieben, bei mir ist jetzt auch die Artikel-Nr. zu sehen. Wie bekomme ich zudem unter dem Artikel-Namen die Kurzbeschreibung hin, die in der Listenansicht zu sehen ist. Gibt es außerdem die Möglichkeit, unter dem Preis einen Grundpreis darzustellen? Wenn ja, wie? Vielen Dank im Voraus. MfG Höhn
Ich würde nicht die Kurzbeschreibung in die Box setzten. Entweder muss diese nach x Zeichen abgeschnitten werden, oder die Boxen werden unterschiedlich hoch, wodurch unschöne Lücken in der Darstellung auftreten, oder der Text schiebt scih über die Preisangabe. Der Grundpreis wird in meinem Testshop angezeigt. Ich schaue da nachher was ich da gemacht habe.
Die Idee 2 unterschiedlich aufgebaute Darstellungen zu Programmieren, ist auf die Analyse des Verhaltens der Besucher auf Websites basiert. Die Besucher einer Website haben unterschiedliche Vorgehensweisen und Interessen, wenn sie die Produkte einer Kategorie durcharbeiten. Ein Besucher möchtet eine kurze Produktbeschreibung, bevor er die Ware in den Warenkorb legt. Der andere möchtet erst das gewünschte Produkt finden - OHNE MIT VIEL INFO BOMBARDIERT ZU WERDEN - bevor er sich für die Details interessiert. Die Kachelansicht ist für diese Klasse von Besuchern konzipiert. Packt man viele Infos von Listenansicht auf Kachelansicht, dann geht der Sinn der Kachelansicht verloren. Daher würde ich dich davon abraten, die kurze Beschreibung in der Kachelansicht verfügbar zu machen.
Vielen Dank schon mal für eure Meinungen, allerdings habe ich nach meinem Shop-Update von 3.0.0.0 auf 3.2.0.1 eine Fehlermeldung: Fatal error: Class 'cp_art_nr_product_parent' not found in /homepages/11/d451176088/htdocs/plotterfolie/GXUserComponents/user_classes/overloads/product/cp_art_nr_product.inc.php on line 4 FATAL ERROR(1): "Class 'cp_art_nr_product_parent' not found" Wo liegt genau mein Fehler?
Die Ordnerangabe stimmt nicht. Die Datei "cp_art_nr_product.inc.php" muss in dem Ordner "GXUserComponents/overloads/product" liegen. Evtl. irgendwas bei der Update falsch gelaufen.
Hallo Cyrus, muss das Thema noch mal hochholen, vielleicht kannst du mir helfen. Möchte eigentlich nur getCrossSells und getReverseCrossSells mit den products_tax_info überladen, da ich bei diesen Button in den Warenkorb habe. Momentan habe ich das einfach über Html eingebaut und das Problem ist, das bei Händlern die Netto-Preise sehen, dann incl.MWST steht. Beim Überladen der product.php bekommen ich nur SLQ-Error 256? Nachtrag: Erledigt, habs hinbekommen