private HashMap<String, String> arguments = new HashMap<>();
public ArgumentResolver() {
}
public ArgumentResolver(String[] args) {
this.readArray(args);
}
/**
* converts an argument array with '-' as argument seperator in a easy
* readable structure
*
* @param args the argument array from e.g. the main-method
*/
public void addArray(String[] args){
this.readArray(args, false);
}
/**
* converts an argument array with '-' as argument seperator in a easy
* readable structure
*
* @param args the argument array from e.g. the main-method
*/
public void readArray(String[] args) {
this.readArray(args, true);
}
/**
* converts an argument array with '-' as argument seperator in a easy
* readable structure
*
* @param args the argument array from e.g. the main-method
* @param clearBefore clear the existing map
*/
public void readArray(String[] args, boolean clearBefore) {
if(clearBefore){
this.arguments.clear();
}
/**
*
* @param name argument name
* @return gives back the existence of the argument with the given name
*/
public boolean existsIn(String name) {
return this.arguments.containsKey(name);
}
/**
*
* @param name argument name
* @param defaultValue argument value if not found
* @return value of the argument with the given name
*/
public String getArgumentValue(String name, String defaultValue) {
return this.existsIn(name) ? this.arguments.get(name).trim() : defaultValue;
}
/**
*
* @param name argument name
* @return value of the argument with the given name
*/
public String getArgumentValue(String name) {
return this.getArgumentValue(name, "");
}
/**
*
* @return count of arguments
*/
public int size() {
return this.arguments.size();
}
}
Syntax ist weiterhin so:
java -jar example.jar -name blubb blubb -value 1
name ist dann "blubb blubb" und value ist "1". Diese Klasse kommt an sich bei jeden meiner Java-Projekte zum Einsatz, wenn das Programm über die CLI bedient werden kann.
Ich hatte ja gehofft, dass sich AngularJS neben Angular gleichberechtigt halten wird und nicht von diesem ersetzt wird. Sieht wohl aber so aus als würde die Zeit von AngularJS jetzt doch zu Ende gehen (mit 3 Jahren LTS). Also werde ich mir dann doch mal wirklich, nach 1000 mal sich dieses vorzunehmen, genauer ansehen und ausprobieren.
Wenn es mir nicht gefällt gibt es ja noch immer Knockout.js. Lust mein eigenes kleines cJS-Framework doch nochmal weiter zu entwickeln habe ich dann doch nicht. Dem fehlt einfach eine gute Template-Engine und so eine zu schreiben oder einzubauen, wäre etwas zu viel Arbeit.
Mal gucken bei welchen Framework ich am Ende dann landen werde.
Aus Spaß habe ich mir mal zwei Mini Kameras gekauft. Die eckige ist eine SQ11, die die so aussieht wie eine kleine DSLR ist.. keine Ahnung. Man findet relativ wenig Infos zur Bild-Qualität, deswegen habe ich mal ein paar Samples angefertigt.
So langsam wird aus dem Prototypen, ein echtes und brauchbares Produkt. Auch wenn der Realworld-Test heute leider ausgefallen ist, hat das Plugin wichtige neue Funktionen bekommen:
- Direktes Anlegen eines Kunden beim ersten Login-Versuch (dann muss man bei 4000 Karten nicht 4000 Kunden anlegen sondern, kann direkt loslegen)
- Vorgegebene Freitext-Felder, dadurch muss man weniger konfigurieren und weniger Fehlerquellen
Zusätzlich:
- viele Fixes
- Drucken von Kassenbons ist zu 50% fertig. Ein Thermodrucker zum testen ist bestellt.. und hilft vielleicht bei der Kassenschubladen-Problematik
- 13,6mHz Tags zum Aufkleben und ein passendes Lesegerät sind auch bestellt... damit kann man einfache Eintrittskarten zu Bezahlkarten machen
Es geht also alles in schnellen Schritten voran und ich hoffe, dass es dann schon bald als Cloud-Service für alle verfügbar sein wird.
Mein Registrierung-Plugin wird in der Version 2.1 ein paar kleine Verbesserungen erhalten. So kann man festlegen, ob die Registrierung nur als Firma oder nur als Privat-Kunde möglich ist (oder natürlich wie sonst auch beides).
Zusätzlich kann man einstellen das Schnellbestellungen als Gast-Kunde nur als Privat-Kunde möglich ist und nicht als Firma.
Die 2.1 Version ist im Store. Momentan wird noch an einem Fix für ein Problem 5.4 RC1 gearbeitet.. der noch mit 5.3.7 getestet werden muss oder wieder fallen gelassen wird, sollte sich 5.4 RC2 in dem Bereich wieder "normal" verhalten.
Quelloffene Plugins sind toll. IonCube ist doof, umständlich und schwer einzurichten. Wenn es die Möglichkeit gibt würde ich ein quelloffenes Plugin immer vorziehen.
Dieser Artikel von Shopware fasst alles sehr gut zusammen.
Viele Fragen zu einem Shopware-Plugin können einfacher und schneller durch einen Blick in den Code beantwortet werden:
- Wo holt es sich die Daten her?
- Wo schreibt es die Daten hin?
- Welche Daten müssen vorhanden sein, damit alles verarbeitet werden kann?
- Wann wird welche Funktion aus geführt?
Und gerade die Angst, der Code könnte geklaut werden halte ich in 99,99999% für eine verzerrte Sicht der Dinge. Denn man muss einfach davon ausgehen, dass die Plugins aus genau zwei Gründen gekauft werden:
- Der Betreiber des Shops kann nicht Programmieren und hat auch keine Entwickler
- Das Plugin selbst zu entwickeln wäre teurer als es zu kaufen
Ich selbst habe ein paar Plugins im Store die auch wirklich wenigen Zeilen Code bestehen. Manche manipulieren genau einen Wert im Request. Es hat etwas gedauert bis man musste welcher Wert manipuliert werden muss (das weiß man, weil man ja den Quellcode von Shopware einsehen kann). Umsetzen, Testen, verbessern, etc. Aber keine großen oder komplexen Leistungen.
Warum habe ich diese quelloffen im Store? Weil ich glaube, dass ein Entwickler (wenn er gerade keinen Forschungsdrang hat) eher mal paar Euro ausgibt als selbst es nach zubauen und alles selbst nochmal testen und überprüfen zu müssen.
Lösungen zu verheimlichen ist nie gut. Weil man selbst braucht ja auch oft mal Hilfe oder Denkanstöße. Mit genug Zeit kommt jeder auf die Lösung, aber man hat immer genug zu tun, um dankbar dafür zu sein, dass jemand anderes sich diese Zeit genommen hat und man sich mit deren Dingen beschäftigen kann.
Mir gefällt der neue Shopware-Newsletter nicht. OK er ist übersichtlicher, aber mir gefällt es nicht, dass die neuen und aktualisierten Updates nicht mehr direkt als Liste enthalten sind sondern nur noch Banner-Links auf deren Store, wo man diese Plugins findet.
Mir gefiel es immer meinen Namen dort zu lesen. Hat den Freitag oft verschönert :-)
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.