Leider ist der Beitrag nur auf Englisch verfügbar.
Learn Refactoring to Framework Independent Code
Leider ist der Beitrag nur auf Englisch verfügbar.
PDF Generierung in Magento 2
Die Core Methoden zum Generieren von PDF Dateien sind auch in Magento 2 eher unflexibel. Eine Alternative sind Tools zum Konvertieren von HTML zu PDF.
In unserem aktuellen Magento 2 Projekt, das wir (integer_net) gemeinsam mit der Stämpfli AG entwickeln, gibt es die Anforderung, aus ausgewählten Produkten dynamisch einen PDF Katalog zu erstellen, der im Prinzip das gleiche Layout hat wie die Produktlisten im Shop. Die PDF aufgrund von HTML zu generieren lag also nahe.
In diesem Beitrag stelle ich unsere Lösung vor, die wkhtmltopdf
mit dem Magento Layout integriert. Am Ende gibt es auch einen Link zum Basismodul auf Github.
Die Woche auf StackExchange #40/2016
Nachdem der letzte “Wochen auf StackExchange” Post recht lang geworden ist, komme ich zurück auf den wöchentlichen Zeitplan:
Magento 2 Antworten
- Ich habe für meine eigene Frage von neulich eine elegante Lösung gefunden, allein mit DI Konfiguration: Force products collection to use EAV instead of flat table (mit persönlichem Upvote von Ivan Chepurny, sie kann also so schlecht nicht sein)
- Dependency Injection with dynamic constructor values ist ein weiteres Beispiel für die Mächtigkeit von Magentos DI Konfiguration, hier in Kombination mit externen Bibliotheken.
- Eine allgemeine Frage zu Modul-Architektur: Best practice for location of a class
- In Magento 2 Layout Events: controller_action_layout_render_before vs. layout_render_before sinniere ich darüber, wie man am besten dynamische Änderungen am Layout vornimmt. Das Ergebnis ist, die genannten Events gar nicht mehr zu nutzen.
- Ist Magento kompatibel mit PHP 7.1? Wahrscheinlich, aber Composer meckert: Magento 2.1.1 not compatibile with PHP 7.1.0
Offene Fragen
- (Magento 2) Ich versuche, einen RequireJS Override abhängig von Backend-Konfiguration zu machen: Conditional RequireJS configuration
- (Magento 1) Geo IP based store view selection with Varnish – wurde beantwortet, ich muss es allerdings noch ausprobieren, um zu einer vollständigen Lösung zu gelangen.
Die Wochen auf StackExchange #37-39/2016
Hier wieder eine Zusammenfassung von interessanten Posts auf StackExchange der letzten Wochen.
Die Woche auf StackExchange #36/2016
Hier sind wieder einige Posts auf Magento StackExchange der letzten Woche, die ich gerne festhalten möchte:
Magento 2
- Das sind Basics der Session-Konfiguration, aber ich fand es interessant, dass Magento 2.1 einen hart kodierten Wert für den Adminbereich nutzt: Logout customer when the browser is closed
- Wie man Datenbank-Transaktionen in Magento 2 nutzt: Magento 2 – Database transaction for multiple model / resource model objects?
- Noch ein praktisches Beispiel für Increment Models, diesmal in Magento 2: Add Dynamic Order Number Prefix [mm-yy-ordernumber]
- Ein Schritt auf meiner Reise, die Magento 2.1 Search Engine Adapters zu verstehen: Does layered navigation always have to use the configured search engine?
- Und ein fieser kleiner Bug: “Asymmetric transaction rollback error” in integration test
Magento 1
- Raphael von DigitalPianism fragte: Magento 1: how to make an extension EE compatible?. Ich habe mit einigen Punkten angefangen zu antworten, aber die Frage könnte etwas mehr Aufmerksamkeit vertragen.
Die Woche auf StackExchange #35/2016
Ich bin etwas spät dran aber ich war in letzter Zeit recht akiv auf Magento StackExchange, also hier sind die besten Posts von letzter Woche!
Magento 1 Antworten
- Maarten Wolfsen hat einen schönen Trick gefunden, um Header-Elemente wie CSS-Dateien für alle Seiten am Ende anzufügen: CSS file is loaded too early
- Kinder einer Kategorie laden, inklusive deaktiverter Kategorien: Get Disabled Category Collection (getChildren() funktioniert hierzu nicht)
- Ein praktisches Beispiel für increment models (Ordernummern sollen jedes Mal um 4 erhöht werden): How to set order increment id iterator in magento 1?
- Kanonische Antwort für Transaktions-Emails: How to send mail from custom module?
- Kanonische Antwort für Controller Rewrites: Magento 1 : how to override/rewrite a core controller class?
PHPUnit
- In phpunit anything matcher inside array zeige ich einen möglichen Weg, PHPUnit Matcher Objekte wie
anything()
in arrays zu verwenden, die anassertEquals()
übergeben werden
Neue Magento 2 Fragen
Magento 2 Integration Tests: @magentoConfigFixture
Ich konnte keine gute Dokumentation zur @magentoConfigFixture
Annotation in Magento 2 Integrationstests finden, also halte ich hier mal meine Zusammenfassung fest, nachdem ich den Core Code inspiziert habe (Magento 2.1.0, Magento\TestFramework\Annotation\ConfigFixture
)
Wie man @magentoConfigFixture nutzt
Standardwert 42 für Konfigurationspfad x/y/z
:
/** * @magentoConfigFixture default/x/y/z 42 */
Store-spezifischer Wert 42 für Konfigurationspfad x/y/z
im Store mit Code store1
/** * @magentoConfigFixture store1_store x/y/z 42 */
Store-spezifischer Wert 42 für Konfigurationspfad x/y/z
in aktuellem Store (also Standard-Store)
/** * @magentoConfigFixture current_store x/y/z 42 */
Das sind alle möglichen Formate. Der erste Parameter muss mit _store
enden oder weggelassen werden. Wenn er weggelassen wird, muss der Pfad mit default/
beginnen, sonst wird er ignoriert.
Implikationen
- Konfigurationswerte können nicht auf Website-Ebene gesetzt werden
- Man sollte nicht “current” als echten Store Code verwenden, sonst kann für diesen Store keine Konfigurations-Fixture genutzt werden
Die Wochen auf StackExchange #33-34 / 2016
Kurz und schmerzlos: StackExchange Posts der letzten zwei Wochen.
Magento 1
- Wie ist es möglich, nach “final price” zu filtern: addAttributeToFilter not working with final_price
- Macht es Sinn, einzelen Items mit Collections zu laden? Difference in performance between load and using collections
- Nicht direkt meine Antwort, verdient aber mehr Aufmerksamkeit: Store code in URL for every store view except for default (the KISS way)
- Was tun wenn SQL Queries in den Suchvorschlägen auftauchen: Spam bots & SQL Injections – How do I stop this?
- Gute Frage: Was macht der “Persistente Warenkorb” eigentlich? Ich bin mir nicht mehr so sicher: Does Persistent Shopping Cart work for guest (unlogged) visitors?
- Ich hatte einige Schwierigkeiten, den EE URL Indexer zu triggern und bin noch nicht mit der Lösung zufrieden: Force URL indexation in Magento 1 Enterprise
- Der Versuch eine kanonischen Frage: How do I override/rewrite a block class in Magento 1? Die bisherigen Antworten decken schon sehr viel ab
Magento 2
- Interessante Idee: Proxy-Klassen zur Laufzeit entscheiden lassen, welche konkrete Klasse instantiiert werden soll: Magento 2 Dependency Injection: Lazy Load with Resolution of Concrete Class-Name
Die Wochen auf StackExchange #30-32 / 2016
Ich war wieder aktiv auf Magento StackExchange und ein paar interessante Fragen und Antworten sind in den letzten drei Wochen zusammengekommen:
Magento 1
- (Warum) braucht man diese hässlichen ___store und ___from_store URL Parameter? M1: Remove “?___store=default” from the URL. Und könnte man sie nicht wenigstens schöner (“SEO freundlicher”) gestalten? Optimise URL when changing Store and language switcher to maintain SEO standards
- Eine Frage, drei komplett verschiedene Ansätze: how to add default products to related products list
- Klingt einfach, ist aber nicht ganz straightforward: Exclude Category when showing product collection
Magento 2
- Ein schmutziger Hack, aber sehr praktisch bei der Entwicklung: Add same plugin to all public methods of a type
- Seit Magento 2.1 wird das Anlegen von eigenen Kategorie-Attributen deutlich komplexer: Add category attribute to custom attribute group. Und so sieht das mit Source Model aus: Create multiselect with source model in UI component
- Ich bin mal wieder unzufrieden mit den Catalog Service Contracts… “Call to a member function getIsInStock() on null” with getExtensionAttributes()->getStockItem() (oder: wie bekomme ich Produkte mit Stock Info aus dem Repository?)
Magento Architektur
Gute Frage zum Verständnis von “MVC” in Magento: Why does Magento need blocks?. Hier gab es schon mal eine ähnlich gelagerte Frage: Where’s The V in Magento’s MVC? And is there better name?