Wenn in einem Node kein Text ist, soll der Text eines anderen Nodes verwendet werden.
/ITEM/TEXT_SHORT[text()]/text() | /ITEM/TEXT_LONG[text() and not(/ITEM/TEXT_SHORT[text()])]/text()
Hier wird vorrangig der TEXT_SHORT verwendet. Sollte dieser aber leer sein, wird auf den TEXT_LONG zurück gegriffen.
Ich habe mir das auch aus anderen Beispielen so lange hin und her gebastelt bis es ging. Aber so erspart man sich zusätzlichen Code der später die beiden Texte abgleicht und es wird gleich richtig eingelesen.
Wenn man sich mal etwas im SearchBundle von Shopware rumtreibt und dann selbst mit Doctrine die Property-Klassen aus dem SerachBundle auf die realen doctrine Models/Entities mappen möchte, sollte man beachten:
SearchBundle: Set
Doctrine: Group
SearchBundle: Group
Doctrine: Option
SearchBundle: Option
Doctrine: Value
Konsistenz mag dahinter stecken, aber ich kann sie nicht erkennen.
<Directory "/var/www/shopware">
Options Indexes FollowSymlinks MultiViews
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Ich hatte ja mal überlegt dafür ein Plugin zu schreiben. Aber jetzt wurde es nach langer Zeit einfach mal richtig implementiert. Alle Attribute-Felder des Artikels stehen beim Export direkt zur Verfügung.
Manchmal komme ich mir alt und unflexibel vor. Ich benutze zum Bauen von allen möglichen Dingen Ant und wenn es um Dependecy-Management geht nutze ich Maven und den Composer.
Diese ganzen neuen und modernen Build-Systeme habe ich war genommen, aber irgendwie habe ich da nicht die Zeit und Energie mich jetzt mit jedem auseinander zu setzen und die Vorteile, Nachteile und Unterschiedene genau zu analysieren. Am Ende soll es ja doch nur das machen, was mein momentanes System schon macht. Gradle sieht sehr schön und übersichtlich auch.. aber selbst Maven sieht in den einfachen Setup übersichtlich und einfach aus.
Wenn ich also mein Shopware-Plugin baue, was bringt es mir mein universales Ant-Script (das ich nur reinkopieren muss bei jedem neuen Plugin) durch etwas "moderneres" zu ersetzen.
Das Ergebnis sieht gleich aus, wird sicher nicht merklich schneller sein und ich muss keine seltsamen/komplexen Dinge über Variablen und so tun, um zum Ziel zu kommen.
Ist das schlecht? Ist es nachvollziehbar? Ich weiß es nicht... aber ich glaube ich sollte mal wieder mich mehr mit neuen Dingen beschäftigen. Einfach mal wieder etwas Forschung, wenigstens um es alles mal gesehen zu haben. Das gilt besonders für Angular >2 auch wenn ich AngularJS weiterhin wirklich toll finde und es mir vollkommen für meine Aufgaben reicht (und ich es ExtJS wohl immer vorziehen werde, wo es nur geht.) .. und Symfony 4 steht auch noch auf meiner Liste.
Nach einigen Versuchen mit einem billigen China NAS (langsam und laut), der NAS-Funktion der Fritzbox (die plötzlich die externe SSD nicht mehr erkannte) bin ich nun bei einer gebrauchten QNAP TS-120 gelandet. Eine der Hauptaufgaben des NAS sollte es ja sein Bilder und Videos einer oder mehrere Überwachungskameras zu speichern. Zusätzlich sollte es auch für andere Dinge dienen, wie Datenaustausch zwischen den PCs und so.
Die TS-120 kann viele Dinge der größeren und neueren NAS nicht. So kann sie weder als VM-Host dienen noch als Domain-Controller in Windows-Netzwerken eingesetzt werden (was schön gewesen wäre). Aber trotzdem ist sie den anderen Lösungen, die ich hatte, weit überlegen.
Die Einrichtung der IP-Kamera ging auch entsprechend einfach. Sie speichert über FTP und man kann über SMB dann auf die Daten zugreifen.
Wer sich schon mal bei Shopware damit auseinander setzen musste, wie die Einstellung "Deaktiviere Steuern wenn eine USt-IdNr. angegeben wurde" funktioniert, ist sicher schnell im Checkout-Controller und in der Methode isTaxFreeDelivery($userData) gelandet.
Leider ist diese Methode in einem Stil geschrieben, der sie meiner Meinung nach extrem schwer lesbar macht. Die wieder negierten emptys und vielen return sorgen dafür, dass man den dahinter steckten logischen Ausdruck nur schwer erkennt, wobei der an sich ziemlich einfach ist.
Alles ist wie man man erwartet nur das bei fehlender VatID in der Shipping-Address auch die Billing-Address "einspringen" kann, muss man sich mehrmals durch den Kopf gehen lassen.
Ich habe die Methode noch mal in für mich besser lesbarer Form nieder geschrieben:
Int-Index und selbst ein Array, dadurch ist ein einzelner Artikel darin zu erkennen. Id gibt es in den Params direkt auch noch, also ist das kein Indikator für eine Batch-Request.
[2018-01-09 13:26:18] plugin.WARNING: SW001: price[EK] should be checked, sell for 1041.18, purchase for 2380 by demo [] {"uid":"5e860d0"}
[2018-01-09 13:27:58] plugin.WARNING: SW002: price(EK) should be checked, sell for 8.40, purchase for 59.5 by demo. [] {"uid":"075a3b6"}
Die obere Zeile kann im Shopware Backend nicht angezeigt werden. Die untere schon. Also sollte man mit eckigen Klammern in Log-Messages aufpassen.
Ob in speziellen Shop, POS-Systemen, Shops für das Beschaffungswesen in Firmen oder Entwicklunger-Shops manchmal ist es entweder unnötig oder
nervig immer bei jeder Bestellung die AGB-checkbox anklicken zu müssen. Aber in den Grundeinstellungen gibt es unter Storefront / Bestellabschluss
keine Option das abzustellen... weil es ganz wo anders zu finden ist.
Warum es da ist, erschließt sich mir nicht auf die schnelle, aber es gibt diese Option.
Weil es ja Probleme mit TLS-SNI-01 gibt, kann man auch einfach eine Domain neu installieren. Dann wird ein neuer Eintrag mit dem Postfix 0001 angelegt.
Das wären so für mich die Highlights, warum man schnell auf Shopware 5.3.5 updaten sollte. Gerade die eigene Email Adresse für Fehlermails ist echt praktisch, besonders wenn man wieder Bots Formulare ausfüllen und X-CSRF Fehler auslösen.
SW-18075 - Es ist nun möglich, Fehlermails an eine separate Email Adresse zu verschicken.
SW-18510 - Fügt den API Endpunkt /users hinzu, welcher es ermöglicht Backend Benutzer über die API zu verwalten (larsbo).
SW-19404 - Ändern der Erstellung der Cronjobs, um aktive Cronjobs über die 'cronjob.xml' erstellen zu können (t2oh4e).