Eigene Artikelfelder im Adminbereich 2.7.x

Thema wurde von javierfrangenheim, 15. Februar 2016 erstellt.

  1. M. Zitzmann

    M. Zitzmann Erfahrener Benutzer

    Registriert seit:
    3. März 2016
    Beiträge:
    136
    Danke erhalten:
    46
    Danke vergeben:
    7
    Ups...
    Soweit habe ich nicht gelesen...
    Ab #19 wird doch genau erklärt wie es mit den Kategorien geht.
    Die categories_id ist die jeweilige in der man "arbeitet"...
    Wenn man eine neue anlegt muß diese erst gespeichert werden (gibt eine neue ID) und beim nächsten Aufruf können die Zusatzfelder gespeichert werden.

    #77 bezieht sich auf die Produktfelder
    Ich denke daß es analog dazu auch bei den Kategorien geht..
     
  2. Kai Stejuhn

    Kai Stejuhn Beta-Held

    Registriert seit:
    26. September 2014
    Beiträge:
    949
    Danke erhalten:
    338
    Danke vergeben:
    56
    #82 Kai Stejuhn, 10. Januar 2018
    Zuletzt bearbeitet: 10. Januar 2018
    Ja, das Speichern bei einer vorhandenen Kategorie funktioniert schon. Aber es ist doch relativ sinnfrei, wenn ich erst eine neue Kategorie speichern muss um dann das Zusatzfeld zu speichern. Beim Speichern einer Kategorie gibt es ja nicht mal die "Aktualisieren" Funktion, wie beim Artikel.

    Den Hinweis ab #77 habe ich glaube ich schon probiert (mit categorie_id), das hat aber nicht funktioniert. Ich werde das aber nochmal prüfen.

    Nachtrag: Mit 'insert_category' anstatt 'new_category' funktioniert es dann auch.
     
  3. pulli#7

    pulli#7 Erfahrener Benutzer

    Registriert seit:
    13. Oktober 2017
    Beiträge:
    153
    Danke erhalten:
    22
    Danke vergeben:
    31
    Hi Cyrus,
    ich muss diesen alten Post mal rauskramen, da ich bei meinen Artikeln zwei Extrefelder benötige. Habe Deine Daten runtergeladen und die Dateien ExtrafelderFormExtender.inc.php, sowie AddExtrafields.inc.php entsprechend angepasst.

    Klappt soweit auch alles. Die beiden extrafelder werden mir auch beim Artikel bearbeiten angezeigt. Wenn ich nun allerdings etwas eintrage und den Artikel speichere, werden die Werte anscheinend nicht abgespeichert. Wenn ich das nächste mal den Artikel bearbeite sind die Felder leer.

    Bei der Artikeldetailansicht im Frontend werden die Felder daher natürlich auch nicht angezeigt.

    Was habe ich übersehen oder muss ich noch anpassen ?

    Mein Wunsch ist es das ich diese beiden Felder mit Text füllen kann, der dann auch bei den Artikeldetails rechts unter Artikelnummer und Lieferzeit angezeigt und auch mit in den Warenkorb und Checkout etc. übernommen wird.

    Es gibt ja auch die schöne Funktion Zusatzfelder (die ich vorab genutzt habe) die ja eigentlich auch passend ist, aber die Werte werden halt leider nicht mit in den Warenkorb und Chechout übernommen.

    Danke für Deine Hilfe.
     
  4. Cyrus (LeGong)

    Cyrus (LeGong) Erfahrener Benutzer

    Registriert seit:
    21. Dezember 2011
    Beiträge:
    1.301
    Danke erhalten:
    283
    Danke vergeben:
    151
    Hallo @pulli#7
    es sind insgesamt 4 php-Dateien, die überladen werden müssen.
    "StoreExtrafelderExtender.inc.php"
    "ExtrafelderFormExtender.inc.php"
    "extrafield_categories.inc.php"
    "AddExtrafields.inc.php"
    hast du was vergessen?
     
  5. pulli#7

    pulli#7 Erfahrener Benutzer

    Registriert seit:
    13. Oktober 2017
    Beiträge:
    153
    Danke erhalten:
    22
    Danke vergeben:
    31
    Ach siehste, ich dachte die zwei anderen Dateien wären für Extrafelder in den Kategorien ;-)
    Gut habe die Daten nun auch entsprechend bearbeitet und hochgeladen.
    Jetzt wird zumindest vom zweiten Feld der Wert beim Artikel gespeichert. Vom ersten Feld jedoch (bei Dir inhalt) bleibt egals was ich eingebe eine 0 stehen. Auch wenn ich die Einträge dieses Feldes lösche und abspeicher bleibt diese 0 bestehen...
    Und beim Artikel im Frontend wird dann auch nichts angezeigt und übertragen...
     
  6. barbara

    barbara G-WARD 2014/15/16

    Registriert seit:
    14. August 2011
    Beiträge:
    27.167
    Danke erhalten:
    8.076
    Danke vergeben:
    1.257
    Prüfe mal bitte die Schreibweise, ob da irgendwo ein Tippfehler ist.
     
  7. pulli#7

    pulli#7 Erfahrener Benutzer

    Registriert seit:
    13. Oktober 2017
    Beiträge:
    153
    Danke erhalten:
    22
    Danke vergeben:
    31
    Ja, habe es zig mal geprüft und neu getestet, Datenbank zurückgesetzt etc. Immer das selbe Ergebnis. Das erste Feld (bei Cyrus mit Bezeichnung inhalt) hat nach erstmaligem Ausfüllen immer eine 0 stehen. Und angezeigt werden beide Felder nicht auf der Detailseite des Artikels.

    Übrigens auch nicht, wenn ich die Originaldateien völlig unverändert nutze. ;-) Da kommt auch das Problem mit der 0.

    So langsam verzweifel ich ;-)
     
  8. barbara

    barbara G-WARD 2014/15/16

    Registriert seit:
    14. August 2011
    Beiträge:
    27.167
    Danke erhalten:
    8.076
    Danke vergeben:
    1.257
    Sage mir mal Deine Felder
     
  9. pulli#7

    pulli#7 Erfahrener Benutzer

    Registriert seit:
    13. Oktober 2017
    Beiträge:
    153
    Danke erhalten:
    22
    Danke vergeben:
    31
    Also zumindest habe ich folgendes rausgefunden: Wenn man im ersten Feld eine Zahl einträgt wird diese zumindest nicht durch eine 0 ersetzt sondern bleibt stehen. Auf der Detailseite wird leider trotzdem nichts angezeigt. Und in der einen Datei (categories) hatte Cyrus bei dem zweiten Namen ein _ dahinter, beim ersten aber nicht... Daran wird es aber wohl nicht liegen, da ich auch dort schon verschiedene Versionen getestet habe.

    Daher hier einfach mal der Inhalt der entsprechenden Dateien:
    StoreExtrafelderExtender.inc.php
    PHP:
    <?php
    /**
     * Der Dateiname muss StoreExtrafelderExtender.inc.php heissen.
     *
     * Overload der Klasse AdminCategoriesExtenderComponent.
     *
     * Der Ordner muss AdminCategoriesExtenderComponent heissen.
     */
    class StoreExtrafelderExtender extends StoreExtrafelderExtender_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['products_bandfarbe'] = (double)$this->v_data_array['POST']['products_bandfarbe'];
                   
    $addonValues['products_ankerfarbe'] = $this->v_data_array['POST']['products_ankerfarbe'];               
                
    $addonValueCollection MainFactory::create('KeyValueCollection'$addonValues);

                
    $product->addAddonValues($addonValueCollection);

                
    /** @var ProductWriteService $productWriteService */
                
    $productWriteService StaticGXCoreLoader::getService('ProductWrite');

                
    $productWriteService->updateProduct($product);
            }
        }
    }
    ExtrafelderFormExtender.inc.php
    PHP:
    <?php
    /**
     * Class ExtrafelderFormExtender. Also die Datei muss heissen
     * ExtrafelderFormExtender.inc.php
     *
     * Overload der Klasse AdminEditProductExtenderComponent.
     * Also der Ordner muss AdminEditProductExtenderComponent heissen.
     *
     * Adds a form for Extrafields values to the edit product page
     *
     * @see AdminEditProductExtenderComponent
     */
    require_once(DIR_FS_INC 'xtc_get_tax_rate.inc.php');
    class 
    ExtrafelderFormExtender extends ExtrafelderFormExtender_parent
    {
       
    /**
       * Overloaded "proceed" method.
       */
       
    public function proceed()
       {
           
    parent::proceed();
           
           
           
    $products_bandfarbe                =        '';
           
    $products_ankerfarbe           =        '';       
           
           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 {
                   
    $products_bandfarbe $product->getAddonValue(new StringType('products_bandfarbe'));
                   
    $products_ankerfarbe $product->getAddonValue(new StringType('products_ankerfarbe'));               
               }
               
               catch(
    InvalidArgumentException $e) {
                   
    // product has no Extrafields yet
               
    }
           }
           
           
    $bp round($products_prime_cost  * (107 100), 2) ;
           
    $cooled_1 $cooled_versand == 'selected' '';
           
    $cooled_0 $cooled_versand == 'selected' '';
           
    $html '<div class="span12">                       
                           <div class="grid control-group span6">
                               <div class="span6">
                                   <label>Bandfarbe:</label>
                               </div>
                               <div class="span6">
                                   <input name="products_bandfarbe" type="text" value="' 
    $products_bandfarbe '" />
                               </div>                           
                           </div>                       
                           <div class="grid control-group span6">
                               <div class="span6">
                                   <label>Ankerfarbe:</label>
                               </div>
                               <div class="span6">
                                   <input name="products_ankerfarbe" type="text" value="' 
    $products_ankerfarbe '" />
                               </div>                           
                           </div>                       
                       </div>'
    ;           
                                           
                                   
           
    $this->v_output_buffer['top'][''] = array('title' => 'Extrafelder''content' => $html);
        }
    }
    extrafield_categories.inc.php
    PHP:
    <?php
    /*
     * Der dateiname muss extrafield_categories.inc.php heissen.
     * Genau wie der Klassenname.
     * Overload der Klasse categories. Also der Orner muss categories heissen.
    */

    class extrafield_categories extends extrafield_categories_parent
    {   
       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_bandfarbe_`= `psrc`.`products_bandfarbe`,               
                   `p`.`products_ankerfarbe_`=`psrc`.`products_ankerfarbe`
               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 bei der AddExtrafields.inc.php
    PHP:
    <?php
    /**
     * Class AddExtrafields. Also die Datei muss AddExtrafields.inc.php heissen.
     *
     * Overload der Klasse ProductAddonValueStorage. Also der Ordner muss
     * nach Klasse benannt werden.
     *
     * @category   System
     * @package    Product
     * @subpackage Storages
     *             
     * @see ProductAddonValueStorage           
     */
    class AddExtrafields extends AddExtrafields_parent
    {
       
    /**
       * Maps extrafields addon values to extrafields fields in products table
       *
       * @return array
       */
       
    protected function _getExternalFieldsArray()
       {       
           
    $externalFields parent::_getExternalFieldsArray();
           
           
    $externalFields['products']['fields']['products_bandfarbe'] = 'products_bandfarbe';
           
    $externalFields['products']['fields']['products_ankerfarbe'] = 'products_ankerfarbe';       
           
           return 
    $externalFields;
       }
    }
    und für das SQL dann entsprechend:
    Ich habe also immer inhalt mit bandfarbe und herkunft mit ankerfarbe ausgetauscht. Mehr nicht ;-)
     
  10. Cyrus (LeGong)

    Cyrus (LeGong) Erfahrener Benutzer

    Registriert seit:
    21. Dezember 2011
    Beiträge:
    1.301
    Danke erhalten:
    283
    Danke vergeben:
    151
    die beide Unterstriche müssen weg:
    Code:
    `p`.`products_bandfarbe_`= `psrc`.`products_bandfarbe`,               
                   `p`.`products_ankerfarbe`=`psrc`.`products_ankerfarbe`
    
     
  11. pulli#7

    pulli#7 Erfahrener Benutzer

    Registriert seit:
    13. Oktober 2017
    Beiträge:
    153
    Danke erhalten:
    22
    Danke vergeben:
    31
    Einen Unterstrich hast Du ja jetzt wieder drin ;-)

    Habe aber beides versucht, mit dem einen, aber natürlich auch ohne unterstriche...es ändert sich aber leider nichts.

    keine Ahnung wo jetzt noch der Fehler liegt.
     
  12. pulli#7

    pulli#7 Erfahrener Benutzer

    Registriert seit:
    13. Oktober 2017
    Beiträge:
    153
    Danke erhalten:
    22
    Danke vergeben:
    31
    Außerdem bekomme ich nun immer eine SQL-Fehlermeldung, wenn ich einen Artikel kopiere. Wenn ich dann zurückgehe und neu lade ist der Artikel zwar tatsächlich kopiert, aber schön ist das mit der Fehlermeldung dennoch nicht ;-)
     
  13. Developer

    Developer Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    2.509
    Danke erhalten:
    498
    Danke vergeben:
    78
    Wie lautet der Fehler?
     
  14. pulli#7

    pulli#7 Erfahrener Benutzer

    Registriert seit:
    13. Oktober 2017
    Beiträge:
    153
    Danke erhalten:
    22
    Danke vergeben:
    31
    kann ich Dir leider nicht mehr genau sagen, da ich die Funktion nun erstmal rausgenommen habe und die Datenbank nochmal neu eingespielt habe.

    wie gesagt, da bei dem ersten feld immer eine 0 stand und die beiden felder ohnehin nicht auf der artikeldetailseite angezeigt wurden bringt mir das momentan leider noch nichts.

    entweder habe ich was falsch gemacht, oder im code steckt ein kleiner fehler...
     
  15. M. Zitzmann

    M. Zitzmann Erfahrener Benutzer

    Registriert seit:
    3. März 2016
    Beiträge:
    136
    Danke erhalten:
    46
    Danke vergeben:
    7