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.
PHP: class_alias verwenden um Klassen rückwärtskompatibel zu verschieben/umzubenennen
Manchmal möchte man eine Klasse umbenennen oder sie in einen anderen Namespace verschieben. Aber sobald sie irgendwo außerhalb des Packages verwendet wurde, ist das eine nicht abwärtskompatible Änderung und sollte nicht leichtfertig vorgenommen werden.
Zum Glück gibt es in PHP eine Möglichkeit, beide Klassen gleichzeitig zu nutzen, die alte und die neue, um die alte als “deprecated” zu markieren aber weiterhin nutzen zu können: class_alias()
.
Wie man class_alias() nutzt, ohne Probleme mit dem Autoloading zu bekommen
Sagen wir, die alte Klasse ist OldClass
und wir wollen sie zu NewClass
umbenennen.
Als erstes benennen wir die Klasse um und schieben sie von OldClass.php
in eine neue Datei NewClass.php
.
Continue reading “PHP: class_alias verwenden um Klassen rückwärtskompatibel zu verschieben/umzubenennen”
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
5 Minuten Tipps: Testing
Es ist wieder Zeit für eine Lern-Kaffeepause, heute zum Thema Softwaretest! Die fünf Minuten reichen diesmal nur für einen Kurzüberblick, um die verlinkten Artikel alle zu lesen, nehmt euch etwas mehr Zeit.
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
EcomDev PHPUnit Tipp #14
Tipp #14: Registry Fixtures
Wie bereits in Tipp #1 erklärt, können Helpers, Singletons und Registry Werte pro Test zurückgesetzt werden. Die problematischen Singletons etc. zu finden war für mich oft der schwierigste Teil beim Schreiben von Integrationstests mit EcomDev, also habe ich angefangen, sie zentral in einer fixtures/registry.yaml
Datei für alle Tests zu sammeln 1. Lieber eins zu viel zurückgesetzt als eins zu wenig.
Die Datei ist aufgebaut wie folgt:
Continue reading “EcomDev PHPUnit Tipp #14”
Notes:
- Siehe auch YAML Directory Fallback ↩
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
“Kaufen auch Sie im Internet?”
Dieser Anzeigetext kam mir neulich auf Facebook unter (natürlich in Bildform):
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?