Was ist das? Es soll wohl wie ein Sonic-Kopf oder -Flügel aussehen. Man kann damit Videospiele spielen in dem man es mit einem doch ausreichend langem Kabel an die Cinch-Anschlüsse eines TV-Gerätes anschließt.
Außerdem hat es einen eingebauten Laserpointer, der sich sehr gut als Katzenspielzeug eignet. Ideale Kombination.. wenn die Katzen ankommen und nerven, weil sie glauben man will mit ihnen spielen, obwohl man eigentlich nur eine Runde Zocken will.
Die Verpackung allein ist schon Wunder moderner Designer-Albträume. Wenn man sich die angesehen hat, weiß man noch weniger was einen eigentlich erwartet. Sonic, Mega-Drive, Mario, Spongebob, eine mir unbekannte Figur die mit Photoshop "erweitert" wurde, Angry Birds, Shawn das Schaf, usw ... und endlose sich unterschiedene Aufzählungen der 4 Funktionen.. wiese sollte ich mir so ein Ding ins Auto hängen?
Man braucht nur eine AAA-Batterie und es kann losgehen. Das Batteriefach ist nicht verschraubt, was es wohl mal sein sollte, da die Bohrungen dafür vorhanden sind.
Ist es wirklich ein Mega-Drive-Clone dadrin? Würde ja zur Optik passen. 89in1 Spiele-Sammlung und es sieht eher nach einer Auswahl aus 3-4 brauchbaren Famicom Spielen aus und einer Ansammlung von Spielen, die man wohl eher gerne aus der Famicom Historie streichen würde.
Die Grafik ist extrem matschig und unscharf. Ein NES liefert ein sehr viel besseres Bild. Oder aber es ist gewollt und man wollte nicht, dass man auf modernen Tv-Geräten die einzelnen Pixel sieht.. also eine Art Weichzeichner. Aber es ist auf den Pixel genau die NES Version von Contra/Probotector.. abgesehen von den geänderten Sprites.
Die Steuerung ist dabei sogar noch erstaunlich brauchbar. Nicht gut und das Startmenü funktioniert mehr schlechter als schlecht, aber innerhalb der Spiele (anhand von Contra getestet) ausreichend gut, um damit spielen zu können.
Ich habe sonst nur noch Mario Bros (ohne das Super vorne) ausprobiert und diese RipOffs wie "Angry Bird" ohne s komplett ignoriert. Es ist kein Turtles dabei, was neben Contra echt ein Highlight gewesen wäre.
Fazit: Für 5 Euro ist es ein lustiges kleines Spielzeug.. für Katzen und für Menschen.
Nachtrag: Super Mario Bros funktioniert wirklich gut und ist nicht merklich schlechter als auf dem NES oder Famicom
Eine wichtige Erkenntnis das Code-Element in Shopware Einkaufswelten betreffend ist, dass es Smarty unterstützt. Wer also im HTML-Teil direkt JavaScript verwenden will muss etwas mit den geschweiften Klammern aufpassen. Das gilt besonders, wenn man einfach minimized Code-Snippets von einem Anbieter in die eigene Seite integrieren möchte.
Mein 2. Shopware Plugin (also.. das 2. das in den Community-Store soll..) ist jetzt so gut wie fertig. Es fehlen nur noch ein paar Test und Dokumentation.
Das Plugin stellt einen Export der Orders bereit. Im Gegensatz zu den eingebauten Export hat man hier ein paar mehr Möglichkeiten das Aufgabeformat (so lange es XML ist) anzupassen und alles zu automatisieren.
Features:
- XML Formate: nativ, openTRANS 1.0 (eher experimentell), openTRANS 2.1
- automatischer Export direkt nach der Bestellung als Datei in ein lokales Verzeichnis
- automatischer Export als XML in einem JSON Container per Push (getestet mit einem Wildfly 11 und einem RestEasy Endpoint)
- Export bestimmter Orders in ein Verzeichnis per CLI
- Abfrage über die REST-API
- REST-API: Als XML in einem JSON-Container (Liste und einzelnd)
- REST-API: Als XML (einzelnd)
- XSLT-TRansformation, damit ist man im Ausgabeformat nicht eingeschränkt (egal ob mit Automatisch, CLI oder REST-API)
- Für die openTRANS-Formate gibt es verschiedene Einstellung für Buyer-Definition und die Party-Ids
Es ist also ein Plugin was rein auf die Integration von Shopware in vorhandene Bestell-Prozesse mit ERP-Systemen wie SAP ausgelegt ist. Arbeit wirklich gut mit Java Application Servern wie Wirldfly zusammen und auch zum Debuggen ist es sehr praktisch die Bestellungen als XML zu dumpen.
Ein relativ alter Fork des Plugin wird bei https://www.notebookswieneu.de genutzt, um die Bestellungen als openTRANS 1.0 an das SAP-System
zu übermitteln.
Diese Woche werden die letzten Dinge erledigt und dann wird es hoffentlich Anfang nächster Woche für den Store eingereicht.
if(dateFuture.isAfter(now)){
days = Duration.between(now.toLocalDate().atStartOfDay(), dateFuture.toLocalDate().atStartOfDay()).toDays();
}
An sich ganz einfach und hat alles was man sich sonst selbst gebaut hat. Gerade in PHP erinnere ich mich noch sehr daran startOfDay implementiert zu haben.
Mit dieser build.xml kann man eine Zip-Datei bauen, die von Shopware für Plugins akzeptiert wird. Wenn man Phing und nicht Ant verwendet, muss man ${basedir} durch ${project.basedir} ersetzen.
Falls man mal wie in der REST-API ein Bild per URL importieren möchte. Das kann der Fall sein, wenn man sich einen eigenen Importer für ein Format wie BMECat oder so geschrieben hat.
/** @var $media Media */
$media = $this->getMediaResource()->internalCreateMediaByFileLink(
$imageData['imgUrl']
);
$image->setMain(1); //1 is primary image, 2 is the rest
$image->setMedia($media);
$image->setArticle($article);
$image->setPath($media->getName());
$image->setExtension($media->getExtension());
$image->setDescription($media->getDescription());
Ich hatte es schon fertig und dachte ich könnte es später auch mal im Community Store anbieten.. aber dann kam mir schon jemand zu vor und dann auch noch kosten los.
Also hier einfach mein Plugin als Code für jeden:
<?php
namespace HPrExportAttrExtend;
use Doctrine\DBAL\Connection;
use Shopware\Components\Plugin;
Um unseren Shopware-Server aufzusetzen brauchen wir
- Apache (mit php7.0-mod)
- PHP7 (common,mysql,gd,xml,json,xsl,intl,gettext,mbstring,zip)
- MySQL Server
- OpenSSH Server
- PHPMyAdmin (wichtig hier Apache2 auszuwählen.. also mit Sternchen sichtbar nicht nur makiert)
Dann folgt die conf für den Apache und der Eintrag in die Host-Datei.
Jetzt können wir Shopware downloaden und installieren
Nun folgt die Netzwerk Konfiguration mit VirtualBox und die Anpassungen der hosts-Datei unter Windows.
Am Ende können wir mit dem Browser auf Shopware und mit WinSCP auf das System und das Shopware-Verzeichnis zugreifen.
So können wir unser lokalen Plugin-Verzeichnis mit dem auf dem Server synchron halten und Änderungen werden automatisch auf den Server gepusht.
Toll fand ich, dass man während des Freigabeprozesses wirklich mit Menschen zu tun hatte und einem auch wirklich von sich aus geholfen wurde.
Meine Erfahrungen beim Mozilla Store für Firefox OS waren da ganz anders. Da erhielt man eine Email mit sehr allgemeinen Punkten gegen was man verstoßen hätte und Hilfe was man noch müssen für die Freigabe gab es so gar nicht.
Deswegen werde ich mich dann jetzt daran machen weitere Plugins zu schreiben und zu veröffentlichen.
Erstmal Shopware mit Vagrant auf meiner Windows Workstation zum Laufen bekommen. Dann geht es sicher alles noch schneller und einfacher.
Oder ich richtige mir doch eine eigene Ubuntu VM ein... mal gucken.
Auch wenn die erste Version noch nicht wirklich weiter ist, was die Freigabe betrifft, habe ich hier schon mal die ersten Test mit der 2.0 Version.
Wenn man einen öffentlich erreichbaren Shop hat, den jeder ohne Umwege von zu hause aus erreichen kann, aber sich nur bestimmte Kunden, wie eigene Mitarbeiter oder Mitarbeiter von Partner Firmen, registrieren dürfen, kann man nun Black- und Whitelists verwenden.
Darin kann man Email-Adressen oder Domains (z.B. "*@hannespries.de") angeben und invalide Email-Adressen, werden erst gar nicht zum Anmelden zugelassen und der Kunde mit einer Nachricht darüber informiert, dass seine Email-Adresse nicht den Anforderungen entspricht.
Wer also einen Mitarbeitershop hat, kann nun nur Anmeldungen mit der Firmen-Email-Adresse zulassen und muss keine Konten per Hand oder auf Verdacht per Job anlegen lassen.
.. hoffentlich :-) Hat jetzt doch ein paar Monate länger gedauert, bis alles so weit war. Die nächste Version mit White- und Blacklists, die bestimmen, mit welchen Email-Adressen und Domains sich Kunden registrieren dürfen, ist auch schon halb fertig.
Ich hoffe mal, dass das Plugin ohne größere Probleme in einiger Zeit dann in den Store gehen kann und ich dann ein paar andere Ideen für Plugins umsetzen kann.
Wäre auf jeden Fall toll damit etwas Geld verdienen zu können, da mir Shopware-Plugins sehr viel mehr zusagen als Apps zu Entwickeln oder zu versuchen mit Werbung meine Projekte wenigstens ohne Zuzahlung betreiben zu können.
Es fällt schnell auf, dass wenn man das Array mit den Bildern im Article-Model der REST-API ersetzt, die neuen Bilder nicht die alten ersetzen, sondern nur hinzugefügt werden. Das funktioniert auch super bei den selben Bildern, so das in einigen Fällen (wenn man nicht weiß, ob es neue Bilder sind oder nicht) sich doppelte Bilder im Artikel häufen.
Zum Glück bietet die REST-API den Merge Mode an. Dieser gilt für Bilder und Kategorien.
Man muss nur ein neues Feld in den Artikel einbauen:
Default ist hier false. True als Defaultwert hätte ich persönlich logischer gefunden, bzw. eine Einstellung dafür in den Grundeinstellungen, um den Default-Wert zu ändern.
Gehen wir mal davon aus wir hätten noch ein Legacy-Plugin mit einer Bootstrap-php, die einen Service registriert, den wir dekorieren wollen. Über die services.xml geht so etwas nicht.
class HprTest extends Plugin{
public static function getSubscribedEvents(){
return [
'Enlight_Bootstrap_AfterInitResource_hpr_legacy.the_service' => 'decorateService',
];
}
public function decorateService()
{
$coreService = Shopware()->Container()->get('hpr_legacy.the_service');
$refl = new \ReflectionClass(get_class($coreService));
$service = new TheNewService($config);
Shopware()->Container()->set('hpr_legacy.the_service', $service;
}
}
Sehr sehr unschön.. aber es funktioniert so. Der Weg über die XML ist natürlich sehr viel schöner, gerade weil die Injection der Constructor Arguments vom ursprünglichen Service übernommen werden man nicht diese per Reflections erst einmal wieder aus dem ursprünglichen Service heraus gepult werden müssen.
Am Ende dachte ich mir nur: "ist an sich ja genau so wie in meinem Framework.."
Ok. Alle Sprachen in einer Datei und nicht wie bei den Properties-Dateien in Java, aber ansonsten. Im Grunde hat man eine ini-Datei die eingelesen wird. Sie hat einen Namespace, was es sehr viel einfacher macht auf Text-Snippets anderer Plugins oder des Core-Systems zuzugreifen.