Du überschreibst evtl. vorhande $externalFields. So wäre es korrekt: PHP: protected function _getExternalFieldsArray(){ $externalFields = parent::_getExternalFieldsArray(); if(!array_key_exists('categories', $externalFields)) { $externalFields['categories'] = array('primary_key' => 'categories_id', 'fields' => array()); } $externalFields['categories']['fields']['section'] = 'section'; return $externalFields;}
Super. Danke. Das Muster hatte ich aus der Vorlage /GXEngine/Classes/CoreServices/Category/Storages/CategoryAddonValueStorage.inc.php Gruß Mike
Ich bin jetzt etwas überlastet im Kopf. Ich hätte gerne für eine bestimmte Kategorie ein Extrafeld, allerdings mehr so als Information mit ganz oben. Wie z. B. - Gute Qualität etc. wie Bulletpoints bei Amazon - Hilft mir irgendeine Anleitung hier um das schnell zu verwirklichen ohne das ich alles einzeln bearbeiten muss?
Hallo. Die o.g. Änderung gilt für alle Kategorien. Du kannst damit für jede Kategorie einen individuellen Eintrag machen - oder auch nicht... Auch für die Anzeige im Frontend muß du die user_classes verwenden. Alternative: Wenn Du für bestimmte Kategorien immer den gleichen Inhalt darstellen möchtest kannst du das auch über eine modifizierte categorie_listing_xxx.html oder eine product_listing_v1_xxx.html realisieren. (und diese dann beim Anlegen der Kategorie auswählen) Gruß Mike
Die alternative habe ich auch drüber nachgedacht. Nur das mit der Umsetzung und den zuordnen muss ich mal schauen.
Hallo Moritz. In der (user_classes/overloads/AdminEditProductExtenderComponent/EkpFormExtender.inc.php steht Kann das sein daß hier nur Zahlen gespeichert werden? Wie kann ich auch Buchstaben speichern
AddonValues werden als String gespeichert. Beim EKP wird es nur immer eine Zahl, da ich im Beispiel einen double cast drin habe: PHP: $addonValues['ekp'] = (double)$this->v_data_array['POST']['ekp'];
Wenn du in meinem EKP-Beispiel an beiden Stellen das (double) weglässt, kannst du z. B. auch einen Text als EKP speichern.
Hallo. Nun habe ich eine seltsame Fehlermeldung beim versuch Artikel zu speichern. Manche Artikel speichern problemlos, manche nicht. Egal ob die Zusatzfelder ausgefüllt sind oder nicht. Hier die Fehlermeldung: Code: Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Given keyName not found: EN' in /www/htdocs/xxxxxxxxx/gambio/GXEngine/Classes/Shared/KeyValueCollection.inc.php:46 Stack trace: #0 /www/htdocs/xxxxxxxxx/gambio/GXEngine/Classes/CoreServices/Product/Entities/GXEngineProduct.inc.php(431): KeyValueCollection->getValue('EN') #1 /www/htdocs/xxxxxxxxx/gambio/GXEngine/Classes/CoreServices/Product/Repositories/Writer/ProductRepositoryWriter.inc.php(180): GXEngineProduct->getName(Object(LanguageCode)) #2 /www/htdocs/xxxxxxxxx/gambio/GXEngine/Classes/CoreServices/Product/Repositories/Writer/ProductRepositoryWriter.inc.php(110): ProductRepositoryWriter->_parseProductDescriptionData(Object(StoredProduct), Object(LanguageCode)) #3 /www/htdocs/xxxxxxxxx/gambio/GXEngine/Classes/CoreServices/Product/Repositories/ProductRepository.inc.php(124): ProductRepositoryWriter->update(Object(StoredProduct)) #4 /www/htdocs/xxxxxxxxx/gambio/GXEngine/Classes/CoreServices/Product/ProductWriteService.inc.php(112): ProductRepository->sto in /www/htdocs/xxxxxxxxx/gambio/GXEngine/Classes/Shared/KeyValueCollection.inc.php on line 46 FATAL ERROR(1): "Uncaught exception 'InvalidArgumentException' with message 'Given keyName not found: EN' in /www/htdocs/xxxxxxxxx/gambio/GXEngine/Classes/Shared/KeyValueCollection.inc.php:46 Stack trace: #0 /www/htdocs/xxxxxxxxx/gambio/GXEngine/Classes/CoreServices/Product/Entities/GXEngineProduct.inc.php(431): KeyValueCollection->getValue('EN') #1 /www/htdocs/xxxxxxxxx/gambio/GXEngine/Classes/CoreServices/Product/Repositories/Writer/ProductRepositoryWriter.inc.php(180): GXEngineProduct->getName(Object(LanguageCode)) #2 /www/htdocs/xxxxxxxxx/gambio/GXEngine/Classes/CoreServices/Product/Repositories/Writer/ProductRepositoryWriter.inc.php(110): ProductRepositoryWriter->_parseProductDescriptionData(Object(StoredProduct), Object(LanguageCode)) #3 /www/htdocs/xxxxxxxxx/gambio/GXEngine/Classes/CoreServices/Product/Repositories/ProductRepository.inc.php(124): ProductRepositoryWriter->update(Object(StoredProduct)) #4 /www/htdocs/xxxxxxxxx/gambio/GXEngine/Classes/CoreServices/Product/ProductWriteService.inc.php(112): ProductRepository->sto" Wenn ich die user_classes/overloads/AdminCategoriesExtenderComponent/StoreEkpExtender.inc.php lösche ist die Fehlermeldung weg und der Artikel läßt sich speichern... Hat die Fehlermeldung was mit Englisch zu tun? Damit kann ich nicht viel anfangen...
Das speichern von einem Feld in einer Spalte funktioniert super. Ich benötige aber 4 Felder in 4 Spalten. Ich bin zu blöd das in PHP umzuändern. Hat jemand einen Tipp für mich.
@barbara bist du schon weiter gekommen? @Moritz (Gambio) hast du einen Tipp was man ändern muss, damit man mehrere Felder übergeben kann?
Hallo. Ein Beispiel für mehrere Felder: In der /StoreEkpExtender.inc.php Code: class StoreEkpExtender extends StoreEkpExtender_parent { /** * Overloaded "proceed" method. */ public function proceed() { parent::proceed(); if(isset($this->v_data_array['GET']['action']) && $this->v_data_array['GET']['action'] === 'update_product') { $productId = (int)$this->v_data_array['GET']['pID']; /** @var ProductReadService $productReadService */ $productReadService = StaticGXCoreLoader::getService('ProductRead'); /** @var StoredProduct $product */ $product = $productReadService->getProductById(new IdType($productId)); $addonValues = $product->getAddonValues()->getArray(); $addonValues['ekp'] = (double)$this->v_data_array['POST']['ekp']; $addonValues['ekp_1'] = (double)$this->v_data_array['POST']['ekp_1']; $addonValues['ekp_2'] = (double)$this->v_data_array['POST']['ekp_2']; $addonValueCollection = MainFactory::create('KeyValueCollection', $addonValues); $product->addAddonValues($addonValueCollection); /** @var ProductWriteService $productWriteService */ $productWriteService = StaticGXCoreLoader::getService('ProductWrite'); $productWriteService->updateProduct($product); } } } In der /AddEkpField.inc.php Code: protected function _getExternalFieldsArray() { $externalFields = parent::_getExternalFieldsArray(); $externalFields['products']['fields']['einkaufspreis'] = 'ekp'; $externalFields['products']['fields']['einkaufspreis_1'] = 'ekp_1'; $externalFields['products']['fields']['einkaufspreis_2'] = 'ekp_2'; return $externalFields; }
Ach wäre es schön, wenn man im backend per [+]-Button individuelle Felder hinzufügen könnte (ohne den Quellcode anzupacken) und das System diese ausliest, übernimmt und speichert (Agenda 2030)
@M. Zitzmann Danke. Hast du auch einen Code für die /EkpFormExtender.inc.php. Damit auch im Admin die Felder eingegeben werden können.
Einfach alles logisch forführen: Code: class EkpFormExtender extends EkpFormExtender_parent { /** * Overloaded "proceed" method. */ public function proceed() { parent::proceed(); $ekp = 0; $ekp_1 = 0; $ekp_2 = 0; if(isset($this->v_data_array['GET']['pID'])) { $productId = (int)$this->v_data_array['GET']['pID']; /** @var ProductReadService $productReadService */ $productReadService = StaticGXCoreLoader::getService('ProductRead'); /** @var StoredProduct $product */ $product = $productReadService->getProductById(new IdType($productId)); try { $ekp = $product->getAddonValue(new StringType('ekp')); $ekp_1 = $product->getAddonValue(new StringType('ekp_1')); $ekp_2 = $product->getAddonValue(new StringType('ekp_2')); } catch(InvalidArgumentException $e) { // product has no EKP yet } } $html = '<div class="grid control-group span6 remove-border"> <div class="span6"> <label>EKP</label> </div> <div class="span6"> <input name="ekp" type="text" value="' . $ekp . '" /> </div> <div class="span6"> <label>EKP 1</label> </div> <div class="span6"> <input name="ekp_1" type="text" value="' . $ekp_1 . '" /> </div> <div class="span6"> <label>EKP 2</label> </div> <div class="span6"> <input name="ekp_2" type="text" value="' . $ekp_2 . '" /> </div> </div>'; $this->v_output_buffer['top']['ekp'] = array('title' => 'EKP', 'content' => $html); } } Die <div class="span6"> kannst Du auch anders formatieren, Tabellen o.ä.
Jetzt sehe ich meinen Fehler. Hatte das <div class="span6"> nicht kopiert. Sondern nur den <input... kopiert. Hab noch ein wenig an der Formatierung geschraubt. Jetzt gefällt´s mir. Schade das man nur einmal auf Danke klicken kann. Mit den Ergänzungen klappt auch das Speichern der Extrafeldern von Cyrus. Und wieder ist der Umstieg zum Honig ein Stück näher gerutscht.
Wie sieht es aus bei der Kopieren der Produkte mit Extrafelder? Wie kann man das so überladen, dass die Werte der Felder beim Kopieren mit kopiert werden? Früher hat man ja die Klasse Categories wie folgt dafür überladen: PHP: function duplicate_product($src_products_id, $dest_categories_id) { $new_products_id = parent::duplicate_product($src_products_id, $dest_categories_id); $copy_extra_data_query = 'UPDATE `products` p LEFT JOIN `products` psrc ON psrc.products_id = \':src_products_id\' SET `p`.`products_content`= `psrc`.`products_content`WHERE `p`.`products_id` = \':new_products_id\' '; // EOF products_extrafield $copy_extra_data_query = strtr($copy_extra_data_query, array( ':src_products_id' => (int)$src_products_id, ':new_products_id' => (int)$new_products_id, ) ); xtc_db_query($copy_extra_data_query); return $new_products_id; } Und nun? Welche Datei muss man überladen?
Das Teil treibt mich gerade in den Wahnsinn! Ich wunder mich die ganze Zeit dass das nicht funktioniert und mir nur Zahlen angezeigt werden, obwohl auch die Texte gespeichert werden. in Feldern ohne Inhalt oder mit Text steht eine "0" Jetzt habe ich entdeckt, dass es nur in den beiden Artikeln so ist, mit denen ich von Anfang an teste. In allen anderen scheint es richtig zu funktionieren. Da sind leere Felder auch einfach leer und nciht mit einer "0" bestückt. Der Grund: ich hatte am Anfang die /AddEkpField.inc.php nicht erstellt, weil ich wissen wollte wo das dann gespeichert wird Obwohl jetzt in der Tabelle products gespeichert wird, werden die Daten Vorrangig aus der addon_values_storage gelesen. Und dafür sucht man nun ewig einen nciht vorhandenen Fehler in den Dateien