Blog: Latest Entries (15):



Shopware: checkLicence() verwenden?

Die checkLicence()-Methode prüft, ob ein Plugin eine gültige Lizenz hat oder nicht. Dafür wird wiederum das Licence-Manager Plugin verwendet. Shopware selbst rät eher davon ab dieses zu verwenden. Sie meinen, dass ein Kunde schon keine Raubkopie verwenden möchte und ungern von Updates abgeschnitten wird.

Bei einigen Plugins sind die Updates nun wirklich minimal umgesetzt. Mal ein paar kleine Schönheitsfixes.

Warum gehe ich lieber das Risiko ein, dass man eine Test-Version länger als gedacht verwendet als zu viel Sicherheit einzubauen?

- Weil ich selbst weiß, dass Test-Zeiträume oft zu gering sind.
- Weil ich die Sicherheitsmaßnahmen von Shopware für ausreichend halten
- Weil meine Plugins im Namespace abzuändern. von der Arbeitszeit oft teurer wäre als es zu kaufen
- Weil ich nicht nur Fixes in Updates habe, sondern Updates bei mir oft auch Features nachliefern oder verbessern (erste Versionen waren oft nicht ansatzweise so umfangreich wie die momentanen Versionen)

Es ist wie mit dem Wasserzeichen auf mp4togif.com. Es nervt und man kann es relativ einfach und ohne viel Einschränkungen entfernen. Meine Plugins sind relativ günstig. Bekommen oft neue Features und ich versuche möglichst guten Support zu leisten.

Sollte sich nichts mehr verkaufen, würde ich auch nicht mehr weiter entwickeln.

Da das Preis/Leistung Verhältnis bei meinen Plugins, glaube ich, stimmt, bin ich auch relativ sicher, dass die Shopbetreiber bereit sind das Geld zu zahlen und weiterhin von der Weiterentwicklung partizipieren zu können. Besonders auch weil ich für jeden Verbesserungsvorschlag dankbar bin und diese auch gerne für Kunden umsetze.


PS: bald veröffentliche ich mal wieder eine aoop-Version, da dort in den letzten Tagen nach langer Zeit wieder mal was passiert ist und ein neues Projekt damit ansteht.. und nicht mit WordPress.. weil das zu unflexibel ist für den Zweck :-)

Neue Displays: Hübsch!!!!!

Ich war ja immer sehr mit meinem Fujitsu Monitor zufrieden. 1920x1200 und alle möglichen Anschlüsse.. eben ein Profimonitor, was man allein schon am Gewicht merkte. Wurde mir von meiner Frau vermacht, nachdem sie zusammen mit ihrem neuen PC auch zwei neue Displays bekam.

Aber ein 1600x1050 und ein 1920x1200 Monitor passen einfach nicht zusammen.

Also habe ich die notebookswieneu.de 20% WM-Aktion genutzt und mir 2 Thinkvision LT2423 gegönnt. Mit ~140 EUR für 2 FullHD 24" Displays wirklich ein gutes Geschäft gemacht und es sieht auch einfach auf dem Schreibtisch sehr viel besser aus.

bbcode-image

bbcode-image


Sollte Deutschland morgen nochmal gewinnen, kommen vielleicht dich noch mal eine oder zwei 2TB HDDs für die QNAP TS-120 dazu.. mal gucken.

* Wenn mehrere gleiche im Listing auftauchen.. das liegt an den verschiedenen Garantie-Laufzeiten

Shopware-Plugin: XML Automatic Order-Export 0.3.1

Es hat doch ein paar Tage länger gedauert, als gedacht und ich habe am Ende doch mehr geändert als ich zu Anfang wollte, aber ich habe bei dem Plugin jetzt ein besseres Gefühl als vorher. Es ist moderner und flexibler als die alte Version. Änderungen gehen auch viel schneller.

An openTRANS 1.0 hat sich garnichts geändert und wird wohl demnächst mal auf XSLT umgestellt. Bei openTRANS 2.1 hat sich mehr geändert. Zuvor fehlende Felder sind hinzu gekommen. Datum und Zeit der Bestellung ist nun getrennt vom Datum der Erzeugung des Dokuments.

