Eigene Artikelfelder im Adminbereich 2.7.x

Thema wurde von javierfrangenheim, 15. Februar 2016 erstellt.

  1. Moritz (Gambio)

    Moritz (Gambio) Administrator

    Registriert seit:
    26. April 2011
    Beiträge:
    5.786
    Danke erhalten:
    2.692
    Danke vergeben:
    903
    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;
    }
     
  2. M. Zitzmann

    M. Zitzmann Erfahrener Benutzer

    Registriert seit:
    3. März 2016
    Beiträge:
    367
    Danke erhalten:
    118
    Danke vergeben:
    39
    Super. Danke.

    Das Muster hatte ich aus der Vorlage
    /GXEngine/Classes/CoreServices/Category/Storages/CategoryAddonValueStorage.inc.php

    Gruß
    Mike
     
  3. Dan (sunnywall.de)

    Dan (sunnywall.de) Erfahrener Benutzer

    Registriert seit:
    16. April 2013
    Beiträge:
    1.262
    Danke erhalten:
    138
    Danke vergeben:
    122
    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?
     
  4. M. Zitzmann

    M. Zitzmann Erfahrener Benutzer

    Registriert seit:
    3. März 2016
    Beiträge:
    367
    Danke erhalten:
    118
    Danke vergeben:
    39
    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
     
  5. Dan (sunnywall.de)

    Dan (sunnywall.de) Erfahrener Benutzer

    Registriert seit:
    16. April 2013
    Beiträge:
    1.262
    Danke erhalten:
    138
    Danke vergeben:
    122
    Die alternative habe ich auch drüber nachgedacht.
    Nur das mit der Umsetzung und den zuordnen muss ich mal schauen.
     
  6. M. Zitzmann

    M. Zitzmann Erfahrener Benutzer

    Registriert seit:
    3. März 2016
    Beiträge:
    367
    Danke erhalten:
    118
    Danke vergeben:
    39
    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
     
  7. Moritz (Gambio)

    Moritz (Gambio) Administrator

    Registriert seit:
    26. April 2011
    Beiträge:
    5.786
    Danke erhalten:
    2.692
    Danke vergeben:
    903
    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'];
     
  8. M. Zitzmann

    M. Zitzmann Erfahrener Benutzer

    Registriert seit:
    3. März 2016
    Beiträge:
    367
    Danke erhalten:
    118
    Danke vergeben:
    39
  9. Moritz (Gambio)

    Moritz (Gambio) Administrator

    Registriert seit:
    26. April 2011
    Beiträge:
    5.786
    Danke erhalten:
    2.692
    Danke vergeben:
    903
    Wenn du in meinem EKP-Beispiel an beiden Stellen das (double) weglässt, kannst du z. B. auch einen Text als EKP speichern.
     
  10. M. Zitzmann

    M. Zitzmann Erfahrener Benutzer

    Registriert seit:
    3. März 2016
    Beiträge:
    367
    Danke erhalten:
    118
    Danke vergeben:
    39
  11. M. Zitzmann

    M. Zitzmann Erfahrener Benutzer

    Registriert seit:
    3. März 2016
    Beiträge:
    367
    Danke erhalten:
    118
    Danke vergeben:
    39
    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...
     
  12. Anonymous

    Anonymous Beta-Held

    Registriert seit:
    22. März 2015
    Beiträge:
    2.381
    Danke erhalten:
    640
    Danke vergeben:
    414
    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.
     
  13. Anonymous

    Anonymous Beta-Held

    Registriert seit:
    22. März 2015
    Beiträge:
    2.381
    Danke erhalten:
    640
    Danke vergeben:
    414
    @barbara bist du schon weiter gekommen?

    @Moritz (Gambio) hast du einen Tipp was man ändern muss, damit man mehrere Felder übergeben kann?
     
  14. M. Zitzmann

    M. Zitzmann Erfahrener Benutzer

    Registriert seit:
    3. März 2016
    Beiträge:
    367
    Danke erhalten:
    118
    Danke vergeben:
    39
    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;
      }
     
  15. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    16. Januar 2016
    Beiträge:
    656
    Danke erhalten:
    115
    Danke vergeben:
    20
    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 :rolleyes::rolleyes::rolleyes: (Agenda 2030) :rolleyes::rolleyes::rolleyes:
     
  16. Anonymous

    Anonymous Beta-Held

    Registriert seit:
    22. März 2015
    Beiträge:
    2.381
    Danke erhalten:
    640
    Danke vergeben:
    414
    @M. Zitzmann
    Danke. Hast du auch einen Code für die /EkpFormExtender.inc.php. Damit auch im Admin die Felder eingegeben werden können.
     
  17. M. Zitzmann

    M. Zitzmann Erfahrener Benutzer

    Registriert seit:
    3. März 2016
    Beiträge:
    367
    Danke erhalten:
    118
    Danke vergeben:
    39
    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.ä.
     
  18. Anonymous

    Anonymous Beta-Held

    Registriert seit:
    22. März 2015
    Beiträge:
    2.381
    Danke erhalten:
    640
    Danke vergeben:
    414
    #38 Anonymous, 13. Mai 2016
    Zuletzt bearbeitet: 13. Mai 2016
    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. :D
    Und wieder ist der Umstieg zum Honig ein Stück näher gerutscht. :rolleyes:
     
  19. Cyrus (LeGong)

    Cyrus (LeGong) Erfahrener Benutzer

    Registriert seit:
    21. Dezember 2011
    Beiträge:
    1.432
    Danke erhalten:
    342
    Danke vergeben:
    176
    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?
     
  20. barbara

    barbara G-WARD 2014-2020

    Registriert seit:
    14. August 2011
    Beiträge:
    35.352
    Danke erhalten:
    11.198
    Danke vergeben:
    1.601
    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
    :mad::oops::oops: