Ja, aber es gibt zwei Einstellungen, einen Artikel pro Zeile "article-list rows" oder gekachelt "article-list cols"
Ich habe leider keine Zeit das zu machen. Aber die betroffene Dateien sind: 1: EyeCandy/objects/product_box_list.html 2: EyeCandy/module/product_listing/product_listing_v1.html Wenn du die Struktur studierst, dann wirst du schon wissen wie es geht und wie du deine Änderungen positionieren willst. Die geänderte Dateien als: 1: product_box_list-USERMOD.html 2: product_listing_v1-USERMOD.html speichern. Dann ist es Updatessicher und die ORIGINALE Bleiben erhalten
Das reicht nicht. Die Daten müssen erst in einer php-Datei abgerufen werden, damit sie in der html ausgegeben werden können. Das habe ich bisher nicht hinbekommen.
Da hast du bestimmt recht. Aber welche PHP-Datei sollte es sein? Diese datei liegt bestimmt in dem Ordner /system/classes.
Vermutlich in der system/ classes/ listing/ und dann eine der ProductListingContent... Ich bin hier noch nicht wirklich zum Testen gekommen, hatte das bisher nur in der 2.0 probiert.
So ich habe ich jetzt mal einiges getestet. In der Datei "ProductListingContentControl.inc.php" im Verzeichnis system/classes/listing/ habe ich die Zeile p.products_uvp (so lautet mein Extrafeld in der DB Tabelle products) jeweils wie folgt eingefügt: Zeile: 632 PHP: .... //build query $t_select = "SELECT distinct p.products_id, p.products_price, p.products_model, p.products_uvp, p.products_quantity, p.products_shippingtime, p.products_fsk18,.... und hier: Zeile: 1195 PHP: .... $this->sql_query = "SELECT DISTINCT p.products_fsk18, p.products_shippingtime, p.products_model, p.products_uvp, p.products_ean, pd.products_name, m.manufacturers_name, p.products_quantity, p.products_image,.... und hier: Zeile: 1282 PHP: .... $this->sql_query = "SELECT DISTINCT p.products_fsk18, p.products_shippingtime, p.products_model, p.products_uvp, p.products_ean, pd.products_name, m.manufacturers_name, p.products_quantity, p.products_image,.... und hier: Zeile: 1408 PHP: .... $this->sql_query = "SELECT DISTINCT p.products_fsk18, p.products_shippingtime, p.products_model, p.products_uvp, p.products_ean, pd.products_name, m.manufacturers_name, p.products_quantity, p.products_image,.... Dann habe ich die Datei "product_listing_v1-USERMOD.html im Ordner templates/EyeCandy/module/product_listing" wie folgt ergänzt: Zeile: 153 PHP: ... <div class="article-list-item-right"> <div class="article-list-item-price"><!-- BOF products_extrafield --> <br/>{$txt.text_products_uvp} <span class="products_uvp">{$module_data.PRODUCTS_UVP}</span><br/><!-- EOF products_extrafield --> <span class="price"><a href="{$module_data.PRODUCTS_LINK}"> <span class="gm_price" id="gm_attr_calc_price_{$module_data.PRODUCTS_ID}"> {$module_data.PRODUCTS_PRICE} {if $module_data.PRODUCTS_VPE} <br /><span class="gm_products_vpe">{$module_data.PRODUCTS_VPE}</span><br /> {/if} </span> </a></span>{if !$module_data.PRODUCTS_VPE}<br />{/if} {if ($module_data.PRODUCTS_TAX_INFO neq '' || $module_data.PRODUCTS_SHIPPING_LINK neq '') && $module_data.GM_PRODUCTS_QTY} <span class="tax-shipping-text">{$module_data.PRODUCTS_TAX_INFO}{$module_data.PRODUCTS_SHIPPING_LINK}</span><br /> {/if} </div> </div>.... Es sieht auch so aus wie es soll, doch leider zieht er den Wert nicht aus der Tabelle Wenn ich die Variable änder in eine x beliebige aus der DB die nicht "extra" angelegt wurde, wie z.B. {$module_data.PRODUCTS_WEIGHT} wird der Wert angezeigt. Ich weiß nicht weiter Vieleicht hat ja einer von euch eine Idee. Gruß Michael (Bitte keine Fragen warum ich dieses Feld brauche )
@Mick-D Um Extra-Felder in Products_Listing anzeigen zu lassen, muss man an 5 Dateien Änderungen ausüben. Datei 1: /shop-ordner/includes/product.php. Suche nach: PHP: $t_data_array = array('PRODUCTS_NAME' => htmlspecialchars_wrapper($array['products_name']), 'COUNT' => $array['ID'], 'PRODUCTS_ID' => $array['products_id'], 'PRODUCTS_VPE' => $this->getVPEtext($array, $products_price['plain']), 'PRODUCTS_IMAGE' => $this->productImage($array['products_image'], $image), 'PRODUCTS_IMAGE_W' => $array['products_image_w'], 'PRODUCTS_IMAGE_H' => $array['products_image_h'], 'PRODUCTS_IMAGE_WIDTH' => PRODUCT_IMAGE_THUMBNAIL_WIDTH, 'PRODUCTS_IMAGE_PADDING' => ((PRODUCT_IMAGE_THUMBNAIL_HEIGHT + 8) - $array['products_image_h']) / 2, 'PRODUCTS_IMAGE_ALT' => $array['gm_alt_text'], und füge danach: in meinem Beispiel "PRODUCTS_INHALT" PHP: 'PRODUCTS_INHALT' => $array['products_inhalt'], Diese Datei, GLAUBE ICH, kann leider nicht Updatessicher geändert werden. Datei 2: /shop-ordner/system/classes/listing/ProductListingContentControl.inc.php. Suche nach: PHP: // sort by price if(strpos($t_orderby, 'p.products_price') !== false) { if($this->show_price_tax != 0) { $t_select_part = ", ROUND(IF(s.status = '1' AND p.products_id = s.products_id, s.specials_new_products_price, p.products_price) * (IF(p.products_tax_class_id = 0,0,tax_rate)/100+1), 2) AS final_price "; $t_from_part = "LEFT JOIN " . TABLE_TAX_RATES . " AS tr ON (p.products_tax_class_id = tr.tax_class_id OR p.products_tax_class_id = 0) LEFT JOIN " . TABLE_ZONES_TO_GEO_ZONES . " AS gz ON (tr.tax_zone_id = gz.geo_zone_id AND gz.zone_country_id = '" . $this->customer_country_id . "') "; $t_where_part = " AND (gz.zone_id = '0' OR gz.zone_id = '" . $this->customer_zone_id . "') "; } else { $t_select_part = ", ROUND(IF(s.status = '1' AND p.products_id = s.products_id, s.specials_new_products_price, p.products_price), 2) AS final_price "; } $t_sorting = str_replace('p.products_price', 'final_price', $t_sorting); } $this->sql_query = "SELECT DISTINCT p.products_fsk18, p.products_shippingtime, p.products_model, und füge danach: PHP: p.products_inhalt, Diese Datei kann man evtl. Updatessicher ändern. Aber habe ich leider momentan keine Zeit um das zu testen. Datei 3: ../templates/EyeCandy/module/product_listing/product_listing_v1.html. Suche nach der Stelle wo du es platzieren möchtest. Bei mir wie folgt: HTML: <div class="article-list-item-main"> <h2> <a href="{$module_data.PRODUCTS_LINK}" class="product_link"{if $module_data.PRODUCTS_META_DESCRIPTION != ''} title="{$module_data.PRODUCTS_META_DESCRIPTION|truncate:80:"..."|replace:'"':'"'}"{/if}>{$module_data.PRODUCTS_NAME}</a> </h2> <p>{$module_data.PRODUCTS_SHORT_DESCRIPTION}<br /> Und füge folgendes ein: HTML: <!-- BOF products_extrafield --> {if $module_data.PRODUCTS_INHALT || $module_data.SHOW_PRODUCTS_INHALT} {$txt.text_products_inhalt} {$module_data.PRODUCTS_INHALT} {/if} <!-- EOF products_extrafield --> Diese datei kann Updatessicher unter product_listing_v1-USERMOD.html gespeichert werden. Datei 4: ../lang/english/sections/_samples/product_listing.lang.inc.php kopieren und in Ordner sections, also eine verzeichnis-Ebene höher speichern. Dann in der Datei folgendes suchen: PHP: $t_language_text_section_content_array = array( 'heading_search_result' => 'Your search results', und den gewünschten Text wie folgt einfügen: PHP: // BOF Producst-Extrafield'text_products_inhalt' => 'Content:',// EOF Products-Extrafield Diese datei ist Updatessicher Datei 5: Jetzt für die deutsche Sprache dasselbe wiederholen: ../lang/german/sections/_samples/product_listing.lang.inc.php kopieren und eine Verzeichnis-Ebene höher speichern. Dann in der Datei folgendes suchen: PHP: $t_language_text_section_content_array = array( 'heading_search_result' => 'Ihr Suchergebnis', und folgendes einfügen: PHP: // BOF Producst-Extrafield'text_products_inhalt' => 'Inhalt:',// EOF Products-Extrafield Diese datei ist Updatessicher Es kann sein, dass du im Kategorie-Einstellung der Produkte, wo du diesen Feld einfügen willst, die "Vorlage zu Artikelübersicht" auch einstellen muss. Viel Spass
Die Datei 2 kann habe ich wie folgt Updatessicher gemacht: 1:in ordner ../user_classes/overloads einen Ordner mit folgendem namen erstellen: "ProductListingContentControl" Die genaue schreibweise ist WICHTIG. 2:eine PHP-Datei mit folgendem Inhalt erstellen und und diesem Ordner speichern. PHP: <?php class extrafield_ProductListingContentControl extends extrafield_ProductListingContentControl_parent { public function extend_proceed($p_action) { $t_uninitialized_array = $this->get_uninitialized_variables(array( 'current_category_id', 'customer_country_id', 'customer_zone_id', 'customers_fsk18_display', 'customers_status_id', 'languages_id', 'show_price_tax', )); if(empty($t_uninitialized_array)) { //fsk18 lock $t_fsk_lock = ''; if($this->customers_fsk18_display == '0') { $t_fsk_lock = ' AND p.products_fsk18 != 1 '; } $t_select_part = ''; $t_from_part = ''; $t_where_part = ''; // sorting query $t_sorting_query = xtc_db_query("SELECT products_sorting, products_sorting2 FROM " . TABLE_CATEGORIES . " WHERE categories_id = '" . $this->current_category_id . "'"); $t_sorting_data_array = xtc_db_fetch_array($t_sorting_query); if(!$t_sorting_data_array['products_sorting']) { $t_sorting_data_array['products_sorting'] = 'pd.products_name'; } $t_sorting = ' ORDER BY ' . $t_sorting_data_array['products_sorting'] . ' ' . $t_sorting_data_array['products_sorting2'] . ' '; // We show them all if(GROUP_CHECK == 'true') { $t_group_check = " AND p.group_permission_" . $this->customers_status_id . " = 1 "; } // sorting if(isset($this->listing_sort)) { $coo_listing_manager = MainFactory::create_object('ListingManager'); $t_orderby = $coo_listing_manager->get_sql_sort_part($this->listing_sort); if($t_orderby != '') { $t_sorting = $t_orderby; } } // sort by price if(strpos($t_orderby, 'p.products_price') !== false) { if($this->show_price_tax != 0) { $t_select_part = ", ROUND(IF(s.status = '1' AND p.products_id = s.products_id, s.specials_new_products_price, p.products_price) * (IF(p.products_tax_class_id = 0,0,tax_rate)/100+1), 2) AS final_price "; $t_from_part = "LEFT JOIN " . TABLE_TAX_RATES . " AS tr ON (p.products_tax_class_id = tr.tax_class_id OR p.products_tax_class_id = 0) LEFT JOIN " . TABLE_ZONES_TO_GEO_ZONES . " AS gz ON (tr.tax_zone_id = gz.geo_zone_id AND gz.zone_country_id = '" . $this->customer_country_id . "') "; $t_where_part = " AND (gz.zone_id = '0' OR gz.zone_id = '" . $this->customer_zone_id . "') "; } else { $t_select_part = ", ROUND(IF(s.status = '1' AND p.products_id = s.products_id, s.specials_new_products_price, p.products_price), 2) AS final_price "; } $t_sorting = str_replace('p.products_price', 'final_price', $t_sorting); } $this->sql_query = "SELECT DISTINCT p.products_fsk18, p.products_shippingtime, p.products_model, p.products_inhalt, p.products_ean, pd.products_name, m.manufacturers_name, p.products_quantity, p.products_image, p.products_image_w, p.products_image_h, p.products_weight, p.gm_show_weight, pd.products_short_description, pd.products_description, pd.gm_alt_text, pd.products_meta_description, p.products_id, p.manufacturers_id, p.products_price, p.products_vpe, p.products_vpe_status, p.products_vpe_value, p.products_discount_allowed, p.products_tax_class_id " . $t_select_part . " FROM " . TABLE_PRODUCTS . " p LEFT JOIN " . TABLE_PRODUCTS_DESCRIPTION . " AS pd ON (pd.products_id = p.products_id) LEFT JOIN " . TABLE_PRODUCTS_TO_CATEGORIES . " AS ptc ON (ptc.products_id = p.products_id) LEFT JOIN " . TABLE_MANUFACTURERS . " AS m ON (m.manufacturers_id = p.manufacturers_id) LEFT JOIN " . TABLE_SPECIALS . " AS s ON (s.products_id = p.products_id) " . $t_from_part . " WHERE p.products_status = 1 AND pd.language_id = '" . $this->languages_id . "' AND ptc.categories_id = '" . $this->current_category_id . "' " . $t_where_part . " " . $t_group_check . " " . $t_fsk_lock . " " . $t_sorting; } else { trigger_error("Variable(s) " . implode(', ', $t_uninitialized_array) . " do(es) not exist in class " . get_class($this) . " or is/are null", E_USER_ERROR); } } } ?> Diese Datei als "extrafield_productListingContentControl.inc.php" speichern. Jetzt musste es funktionieren. Ich habe es versucht diese Datei kurzer zu machen. Es funktioniert zwar, aber die Sortierung der Artikel stimmt nicht mehr??
Wenn ich so was lese, bekomme ich immer die Krise,,,, Im Jahre 3 nach Erfindung des Klass-Overloadings in Gambio kann man das wesentlich besser, weil (größtenteils) updatesicher machen....
Hallo Avenger, laut die Liste von Gambio https://tracker.gambio-server.net/projects/gxdoc/wiki/Dateien_die_updatesicher_gemacht_werden_k%C3%B6nnen die Dateien in includes/classes sind nicht überladbar. Oder sehe ich das falsch? Und hier geht es nur um eine Datei die nicht überladbar ist: includes/classes/product.php. Sonst die andere 4 Dateien sind ja Updatessicher. Vieleicht hast du ja eine Lösung für diese Datei auch. Wenn ja, dann hier damit.
Hallo Cyrus, die Datei includes/ classes/ breadcrumb kann man überladen, dann sollte dass mit der product.php eigentlich auch gehen.
Hallo Barbara, also dies hier ist eine Liste von gambio: Dateien die updatesicher gemacht werden können Klassen in folgenden Verzeichnissen (inkl. Unterverzeichnissen) können überladen werden: DIR_FS_CATALOG . 'admin/includes/classes', DIR_FS_CATALOG . 'admin/gm/classes', DIR_FS_CATALOG . 'gm/classes', DIR_FS_CATALOG . 'includes/modules/order_total', DIR_FS_CATALOG . 'includes/modules/payment', DIR_FS_CATALOG . 'includes/modules/shipping', DIR_FS_CATALOG . 'gm/properties', * DIR_FS_CATALOG . 'templates/' . CURRENT_TEMPLATE . '/source/classes', * DIR_FS_CATALOG . 'system/controls', * DIR_FS_CATALOG . 'system/data', * DIR_FS_CATALOG . 'system/views', * DIR_FS_CATALOG . 'system/request_port', * DIR_FS_CATALOG . 'system/overloads', DIR_FS_CATALOG . 'system/extender', DIR_FS_CATALOG . 'system/classes', DIR_FS_CATALOG . 'system/core' Wonach sollte man noch suchen um auszufinden was überladbar ist und was nicht? Außerdem, ich sehe, dass Avenger selbst viele Dateien einfach ändert und meint, dass die nicht überladbar wären, aber die anderen zu kritisieren! Dann muss ich wohl sagen "TALK IS CHEAP".