Und das Wichtigste, was hinzu kam, ist, dass nun auch Updates auf Bestellungen exportiert werden. Der UDX.EDI-Block enthält dann die Information, ob es sich um ein CREATE UPDATE handelt. Wer den Export in eine Datei schreibt oder den Push-Client verwendet bekommt jetzt diese Informationen geliefert. Dateien haben nun einen Timestamp im Namen, so dass alle Änderungen linear exportiert werden können.

Wer eine alte Version verwendet sollte nicht einfach updaten, sondern erst einmal ausgiebig Testen!

bbcode-image


Wie schon gesagt, habe ich bei dem Plugin jetzt ein wirklich gutes Gefühl.

Version 0.3.1 sollte demnächst im Store verfügbar sein.


Datenschutz DSGVO Cookie-Overlay V.2

Mit der Version kann man nun auch Optout-Links erstellen, um eine Entscheidung zurück zu nehmen ohne den Browser-Storage leeren zu müssen (was ein normaler Besucher sicher nicht alleine hinbekommt).


<a href="#" cookie-optout-link>Doch keine Cookies!</a>



<div id="cookiequestion">
<style type="text/css">
#cookiequestion{
position: fixed;
text-align: center;
font-weight: bold;
left: 0;
bottom: 0;
border: 2px solid #BBB;
background-color: #DDD;
padding: 10px;
border-radius: 5px;
width: 100%;
}
</style>
<script type="text/javascript">
function cookieclose(val){
var storage = window.localStorage;
if(val && val > 0){
storage.setItem("cookiequestion_val", val);
}
else {
val = storage.getItem("cookiequestion_val");
}

if(val && val > 0){
document.getElementById("cookiequestion").style.display="none";

if(val > 1) {
var event = new Event('cookiequestion_clicked', {value: val, overlay: document.getElementById("cookiequestion")});
document.dispatchEvent(event);
//or do other things here
}
}

//create optional optout-links
var elements = document.querySelectorAll("[cookie-optout-link]");
var func = function(){
return function(){
cookieclose(1);
};
};
for(var i=0; i < elements.length; i++){
elements.addEventListener("click", func());
}
};

cookieclose(0);
</script>
<p>
Erlauben von Tracking/Cookies?
</p>
<p>
<button onclick="cookieclose(2);">ja</button>
<button onclick="cookieclose(1);">nein</button>
</p>
</div>

Von Underscore zu CamelCase

Manchmal muss man aus Datenbank Spaltennamen Getter und Setter Methodennamen generieren. Ein RegEx mal Callback-Function ist nicht immer die schnellste Lösung. Manchmal sind gute alte String-Functionen doch noch die Beste Lösung.


function convertToCamelCase($text){
$result = '';
$nextUp = false;
for($i = 0; $i < strlen($text); $i++){
$char = substr($text, $i, 1);
if($char == '_'){
$nextUp = true;
}
else if ($nextUp){
$result .= strtoupper($char);
}
else{
$result .= strtolower($char);
}
}
return $result;
}

Mehr B2B, Projekte und Stillstände

Ich wollte ja das Order-Export in Richtung XSLT bearbeiten... nun wird alle sehr vollständige Überarbeitung daraus. Besseres Export verhalten nach Änderungen an Bestellungen.. auf über das Backend. Insgesamt soll alles etwas flexibler werden und für mehr B2B-Anwendungsfälle passend gemacht werden.

bbcode-image


Andere Projekte gehen auch nicht so wirklich weiter. Das Cashless-Paymentsystem ist erst einmal auf HOLD. Ich habe zwar schon fertige Pläne, um es auch als ganz normale Kasse (mit Barcode-Scanner) nutzen zu können und auch die Bons dokumenten-echt als signierte PDF parallel zum Druck speichern zu können.
Auch wollte ich mal eine wirkliche Präsentation (vielleicht mit Video) dafür basteln. Am Ende könnte ich mit wenig Zeit noch ein gutes und fertiges Produkt daraus machen. Leider fehlt die Zeit oder das Geld um bei der Zeit das Projekt neu zu priorisieren.

