Hallo Community, ich möchte innerhalb des SW eigenen Plugins Advanced Menu (Plugins/Default/Frontend/AdvancedMenu) die Variablen der Kategorieattribute zur Verfügung stellen. Also in der Bootstrap.php des Plugins hier noch zusätzlich die Attribute (Freitextfelder der Kategorie); diese stehen in der s_categories_attributes: /\*\* \* @param Category[] $categories \* @return array \*/ private function convertCategories($categories) { $converter = Shopware()-\>Container()-\>get('legacy\_struct\_converter'); return array\_map(function (Category $category) use ($converter) { $data = ['id' =\> $category-\>getId(), 'name' =\> $category-\>getName(), 'parentId' =\> $category-\>getParentId(), 'hidetop' =\> !$category-\>displayInNavigation(), 'active' =\> 1, 'cmsHeadline' =\> $category-\>getCmsHeadline(), 'cmsText' =\> $category-\>getCmsText(), 'position' =\> $category-\>getPosition(), 'link' =\> 'shopware.php?sViewport=cat&sCategory=' . $category-\>getId(), 'media' =\> null, 'flag' =\> false]; if ($category-\>isBlog()) { $data['link'] = 'shopware.php?sViewport=blog&sCategory=' . $category-\>getId(); } if ($category-\>getMedia()) { $data['media'] = $converter-\>convertMediaStruct($category-\>getMedia()); $data['media']['path'] = $category-\>getMedia()-\>getFile(); } return $data; }, $categories); }
So daß ich dann mit den Attributen im Template arbeiten kann. Kann mir da jemand helfen bitte? Bin ein Programmier Neuling… Vielen Dank schon mal
Man könnte es so machen… /\*\* \* @param int $categoryId \* @return array \* @throws Exception \*/ private function getCategoryAttributes($categoryId) { $sql = "SELECT \* FROM s\_categories\_attributes WHERE categoryID = ?"; $arr = Shopware()-\>Db()-\>fetchAll($sql, $categoryId); return $arr; }
/\*\* \* @param Category[] $categories \* @return array \*/ private function convertCategories($categories) { $converter = Shopware()-\>Container()-\>get('legacy\_struct\_converter'); return array\_map(function (Category $category) use ($converter) { $data = ['id' =\> $category-\>getId(), 'name' =\> $category-\>getName(), 'attributesArray' =\> $this-\>getCategoryAttributes($category-\>getId()), // Neue Zeile 'parentId' =\> $category-\>getParentId(), 'hidetop' =\> !$category-\>displayInNavigation(), 'active' =\> 1, 'cmsHeadline' =\> $category-\>getCmsHeadline(), 'cmsText' =\> $category-\>getCmsText(), 'position' =\> $category-\>getPosition(), 'link' =\> 'shopware.php?sViewport=cat&sCategory=' . $category-\>getId(), 'media' =\> null, 'flag' =\> false]; if ($category-\>isBlog()) { $data['link'] = 'shopware.php?sViewport=blog&sCategory=' . $category-\>getId(); } if ($category-\>getMedia()) { $data['media'] = $converter-\>convertMediaStruct($category-\>getMedia()); $data['media']['path'] = $category-\>getMedia()-\>getFile(); } return $data; }, $categories); }
hallo tsurt, erst mal danke für deine Antwort. Mit deiner Funktion wird der “attributesArray” im Frontend ausgeworfen; mit dem Smarty Debugger wird er mir innerhalb des Arrays “$sAdvancedMenu” angezeigt.
Aber ich bekomme den Inhalt nicht ausgegeben. So habe ich meine Variable angegeben: {foreach $sAdvancedMenu as $mainCategory} {$mainCategory.attributesArray.attribute2} {/foreach}
Da wird nichts ausgegeben. In attribute2 gibt es aber einen Inhalt. Mit {$mainCategory.attributesArray}
wird “Array” ausgegeben. Wo liegt hier mein Fehler? Danke schon mal für Deine / Eure Hilfe.
Also wenn {$mainCategory.link}
das erwartete Ergebnis ausspuckt müsste der Zugriff über {$mainCategory.attributesArray.0.attribute2}
erfolgen.
Na klar, da hätte ich auch selbst drauf kommen können. Mit {$mainCategory.attributesArray.0.attribute2}
erhalte ich den korrekten Wert zurück. Da ich auch in den Unterkategorien mit den Freitextfeldern arbeite, möchte ich auch darauf zugreifen können. Da hier aber für jede Unterkategorie eins hochgezählt wird, verwende ich @iteration. Iteration startet aber mit dem Wert 1, deshalb die Subtraktion. Das sieht dann so aus: {foreach $categories as $category} {$count = $category@iteration - 1} {$categories.{$count}.attributesArray.0.attribute2} {/foreach}
Das Ganze passiert innerhalb der Funktion zur Ausgabe der Subkategorien [code] {function name=“categories_top” level=0} {foreach $categories as $category} {$count = $category@iteration - 1} {if $categories.{$count}.attributesArray.0.attribute2}
- Hier steht dann der Inhalt: {$categories.{$count}.attributesArray.0.attribute2}
{/if} {/foreach} {/function} [/code] Vielleicht kann’s ja jemand brauchen. Vielen dank für Eure Hilfe! Eine Frage noch: - Kann man die geänderte Bootstrap.php des PlugIns “Advanced Menü” auch irgendwie erben und somit updatesicher verwenden?
Hallo, würde mich auch sehr interessieren, ich ich diese Lösung update sicher hinbekomme.
Hallo zusammen,
auch wenn das Thema schon einige Monate alt ist:
Da wir bei einem Kunden auch auf dieses Problem stoßen, haben wir ein Plugin geschrieben, welches die Attribute update sicher hinzufügt. Dieses haben wir in den Store eingestellt:http://store.shopware.com/detail/index/sArticle/162804/number/Bpa5105639631236
Es wäre natürlich jedoch schön, wenn dies in den Shopware Core übernommen werden würde. Die Anpassung im Core deutlich weniger komplex als die Vorgehensweise in unserem Plugin.
Im Issue Tracker existiert auch ein Ticket dazu: Shopware Issuetracker
Es wäre schön, dass jeder, der mit diesem Problem konfrontiert wird und Änderungsbedarf sieht, für das Ticket voten würde, damit dies mehr Aufmerksamkeit bei der Shopware AG bekommt.
Viele Grüße,
Alexander Pankow
Super, genau das habe ich gebraucht.
Bei jedem Update musste ich die angepasste Bootstrap.php neu hochladen - jetzt nicht mehr.
Vielen dank für Eure Mühe. Endlich kann ich mein angepasstes individuelles Menü updatesicher verwenden.
Ich hatte auch länger gekniffelt, ob man nicht ohne die Freifelder im Menü auskommen kann, wenn man Variablenwerte pro Kategorie für komplexere Menüs benötigt. Geht nicht . ID-Abfragen sind fragwürdig, bei Änderungen im Backend sind diese hinfällig und auch nicht Subshop-tauglich. Und Felder wie cmsHeadline werden menschenlesbar im Frontend ausgegeben - auch keine gute Idee. Bliebe nur das Feld für externe Links, und in meinem Fall ist das bereits belegt. Ohne Freifelder geht es nicht - mit anderen Worten: danke für das Plugin!
PS:
Fatal error : Call to a member function toArray() on a non-object in /home/vagrant/www/shopware/engine/Shopware/Plugins/Community/Frontend/BpaAdvancedMenuAttributes/Bootstrap.php on line 148
$catStruct = $categories[$id]-\>getAttribute( **'core'** ); **if** (_is\_object_($catStruct)) { $category[**'attributes'**] = $catStruct-\>toArray(); }
Hallo an Alle,
ich habe auch das Problem Freitextfelder im Advanced Menü einzubinden… lt. Tiket SW-12469 gelöst und lt. Tiket SW-13117 verworfen. Das Plugin kann ich auch nicht installieren, weil nur bis v5.1.6 - In der bootstrap.php ist (bei v 5.2.20) noch alles beim „Alten“ und ich möchte da auch nicht drin rumfummeln.
Stecken die Attribute jetzt irgendwo und ich habe sie einfach nur nicht gefunden oder ist das Problem immer noch aktuell?
Vielen Dank, Gruß
Mike
Hallo, ich würde auch gerne wissen ob Kategorie-Freifelder im Advanced Menü funktionieren. Momentan funktioniert es bei mir nicht und aufgrund dieses Artikel frage ich mich ob es an mir liegt oder immer noch ein bekanntes Problem ist.
Mit der Bitte um schnellstmögliche Anwort da ich mich jetzt nicht weiter damit befassen möchte falls es ein Shopware Fehler ist.
Danke,
Markus
Hi Marcus,
im Template hat man die Freitextfelder zur Verfügung (bspw. hier: /engine/Shopware/Plugins/Default/Frontend/AdvancedMenu/Views/frontend/plugins/advanced_menu/index.tpl - natürlich nicht dort bearbeiten!).
Mit dem folgenden Snippet kann man im foreach ein Attribut ausgeben:
{$category.attribute.attribute1}
Oder meinst du an einer anderen Stelle?