bis zur Version 3.0 funktionierte auch noch der Upload von Dateien via xtc_try_upload ... In der 3.1.x gehen Bilddateien... nur leider keine pdf und txt Dateien mehr. Kommt immer folgende Fehlermeldung: "Sie haben ungültige Bilddateien ausgewählt. Bitte überprüfen Sie die Auswahl." Die admin/includes/gm/classes/GMProductUpload.php habe ich um application/pdf erweitert ... nur mag er das immer noch nicht Einer einen Gedanken?
Hallo Rene, sorry, es ist mir überhaupt nicht klar was du ganz genau machen möchtest? Kannst du bitte dein Vorhaben genauer beschreiben?
was Ich machen will? In der Artikel bearbeitung eine Datei über ein Extrafeld hochladen, welche kein Bild ist. Jedoch scheitere ich an der Prüfung ...
Hallo an alle mit diesem code PHP: <?php/*** Class AddEkpField** @category System* @package Product* @subpackage Storages* * @see ProductAddonValueStorage */class AddExtrafelderExtender extends AddExtrafelderExtender_parent{ /** * Maps ekp addon value to einkaufspreis field in products table * * @return array */ protected function _getExternalFieldsArray() { $externalFields = parent::_getExternalFieldsArray(); $externalFields['products_description']['fields']['products_short_description_2'] = 'ekp'; $externalFields['products']['fields']['einkaufspreis_1'] = 'ekp_1'; $externalFields['products']['fields']['einkaufspreis_2'] = 'ekp_2'; $externalFields['products']['fields']['einkaufspreis_3'] = 'ekp_3'; return $externalFields; }} eror Query error: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '= 677' at line 3 - Invalid query: SELECT `products_short_description_2` FROM `products_description` WHERE = 677 USER ERROR(256): "SQL Error"
Hallo, ich hab ein zusätzliches Datenbankfeld nach dem Beispieldaten von Cyrus angelegt. Im Backend bei den Artikeln klappt soweit alles. Wie jedoch erreiche ich die Ausgabe im Frontend des Shops auf der Start-, den Kategorieseiten sowie in der Artikelseite rechts in dem Sticky Container? Besten Dank schon mal im voraus Steffen
Hallo Wissende, habe jetzt seit einigen Tagen den Shop 3.4.1 zur Prüfung in der Mache. Verlockend diese Extra Felder. Konnte das auch nach den Anleitungen von Cyrus halbwegs umsetzen. Vielen Dank auch an dieser Stelle insbesondere an Cyrus. Jetzt zu meinem Problem bei dem ich mir die Karten lege. Muß zugeben durch das System von Gambio steige ich überhaupt nicht durch. Was habe ich getan: language Datein wie in der Anleitung beschrieben angepasst. Folgende Klassen im Ordner overloads überladen AdminCategoriesExtenderComponent/StoreExtrafelderExtender.inc.php AdminEditProductExtenderComponent/ExtrafelderFormExtender.inc.php categories/extrafield_categories.inc.php ProductAddonValueStorage/AddExtrafields.inc.php Soweit so gut. Ich kann im Backend das entsprechende Extrafeld sehen, bearbeiten, speichern. Also eigentlich alles chic. Jetzt zu dem Part wo ich absolut nicht durchsteige. Um jetzt dieses Extrafeld im Frontend sichtbar zu machen. Und ich würde das gern in der Detail-, Listen- und Kachelansicht machen sind ja zusätzliche Anpassungen nötig. Als ersten Schritt habe ich ProductInfoContentView überladen. ProductInfoContentView/extrafield_ProductInfoContentView.inc.php Das hatte zur Folge das ich schon mal in der DetailAnsicht eine Warnung bekam. Code: WARNING(2): "Declaration of extrafield_ProductInfoContentView::get_html($p_coo_product, $p_current_category_id = 0) should be compatible with ProductInfoContentView::get_html()" WARNING(2): "Missing argument 1 for extrafield_ProductInfoContentView::get_html(), called in /Applications/XAMPP/xamppfiles/htdocs/product_info.php on line 101 and defined" Weshalb ich mal denke ich mache hier einen grundlegenden Fehler.
Hallo fpo, kannst du bitte den Code für die Datei "extrafield_ProductInfoContenView.inc.php" hier als Code öffentlichen, damit man sieht wo der Fehler ist.
Hallo Cyrus, vielen Dank das Du dich meines Problems animmst. Hier der Code: Code: <?php class extrafield_ProductInfoContentView extends extrafield_ProductInfoContentView_parent { function get_html($p_coo_product, $p_current_category_id = 0) { // BOF products_extrafield $this->set_content_data('PRODUCTS_GEBINDE', $p_coo_product->data['products_gebinde']); // EOF products_extrafield return parent::get_html($p_coo_product, $p_current_category_id); } } ?> Viele Grüße Frank
PHP: <?php/* -------------------------------------------------------------- extrafields_ProductsInfoContentView.inc.php 2015.06.24 Cyrus Micronix TCT info@micronix.de Released under the GNU General Public License (Version 2) [http://www.gnu.org/licenses/gpl-2.0.html] based on: main.php Gambio OHG http://www.gambio.de Copyright (c) 2008 Gambio OHG Released under the GNU General Public License (Version 2) [http://www.gnu.org/licenses/gpl-2.0.html] -------------------------------------------------------------- based on: (c) 2000-2001 The Exchange Project (earlier name of osCommerce) (c) 2002-2003 osCommerce(Coding Standards); www.oscommerce.com (c) 2005 XT-Commerce - community made shopping http://www.xt-commerce.com ($Id: main.php 1286 2005-10-07 10:10:18Z mz $) Released under the GNU General Public License ---------------------------------------------------------------------------------------*/ class extrafield_ProductInfoContentView extends extrafield_ProductInfoContentView_parent { function _assignProductData() { $this->_assignExtrafields(); return parent::_assignProductData(); } // assign new fields to the products content view public function _assignExtrafields() { // BOF products_extrafield $this->set_content_data('PRODUCTS_GEBINDE', $p_coo_product->data['products_gebinde']); // EOF products_extrafield }}?>
Herzlichen Dank. Fehlermeldung ist weg. Darf ich Dich aber trotzdem noch belöffeln wie ich dieses Feld jetzt in die ensprechenden Anzeigen einbauen kann. Bis jetzt habe ich das so verstanden, das um dieses Feld jetzt beispielsweise in der Listenansicht zur Anzeige zu bringen folgende Änderung an der product-USERMOD.html nötig wären. Code: <!-- Extrafelder Start --> {if $PRODUCTS_GEBINDE} <div class="extra"> {$PRODUCTS_GEBINDE} </div> {/if} <!-- Extrafelder Ende --> Leider geht das so wie ich es ausgeführt habe nicht. Gruß Frank
Hallo, die Anzeige in den Artikeldetails habe ich mit folgender Änderung hinbekommen. Im Überladen der ProductInfoContentView folgende Zeile eingetragen: Code: $this->set_content_data('PRODUCTS_GEBINDE', $this->product->data['products_gebinde']); anstatt: Code: $this->set_content_data('PRODUCTS_GEBINDE', $p_coo_product->data['products_gebinde']); Entsprechendes template angepasst - spielt Jetzt stehe ich allerdings vor der nächsten Herausforderung. Dieses Feld soll auch in der Listen-/Kachelanzeige angezeigt werden. Bin leider noch ein blutiger Anfänger und durch die Versionsvielfalt und die damit zusammenhängenden Informationen hier im Forum etwas verwirrt. Nach meinem Verständnis sollte dies möglich sein durch Überladen zweier Klassen. ProductListingContentControl und ProductListingContentView. Berichtigt mich gern wenn ich etwas falsch interpretiere. In der Klasse ProductListingContentControl werden die Daten definiert/selektiert. Hier konnte ich durch Überladung zwar das Feld abrufen. Bekomme aber den Weg zum template nicht hin. Hier mal die entsprechende Überladung für ProductListingContentControl: Code: <?php class extrafield_ProductListingContentControl extends extrafield_ProductListingContentControl_parent { public function getSelectFields() { $select_fields = array('p.products_gebinde'); return $select_fields; } public function extend_proceed($p_action) { $t_sql = $this->sql_query; $select_fields = implode(",",$this->getSelectFields()); $t_sql = str_replace('FROM',', '.$select_fields.' FROM',$t_sql); $this->sql_query = $t_sql; parent::extend_proceed($p_action); } public function add_product_data(array &$p_products_array, array $p_product_array, product $p_coo_product) { // Hier stehen das Feld sowohl unter $p_coo_product als auch unter $p_product_array zur Verfügung // Aber was wäre zu tun damit die Daten auch in ProductListingContentView zur Verfügung stehen? // overload this method to add or manipulate data of the product array } } Jetzt würde ich denken das Feld wäre jetzt in der Klasse ProductListingContentView verfügbar und könnte dann mit einer entsprechenden Zuweisung dem Template zur Verfügung gestellt werden. Leider ist in dieser Klasse das Feld nicht verfügbar. Vielleicht irgendwelche Ansätze? Danke schonmal. Gruß Frank
Das was Du da machst ist Müll, da Du in den originalen Dateien bastelst. Beim Nächsten Update fliegt Dir die hälfte um die Ohren, bzw. musst Du das neu machen. Dafür hat man die overloads. Ich poste hier mal meine Dateien, da habe ich die Felder Model, Inhalt, size, Rest und Sonder eingefügt. Das musst Du bitte auf Deine Felder ändern Erstelle im Verzeichnis user_classes/ overloads/ den Ordner product und darin die Datei extrafeld_product.inc.php mit diesem Inhalt: PHP: <?phpclass extrafeld_product extends extrafeld_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']; $t_data_array['PRODUCTS_INHALT']=$array['products_inhalt']; $t_data_array['PRODUCTS_SIZE']=$array['products_size']; $t_data_array['PRODUCTS_REST']=$array['products_rest']; $t_data_array['PRODUCTS_SONDER']=$array['products_sonder']; //Additional info in $t_data_array return $t_data_array; // EOF GM_MOD }function getAlsoPurchased() { // BOF YOOCHOOSE if(defined('YOOCHOOSE_ACTIVE') && YOOCHOOSE_ACTIVE) { require_once (DIR_FS_CATALOG . 'includes/yoochoose/recommendations.php'); require_once (DIR_FS_CATALOG . '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_size, p.products_inhalt, p.products_sonder, p.products_rest, 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; } 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, pd.products_name, p.products_model, p.products_size, p.products_inhalt, p.products_sonder, p.products_rest, 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; } } 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, p.products_size, p.products_inhalt, p.products_sonder, p.products_rest, 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; } }?> Dann erstellst Du einen weiteren Ordner ProductListingContentControl mit einer Datei extrafeld_ProductListingContentControl.inc.php und dem Inhalt: PHP: <?phpclass extrafeld_ProductListingContentControl extends extrafeld_ProductListingContentControl_parent{ /* public function add_product_data(array &$p_products_array, array $p_product_array, product $p_coo_product) { array('PRODUCTS_INHALT' => $coo_product->data['p.products_inhalt']); array('PRODUCTS_SIZE' => $coo_product->data['p.products_size']); array('PRODUCTS_REST' => $coo_product->data['p.products_rest']); array('PRODUCTS_SONDER' => $coo_product->data['p.products_sonder']); }}{*/ public function getSelectFields() { $select_fields = array('p.products_inhalt', 'p.products_size', 'p.products_rest', 'p.products_sonder'); return $select_fields; }public function extend_proceed($p_action) { $t_sql = $this->sql_query; $select_fields = implode(",",$this->getSelectFields()); $t_sql = str_replace('FROM',','.$select_fields.' FROM',$t_sql); $this->sql_query = $t_sql; parent::extend_proceed($p_action); }} Dann kannst Du die Felder unter templates/ Honeygrid/ snippets/ product_listing/ product-USERMOD.html und templates/ Honeygrid/ snippets/ product_listing/ product_grid_only-USERMOD.html eintragen. Hier ist das auch noch einmal beschrieben: (Link nur für registrierte Nutzer sichtbar.)
Hallo Barbara, Vielleicht ist das nicht ganz klar rübergekommen da ich von Überladungen sprach. Vielleicht klingt Overloads besser. Ja, alle Änderungen sind im Ordner overloads als entsprechende Ordner mit entsprechenden Files angelegt. Hier wird keine Klassendefinition im Original verändert. Nur "Overloads". Gruß Frank
Dann habe ich das nciht richtig verstanden . Ich hatte das so gelesen, als ob du die Änderungen direkt in den originalen Dateien machst.
Hallo Barbara, kein Problem. Es ist warm, Wochenende und Freizeit wird sowieso überbewertet. Aber Du hast mich glücklicherweise auf den richtigen Weg gebracht. Es war die fehlende Überladung von "product". Gruß Frank und einen schönen Sonntag.
Hallo, nachdem es doch ein wenig nervig war das die Extrafelder nicht bei neuen Artikeln gespeichert werden, habe ich mich dieses Problems angenommen und scheinbar eine Lösung gefunden. In der Datei StoreExtrafelderExtender.inc.php unter den overloads/AdminCategoriesExtenderComponents ist folgende kleine Änderung vorzunehmen. Die Zeilen: PHP: if(isset($this->v_data_array['GET']['action']) && $this->v_data_array['GET']['action'] === 'update_product') { $productId = (int)$this->v_data_array['GET']['pID']; sind durch folgende zu ersetzen: PHP: if(isset($this->v_data_array['GET']['action']) && ($this->v_data_array['GET']['action'] === 'update_product' || $this->v_data_array['GET']['action'] === 'insert_product')) { $productId = (int)$this->v_data_array['products_id']; Spielt jedenfalls bei mir unter 3.7.2 Gruß Frank
Wie speichert man denn die Zusatzfelder bei einer neuen Kategorie? Da hat man ja keine "categories_id", die mit übergeben wird.
Ab ca. #19 wird aber doch über die Zusatzfelder in den Kategorien geschrieben oder habe ich da jetzt etwas total falsch verstanden. Aber mal davon abgesehen, wird das Prozedere bei den Kategorien und den Artikeln ziemlich identisch sein. Ich vermute mal das man auch bei der Artikelneuanlage die Zusatzfelder abspeichern muss und kann. Wäre nett wenn ich da einen Hinweis bekommen könnte.