Aber erst einmal steht auch wieder Bremen am 30.6. an. Diesmal bewaffnet mit unter anderen 2 ThinkPad T500 für echt wenig Geld (Die sind für mich da auch Verbrauchsmaterial.. bei höheren Stückzahlen einfach mal wegen dem Preis direkt anfragen. Auch wegen den passenden Akkus und WLAN-Karten dazu).

Im Hintergrund bei der Artikelseite läuft mein "Eigenschaften im Listing" Plugin als Dataprovider ohne eigene Ausgabe.

Shopware-Plugin: Automatischer Order XML Export

Bis jetzt konnte das Plugin neben dem Shopware-Model als XML auch openTRANS 1.0 und 2.1 exportieren. Das war aber rein in PHP implementiert. Zusätzlich konnte man eigene XML-Formate über XSLT ausgeben.
Nun werde ich nach und nach den PHP Anteil reduzieren und auch openTRANS in XSLT implementieren. Erste Schritte sind getan.

Ich rechne damit dass ich so in 2 Wochen, dann alles so weit auf XSLT migriert haben werde.

bbcode-image

Für Anfänger: Eine Festplatte einbauen

Irgendwann kommt jeder zu dem Punkt wo die Festplatte gegen voll tendiert. Dann bekommt man Nachtrichten: "Hilfe, bei C sind nur noch 11% frei!!!!". Erstens ist das vollkommen OK. Leerer Festplattenspeicher nutzt niemanden was. Man sollte immer einen Puffer für temporäre Dateien haben, aber wenn die Festplatte wirklich zu 100% gefüllt sein sollte, wird das System weiterhin noch funktionieren. Also kein Grund zur Panik.
Man hat aber eben viele Daten, Spiele, Fotos, Videos und so was alles, was nicht zwingend auf C: liegen muss und selbst die Verzeichnisse des Benutzerprofils kann man auf andere Laufwerke auslagern. Wenn man viele Sims, Dragon Age oder andere Mods in "Dokumente" liegen hat, kann man den Dokumente-Order auf eine andere Festplatte verschieben. Wenn C: eine SSD ist, kommt man schnell in die Situation, dass man Daten gerne auf einem anderen Laufwerk speichern möchte, um die SSD zu schonen und dort Programme und Spiele zu haben, wo man die Geschwindigkeit einer SSD auch merklich spürt.

bbcode-image
Mein PC als Beispiel-PC


Ich erkläre hier wie man ganz einfach eine zusätzliche HDD (es ist das selbe Vorgehen bei einer SSD) in seinen PC einbaut und auch was man bei den Anschlüssen und Kabeln achten muss. Ich benutze dabei meinen PC (ein einfacher Standard-PC mit 2x 6C L5639 Xeon CPUs, 16GB RAM, 1x 240GB SSD, 1x 1TB HDD, usw) und eine refurbished 2TB SAS HDD.

An sich ist das alles ganz einfach. Früher musste man im BIOS noch die Festplatten einstellen oder erkennen lassen, aber das ist heute alles nicht mehr nötig. Es gibt grundlegend zwei Bauformen für Festplatten:

- 3,5 Zoll
- 2,5 Zoll

moderne Gehäuse bieten Slots für beide Bauformen oder es liegen Adapter bei. Zur Not kann man sich auch einen Adapter für wenige Euro bei Amazon kaufen. Ich hab hier eine 3,5 Zoll HDD an der ich den Einbau zeigen werde.

Neben der Bauform gibt es auch zwei verschiedene Arten von Anschlüssen (SSDs kennen noch U.2 und M.2 die komplett anders arbeiten):

- SATA (der Nachfolger von IDE)
- SAS (der Nachfolger von SCSI)

