array_merge:
let a = [23, 42, 69];
let b = [112, 256 ...a];
isset() oder ??:
let data = {a: 2, b: 3};
let result = a?.c ?? 0;
Object-Felder als Arguments verwenden:
let data = [
{
id: 0,
name: 'test'
}
];
data.forEach(
({id, name}, idx) => {
console.log(id + ' is named as ' + name + ' and has the index ' + idx);
}
);
Wo findet man die für Hooks benötigte sh.exe aus der normalen Git-Installation?
C:\Users\__your_user__\AppData\Local\Programs\Git\bin\sh.exe
Die Datei in den Preferences auswählen und dann läuft es.
Lizenzen einsammeln die man in seinen Projekten benutzt kann manchmal nötig sein. Gerade wenn man Software für andere
entwickelt, kann sich der Kunde dafür interessieren, weil den es ja einschränken könnte, wie er die Software verwendet.
Das geht mit diesen Libs relativ einfach.
PHP:
composer global require comcast/php-legal-licenses
~/.config/composer/vendor/bin/php-legal-licenses generate
NPM:
sudo npm install -g license-checker
license-checker --development --csv > licenses.csv
Um schnell zu prüfen, ob ein String schon UTF-8 encoded ist kann man die mb_string Erweiterung nutzen.
mb_detect_encoding($str, 'UTF-8', true) != 'UTF-8'
oder
!mb_detect_encoding($str, 'UTF-8', true)
Damit kann man dem Problem begegnen, dass ein doppeltes UTF-8 Encoding in PHP einfach den String kaputt macht und weil die Funktion selbst nicht prüft, ob ein Encoding überhaupt nötig ist.
Manchmal möchte man Artikel für 0.00 Euro anbieten. Zum Beispiel irgendwelche Muster-Artikel.
Wenn man nun einfach einen Preis von 0.00 Euro eingibt, gibt es einige seltsame Nebeneffekte. Der Warenkorb funktioniert auch nicht mehr und man findet im Log den Fehler (sBasket::getPriceForAddProduct):
BASKET-INSERT #01 No price acquired
Die Lösung ist hier https://forum.shopware.com/discussion/7376/erledigt-null-euro-artikel-verwenden beschrieben. Es muss also immer ein Preis > 0 gegeben sein, denn man über die Gruppe wieder auf 0 zurück bekommt.
Jeder der schon mal mit PHP zu tun hatte wird sicher die Installationsanleitung von getcomposer.org. Das Problem ist nur, dass seit einiger Zeit Composer 2.0 installiert wird und einige alte Projekte damit echt ihre Probleme haben. Aber wie installiert man sich eine bestimmte Version? So das nicht plötzlich der Docker-Container nach einem neuen Build eine andere Composer-Version hat und die Pipeline nicht mehr funktioniert.
Lösung:
php composer-setup.php --version=1.10.17
anstelle von
php composer-setup.php
Ich hatte das Problem, dass der Befehl 'bash' nicht mehr mir die Bash meines WSL Ubuntu geöffnet hat sondern irgendwas machte und dann wieder in die Powershell zurück wechselte ohne was anzuzeigen. Das Problem kam wohl daher, dass ich Docker mit WSL vor Ubuntu installiert hatte. Also kein Hyper-V und kein Ubuntu. Daher war der 'bash' Befehl auf Docker gemappt und nicht auf das Ubuntu.
Prüfen:
wslconfig /L
Ändern:
wslconfig /setdefault Ubuntu-20.04
Man kann einen Update-Endpoint für Bestellungen definieren, der angesprochen, wenn sich der Status einer Bestellung bei EDC-Wholesale ändert. Problem ist, dass das nicht immer funktioniert und Hilfe auch nicht immer kommt. Aber man hat Mail die man parsen kann. Die wichtigsten Regex dafür sind:
Betreff:
/Auslieferung Ihrer Bestellung/
Body-Trackingcode:
/>(\d+)<\/b>/
Body-Ordernumber:
/Kontrollnummer:<\/b>\s*(\d+)<br/
Damit kann man alle Daten bekommen und seine Bestellungen updaten. Mit einer Shopware 5 Lösung kann ich gerne auf Anfrage helfen.
Auf Wunsch hier nochmal eine kleine Anleitung wie man Xdebug in einem Docker-Container zusammen mit PHPStorm verwendet. Ich hatte ja schon eine Anleitung für VSCode geschrieben und dort am Ende angemerkt, dass es mit PHPStorm sehr viel einfacher geht. Vorhin nochmal getestet und es geht sehr viel einfacher.
Aber von Anfang an. Wir müssen erstmal das Docker-Image um Xdebug erweitern:
RUN pecl install xdebug-2.8.0 && docker-php-ext-enable xdebug
RUN echo 'zend_extension="/usr/local/lib/php/extensions/no-debug-non-zts-20151012/xdebug.so"' >> /usr/local/etc/php/php.ini
RUN echo 'xdebug.remote_port=9000' >> /usr/local/etc/php/php.ini
RUN echo 'xdebug.remote_enable=1' >> /usr/local/etc/php/php.ini
RUN echo 'xdebug.remote_host=host.docker.internal' >> /usr/local/etc/php/php.ini
Dann installieren wir uns "Xdebug Helper" für den Chrome oder eben die Kombination aus Addon und Browser, die man gerne hätte.
Dann den Docker-Container starten. Die Seite im Chrome aufrufen und dort das Addon aktivieren. Einen Breakpoint in PHPStorm setzen und PHPStorm auf Debug Eingänge horchen lassen.
F5 im Webbrowser drücken und dann das Mapping bestätigen.
Das wars. Super einfach und schnell (abgesehen vom Docker-Container bauen) eingerichtet.
Was ist der 31.1. + ein Monat? Den 31.2. gibt es nicht also ist es der 27.2./28.2. oder ein Tag im März?
Von der reinen menschlichen Logik wäre der Xte Tag des Monats der selbe oder der nächstgelegenste mögliche Tag. Aber nie der Tag des nächsten Monats. Wie beim ISO-Kalenderjahr geht man vom Gefühl nicht davon aus dass das neue (Kalender-)Jahr im alten (gefühlten) Jahr anfängt.
/**
* @param DateTime $date
* @param int $months
*
* @return DateTime
* @throws Exception
*/
function addMonths(DateTime $date, $months = 0) {
$firstDayDate = clone $date;
$dayOfMonth = $firstDayDate->format('d');
$firstInterval = new DateInterval('P' . ($dayOfMonth - 1) .'D');
$firstDayDate->sub($firstInterval);
$firstDayDate->add(new DateInterval('P' . $months . 'M'));
$maxDay = $firstDayDate->format('t');
if($dayOfMonth > $maxDay) {
$dayOfMonth = $maxDay;
}
$restoreIntervall = new DateInterval('P' . ($dayOfMonth - 1) . 'D');
$firstDayDate->add($restoreIntervall);
return $firstDayDate;
}
Damit wäre der 31.1. + 3 Monate der 30.4. weil immer im Context eines bestimmten Monats gerechnet wird und dieser Context nicht verlassen werden darf.
Manchmal muss man auch heute noch prüfen ob der Benutzer JavaScript
auf der Seite erlaubt hat oder ob ein Framework wie JQuery korrekt geladen und nicht geblockt wurde.
Prinzip ist einfach. Man versucht die Meldung mit JavaScript nach dem Laden der Seite auszublenden. Wenn es nicht klappt, liegt ein Problem vor und die Meldung ist für den Benutzer sichtbar.
Hier
wird erklärt wie man im Chrome bewußt JavaScript deaktiviert, damit man solche Fälle testen kann.
Eine Notice in HTML
<strong id="">Please activate/allow JavaScript</strong>
Vanilla-JS
setTimeout(function() {
document.getElementById('#noscript-marker').style.display = 'none';
}, 50);
JQuery (prüft auch mit ob JQuery geladen wurde)
setTimeout(function() {
$('#noscript-marker').hide();
}, 50);
Ein kleines Problem, dass mich bestimmt 10 Minuten gekostet hat und nur durch sw:cron:list aufgeklärt werden konnte.
Der CronJob:
Export_orders
wird zu:
Shopware_CronJob_ExportOrders
und muss auch so im Plugin definiert sein.