[GELÖST] Hersteller Modul um Checkbox erweitern

Hallo zusammen, ich versuche seit Stunden das Hersteller Modul im Backend um ein weiteres Attribut (Checkbox) zu erweitern. Bin jetzt an dem Punkt dass ich im „Hersteller Editieren“-Fenster meine Checkbox angezeigt bekomme die Änderunge an dieser aber leider nicht gespeichert wird (Firebug sagt bei „action“:„updateSupplier“ leider „attribute“:null) Bootstrap.php public function install() { $metaDataCache = Shopware()-\>Models()-\>getConfiguration()-\>getMetadataCacheImpl(); $metaDataCache-\>deleteAll(); Shopware()-\>Models()-\>addAttribute( 's\_articles\_supplier\_attributes', 'e23', 'brand\_selector', 'tinyint(1)', false, 0 ); $metaDataCache = Shopware()-\>Models()-\>getConfiguration()-\>getMetadataCacheImpl(); $metaDataCache-\>deleteAll(); Shopware()-\>Models()-\>generateAttributeModels( array('s\_articles\_supplier\_attributes') ); $this-\>subscribeEvent( 'Enlight\_Controller\_Action\_PostDispatch\_Backend\_Supplier', 'postDispatchSupplier' ); return array('success' =\> true, 'invalidateCache' =\> array('backend', 'proxy')); } /\*\* \* backendmodul bei Aufruf erweitern \*/ public function postDispatchSupplier(Enlight\_Event\_EventArgs $args) { $args-\>getSubject()-\>View()-\>addTemplateDir( $this-\>Path() . 'Views/' ); //if the controller action name equals "load" we have to load all application components. if ($args-\>getRequest()-\>getActionName() === 'load') { $args-\>getSubject()-\>View()-\>extendsTemplate( 'backend/e23brandselector/supplier/model/attribute.js' ); $args-\>getSubject()-\>View()-\>extendsTemplate( 'backend/e23brandselector/supplier/view/main/edit.js' ); } } Dazu die Erweiterung des Models (backend/e23brandselector/supplier/model/attribute.js): //{block name="backend/supplier/model/attribute/fields" append} { name: 'e23\_brand\_selector', type: 'boolean', defaultValue: 0 }, //{/block} Und die Erweiterung des Edit-Views (backend/e23brandselector/supplier/view/main/edit.js): //{block name="backend/supplier/view/main/edit" append} Ext.override(Shopware.apps.Supplier.view.main.Edit, { getFormTopPart : function() { var me = this, fields = me.callParent(arguments); fields.push({ xtype : 'checkbox', name : 'attribute[eins23BrandSelector]', anchor : '95%', fieldLabel : 'Sichtbar im Brand Selector' }); return fields; } }); //{/block} Wie gesagt, Erweiterung der s_articles_supplier_attributes passiert, das Event wird richtig abgefangen, ich sehe meine CHeckbox im Edit-View des Herstellers: aber leider wird nichts gespeichert, die Checkbox steht immer auf false. Vielleicht kann mir jemand weiterhelfen, die diversen „Hersteller erweitern“-Themen hier im Forum haben mich bis hierher gebracht jetzt aber nicht mehr weiter… Gruß und Danke schon mal, Christian

Kannst du mal folgende Dinge überprüfen? [list] [*] Werden die Daten (True/False) der Checkbox korrekt an den Controller übertragen beim Speichern ? Stehen die also im Post-Request?[/*] [*] Werden die Daten in der Datenbank-Tabelle gespeichert und ggf. nur nicht korrekt wieder ausgelesen?[/*] [*] Ist das Hersteller-Attribut-Model im Filesystem korrekt / aktuell ? Siehe /engine/Shopware/Models/Attribute/Supplier.php[/*][/list]

Hallo Stefan, danke für den schnellen Beistand! Soweit ich sehe werden die Daten nicht an den Controller übergeben… Post Request beim speichern unchecked: [code]{„success“:true,„data“:{„module“:„backend“,„controller“:„supplier“,„action“:„updateSupplier“,"_dc":„1365077109464“,„id“:5,„name“:„Access Oires Sisters“,„count“:0,„image“:„media/image/accessoires.png“,„media-manager-selection“:"",„link“:"",„description“:"

Access Oires Sisters Beschreibung",„articleCounter“:0,„attribute“:null}[/code] Post Request beim speichern checked: [code]{„success“:true,„data“:{„module“:„backend“,„controller“:„supplier“,„action“:„updateSupplier“,"_dc":„1365077179588“,„id“:5,„name“:„Access Oires Sisters“,„count“:0,„image“:„media/image/accessoires.png“,„media-manager-selection“:"",„link“:"",„description“:"

Access Oires Sisters Beschreibung",„articleCounter“:0,„attribute“:null}}[/code] Sollten die Daten nicht bei „attribute“ auftauchen? Infolge dessen wird natürlich auch nichts in die Datenbank geschrieben. Ich finde unter deinem angegebenen Pfad (/engine/Shopware/Models/Attribute/) in meiner Installation kein File „Supplier.php“, aber ein File „ArticleSupplier.php“ welches für mich auch korrekt aussieht. ArticleSupplier.php [code]<?php /**

  • Shopware 4.0

    */

namespace Shopware\Models\Attribute;
use Shopware\Components\Model\ModelEntity,
Doctrine\ORM\Mapping AS ORM,
Symfony\Component\Validator\Constraints as Assert,
Doctrine\Common\Collections\ArrayCollection;

/**

  • @ORM\Entity

  • @ORM\Table(name=„s_articles_supplier_attributes“)
    */
    class ArticleSupplier extends ModelEntity
    {

    /**

    • @var integer $id
    • @ORM\Id
    • @ORM\GeneratedValue(strategy=„IDENTITY“)
    • @ORM\Column(name=„id“, type=„integer“, nullable=false)
      */
      protected $id;

    /**

    • @var integer $articleSupplierId
    • @ORM\Column(name=„supplierID“, type=„integer“, nullable=true)
      */
      protected $articleSupplierId;

    /**

    • @var boolean $e23BrandSelector
    • @ORM\Column(name=„e23_brand_selector“, type=„boolean“, nullable=false)
      */
      protected $e23BrandSelector;

    /**

    • @var \Shopware\Models\Article\Supplier
    • @ORM\OneToOne(targetEntity=„Shopware\Models\Article\Supplier“, inversedBy=„attribute“)
    • @ORM\JoinColumns({
    • @ORM\JoinColumn(name=„supplierID“, referencedColumnName=„id“)
    • })
      */
      protected $articleSupplier;

    public function getId()
    {
    return $this->id; } public function setId($id) { $this->id = $id; return $this; } public function getArticleSupplierId() { return $this->articleSupplierId; } public function setArticleSupplierId($articleSupplierId) { $this->articleSupplierId = $articleSupplierId; return $this; } public function getE23BrandSelector() { return $this->e23BrandSelector; } public function setE23BrandSelector($e23BrandSelector) { $this->e23BrandSelector = $e23BrandSelector; return $this; } public function getArticleSupplier() { return $this->articleSupplier; } public function setArticleSupplier($articleSupplier) { $this->articleSupplier = $articleSupplier; return $this; } }[/code] Muss ich in der Bootstrap vielleicht noch zusätzlich zu Shopware()-\>Models()-\>generateAttributeModels( array('s\_articles\_supplier\_attributes') ); auch noch das AttributrModel für die Supplier selbst generieren? Shopware()-\>Models()-\>generateAttributeModels( array('s\_articles\_supplier') ); Danke für die Hilfe! Gruß Christian

Häng dein Zusatzfeld bitte mal direkt in das Supplier Model, also: //{block name=„backend/supplier/model/supplier/fields“ append} { name: ‚attribute[e23_brand_selector]‘, type: ‚boolean‘, defaultValue: 0 }, //{/block} Wg. dem PHP-Model, sorry hatte mich vertan, ArticleSupplier passt soweit.

hmm, leider kein Erfolg, [code]{“success”:true,“data”:{“module”:“backend”,“controller”:“supplier”,“action”:“updateSupplier”,"_dc":“1365081443425”,“e23_brand_selector”:false,“id”:5,“name”:“Access Oires Sisters”,“count”:0,“image”:“media/image/accessoires.png”,“media-manager-selection”:"",“link”:"",“description”:"

Access Oires Sisters Beschreibung",“articleCounter”:0,“attribute”:null}}[/code] “e23_brand_selector”:false ist jetzt im Post-Request, kommt aber nirgends an und wird immer als false übergeben egal ob angehakt oder nicht

Hallo, du verwendest im Model den Namen e23_brand_selector im Formular jedoch den Namen eins23BrandSelector. Des Weitern solltest du noch inputValue und uncheckedValue in der Checkbox mit angeben. Folgendes Codesnippet sollte dein Problem lösen: fields.push({ xtype : 'checkbox', name : 'attribute[e23\_brand\_selector]', anchor : '95%', fieldLabel : 'Sichtbar im Brand Selector', inputValue: 1, uncheckedValue: 0, }); Viele Grüße, Benjamin Cremer :shopware:

Hallo Benjamin, erstmal dickes Lob an den Support hier im Forum echt der Hammer. Zu meinem Problem: Habe den Namen im Model und im Formular angeglichen wie du sagtest und Values angegeben. Ergebnis, ein SQL Fehler (siehe Bild) ansonsten sieht die Übergabe gut aus obwohl ich mich über supplierId=null etwas wundere darauf hin den $nullable Wert in der addAttribute-Methode meiner Bootstrap.php auf true gesetzt und nochmal getestet und siehe da: übergabe sieht gut aus, keine SQL Fehler mehr, Eintrag in der Datenbank wird geschrieben aber leider als NULL im e23_brand_selector ??? (siehe Bild) Ergebnis des getSuppliers Aufruf ist dann logischerweise „e23BrandSelector“:null Jetzt bin ich komplett verwirrt…

Hi ich hatte das selbe Problem… Versuch mal den type deines Attributes von boolean in type int zu setzen und dann auch die inputValue/uncheckedValue 1/0 nehmen und nicht true/false… das hat es bei mir verhauen Gruß Matze

Hi Matze, danke für den Tip ich denke du hast Recht alle Felder/Attribute auf int umzustellen da ja in der Datenbank im Falles eines Booleans sowieso ein tinyint angelegt wird. Habe nun alles umgestrickt, meine Bootsrap legt das Attribut jetzt als tiniynt an: Shopware()-\>Models()-\>addAttribute( 's\_articles\_supplier\_attributes', 'e23', 'brand\_selector', 'TINYINT(1)', true, 0 ); Mein model ist jetzt vom type:‘int’ mit dem defaultValue:0 //{block name="backend/supplier/model/attribute/fields" append} { name: 'e23\_brand\_selector', type: 'int', defaultValue: 0 }, //{/block} und mein EditView handelt input- und uncheckedValue mit 1 und 0: //{block name="backend/supplier/view/main/edit" append} Ext.override(Shopware.apps.Supplier.view.main.Edit, { getFormTopPart : function() { var me = this, fields = me.callParent(arguments); fields.push({ xtype : 'checkbox', name : 'attribute[e23\_brand\_selector]', anchor : '95%', fieldLabel : 'Sichtbar im Brand Selector', inputValue : 1, uncheckedValue : 0 }); return fields; } }); //{/block} Leider bleibt das Problem bestehen, dass zwar beim speichern des Herstellers (updateSupplier) alles korrekt (“e23_brand_selector”:1) übergeben wird: [code]{“success”:true, “data”:{“module”:“backend”,“controller”:“supplier”,“action”:“updateSupplier”, “_dc”:“1365105548212”,“id”:5,“name”:“Access Oires Sisters”,“count”:0, “image”:“media/image/accessoires.png”,“media-manager-selection”:"", “link”:"",“description”:"

Access Oires Sisters Beschreibung", “articleCounter”:0, “attribute”:{“e23_brand_selector”:1,“id”:5,“supplierId”:null}}}[/code] jedoch in der Datenbank im e23_brand_selector Feld keine 1 ankommt sondern ein null. weswegen der nächste Aufruf des Herstellers (getSupplier) auch ein null liefert: [code]{“success”:true, “data”:[{“id”:5,“name”:“Access Oires Sisters”, “image”:“media/image/accessoires.png”,“link”:"", “description”:"

Access Oires Sisters Beschreibung", “attribute”:{“id”:5,“articleSupplierId”:5,“e23BrandSelector”:null}}], “total”:1}[/code] und da fällt mir gerade auf dass beim Absenden das attribute “e23_brand_selector” heisst beim Abrufen jedoch “e23BrandSelector” hmmm… Gruß Christian

Danke an alle die mitgedacht haben! Jetzt funktioniert das. Das Datenbankfeld als tinyint anzulegen war wohl keine gute Idee von mir… Das Datenbankfeld in der Bootstrap.php ist nun also als Boolean angelegt, das Model ist um ein Feld vom type: ‚boolean‘ mit defaultValue: false erweitert und die Checkbox die den Edit View erweitert hat den inputValue : true sowie den uncheckedValue : false Hier noch die Codesnippets: addAttribute in der Bootstrap.php Shopware()-\>Models()-\>addAttribute( 's\_articles\_supplier\_attributes', 'e23', 'brand\_selector', 'BOOLEAN', false, true ); Modelerweiterung in der attribute.js //{block name="backend/supplier/model/attribute/fields" append} { name: 'e23BrandSelector', type: 'boolean', defaultValue: false }, //{/block} Edit View Erweiterung in der edit.js //{block name="backend/supplier/view/main/edit" append} Ext.override(Shopware.apps.Supplier.view.main.Edit, { getFormTopPart : function() { var me = this, fields = me.callParent(arguments); fields.push({ xtype : 'checkbox', name : 'attribute[e23BrandSelector]', anchor : '95%', fieldLabel : 'Sichtbar im Brand Selector', inputValue : true, uncheckedValue : false }); return fields; } }); //{/block} Vielleicht hilfts ja noch jemandem. Grüße Christian

1 Like

Auf Nachfrage hier das Plugin als Zip. Viel Spass damit Grüße Christian

1 Like

Hallo, Bei mir funktioniert alles, nur habe ich das Problem, dass das backend Modul nicht um die Checkbox erweitert wird… Bootstrap.php (onPost Methode) public function onPostDispatchSupplier(Enlight\_Event\_EventArgs $args) { $view = $args-\>getSubject()-\>View(); $view-\>addTemplateDir($this-\>Path() . 'Views/'); //if the controller action name equals "load" we have to load all application components. if ($args-\>getRequest()-\>getActionName() === 'load') { $view-\>extendsTemplate('backend/supplier/model/markenfilter/attribute.js'); $view-\>extendsTemplate('backend/supplier/view/main/markenfilter/edit.js'); } if ($args-\>getRequest()-\>getActionName() === 'index') { $view-\>extendsTemplate('backend/supplier/markenfilter\_app.js'); } } markenfilter_app.js //{block name="backend/supplier/app" append} /\*\* \* Views \*/ //{include file="backend/supplier/view/main/markenfilter/edit.js"} //{/block} attribute.js //{block name="backend/supplier/model/attribute/fields" append} { name: 'SeventhSense\_markenfilter\_isActive', type: 'int', defaultValue: 1 }, //{/block} edit.js //{block name="backend/supplier/view/main/edit" append} Ext.override(Shopware.apps.Supplier.view.main.Edit, { getFormTopPart : function() { var me = this, fields = me.callParent(arguments); fields.push({ xtype : 'checkbox', name : 'attribute[SeventhSense\_markenfilter\_isActive]', anchor : '95%', fieldLabel : 'Aktiv', inputValue : 1, uncheckedValue: 0 }); return fields; } }); //{/block} was habe ich hier vergessen? Alle Methoden werden korrekt aufgerufen und das speichern der Daten funktioniert ebenfalls; d.h. es werden alle Attribut Einstellungen korrekt geladen. Vielen Dank schonmals! Edit: hat sich erledigt siehe http://jira.shopware.de/Widgets/Jira/?ticket=SW-5147

Ich hätte das Ganze dann im Frontend gerne noch ohne Select. Sonst kann ich mir ja das ganze Model-Gedöhns sparen, wenn ich dann am Ende doch wieder bei SQL-Queries lande. In dem Fall konnte ich nicht rausfinden, ob die ->find() Methode erweiterbar ist, denn im Unterschied zu dem Schuhgrößen-Tutorial gibt es beim ArticleSupplier keine eigenen Builder-Methoden, die hookable wären. Im konkreten Fall ging es um eine Erweiterung der Herstellerdaten im Listing und ich hätte mich entweder an sGetSupplierById() in sArticles hängen können oder eben Enlight_Controller_Action_PostDispatch_Frontend_Listing erweitern. Ich habe das dann für das Listing so erweitert in meinem Plugin: $articleSupplierRepository = Shopware()->Models()->getRepository( ‚Shopware\Models\Attribute\ArticleSupplier‘ ); $articleSupplier = $articleSupplierRepository->findOneByArticleSupplierId($supplierId); $view->additionalSupplierImage = $articleSupplier->getMyTopmarkenImg();