Der Vorteil von SAS Anschlüssen ist, dass man dort auch SATA-Festplatten anschließen kann. SAS an SATA geht nicht. Der Nachteil von SAS ist, dass man speziellere Kabel oder Adapter braucht, weil der Anschluss der SAS Festplatte für das einfache Einstecken über Rahmen in die Front von Servern optimiert wurde. Bei normalen PCs braucht man zumeist so einen Adapter, um die Festplatte per SATA-Kabel anschließen zu
können.

bbcode-image
SATA

bbcode-image
SAS

bbcode-image
Der benötigte SAS-Adapter


Oft sehen die SATA- und SAS-Anschlüsse komplett gleich aus und haben nur unterschiedliche Farben. Da hilft nur die Beschriftung auf dem Mainboard. Viele Boards haben aber nur SATA-Anschlüsse. Ob man überhaupt SAS-Anschlüsse hat verrät einen ein Blick in den Gerätemanager von Windows.

bbcode-image


Wenn dort ein SAS-Hostadapter aufgeführt ist hat man welche sonst muss man sich keine Gedanken machen, kann aber auch nur SATA-Festplatten verbauen.

Ich bin günstig an eine SAS-Festplatte gekommen und habe mir einen entsprechenden Adapter gekauft. Nun kommt der schwierigste Teil für den man viel Geduld und oft auch etwas mehr Zeit braucht. Das SATA-Kabel durch den Wulst vorhandener Kabel und dem Festplattenkäfig, der sowie so immer dabei im Weg ist, egal welches Gehäuse man hat, in den Anschluss des Mainboard zu stecken. Ruhig bleiben und eine zusätzliche Lichtquelle helfen hier weiter.
Festplatten kann man meist mit Hilfe eines Rahmens oder Schienen direkt in den Slot stecken und braucht keine Schrauben mehr.

bbcode-image


SATA-Kabel an den Adapter. Dann das Stromkabel ranstecken und den Adapter an die Festplatte stecken. Fertig!

bbcode-image
die neue 2TB HDD über der alten 1TB HDD


Nun den PC einschalten und Windows starten. Entweder wird die Festplatte schon angezeigt oder man muss über die Datenträgerverwaltung noch ein Volume einrichten (einfaches Volumen.. RAIDs sind komplizierter...).

bbcode-image


Nun ist die Festplatte da und man dann anfangen Daten zu kopieren.

bbcode-image


Die Daten von der alten Festplatte sollte man immer noch etwas dort behalten, falls die Festplatte doch Zicken machen sollte, dann muss man nicht aufwendig das Backup raus suchen, sondern hat die Daten direkt noch. Ich geh immer davon aus, dass wenn eine Komponente 2 Wochen fehlerfrei lief, dass man erst einmal davon ausgehen kann, dass kein Hardware-Defekt vorliegen kann und wenn dann was kaputt geht, es nicht vorhersagbar war.

Shopware-Plugin: Registrierung blockieren

Nach längerer Zeit habe ich auch mal wieder etwas Arbeit in mein B2B Registrierung-Blockieren Plugin gesteckt. Nun ist das Styling und das Layout nicht mehr ganz so hässlich. Man kann etwas mehr einstellen (nur die Form aus einer Liste auswählen macht im Backend echt viel Ärger.. ich habe es nach hinten verschoben).

bbcode-image


Update auf Version 2.5 erfolgt in den nächsten Tagen.

Falls auch mal jemand mit Emails testen muss und keinen Email-Server zur Verfügung hat, kann hiermit echt gut arbeiten:
https://community.shopware.com/Mailer-Mailversand-als-File_detail_1442.html

Remote Debugging in der VM

Es klingt sehr viel komplizierter als es man Ende ist. Das Wichtigste ist es erst einmal XDebug auf der VM zu installieren. Ich habe da PHP7.1 und es erklärt sich an sich von selbst:


apt-get install php7.1-xdebug


Danach muss die /etc/php/7.1/mods-available/xdebug.ini bearbeitet werden. Wenn man nun davon ausgeht, dass die VM mit VirtualBox und einem Host-only Netzwerk in den Standard Einstellungen läuft ist der Host 192.168.56.1 . Die Datei sieht dann also so aus:

bbcode-image



zend_extension=xdebug.so
xdebug.remote_enable=1
xdebug.remote_host=192.168.56.1
xdebug.remote_port=9000


Bei mit zeigt shopware.localhost auf die VM und auf eine Shopware-Installation. Einen Breakpoint habe ich ganz an den Anfang von der shopware.php gesetzt.

Im Firefox verwendet ich das Addons Xdebug Session Cookie. PHPStorm hört auf Port 9000 nach Debug-Verbindungen. Wenn man nun shopware.localhost aufruft und das Addon aktiviert, wird auch sofort in PHPStorm dieses erkannt und er stoppt beim ersten Breakpoint, den man gesetzt hat.

bbcode-image

bbcode-image


Ist also in wenigen Minuten machbar, das für seine lokale Umgebung einzurichten.

Etwas komplexer ist es mit SSH und Portweiterleitungen, was aber ermöglicht ganz sicher ein Live- oder Staging-System zu debuggen und man muss nicht auf dem Server mit VI und echo/var_dump arbeiten, um heraus zu finden warum es zwar lokal super lief, aber nicht auf dem Server, obwohl die an sich total gleich sind. Kennt jeder.. oder?

Fehler beim Domain-Betritt

Wenn der Fehler auftritt, dass ein Windows-PC die Domain in Netzwerk nicht finden kann und keine Verbindung zum Active Directory-Domaänencontroller hergestellt werden kann, kann es helfen das IPv6-Protokoll zu deaktivieren.

bbcode-image


Sollte der PC dann in der Domain registriert sein, sollte man das IPv6 wieder aktivieren können und es sollte alles ohne Probleme funktionieren.

Datenschutz DSGVO Cookie-Overlay

Meine Seite hat jetzt auch eine Abfrage, ob Cookies angelegt werden dürfen oder nicht. Es wird nicht nur einfach informiert, dass es geschieht oder nach dem Bestätigen geschehen wird. Der Besucher hat auch die Wahl, ob er mit oder ohne Cookies die Seite besuchen möchte. Ich überlege noch ein Belohnungssystem, für Besucher, die die Anzeigen anzeigen lassen (...was für ein komischer Satz...).
Besuchern die Seite zu verwehren halte ich für falsch. Belohnungen sind besser als Strafen.

Hier eine Plain-JavaScript Lösung, bei der man die Ausführung von AdSense oder Analytics per Event triggern kann. Wenn es einmal bestätigt wurde, merkt sich der Browser die Einstellung und behält das Verhalten bei. Es wird im localStorage gespeichert und dort kann man die Auswahl auch wieder löschen.

Vielleicht hilft das ja jemanden :-)


<div id="cookiequestion">
<style type="text/css">
#cookiequestion{
position: fixed;
text-align: center;
font-weight: bold;
left: 0;
bottom: 0;
border: 2px solid #BBB;
background-color: #DDD;
padding: 10px;
border-radius: 5px;
width: 100%;
}
</style>
<script type="text/javascript">
function cookieclose(val){
var storage = window.localStorage;
if(val && val > 0){
storage.setItem("cookiequestion_val", val);
}
else {
val = storage.getItem("cookiequestion_val");
}

if(val && val > 0){
document.getElementById("cookiequestion").style.display="none";

if(val > 1) {
var event = new Event('cookiequestion_clicked', {value: val, overlay: document.getElementById("cookiequestion")});
document.dispatchEvent(event);
//or do other things here
}
}
};

cookieclose(0);
</script>
<p>
Erlauben von Tracking/Cookies?
</p>
<p>
<button onclick="cookieclose(2);">
ja
</button>
<button onclick="cookieclose(1);">
nein
</button>
</p>
</div>


Older posts:

Möchtest Du AdSense-Werbung erlauben und mir damit helfen die laufenden Kosten des Blogs tragen zu können?