<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title> blog</title>
		<link>http://www.pixeltricks.de/blog/</link>
		<atom:link href="http://www.pixeltricks.de/blog/" rel="self" type="application/rss+xml" />
		<description></description>

		
		<item>
			<title>Neue Referenz: Walber-Schuhe aus Kandel</title>
			<link>http://www.pixeltricks.de/blog/neue-referenz-walber-schuhe-aus-kandel/</link>
			<description>&lt;p&gt;Seit 1908 werden in der Schuhfabrik Walber in Kandel fußgesunde Wohlfühlschuhe von Hand hergestellt. Durch die Manufaktur ist es möglich, jeden Schuh mit den Wunschfarben des Kunden herzustellen. Was gefällt ist erlaubt, und das ohne Aufpreis.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;leftAlone&quot; src=&quot;http://www.pixeltricks.de/assets/Referenzen/_resampled/resizedimage680512-Walber-Schuhe.jpg&quot; width=&quot;680&quot; height=&quot;512&quot; alt=&quot;&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Auch im Webshop, den wir mit unserer &lt;a href=&quot;http://www.silvercart.de/&quot;&gt;Shopsoftware SilverCart&lt;/a&gt; realisiert haben, kann sich der Kunde seinen Traumschuh konfigurieren. Direkt nach der Bestellung wird der Schuh in der Fabrik von Hand nach Kundenvorgabe gefertigt.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.pixeltricks.de/assets/Referenzen/_resampled/resizedimage497521-walberprodukt.jpg&quot; alt=&quot;Produktansicht des SilverCart Webshop für Walberf-Schuhe&quot; width=&quot;497&quot; height=&quot;521&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Design und Layout wurden vollständig von Herrn Markus Walber vorgegeben und von uns mit YAML und jquery in valides XHTML umgesetzt.&lt;/p&gt;
&lt;p&gt;Eine Bildergalerie zeigt Impressionen aus der Werkstatt und erklärt den Herstellungsprozess eines Schuhs vom Stanzen der einzelnen Schuhteile bis zur Entnahme der Schuhe aus der Presse.&lt;/p&gt;
&lt;p&gt;Eine weitere Besonderheit ist die direkte Anbindung des SilverCart Webshops an die &lt;a href=&quot;http://www.haendlerbund.de/&quot;&gt;Rechtstext-Schnittstelle des Händlerbund&lt;/a&gt;. Über diesen Webservice werden unter anderem Impressum, AGB, Widerrufsbelehrung automatisch eingelesen. Somit entsprechen die Rechtstexte immer den neuesten gesetzlichen Bestimmungen.&lt;/p&gt;
&lt;p&gt;Die Zahlung im Webshop wird mit dem SilverCart Zahlungsmodul für iPayment und dem Zahlungsmodul für PayPal ermöglicht.&lt;/p&gt;
&lt;p&gt;Zum Webshop von Walber-Schuhe:&lt;a href=&quot;http://www.walber-schuhe.de/&quot;&gt; www-walber-schuhe.de&lt;/a&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</description>
			<pubDate>Wed, 18 Jan 2012 16:28:42 +0100</pubDate>
			
			
			<guid>http://www.pixeltricks.de/blog/neue-referenz-walber-schuhe-aus-kandel/</guid>
		</item>
		
		<item>
			<title>Warum Liebhaber die besseren Shopbetreiber sind</title>
			<link>http://www.pixeltricks.de/blog/warum-liebhaber-die-besseren-shopbetreiber-sind/</link>
			<description>&lt;p&gt;Vor etwas über einem neuen Jahr habe ich durch einen alten Bekannten die wohl schon seit meiner Kindheit latent schlummernde Leidenschaft zu ferngesteuerten Modellautos entdeckt. Genauer gesagt, zu Verbrenner-Modellen im Maßstab 1:8. Diese Modelle fahren mit einem Nitromethanol-Gemisch, wiegen etwa 4 kg und können Geschwindigkeiten von über 80 km/h erreichen. Dabei machen die Nitros einen herrlichen Höllenlärm.&lt;br/&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.pixeltricks.de/assets/Uploads/carsonspecter1.jpg&quot; alt=&quot;Carson Specter II&quot; width=&quot;450&quot; height=&quot;251&quot; title=&quot;&quot;/&gt;&lt;br/&gt;Allerdings ist die Handhabung der Verbrenner-Motoren nicht gerade einsteigerfreundlich, weshalb ich bislang mehr Zeit damit verbracht habe, das Modell zum Fahren zu bringen als selbst damit zu fahren.&lt;/p&gt;
&lt;p&gt;Nach reiflicher Überlegung wollte ich nun den 3.5 ccm großen Verbrennermotor in meinem Carson Specter II durch einen leistungsstarken Elektromotor ersetzen. Immerhin sind das Chassis, die Fernbedienung und der Lenkservo ja fast unbenutzt und noch sehr gut zu gebrauchen.&lt;br/&gt;&lt;br/&gt;Mittlerweile habe ich mich durch etliche Foren gekämpft, Blogs gelesen und in vielen Online-Shops gestöbert um letztlich zu der Erkenntnis zu kommen, dass keiner der von mir besuchten Shops kundenfreundlich ist. Den Verdacht hatte ich schon vorher, als ich Ersatzteile benötigt habe, diese jedoch anhand der Hersteller-Artikelnummer schnell gefunden habe. Ohne die Explosionszeichnungen in der (übrigens sehr guten und sehr ausführlichen) Anleitung meines Nitro-Buggy würde ich wohl immer noch suchen. Keiner der Shops bietet einen Filter an, mit dem ich die passenden Tuning- und Ersatzteile für mein Modell auf einen Blick finden kann.&lt;br/&gt;&lt;br/&gt;&lt;/p&gt;
&lt;h2&gt;Warum ist das so schwer?&lt;/h2&gt;
&lt;p&gt;&lt;br/&gt;Im RC-Car-Bereich gibt es [auszugsweise] verschiedene Attribute:&lt;br/&gt;&lt;br/&gt;Maßstab: 1:10, 1:8, 1:5 etc&lt;br/&gt;Motor: Verbrenner (verschiedene Hubraumgrößen) oder Elektro (Brushed, Brushless),...&lt;br/&gt;Variante: Buggy, Truggy, Monster Truck, ShortCourse,...&lt;br/&gt;Hersteller: Carson, Ansmann, HPI, ThunderTiger,...&lt;br/&gt;Antrieb: 2WD, 4WD&lt;br/&gt;Einsatzzweck: Onroad, Offroad, Crawler,...&lt;br/&gt;[...]&lt;br/&gt;&lt;br/&gt;Würde es einen Online-Shop geben, der dieses Datenmodell bei allen seinen Produkten konsequent pflegt, dann könnte man über einfache Filter ganz einfach passende Ersatzteile für sein Modell finden. Oder man könnte sich als Einsteiger überhaupt erstmal einen schnellen Überlick über das komplexe Thema verschaffen und z.B. mit einem einfach umzusetzenden Fragebogen eine Art Online-Kaufberatung  erhalten. &lt;img class=&quot;left&quot; src=&quot;http://www.pixeltricks.de/assets/Uploads/carsonspecter2.jpg&quot; alt=&quot;Carson Specter II&quot; width=&quot;450&quot; height=&quot;230&quot; title=&quot;&quot;/&gt;&lt;br/&gt;&lt;br/&gt;Nun ist das ja nicht nur beim Modellbau so. In der Aquaristik ist ein Filter nur für bestimmte Beckengrößen geeignet. Wasserpflanzen, Wirbellose und Fische benötigen bestimmte Wasserwerte. Warum kann ich in keinem Online-Shop die Daten meines Aquariums und meine Wasserwerte eingeben und bekomme dann alle für mich geeigneten Produkte angezeigt?&lt;br/&gt;&lt;br/&gt;Wenn ich meine Kleidergröße kenne, warum kann ich in einem Webshop nicht alle anderen - für mich uninteressanten - Größen ausblenden? Soll ich mich wirklich durch jeden Mantel klicken, nur um dann zu merken, dass meine Größe &quot;leider gerade ausverkauft&quot; ist? &lt;br/&gt;&lt;br/&gt;Mit dieser Aufgabenstellung im Blick haben wir &lt;a href=&quot;http://www.silvercart.de&quot;&gt;unsere Shopsoftware SilverCart&lt;/a&gt; entwickelt. Es ist keine Hexerei, neue Attribute hinzuzufügen und selbst komplexe Filter können von uns wirtschaftlich maßgeschneidert für jede Branche und für jede Warengruppe entwickelt werden. Jetzt braucht es nur noch die passenden Liebhaber, die Ihr Sortiment wirklich lieben, ihren Kunden ein besseres Einkaufserlebnis bieten wollen und nicht einfach nur über den Webshop verkaufen wollen.&lt;br/&gt;&lt;br/&gt;Natürlich ist das ein nicht zu unterschätzender Aufwand bei der Pflege des Online-Shops. Aber ebenso wie der Fachverkäufer im Einzelhandel sein Sortiment kennen lernen muss und dafür Zeit und Geld investieren muss sollte auch der Online-Handel seine Hausaufgaben machen. Offensichtlich ist es aber einfacher mit Rabatten und Preisschlachten zu werben. Dabei sitzt doch gerade im Hobby-Bereich das Geld bei vielen Enthusiasten etwas lockerer.&lt;/p&gt;
&lt;h2&gt;Kunde droht mit Kauf&lt;/h2&gt;
&lt;p&gt;Ich werde mich wohl noch länger mit meinem Verbrenner auseinandersetzen. Hätte ein Shopbetreiber das Thema &quot;Umbau von Nitro zu Elo&quot; aufgegriffen und eventuell sogar passende Umbausätze angeboten, oder auf der Website im Blog oder mit Erfahrungsberichten vermittelt, dass er selbst ein Modellbau-Liebhaber ist und mir weiter helfen kann: ich hätte wohl gerne bei ihm eingekauft. Zu dumm, dass mein Urlaub jetzt vorbei ist und auch das Wetter wieder schlechter wurde...&lt;/p&gt;</description>
			<pubDate>Wed, 04 Jan 2012 23:09:53 +0100</pubDate>
			
			
			<guid>http://www.pixeltricks.de/blog/warum-liebhaber-die-besseren-shopbetreiber-sind/</guid>
		</item>
		
		<item>
			<title>Schnittstelle zu ProtectedShops</title>
			<link>http://www.pixeltricks.de/blog/schnittstelle-zu-protectedshops/</link>
			<description>&lt;p&gt;Vertrauen ist ein wichtiger Faktor im E-Commerce. Kundenbewertungen und geprüfte Rechtstexte wie beispielsweise AGB, Widerrufsbelehrung und Datenschutzerklärung gehören dazu. &lt;/p&gt;
&lt;p&gt;Die Protected Shops GmbH bietet Ihren Kunden verschiedene Schutz- und Bewertungspakete, die Sie jetzt sogar automatisch über eine Schnittstelle in unsere Shopsoftware SilverCart einlesen können. Damit sind Sie immer auf dem aktuellen Stand und können sich, &lt;a href=&quot;http://www.protectedshops.de/Haftungsuebernahmegarantie&quot;&gt;Dank der Haftungsübernahmegarantie&lt;/a&gt;, voll auf Ihren Online-Handel konzentrieren.&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 1em;&quot;&gt;&lt;em&gt;&quot;In Verbindung mit den Anwälten unserer Kooperations-Kanzlei, der IT-Recht Kanzlei, werden die Rechtstexte von Protected Shops ständig den neusten rechtlichen Gegebenheiten angepasst.&lt;/em&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 1em;&quot;&gt;&lt;em&gt;Gesetzesänderungen und neue Urteile werden berücksichtigt und wenn erforderlich, in die Rechtstexte eingearbeitet – ganz ohne Ihr Zutun.&lt;/em&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 1em;&quot;&gt;&lt;em&gt;Sie werden informiert, wenn die Texte aktualisiert wurden. So stehen Ihnen stets die aktuellen und rechtssicheren Texte zum Abruf im Protected Shops Portal zur Verfügung.&lt;/em&gt;&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 1em;&quot;&gt;&lt;em&gt;Bequemer geht es nicht – und das zu fairen Preisen!&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Fragen Sie uns nach den Sonderkonditionen für SilverCart und sichern Sie Ihren Webshop noch heute mit dem Service von Protected Shops.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;</description>
			<pubDate>Mon, 28 Nov 2011 14:55:43 +0100</pubDate>
			
			
			<guid>http://www.pixeltricks.de/blog/schnittstelle-zu-protectedshops/</guid>
		</item>
		
		<item>
			<title>Wir haben SilverCart 1.2 veröffentlicht</title>
			<link>http://www.pixeltricks.de/blog/wir-haben-silvercart-1-2-veroeffentlicht/</link>
			<description>&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.pixeltricks.de/assets/Uploads/_resampled/resizedimage420600-SilverCart1.2.jpg&quot; alt=&quot;SilverCart 1.2 Webshop Software&quot; width=&quot;420&quot; height=&quot;600&quot; title=&quot;&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Es ist geschafft! Wir haben unsere Shopsoftware SilverCart mit der neuen Version 1.2 in großen Punkten aber auch in vielen Details verbessern können. Dabei hatten wir rege Hilfe aus unserer Community, die uns mit Vorschlägen und bei der Fehlersuche tatkräftig unterstützt hat. Ganz wichtig war auch das Feedback der Entwickler, die SilverCart schon im produktiven Einsatz haben.&lt;/p&gt;
&lt;p&gt;Dank Roland, der über 300 Commits in unserer Mercurial-Versionskontrolle durchgesehen hat, haben wir hier ein Changelog mit den Änderungen und Neuerungen in SilverCart 1.2.&lt;/p&gt;
&lt;p&gt;Der Schwerpunkt dieser Version war ganz klar die unbedingte Verbesserung der Installationsfreundlichkeit und Detailverbesserungen bei der Usability im Backend.&lt;/p&gt;
&lt;h2&gt;&lt;span style=&quot;font-size: 15px; font-weight: bold;&quot;&gt;Neue Funktionen&lt;/span&gt;&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;Produktbilder werden über die Fancybox gezoomt (JS)&lt;/li&gt;
&lt;li&gt;Die Einstellungen der Konfiguration sind jetzt optional für mehr Übersicht in Tabs geordnet &lt;/li&gt;
&lt;li&gt;Deeplinks&lt;/li&gt;
&lt;li&gt;Fremdbefüllung/Übergabe des Warenkorbs (z.B. über Preisportale)&lt;/li&gt;
&lt;li&gt;Benachrichtigungssystem im Frontend&lt;/li&gt;
&lt;li&gt;Google Taxonomie &lt;/li&gt;
&lt;li&gt;flexibles Widget System zum einfachen Anpassen des Shoplayouts&lt;/li&gt;
&lt;li&gt;Über Widget konfigurierbare Subnavigation&lt;/li&gt;
&lt;li&gt;neues Widget zur Anzeige der neuesten Blogeinträge&lt;/li&gt;
&lt;li&gt;Standard Widget-Sets haben nun Beispieldaten&lt;/li&gt;
&lt;li&gt;Produktgruppenseiten können den Inhalt der übergeordneten Produktgruppe erben. Dies ist einstellbar und im Standard abgeschaltet.&lt;/li&gt;
&lt;li&gt;die Anzahl der Produkte kann auf der Produktgruppenseite angezeigt werden&lt;/li&gt;
&lt;li&gt;es gibt jetzt eine Möglichkeit, Produktfilter-Plgins zu laden&lt;/li&gt;
&lt;li&gt;es können mehrere Anhänge über eine Shop-E-Mail verdendet werden&lt;/li&gt;
&lt;li&gt;Produktbilder können über die Produktverwaltung aus einem Webserver-Verzeichnis importiert werden&lt;/li&gt;
&lt;li&gt;es ist einstellbar, ob in den Warenkorb weitergeleitet werden soll wenn ein Produkt in den Warenkorb gelegt wurde&lt;/li&gt;
&lt;li&gt;es gibt einen SilvercartOrderPlugin-Mechanismus&lt;/li&gt;
&lt;li&gt;CSS- und JavaScript-Dateien werden im Live-Betrieb zu jeweils einer Datei zusammen gefasst um die Ladezeiten zu verbessern&lt;/li&gt;
&lt;li&gt;im Backend gibt es eine neue Funktion zur Optimierung der Datenbank. Dabei werden Relationen zu nicht mehr existierenden Objekte gelöscht&lt;/li&gt;
&lt;li&gt;neues Plugin-System für SilverCart Kern-Klassen. Dadurch lassen sich Updates auch bei umfangreichen projektspezifischen Anpassungen einfach einspielen&lt;/li&gt;
&lt;li&gt;&quot;AnythingSlider&quot; hinzugefügt (zur &lt;a href=&quot;http://css-tricks.com/3412-anythingslider-jquery-plugin/&quot;&gt;AnythingSlider-Website&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;JavaScript und CSS-Dateien die über Requirements::themedCSS/javascript werden jetzt wie Templates gerendert und dynamischen Template Code enthalten. &lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Verbesserungen&lt;/h2&gt;
&lt;ul&gt;&lt;li&gt;Der Installationsvorgang wurde so weit wie möglich vereinfacht. Bei installiertem SilverStripeDateien entpacken + dev/build ausführen. Bei einer Neuinstallation von SilverStripe kann SilverCart &quot;in einem Rutsch&quot; mitinstalliert werden.&lt;/li&gt;
&lt;li&gt;Ausgabe des Mindestbestellwerts für Bestellung auf der Warenkorbseite hinzugefügt&lt;/li&gt;
&lt;li&gt;Vollständige Überarbeitung des Frontend-Designs für mehr Usability. &lt;a href=&quot;http://demo.silvercart.org&quot;&gt;Ausserdem sieht es einfach nur sexy aus.&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Die Bereiche &quot;Administration&quot; und &quot;Konfiguration&quot; wurden im Backend hinzugefügt. Durch diese Aufgabenbezogene Aufteilung ist die Pflege des SilverCart Webshops für den Shopbetreiber einfacher.&lt;/li&gt;
&lt;li&gt;Der SilvercartProductExporter wurde grundlegend überarbeitet und optimiert. Durch die Verwendung von DB::query anstelle von DataObject::get läuft der Export wesentlich schneller bei geringerem Resourcenverbrauch&lt;/li&gt;
&lt;li&gt;Die Klasse SilvercartCustomerCategory wurde mitsamt allen Abhängigkeiten entfernt. Statt dessen wird die Klasse &quot;Group&quot; verwendet&lt;/li&gt;
&lt;li&gt;Der Kundenbereich ist jetzt optional SSL-Verschlüsselt&lt;/li&gt;
&lt;li&gt;Das Registrierungsformular ist jetzt optional SSL-Verschlüsselt&lt;/li&gt;
&lt;li&gt;Der SilverCartProduct CSV Export läuft jetzt wesentlich schneller&lt;/li&gt;
&lt;li&gt;Der Produktimport kommt jetzt besser mit sehr großen Datenmengen zurecht. Die Daten werden jetzt in einzelnen Tranchen rekursiv importiert.&lt;/li&gt;
&lt;li&gt;Der Produkt-Import läuft jetzt über CGI um die üblichen Probleme mit der Skriptlaufzeit beim Webserver zu umgehen&lt;/li&gt;
&lt;li&gt;es können jetzt frei definierbare Verpackungseinheiten am Produkt gepflegt werden, z.B. &quot;Inhalt: 6 Stück&quot;&lt;/li&gt;
&lt;li&gt;Übersetzungsfehler im Admin-Bereich behoben&lt;/li&gt;
&lt;li&gt;Bei der Registirierung ist das Double-Opt-In optional möglich&lt;/li&gt;
&lt;li&gt;Bei der Newsletter-Anmeldung ist das Double-Opt-In jetzt zwingend notwendig&lt;/li&gt;
&lt;li&gt;Mehrere Produtbilder können je Produkt hinterlegt werden. Die Zuordnung wurde vereinfacht und kann sogar automatisiert ablaufen.&lt;/li&gt;
&lt;li&gt;Suchergebnisseite hat jetzt die Möglichkeit die Menge der angezeigten Produkte über einen Filter zu begrenzen&lt;/li&gt;
&lt;li&gt;Unterseiten können die Widgets der Oberseiten übernehmen&lt;/li&gt;
&lt;li&gt;Die Produktpflegeseite im Backend ist durch die optionale Verwendung von Tabs übersichtlicher&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;a href=&quot;http://www.silvercart.org/downloads/&quot;&gt;Zur SilverCart 1.2 Download-Seite&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://demo.silvercart.org/&quot;&gt;Zum SilverCart 1.2 Demo-Shop&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Mit der Version 1.2 haben wir uns einige kleine und auch größere Träume erfüllt. Zwar haben wir unseren (rückblickend doch sehr ambitionierten) Zeitplan um 2 Monate überschritten, dafür aber auch wesentlich mehr Funktionen und Verbesserungen eingebaut als ursprünglich geplant. Das Warten hat sich also gelohnt.&lt;/p&gt;
&lt;p&gt;Mit dem jetzt vorhandenen Funktionsumfang ist SilverCart eine interessante Option und zweifelsfrei die erste Wahl für SilverStripe-Benutzer.&lt;/p&gt;
&lt;p&gt;Wir sind noch lange nicht fertig und es stehen noch einige Funktionen auf unserer Wunschliste. Gerade mit der unlängst veröffentlichten &lt;a href=&quot;http://www.silverstripe.org/silverstripe-3-0-alpha-1-is-ready-to-download/&quot;&gt;SilverStripe 3.0 alpha 1  &lt;/a&gt;zeigen sich völlig neue Perspektiven für die Optimierung des Backends auf.&lt;/p&gt;
&lt;p&gt;Lob, aber auch Kritik und vor allem Anregungen für die Zukunft sind jederzeit willkommen. Ganz besonders freuen wir uns aber auch über Unterstützung jeglicher Art. Es gibt viel zu tun und die unterschiedlichsten Möglichkeiten die Open Source Shopsoftware SilverCart zu unterstützen - eine kurze Nachricht reicht um mit uns Kontakt aufzunehmen.&lt;/p&gt;</description>
			<pubDate>Thu, 03 Nov 2011 17:21:43 +0100</pubDate>
			
			
			<guid>http://www.pixeltricks.de/blog/wir-haben-silvercart-1-2-veroeffentlicht/</guid>
		</item>
		
		<item>
			<title>SilverCart 1.2 steht kurz vor der Veröffentlichung</title>
			<link>http://www.pixeltricks.de/blog/silvercart-1-2-steht-kurz-vor-der-veroeffentlichung/</link>
			<description>&lt;p&gt;Wir haben seit der Veröffentlichung unserer Open Source Shopsoftware SilverCart viel internationalen Zuspruch und Anregungen erhalten. Viele dieser Anregungen konnten wir umsetzen und in die aktuelle Version 1.2 unserer Webshop-Software einfliessen lassen.&lt;/p&gt;
&lt;p&gt;Die Entwicklung von SilverCart 1.2 ist abgeschlossen. Wir werden die neue Version unserer Shopsoftware veröffentlichen, sobald die Qualitätssicherung abgeschlossen ist. Bei der Qualitätssicherung unterstützen uns gerade einige  Community-Mitglieder. Dank ihrer Hilfe konnten wir SilverCart von einigen Bugs befreien  und vor allem den Installationsprozess wesentlich vereinfachen.&lt;/p&gt;
&lt;p&gt;SilverCart wird übrigens auch schon international eingesetzt -  und zwar von einem E-Book-Store in England. Mehr darüber gibt es demnächst zu berichten.&lt;/p&gt;
&lt;p&gt;Wir pixeltrickser sind stolz auf SilverCart, auf viele neue Funktionen, neue Schnittstellen und noch mehr Detailverbesserungen.&lt;/p&gt;</description>
			<pubDate>Thu, 27 Oct 2011 20:02:11 +0200</pubDate>
			
			
			<guid>http://www.pixeltricks.de/blog/silvercart-1-2-steht-kurz-vor-der-veroeffentlichung/</guid>
		</item>
		
		<item>
			<title>pixeltricks auf der Mail Order World 2011</title>
			<link>http://www.pixeltricks.de/blog/pixeltricks-auf-der-mail-order-world-2011/</link>
			<description>&lt;p&gt;Dieses Jahr werden wir auf der Mail Order World in Wiesbaden am 5. und 6. Oktober als Aussteller vertreten sein.&lt;/p&gt;
&lt;p&gt;Die Mail Order World ist Europas größte Fachmesse für das gesamte Spektrum des Versandhandels. Und wir pixeltrickser sind mit unserer Shopsoftware SilverCart mit dabei.&lt;/p&gt;
&lt;p&gt;Die Mail Order World ist unsere erste Messe als Aussteller und ich jetzt schon sehr freudig gespannt auf das, was da alles auf uns zukommen wird. Immerhin - die Stromanschlüsse sind schon mal bestellt :-)&lt;/p&gt;
&lt;p&gt;Wir sind in Halle 9, Stand 911 und freuen uns auf Ihren Besuch - es gibt auch noch einige Freikarten.&lt;/p&gt;</description>
			<pubDate>Tue, 13 Sep 2011 20:56:55 +0200</pubDate>
			
			
			<guid>http://www.pixeltricks.de/blog/pixeltricks-auf-der-mail-order-world-2011/</guid>
		</item>
		
		<item>
			<title>Allein mit dem Löwen</title>
			<link>http://www.pixeltricks.de/blog/allein-mit-dem-loewen/</link>
			<description>&lt;p&gt;Ich habe großes Vertrauen zu Apple, mehr als zu jeder anderen Marke. Das ist in meinem Fall so bemerkenswert, weil ich bisher keiner anderen Marke treu war. Allerdings ist blinder Gehorsam auch nicht gerade mein Markenzeichen und so frage ich mich seit einigen Tagen, ob ich Apple weiter vertrauen soll.&lt;/p&gt;
&lt;p&gt;Der Mac hat mir zu Anfang des neuen Jahrtausends eine zentnerschwere Last von den Schultern genommen: Windows XP. Was habe ich mich über dieses OS aufgeregt: Man musste je nach Anwendungsgebiet seine Hardwarekomponenten selbst zusammenstellen, die dann von Windows mal erkannt wurden, mal nicht. Hat man sich einen neuen Rechner gekauft, hat man mitunter zwei ganze Tage gebraucht bis er konfiguriert war und die Daten portiert waren. Datenverluste waren die Regel, Konfigurationsoptionen in der Systemtiefe gut versteckt, das System ständig von Viren und Würmern bedroht, etc... Ich will nicht weiter über diese zeit nachdenken, denn ich merke schon, wie mein juckender Ausschlag zurückkommt. Der Mac war logisch und es musste garnicht konfiguriert werden. Ein neues Audiointerface gekauft? Einfach anstecken und benutzen! Textdokument von vor 2 Jahren finden? Dauert eine Sekunde mit Spotlight. Mal schnell was im Kalender nachschauen? iBook aufklappen und wieder zuklappen. Kurzum, Tiger, Leopard, Snow Leopard waren spitzenmäßige Betriebssysteme und jedes war noch besser als sein Vorgänger. Deshalb habe ich mir ohne lange zu zögern Lion gekauft. Erst einmal war der Preis von 23.99€ total verlockend und dann hatte ich ein unglaubliches Vertrauen in den Installationsprozess.&lt;/p&gt;
&lt;p&gt;Installiert war Lion dann auch mit wenigen Mausklicks, das finde ich beachtenswert. Der erste Wehrmutstropfen war dann aber, dass iSync nicht mehr da war. iSync war ein super Tool für Leute mit alten Nokia Handys. Ich nehme an, dass die Marketingabteilung des iPhone daran schuld ist, dass iSync gekillt wurde. Ich finde das nicht korrekt.&lt;/p&gt;
&lt;p&gt;Das neue Adressbuch sieht scheisse aus und ist überhaupt nicht intuitiv. Es sieht aus wie ein Buch, kann aber nur einmal umgeblättert werden, nämlich zwischen einer Gruppenübersicht und Gruppendetails. Da muss man dann erst mal nachdenken.&lt;/p&gt;
&lt;p&gt;MacBook aufklappen und benutzen war gestern. Mit Lion muss man erst mal per Hand für eine WLAN Verbindung sorgen. Teilweise hat da das neue Update abhilfe geschafft. Ich erwarte da aber mehr von meinem Mac.&lt;/p&gt;
&lt;p&gt;Ich bin ein treuer iTunes Kunde und verwalte damit auch meine CD Sammlung (CD‘s waren diese unpraktischen silbernen Scheiben, an die sich in 10 Jahren kaum noch einer erinnern wird). Wenn ich mein MacBook ohne den externen Monitor benutze, dann ist das iTunes Fenster zu groß für das 13´´ Display, lässt sich aber nicht verkleinern, da die untere rechte Ecke nicht erreichbar ist.&lt;/p&gt;
&lt;p&gt;Das Verhalten der Fenster nervt mich unterschwellig schon seit längerem. Während ein CMD+W in manchen Applikationen einfach nur ein Fenster schließt, beendet es andere. Aus diesem Grund muss ich mein Adressbuch öfters mal neu starten. Der Klick auf grün oben links passt ein Browserfenster an den Monitor an, bei iTunes hat das den Effekt leider nicht.&lt;/p&gt;
&lt;p&gt;Wenn ich mein externes Hardwarefenster in Form eines Dell Monitors anschließe, gibt es ebenfalls Ärger. Der Monitor wird nicht wach, man muss ihm mit unerklärlichen Kombinationen aus Einschaltknopf und DVI Kabel ziehen auf die Sprünge helfen. Zum Teil ist das die Schuld von Dell, Lion hat das aber verschlimmert. Ziehe ich den Monitor wiederum ab um mit meinem MacBook mobil weiterzuarbeiten, bleibt das Display am MacBook dunkel und ich muss es zuerst zuklappen und dann wieder öffnen.&lt;/p&gt;
&lt;p&gt;Ich bin sehr anspruchsvoll, jaja ich weis. Ich will aber auch kein Diplom in Hardwarebedienung machen sondern schreiben, programmieren, Musik hören, Bilder anschauen, Termine verwalten, ... Meine Aufgaben stehen im Vordergrund, der Rechner mit dem ich sie erledige ist nur das Werkzeug dazu, das im Hintergrund still und zuverlässig seinen Dienst tut. Still und zuverlässig.&lt;/p&gt;</description>
			<pubDate>Fri, 19 Aug 2011 06:40:11 +0200</pubDate>
			
			
			<guid>http://www.pixeltricks.de/blog/allein-mit-dem-loewen/</guid>
		</item>
		
		<item>
			<title>SilverCart 1.1 ist fertig</title>
			<link>http://www.pixeltricks.de/blog/silvercart-1-1-ist-fertig/</link>
			<description>&lt;p&gt;Es ist vollbracht. SilverCart 1.1 ist veröffentlicht.&lt;/p&gt;
&lt;p&gt;Wir haben lange und hart gearbeitet, aber nun ist es geschafft. Mit über 200 Commits haben die neue Version unserer Open-Source Shopsoftware SilverCart fertig gestellt. In der Version 1.1 haben wir viele neue Funktionen und Verbesserungen eingebaut und auch einige Fehler beheben können.&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.pixeltricks.de/assets/logosilvercart.png&quot; alt=&quot;SilverCart&quot; title=&quot;SilverCart, die moderne OpenSource Shopsoftware für das CMS SilverStripe&quot; width=&quot;264&quot; height=&quot;95&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Vielen Dank an alle, die uns mit Übersetzungen, Kritik, Verbesserungsvorschlägen und Lob bei SilverCart geholfen haben.&lt;/p&gt;
&lt;p&gt;Mehr Informationen gibt es auf der deutschen &lt;a href=&quot;http://www.silvercart.de/2011/07/silvercart-1-1-veroffentlicht/&quot;&gt;SilverCart Webshop Projektseite&lt;/a&gt; und natürlich auf &lt;a href=&quot;http://www.silvercart.org&quot;&gt;silvercart.org&lt;/a&gt;.&lt;/p&gt;</description>
			<pubDate>Sat, 23 Jul 2011 11:59:55 +0200</pubDate>
			
			
			<guid>http://www.pixeltricks.de/blog/silvercart-1-1-ist-fertig/</guid>
		</item>
		
		<item>
			<title>Neues SilverStripe-Modul CustomHtmlForm</title>
			<link>http://www.pixeltricks.de/blog/neues-silverstripe-modul-customhtmlform/</link>
			<description>&lt;p&gt;Wir haben unser zweites Modul für das CMS SilverStripe veröffentlicht.&lt;/p&gt;
&lt;p&gt;Bei der Entwicklung unserer &lt;a href=&quot;http://www.silvercart.de/&quot;&gt;Shopsoftware SilverCart&lt;/a&gt; haben wir schnell gemerkt, dass wir bei der Gestaltung und Entwicklung von Formularen mehr Freiheiten brauchen, als das &lt;a href=&quot;http://www.silverstripe.org/&quot;&gt;CMS-Framework SilverStripe&lt;/a&gt; zur Verfügung stellt. &lt;/p&gt;
&lt;p&gt;Vor allem die dynamische Überprüfung von Eingaben in Echtzeit (z.B. sind Benutzername oder E-Mail-Adresse schon vergeben?) hat uns vorher schon so manches graue Haar gekostet.&lt;/p&gt;
&lt;p&gt;Deshalb haben wir das Modul CustomHtmlForms entwickelt und benutzen es seit 2010 sehr erfolgreich in allen unseren Projekten.&lt;/p&gt;
&lt;p&gt;Im Rahmen der Veröffentlichung unseres Shopsoftware haben wir uns entschlossen, das Modul ebenfalls unter der &lt;a href=&quot;http://www.gnu.org/licenses/lgpl.html&quot;&gt;Lesser General Public License (GNU LGPL)&lt;/a&gt; zu veröffentlichen. Damit tragen wir unseren kleinen Teil zum Erfolg der OpenSource-Software SilverStripe bei und können der Entwicklergemeinde etwas zurück geben.&lt;/p&gt;
&lt;p&gt;Mittlerweile ist das Modul in der Version 1.1 verfügbar und kann sowohl vom &lt;a href=&quot;http://www.silverstripe.org/customhtmlform-module/&quot;&gt;SilverStripe-Modulverzeichnis&lt;/a&gt; als auch von der &lt;a href=&quot;http://code.silvercart.org/&quot;&gt;SilverCart-Downloadseite&lt;/a&gt; herunter geladen werden.&lt;/p&gt;
&lt;p&gt;Die Dokumentation ist auf der &lt;a href=&quot;http://www.silvercart.org/documentation/techbase/develop/how-to-customize-forms/&quot;&gt;SilverCart-Projektseite&lt;/a&gt; in englischer Sprache verfügbar.&lt;/p&gt;</description>
			<pubDate>Mon, 11 Jul 2011 21:12:54 +0200</pubDate>
			
			
			<guid>http://www.pixeltricks.de/blog/neues-silverstripe-modul-customhtmlform/</guid>
		</item>
		
		<item>
			<title>Acht Wochen Praktikum bei pixeltricks</title>
			<link>http://www.pixeltricks.de/blog/acht-wochen-praktikum-bei-pixeltricks/</link>
			<description>&lt;p&gt;In meinem achtwöchigen Schülerpraktikum, hier bei pixeltricks, habe ich eine Vertiefung im Bereich der Anwendungsentwicklung erreicht. Da ich an meiner vorherigen Schule Informatik als Zusatzfach gewählt habe, ist dies somit die Grundlage für meinen beruflichen Weg geworden.  An meiner jetzigen Schule verfolge ich diesen Weg weiter und möchte die Fachhochschulreife im Bereich IT-Systeme erreichen. Daher habe ich die Möglichkeit bekommen ein achtwöchiges Schülerpraktikum zu absolvieren. Das Team von pixeltricks beschäftigt sich mit Content Management, Shopsystemen, Portalsystemen, Consulting und Hosting.&lt;/p&gt;
&lt;p&gt;Vor meinem Praktikum hatte ich mir einige Gedanken gemacht, ob ich die ganze Arbeit leistungsmäßig mit meinen Computerkenntnissen schaffen kann. Ich habe es einfach auf mich zukommen gelassen.&lt;/p&gt;
&lt;p&gt;Nach meinem persönlichen Vorstellungsgespräch war ich bereit mein Praktikum zu beginnen. Als ich am ersten Tag ankam, wurde ich herzlichst begrüßt und dem Team vorgestellt.&lt;/p&gt;
&lt;hr/&gt;&lt;h2&gt;Auf die Plätze...&lt;/h2&gt;
&lt;p&gt;Danach konnte ich mich an meinem Arbeitsplatz einrichten. Patrick hatte mir geholfen, dass ich mich mit meinem zur Verfügung gestellten iMac zurecht finde. Zuerst durfte ich mir einige Einblicke in das Arbeiten der Web-Entwicklung verschaffen. Hier wird mit PHP gearbeitet. PHP ist eine Skriptsprache, die fast ausschließlich bei Webanwendungen verwendet wird.&lt;/p&gt;
&lt;p&gt;Am ersten Tag habe ich mich mit dem, auf &lt;a href=&quot;http://www.pixeltricks.de/blog/silverstripe-ist-das-flexibelste-content-management-system/&quot; target=&quot;_new&quot;&gt;SilverStripe&lt;/a&gt; aufbauenden, &lt;a href=&quot;http://silvercart.de&quot; target=&quot;_blank&quot;&gt;Webshop SilverCart&lt;/a&gt; vertraut gemacht und eine Übersicht inklusive Beschreibung aller Seitentypen erstellt.&lt;img class=&quot;left&quot; src=&quot;http://www.pixeltricks.de/assets/umlsilvercart.png&quot; alt=&quot;SilverCart Backend und UML 2 kompakt&quot; title=&quot;SilverCart Backend und UML 2 kompakt&quot; width=&quot;300&quot;/&gt;&lt;/p&gt;
&lt;p&gt;Für die kommenden Tage der ersten Woche hatte ich die Aufgabe eine Dokumentation über SilverCart zu schreiben,  die die einzelnen Arbeitsschritte im Backend von SilverStripe und SilverCart darstellt.  Dazu habe ich Screenshots angefertigt und an Roland weitergeleitet. Er verwendet diese,  um die Dokumentation für Anwender von SilverCart zu verbessern.&lt;/p&gt;
&lt;p&gt;Zu Beginn der zweiten Woche hatte ich mich mit UML vertraut gemacht.  UML (Unified Modeling Language) ist eine Modellierungssprache zum Festlegen von Beziehungen zwischen Klassen.  Anschließend hatte ich mit Hilfe von MySQL Workbench ein „EER Diagramm“,  zur SilverCart Version 1.0 erstellt und auf &lt;a href=&quot;http://www.silvercart.org&quot; target=&quot;_new&quot;&gt;www.silvercart.org&lt;/a&gt; veröffentlicht.&lt;/p&gt;
&lt;p&gt;Um den Demoshop von SilverCart mit Inhalt zu füllen, durfte ich mit der Digitalkamera von  Ramon Bilder von allen möglichen Sachen machen, welche pixeltricks beschreiben oder zum täglichen Arbeiten  benötigt werden.&lt;/p&gt;
&lt;p&gt;Anschließend erstellte ich passende Produkte im Demoshop und wies ihnen kreative Überschriften und kreative Artikelbeschreibungen zu. Nebenbei habe ich mehrere Produktgruppen für den Shop erstellt und alles zugeordnet.&lt;/p&gt;
&lt;hr/&gt;&lt;h2&gt;An die Arbeit&lt;/h2&gt;
&lt;p&gt;Ab der dritten Woche wurde ich dann in ein größeres Projekt mit einbezogen. Sascha und Sebastian haben mir geholfen, dass ich mich in Selenium IDE zurechtfinden werde. Selenium ist ein Programm, das Internetseiten testet und automatisch ablaufen lassen kann. Somit kann man Fehlerfälle und nicht erreichbare Seiten vermeiden.&lt;br/&gt; Dazu sollte ich &lt;a href=&quot;http://www.google.de/#hl=de&amp;amp;sa=X&amp;amp;ei=w9wWTt6WFs_B8QOQ38QO&amp;amp;ved=0CCMQBSgA&amp;amp;q=define%3A+use+cases&amp;amp;spell=1&amp;amp;bav=on.2,or.r_gc.r_pw.&amp;amp;fp=4e944cf36d1f2a2d&amp;amp;biw=1341&amp;amp;bih=753&quot; target=&quot;_new&quot;&gt; Use Cases&lt;/a&gt; definieren und den Vorgang beschreiben. An dieser Stelle möchte ich erwähnen,  dass ich die Aufgabe nicht richtig verstanden hatte. Ich hatte wie zuvor bei der Dokumentation den Arbeitsschritt des SilverCart Webshops beschrieben.  Jedoch sollte ich nicht aufschreiben was man mit den einzelnen Feldern macht, sondern wie die Use Case Sequenzen aufgebaut sind.  Alle pixeltrickser hatten sich die Zeit genommen mit mir zusammen die Use Case Sequenzen zu definieren,  damit ich dann die Selenium Tests umsetzen konnte. Jeder Selenium Test besteht aus mehreren Schritten,  die automatisiert ausgeführt werden können.&lt;/p&gt;
&lt;h4&gt;Ein Beispiel für eine Use Case Sequenz im Checkout Prozess:&lt;/h4&gt;
&lt;ol&gt;&lt;li&gt;Kunde gibt nur die Rechnungsadresse an&lt;/li&gt;
&lt;li&gt;Kunde wählt Zahlungsart, Vorkasse&lt;/li&gt;
&lt;li&gt;Kunde wählt Versandart&lt;/li&gt;
&lt;li&gt;Kunde geht zur Bestellübersicht&lt;/li&gt;
&lt;li&gt;Kunde schließt Bestellung ab&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;Dabei musste ich lernen, wie ein Programmierer zu denken.&lt;/p&gt;
&lt;p&gt;Damit ich die Tests vollständig durchführen konnte wurde das FireFox Plugin „Firebug“ installiert. Firebug wird bezüglich analysieren von HTML und CSS verwendet.  Mit Firebug kann man jedes einzelne Element auf der Internetseite untersuchen. Beim Herrausschreiben der „id‘s“ aller Container konnte ich mehr über &lt;a href=&quot;http://de.wikipedia.org/wiki/Object-Relational-Mapping&quot; target=&quot;_blank&quot;&gt;„ORM“  (object relational mapping)&lt;/a&gt; und das Architekturmuster, das bei SilverStripe verwendet wird, lernen.  Zu jedem Use Case Vorgang werden Suite Cases abgespeichert. Darin kann man jeden einzelnen Klick nachvollziehen.  Zwischendurch schaute ich Patrick beim Umsetzen eines Webdesigns mit HTML und CSS zu.&lt;/p&gt;
&lt;p&gt;In der fünften und sechsten Woche habe ich mir weitere Einblicke in die Webentwicklung verschafft.  Sebastian und Patrick haben mit der &lt;a href=&quot;http://www.netbeans.org&quot; target=&quot;_new&quot;&gt;NetBeans IDE&lt;/a&gt; weitere Funktionen für SilverStripe  programmiert.  Außerdem konnte ich den beiden beim Verwalten und Anlegen verschiedener Web-Hosting Pakete zusehen und habe mir erklären lassen,  wie dies funktioniert. Beim Erstellen und Zuordnen der symbolisierten Icons für SilverCart konnte ich meine eigene Meinung vertreten und eigene Ideen einbringen.&lt;/p&gt;
&lt;p&gt;Außerdem habe ich erfahren für was der Zeichensatz UTF-8 benötigt wird und ein &lt;a href=&quot;http://www.pixeltricks.de/blog/php-codesniffer-hook-fr-mercurial-unter-mac-os-x-10-6/&quot; target=&quot;_new&quot;&gt;Codesniffer&lt;/a&gt; für das Arbeiten im Team von hoher Bedeutung ist.&lt;/p&gt;
&lt;hr/&gt;&lt;h2&gt;Kekse!&lt;/h2&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.pixeltricks.de/assets/_resampled/resizedimage300232-zusammen.png&quot; alt=&quot;Kekse&quot; title=&quot;Kekse&quot; width=&quot;300&quot; height=&quot;232&quot;/&gt;Die Besprechungen in meinem Praktikum waren immer sehr angebracht. Auch über die &lt;a href=&quot;http://www.pixeltricks.de/blog/silvercart-praesentation-in-london/&quot; target=&quot;_new&quot;&gt;SilverCart-Präsentation in London&lt;/a&gt; wurde fleißig berichtet.&lt;br/&gt; Beim täglichen Mittagessen, das wir zusammen verbringen, besprechen wir aktuelle Themen und unserer Phantasie bezüglich Keksen sind  natürlich keine Grenzen gesetzt. Ich finde es gut, dass es einen Küchenplan gibt, mit dem man Essensvorschläge abgeben darf,  sonst müsste ich jeden Tag Pesto essen. ;-)&lt;/p&gt;
&lt;p&gt;Natürlich hatte ich auch Besuch von einem Lehrer meiner Schule. Ich zeigte Ihm, womit ich mich in meinem Praktikum beschäftigte. Er hatte einen sehr interessierten Eindruck hinterlassen.&lt;/p&gt;
&lt;p&gt;Gegen Ende meines Praktikums habe ich mich selbstständig durch die SelfHTML Touren durchgearbeitet, weil man HTML immer wieder gebrauchen kann. Rechts im Bild sind verschiedene Beispiele einer Farbpalette. &lt;img class=&quot;left&quot; src=&quot;http://www.pixeltricks.de/assets/_resampled/resizedimage227230-farbpalletterot.png&quot; alt=&quot;CSS Farbpallette&quot; title=&quot;CSS Farbpallette&quot; width=&quot;180&quot;/&gt;Die Beschriftungen zeigen, welchem Hexadezimalbereich von HTML und CSS die jeweiligen Farben entsprechen.&lt;/p&gt;
&lt;p&gt;Anfangs habe ich einfache Beispiele zur Übung rausgeschrieben. Anschließend habe ich mein Wissen weiter ausgebaut, indem ich dann einen tabellarischen Lebenslauf erstellt habe. Mit Unterstützung von meinem Praktikumsteam konnte ich dann CSS Befehle ausprobieren, einbauen und auf die kleinen Einzelheiten achten. Das Gestalten mit CSS finde ich sehr aufregend.&lt;/p&gt;
&lt;p&gt;Um den Quellcode zu bearbeiten habe ich Adobe Dreamweaver CS4 und TextWrangler benutzt. Dabei habe ich mehr darüber erfahren, wie wichtig es ist, dass der Quelltext sauber und auch für ScreenReader ausführlich umgesetzt ist. Somit ist sichergestellt, dass auch Sehbehinderte Menschen das Internet verwenden können. Beispiel: Alle Bilder mit der Eigenschaft „alt“ und „title“ pflegen. Diese werden von den ScreenReadern anschließend dem Nutzer vorgelesen. Oder was es mit den verschiedenen DPI Auflösungen zwischen Windows und Mac OS X auf sich hat.&lt;/p&gt;
&lt;p&gt;Abschließend habe ich die Aufgabe bekommen im Internet nach Firmen oder Agenturen zu recherchieren, die SilverStripe benutzen. Dabei bin ich auf etwa 150 verschiedene Adressen gestoßen. Es ist ausreichend sich die Meta-Tags im Seitenquelltext anzeigen zu lassen, um zu sehen, dass die Seite mit SilverStripe erstellt wurde.&lt;/p&gt;
&lt;p&gt;Gerne hätte ich mehr über PHP erfahren und beispielsweise kleine Aufgaben ausprobiert.&lt;/p&gt;
&lt;hr/&gt;&lt;h2&gt;Die Zeit vergeht...&lt;/h2&gt;
&lt;p&gt;&lt;img class=&quot;left&quot; src=&quot;http://www.pixeltricks.de/assets/tischfussball.png&quot; alt=&quot;Kicker&quot; title=&quot;Kicker&quot; width=&quot;300&quot;/&gt;Nachdem ich vor meinem Praktikum alles auf mich zukommen gelassen habe, kann ich jetzt sagen, dass ich sehr viel gelernt habe. Nun kann ich auch schwierige Aufgaben lösen. Wichtig finde ich, dass meine Arbeit anerkannt wird, sodass ihr sie weiter verwenden könnt. Ich habe gelernt, dass man zu großem Erfolg kommen kann, wenn man sich nur in die gestellten Aufgaben hineinversetzt und sich herantraut. Denn in meinem Praktikum habe ich jeden Tag sehr viele, neue Erfahrungen im Bereich der Anwendungsentwicklung gesammelt.&lt;/p&gt;
&lt;p&gt;Ich hoffe, dass das pixeltricks-Team gut mit mir zurecht gekommen ist, denn ich fand mein Praktikum bei euch sehr interessant und abwechslungsreich. Ich bin sehr zufrieden mit der ruhigen und lockeren Arbeitsweise bei pixeltricks, auch wenn nebenher einige schräg geschossene Tore fallen und Musik gehört wird. Es gibt immer etwas zum Lachen. Für eure Hilfsbereitschaft und dafür, dass ich mein Praktikum bei euch machen durfte, möchte ich mich bedanken.&lt;/p&gt;</description>
			<pubDate>Fri, 08 Jul 2011 11:49:40 +0200</pubDate>
			
			
			<guid>http://www.pixeltricks.de/blog/acht-wochen-praktikum-bei-pixeltricks/</guid>
		</item>
		
		<item>
			<title>SilverCart-Präsentation in London</title>
			<link>http://www.pixeltricks.de/blog/silvercart-praesentation-in-london/</link>
			<description>&lt;p&gt;Zusammen mit Roland werde ich am 23. Juni nach London zur UK SilverStripe CMS User Group fliegen.&lt;/p&gt;
&lt;p&gt;Vor einigen Wochen hat uns die &lt;a href=&quot;http://www.meetup.com/SilverStripeUK/events/17526177/&quot;&gt;UK SilverStripe CMS User Group&lt;/a&gt; in London eingeladen um unser &lt;a href=&quot;http://www.silvercart.de/&quot;&gt;SilverStripe E-Commerce Modul SilverCart&lt;/a&gt; zu präsentieren.&lt;/p&gt;
&lt;p&gt;Die 2009 gegründete UK SilverStripe CMS User Group ist mit über 100 Mitgliedern die weltweit größte SilverStripe User Group. Die SilverStripe User Group wurde von der englischen Agentur &lt;a href=&quot;http://www.gpmd.co.uk/&quot;&gt;GPMD&lt;/a&gt; initiiert. GPMD ist offizieller SilverStripe-Partner.&lt;/p&gt;
&lt;p&gt;Neben dem Werdegang des Unternehmens werden wir darstellen, warum wir uns für SilverStripe und für die Entwicklung von SilverCart entschieden haben. Nach der Live-Präsentation des Shopsystems (Store Front und Adminbereich) werden wir die Präsenation mit einem Ausblick auf die kommenden SilverCart-Versionen und einer Frage-Antwort-Runde beenden.&lt;/p&gt;
&lt;p&gt;Wir freuen uns auf darauf, viele neue begeisterte SilverStripe-Fans kennen zu lernen.&lt;/p&gt;
&lt;p&gt;Weitere Informationen zur Veranstaltung gibt es unter &lt;a href=&quot;http://www.meetup.com/SilverStripeUK/events/17526177/&quot;&gt;http://www.meetup.com/SilverStripeUK/events/17526177/&lt;/a&gt;&lt;/p&gt;</description>
			<pubDate>Mon, 20 Jun 2011 17:13:21 +0200</pubDate>
			
			
			<guid>http://www.pixeltricks.de/blog/silvercart-praesentation-in-london/</guid>
		</item>
		
		<item>
			<title>Kommasetzung im Englischen</title>
			<link>http://www.pixeltricks.de/blog/kommasetzung-im-englischen/</link>
			<description>&lt;p&gt;In letzter Zeit schreibe ich vermehrt Blogbeiträge und Dokumentationssteiten in englischer Sprache für &lt;a title=&quot;Link zur Seite silvercart.org&quot; href=&quot;http://silvercart.org&quot; target=&quot;_blank&quot;&gt;silvercart.org&lt;/a&gt;.  Dabei werden meine Lücken in englischer Rechtschreibung deutlich. Unsere qualitativen Ansprüche an unseren Code sollen natürlich auch durch das Sprachliche verdeutlicht werden.&lt;/p&gt;
&lt;p&gt;Hier einmal die wichtigsten Regeln zur Kommasetzung im Englischen:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Nach Anreden: „Dear John,“. Bei geschäftlicher Korrespondenz wird im Englischen auf das Komma verzichtet, im Amerikanischen wird statt des Kommas ein Doppelpunkt gesetzt.&lt;/li&gt;
&lt;li&gt;Beginnt ein if-Satz mit if, ist ein Komma notwendig: „If i would be rich, I would do the same things I am doing today.“&lt;/li&gt;
&lt;li&gt;Nach einem Infinitiv am Satzanfang folgt ein Komma: „To enlarge his skills as a programmer, he examines each and every bugfix.“&lt;/li&gt;
&lt;li&gt;Einschübe werden durch Komma kenntlich gemacht, wenn sie für das Verständnis nicht relevant sind: „Jim Meyer, who works in London, invited me to his birthday party.“&lt;/li&gt;
&lt;li&gt;Please wird am Ende des Satzes durch Komma getrennt: „Give me all Your money, please.“&lt;/li&gt;
&lt;li&gt;Question Tags werden immer durch Komma getrennt: „She is very good looking, isn‘t she?“&lt;/li&gt;
&lt;li&gt;Aufzählungen werden durch Komma kenntlich gemacht: „I like flowers, ice cream, soccer and my bike.“&lt;/li&gt;
&lt;li&gt;Hauptsätze werden durch Komma geteilt: „I had a terrible headache, and my windows machine broke down the third time today.“&lt;/li&gt;
&lt;li&gt;Viele Adverbien verlangen ein anschließendes Komma, wenn sie am Satzanfang stehen: „Furthermore, I told him to do so!“ Wenn sie in der Satzmitte stehen, werden sie sogar von Kommas eingefasst: „Michael, instead, told me about his father‘s accident.“&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;So jetzt muss ich erst einmal meine ganzen alten Artikel überarbeiten ;)&lt;/div&gt;</description>
			<pubDate>Wed, 08 Jun 2011 12:52:07 +0200</pubDate>
			
			
			<guid>http://www.pixeltricks.de/blog/kommasetzung-im-englischen/</guid>
		</item>
		
		<item>
			<title>Wir feiern SilverCart 1.0</title>
			<link>http://www.pixeltricks.de/blog/wir-feiern-silvercart-1-0/</link>
			<description>&lt;p&gt;Dass wir an unserer eigenen Shopsoftware SilverCart arbeiten war ja nun schon seit einigen Monaten ein offenes Geheimnis. &lt;a href=&quot;http://silvercart.de&quot;&gt;SilverCart&lt;/a&gt; basiert auf dem CMS SilverStripe und dem PHP-Framework Sapphire&lt;/p&gt;
&lt;p&gt;Vor etwa 3 Monaten haben wir &lt;a href=&quot;http://silvercart.de&quot;&gt;SilverCart&lt;/a&gt; 0.9 veröffentlicht. In kurzen Abständen folgten Release candidates RC1, RC2 und RC3. Soeben haben wir die endgültige Version 1.0 veröffentlicht. Dieser Meilenstein muss natürlich gebührend gefeiert werden, weshalb wir uns jetzt zurückziehen um diesen Erfolg gebührend mit einem kleinen Grillfest zu feiern.&lt;/p&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;p&gt;  &lt;/p&gt;</description>
			<pubDate>Tue, 24 May 2011 15:41:26 +0200</pubDate>
			
			
			<guid>http://www.pixeltricks.de/blog/wir-feiern-silvercart-1-0/</guid>
		</item>
		
		<item>
			<title>SilverStripe und PHPUnit</title>
			<link>http://www.pixeltricks.de/blog/silverstripe-und-phpunit/</link>
			<description>&lt;p&gt;In meinem Leben als Programmierer gibt es einige Dinge, die ich unbedingt lernen wollte, im Tagesgeschäft aber nie Zeit dazu hatte. Jetzt über die Osterfeiertage habe ich endlich einmal Muße und kann mich dem Thema PHPUnit zuwenden.&lt;/p&gt;
&lt;p&gt;Das CMS und das Framework Sapphire von SilverStripe besitzen zusammen schon an die 150 Testklassen mit 2 bis 10 Tests, die die Methoden der Klassen auf ihre korrekte Funktionalität hin prüfen. Es gibt in der &lt;a title=&quot;Link zur SilverStripe Doku zu Unit Tests&quot; href=&quot;http://doc.silverstripe.org/sapphire/en/topics/testing/index&quot; target=&quot;_blank&quot;&gt;SilverStripe Doku auch eine kurze Einführung zu PHPUnit&lt;/a&gt;, oder besser gesagt zu dessen Implementierung in SilverStripe. Allerdings liegen die Tücken wie so oft in den Details und diese spart die Doku dann doch eher aus. Genau an dieser Stelle soll mein kleiner Artikel ins Spiel kommen und dem geneigten Leser einen Informationsvorsprung bieten, den ich selbst nicht hatte.&lt;/p&gt;
&lt;p&gt;Ich habe keine Ahnung, wie man PHPUnit auf einem Server installiert, diese Arbeit hat mir dankenswerterweise &lt;a href=&quot;http://www.pixeltricks.de/unternehmen/team/sebastian-diel/#http://www.pixeltricks.de/unternehmen/team/sebastian-diel/&quot; target=&quot;_blank&quot;&gt;Sebastian&lt;/a&gt; abgenommen. Ich gehe bei meinen Ausführungen einfach davon aus, dass PHPUnit installiert ist, sonst läuft nämlich goanix.&lt;/p&gt;
&lt;h3&gt;Konvention vor Konfiguration&lt;/h3&gt;
&lt;p&gt;&quot;Convention over Configuration&quot;, nach diesem Prinzip funktioniert das Erstellen von Unit-Tests mit SilverStripe Bordmitteln. Neue Tests werden von der Klasse SapphireTest abgeleitet und im Verzeichnis &quot;tests&quot; in einem Modul oder im Projektverzeichnis abgelegt. Zu jeder Testklasse kann man eine YAML-Datei anlegen, in der die Testobjekte definiert werden. Man muss nämlich wissen, dass bei einem Testlauf nicht die Datenbank der Installation benutzt wird, sondern eine temporäre Datenbank erzeugt wird. Dies hat zwar den Vorteil, dass die Konfiguration und der Zustand der Installation nicht verändert werden, erfordert aber eine Definition aller Objekte, die während des Tests benötigt werden.&lt;/p&gt;
&lt;h3&gt;Auf die Plätze, fertig, ...&lt;/h3&gt;
&lt;p&gt;Ein SapphireTest lässt sich auf unterschiedliche Weise ansteuern. Ãœber den Aufruf der URL [www.mysite.de]/dev/tests bekommt man eine Ãœbersicht aller verfügbarer Tests. Mit  [www.mysite.de]/dev/tests/all kann man diese sukzessive Ablaufen lassen. Hier kann es zum Timeout des Servers kommen, ein einziger Test kann nämlich eine Sekunde und länger dauern. Mit  [www.mysite.de]/dev/tests/[TestKlasse] kann eine einzelne Testklasse aufgerufen werden, zum Entwickeln eines Test sehr nützlich. Nachdem ich einen halben Tag mit Sapphiretests experimentiert hatte, hatte ich so an die 50 Testdatenbanken unwissentlich erzeugt. Diese erkennt man immer am Namen &quot;tmpdb&quot; konkatiniert mit einer siebenstelligen Zufallszahl. Nach Abschluss der Testerei kann man diese mit  [www.mysite.de]/dev/tests/cleanupdb auf einen Schlag löschen.&lt;/p&gt;
&lt;h3&gt;Jetzt aber mal Butter bei die Fische&lt;/h3&gt;
&lt;p&gt;Ich will als keines Beispiel den Entwicklungsweg zu den ersten Tests für unser geliebtes Modul &lt;a title=&quot;Link zur Seite von Silvercart&quot; href=&quot;http://silvercart.org&quot; target=&quot;_blank&quot;&gt;SilverCart&lt;/a&gt; heranziehen. Ich habe mit Test für die Klasse SilvercartProduct begonnen. Ein Test untersucht immer das Verhalten einer Methode. Führt diese Manipulationen eines Objektes richtig aus? Liefert diese den richtigen Rückgabewert und diese hoffentlich für viele verschiedene Parameter? Eine Testmethode muss gemäß der Konvention immer mit dem Namenspräfix &quot;test&quot; beginnen.&lt;/p&gt;
&lt;p&gt;Als Erstes will ich das Verhalten eines Setters und eines Getter untersuchen:&lt;/p&gt;
&lt;pre&gt;/**
     * get all required attributes as an array.
     *
     * @return array the attributes required to display an product in the frontend
     * @author Roland Lehmann 
     * @since 23.10.2010
     */
    public static function getRequiredAttributes() {
        return self::$requiredAttributes;
    }

    /**
     * define all attributes that must be filled out to show products in the frontend.
     *
     * @param string $concatinatedAttributesString a string with all attribute names, seperated by comma, with or without whitespaces
     *
     * @since 23.10.2010
     * @return void
     * @author Roland Lehmann
     */
    public static function setRequiredAttributes($concatinatedAttributesString) {
        $requiredAttributesArray = array();
        $requiredAttributesArray = explode(&quot;,&quot;, str_replace(&quot; &quot;, &quot;&quot;, $concatinatedAttributesString));
        self::$requiredAttributes = $requiredAttributesArray;
    }
&lt;/pre&gt;
&lt;p&gt;Mit Hilfe des Setters sollen Pflichtattribute von Produkten definiert werden. Sind diese Attribute nicht gepflegt, werden die Produkte im Frontend nicht angezeigt. Der Test dazu sieht dann wie folgt aus:&lt;/p&gt;
&lt;pre&gt;class SilvercartProductTest extends SapphireTest {
    
    public static $fixture_file = 'silvercart/tests/SilvercartProductTest.yml';

/**
     * tests the reqired attributes system for products
     * 
     * @author Roland Lehmann 
     * @since 28.4.2011
     * @return void
     */
    public function testRequiredAttributes() {
        
        //two attributes
        SilvercartProduct::setRequiredAttributes(&quot;Price, Weight&quot;);
        $attributes = SilvercartProduct::getRequiredAttributes();
        $this-&amp;gt;assertEquals(array(&quot;Price&quot;, &quot;Weight&quot;), $attributes, &quot;Something went wrong setting two required attributes.&quot;);
        
        //four attributes
        SilvercartProduct::setRequiredAttributes(&quot;Price, Weight, ShortDescription, LongDescription&quot;);
        $attributes = SilvercartProduct::getRequiredAttributes();
        $this-&amp;gt;assertEquals(array(&quot;Price&quot;, &quot;Weight&quot;, &quot;ShortDescription&quot;, &quot;LongDescription&quot;), $attributes, &quot;Something went wrong setting four required attributes.&quot;);
    }
}&lt;/pre&gt;
&lt;p&gt;Im Test werden jetzt erst einmal die beiden Attribute &quot;Price&quot; und &quot;Weight&quot; gesetzt. Dann werden sie mit Hilfe des Getters wieder geladen. Wir nehmen jetzt natürlich an, dass der Getter die Attribute &quot;Price&quot; und &quot;Weight&quot; in einem Array zurückliefert. Diese Annahme wird mit $this-&amp;gt;assertEquals() in Code gegossen. Deren erster Parameter ist der erwartete Wert, der mit dem zweiten Parameter, dem tatsächlichen Wert verglichen wird. Falls die Annahme falsch ist, gilt der Test als fehlgeschlagen und der dritte Parameter wird als Fehlermeldung ausgegeben. Ein Test ist nur dann erfolgreich, wenn &lt;strong&gt;alle&lt;/strong&gt; seine Annahmen (engl. asserts) richtig sind.&lt;/p&gt;
&lt;h3&gt;Crash Test Dummies&lt;/h3&gt;
&lt;p&gt;In diesem Beispiel werden jetzt Testobjekte verwendet. Diese werden, wie schon gesagt, in einer YAML-Datei definiert. Der Code dazu ist wirklich minimalistisch:&lt;/p&gt;
&lt;pre&gt;SilvercartTax:
    VAT19:
        Title: 19%
        Rate: 19
        
SilvercartProduct:
    ProductWithPrice:
        isFreeOfCharge: 0
        Title: Product with price
        ShortDescription: This is the short description of the product with price
        LongDescription: This is the long description of the product with price
        isActive: 1
        PriceNetAmount: 90.00
        PriceNetCurrency: EUR
        PriceGrossAmount: 99.99
        PriceGrossCurrency: EUR
        SilvercartTax: =&amp;gt;SilvercartTax.VAT19
&lt;/pre&gt;
&lt;p&gt;Auf der ersten Ebene wird die Klasse (SilvercartTax) definiert, von der Objekte erzeugt werden. Die zweite Ebene ist der Identifikator eines Objekts, der in SilverStripe ja eigentlich die ID ist. Dazu aber gleich noch mehr. Auf der dritten Ebene werden Werte von Objektattributen (Title: 19%) oder Objektrelationen (SilvercartTax: =&amp;gt;SilvercartTax.VAT19) definiert. Bei einer Relation funktioniert das immer so:&lt;/p&gt;
&lt;pre&gt;NameDerRelation: =&amp;gt;[Klassenname].[Identifikator]&lt;/pre&gt;
&lt;p&gt;Das SilvercartTax-Objekt muss in der YAML-Datei vor dem SilvercartProduct-Objekt stehen. Dieses Prinzip gilt für alle Relationen.&lt;/p&gt;
&lt;p&gt;Jetzt aber zum eigentlichen Test mit Objekten. Der Test testGetTaxRate()&lt;/p&gt;
&lt;pre&gt;     /**
     * Is tax rate returned correctly?
     * 
     * @author Roland Lehmann 
     * @since 24.4.2011
     * @return void
     */
    public function testGetTaxRate() {
        $productWithTax = $this-&amp;gt;objFromFixture(&quot;SilvercartProduct&quot;, &quot;ProductWithPrice&quot;);
        $taxRate = $productWithTax-&amp;gt;getTaxRate();
        $this-&amp;gt;assertEquals(19, $taxRate, &quot;The tax rate is not correct.&quot;);
    }
&lt;/pre&gt;
&lt;p&gt;soll die Methode getTaxRate()&lt;/p&gt;
&lt;pre&gt;    /**
     * Returns the tax rate in percent. The attribute 'Rate' of the relation
     * 'SilvercartTax' is not used to handle with complex tax systems without
     * clearly defined product taxes.
     *
     * @return float the tax rate in percent
     *
     * @author Sebastian Diel 
     * @since 23.03.2011
     */
    public function getTaxRate() {
        return $this-&amp;gt;SilvercartTax()-&amp;gt;getTaxRate();
    }
&lt;/pre&gt;
&lt;p&gt;auf ihre korrekte Funktion hin überprüfen. Mit Hilfe der Methode objFromFixture() wird jetzt ein Produkt geladen, das in der YAML-Datei definiert wurde. Der erste Parameter steht für die Klasse, der zweite für den Identifikator des Objekts. Dieser Test ist an sich nicht besonders sinnvoll, prüft er doch lediglich das Ansprechen von Relationen. Dafür gibt es sicherlich einen Test im Framework. Er verdeutlicht aber hoffentlich den Umgang mit Objekten.&lt;/p&gt;
&lt;h3&gt;Das nur am Rande&lt;/h3&gt;
&lt;p&gt;Für den ein oder anderen ist es vielleicht wichtig zu wissen, dass während eines Tests ein Admin User erzeugt und eingeloggt wird. Dies geschieht irgendwo in der Methode  runTests() der Klasse TestRunner. Da viele der Methoden unseres SilverCart-Moduls auf die Klasse des eingeloggten Nutzers reagieren, ist das wichtig zu wissen.&lt;/p&gt;
&lt;p&gt;Beim Laden eines Objekts mit $obj = DataObject::get_one() ist man es ja gewohnt, dass Manipulationen an Attributen und Relationen auch an $obj stattfinden. Läd man ein Objekt aus der YAML-Datei mit $this-&amp;gt;objFromFixture(), ist das nicht der Fall:&lt;/p&gt;
&lt;pre&gt;        $productWithPrice = $this-&amp;gt;objFromFixture(&quot;SilvercartProduct&quot;, &quot;ProductWithPrice&quot;);
        $productWithPrice-&amp;gt;addToCart($cart-&amp;gt;ID, 2);
        $cartPosition = $this-&amp;gt;objFromFixture(&quot;SilvercartShoppingCartPosition&quot;, &quot;ShoppingCartPosition&quot;);
        $position = DataObject::get_by_id(&quot;SilvercartShoppingCartPosition&quot;, $cartPosition-&amp;gt;ID);
        $this-&amp;gt;assertEquals(3, $position-&amp;gt;Quantity, &quot;The quantity of the overwritten shopping cart position is incorrect.&quot;);
&lt;/pre&gt;
&lt;p&gt;Im Codebeispiel wird ein Produkt geladen und in den Einkaufswagen gelegt. Da es schon eine Position mit diesem Produkt gibt, wird deren Anzahl (Quantity) von 1 auf 3 erhöht. Die Position muss aber mit DataObject::get_one() neu geladen werden, da sich $cartPosition-&amp;gt;Quantity nicht manipulieren lässt. $cartPosition hat immer die in der YAML-Datei definierten Werte.&lt;/p&gt;</description>
			<pubDate>Sun, 24 Apr 2011 23:02:43 +0200</pubDate>
			
			
			<guid>http://www.pixeltricks.de/blog/silverstripe-und-phpunit/</guid>
		</item>
		
		<item>
			<title>Wer (y)A(ml) sagt, muss auch B sagen</title>
			<link>http://www.pixeltricks.de/blog/wer-yaml-sagt-muss-auch-b-sagen/</link>
			<description>&lt;p&gt;YAML ist unser hochgeschätztes CSS Framework, bitte nie wieder ohne! Wie man YAML und SilverStripe vereint, haben wir schon &lt;a title=&quot;Installation von YAML in SilverStripe&quot; href=&quot;http://www.pixeltricks.de/blog/installation-von-yaml-in-silverstripe/&quot;&gt;in einem unserer Blogbeiträge gezeigt.&lt;/a&gt; YAML hat bezüglich Formularen sehr genaue Anforderungen an das Markup, denen SilverStripe von Haus aus nicht gerecht wird. Da werden zum Beispiel &amp;lt;input&amp;gt; Felder in &amp;lt;div&amp;gt; geschachtet. Wer das ändern möchte, muss tief in die Trickkiste greifen. Aber uns ist ja bekanntlich kein Trick zu schwer ;-)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.pixeltricks.de/unternehmen/team/sascha-koehler/&quot;&gt;Sascha&lt;/a&gt; hat en passent ein Modul für SilverStripe entwickelt, das er CustomHtmlForm genannt hat. Einmal installiert bietet es dem Programmierer mittels Templates volle Kontrolle über das Markup und verändert den Umgang mit JavaScript.&lt;/p&gt;
&lt;p&gt;Im folgenden Beispiel will ich den Weg zu einem Kontaktformular beschreiben. Jedes Formular hat eine eigene Klasse und mit dieser fange ich jetzt an:&lt;/p&gt;
&lt;pre&gt;class ContactForm extends CustomHtmlForm {&lt;br/&gt;&lt;br/&gt;    protected $formFields = array(&lt;br/&gt;        'Name' =&amp;gt; array(&lt;br/&gt;            'type' =&amp;gt; 'TextField',&lt;br/&gt;            'title' =&amp;gt; 'Name',&lt;br/&gt;            'checkRequirements' =&amp;gt; array(&lt;br/&gt;                'isFilledIn' =&amp;gt; true,&lt;br/&gt;                'hasMinLength' =&amp;gt; 3&lt;br/&gt;            )&lt;br/&gt;        ),&lt;br/&gt;        'Email' =&amp;gt; array(&lt;br/&gt;            'type' =&amp;gt; 'TextField',&lt;br/&gt;            'title' =&amp;gt; 'Email Adresse',&lt;br/&gt;            'value' =&amp;gt; '',&lt;br/&gt;            'checkRequirements' =&amp;gt; array(&lt;br/&gt;                'isFilledIn' =&amp;gt; true,&lt;br/&gt;                'isEmailAddress' =&amp;gt; true&lt;br/&gt;            )&lt;br/&gt;        ),&lt;br/&gt;        'Message' =&amp;gt; array(&lt;br/&gt;            'type' =&amp;gt; 'TextareaField',&lt;br/&gt;            'title' =&amp;gt; 'Nachricht',&lt;br/&gt;            'checkRequirements' =&amp;gt; array&lt;br/&gt;                (&lt;br/&gt;                'isFilledIn' =&amp;gt; true,&lt;br/&gt;                'hasMinLength' =&amp;gt; 3&lt;br/&gt;            )&lt;br/&gt;        )&lt;br/&gt;    );&lt;br/&gt;&lt;br/&gt;    protected $preferences = array(&lt;br/&gt;        'submitButtonTitle' =&amp;gt; 'absenden'&lt;br/&gt;    );&lt;br/&gt;&lt;br/&gt;    protected function fillInFieldValues() {&lt;br/&gt;        $member = Member::currentUser();&lt;br/&gt;        if ($member) {&lt;br/&gt;            $this-&amp;gt;formFields['Name']['value'] = $member-&amp;gt;Surname;&lt;br/&gt;            $this-&amp;gt;formFields['Email']['value'] = $member-&amp;gt;Email;&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    protected function submitSuccess($data, $form, $formData) {&lt;br/&gt;&lt;br/&gt;        $email = new Email(&lt;br/&gt;                        'info@pourlatable.de',&lt;br/&gt;                        'rlehmann@pixeltricks.de',&lt;br/&gt;                        'Kontaktformular Anfrage',&lt;br/&gt;                        ''&lt;br/&gt;        );&lt;br/&gt;&lt;br/&gt;        $email-&amp;gt;setTemplate('MailContact');&lt;br/&gt;        $email-&amp;gt;populateTemplate(&lt;br/&gt;                array(&lt;br/&gt;                    'Name' =&amp;gt; $formData['Name'],&lt;br/&gt;                    'Email' =&amp;gt; $formData['Email'],&lt;br/&gt;                    'Message' =&amp;gt; str_replace('\r\n', '&amp;lt;br&amp;gt;', nl2br($formData['Message']))&lt;br/&gt;                )&lt;br/&gt;        );&lt;br/&gt;&lt;br/&gt;        $email-&amp;gt;send();&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;}&lt;/pre&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;p&gt;Im Array $formFields werden die Felder des Formulars definiert. „Name“ ist der Identifier des Formularfeldes, „type“ ist der SilverStripe Feldtyp und „title“ ist die Beschriftung des Feldes. Mit „checkRequirements“ kann man eine Reihe von Validierungsmethoden konfigurieren. Es gibt zur Zeit die Methoden hasSpecialSigns, isEmailAddress, isCurrency, isDate, isFilledIn, isFilledInDependantOn, isNumbersOnly, hasMinLength, hasLength, mustEqual, mustNotEqual.&lt;/p&gt;
&lt;p&gt;Im Array $preferences wird hier nur die Beschriftung des Submit Buttons festgelegt.&lt;/p&gt;
&lt;p&gt;Die Methode fillInFieldValues() dient zum Befüllen der Eingabefelder. Im Bespiel werden die Felder „Name“ und „Email“ mit den entsprechenden Werten eines eingeloggten Nutzers befüllt.&lt;/p&gt;
&lt;p&gt;Die Methode submitSuccess() wird aufgerufen, wenn keine Validierungsfehler aufbetreten sind. Im Gegensatz zur herkömmichen Action-Methode eines SilverStripe Formulars wird hier noch das Array $formData mitgeführt, das die Formulareingaben enthällt.&lt;/p&gt;
&lt;p&gt;So, das Formular brauch jetzt noch ein Template und muss in einen Controller implementiert werden. Ich fange mit dem „CustomHtmlForm“-atierten Template an. Es wird unter themes/blackcandy/templates/layout/ abgespeichert:&lt;/p&gt;
&lt;pre&gt;&amp;lt;% if IncludeFormTag %&amp;gt;&lt;br/&gt;&amp;lt;form class=&quot;yform&quot; $FormAttributes &amp;gt;&lt;br/&gt;&amp;lt;% end_if %&amp;gt;&lt;br/&gt;&lt;br/&gt;      $CustomHtmlFormMetadata&lt;br/&gt;&lt;br/&gt;      &amp;lt;fieldset&amp;gt;&lt;br/&gt;        &amp;lt;legend&amp;gt;Kontaktformular&amp;lt;/legend&amp;gt;&lt;br/&gt;        &amp;lt;div class=&quot;subcolumns&quot;&amp;gt;&lt;br/&gt;            &amp;lt;div class=&quot;c50l&quot;&amp;gt;&lt;br/&gt;                &amp;lt;div class=&quot;subcl&quot;&amp;gt;&lt;br/&gt;                    $CustomHtmlFormFieldByName(Name)&lt;br/&gt;                &amp;lt;/div&amp;gt;&lt;br/&gt;            &amp;lt;/div&amp;gt;&lt;br/&gt;            &amp;lt;div class=&quot;c50r&quot;&amp;gt;&lt;br/&gt;                &amp;lt;div class=&quot;subcr&quot;&amp;gt;&lt;br/&gt;                    $CustomHtmlFormFieldByName(Email)&lt;br/&gt;                &amp;lt;/div&amp;gt;&lt;br/&gt;            &amp;lt;/div&amp;gt;&lt;br/&gt;        &amp;lt;/div&amp;gt;&lt;br/&gt;        $CustomHtmlFormFieldByName(Message)&lt;br/&gt;    &amp;lt;/fieldset&amp;gt;&lt;br/&gt;&lt;br/&gt;    &amp;lt;div class=&quot;actionRow&quot;&amp;gt;&lt;br/&gt;        &amp;lt;div class=&quot;type-button&quot;&amp;gt;&lt;br/&gt;            &amp;lt;% control Actions %&amp;gt;&lt;br/&gt;            $Field&lt;br/&gt;            &amp;lt;% end_control %&amp;gt;&lt;br/&gt;        &amp;lt;/div&amp;gt;&lt;br/&gt;    &amp;lt;/div&amp;gt;&lt;br/&gt;&amp;lt;% if IncludeFormTag %&amp;gt;&lt;br/&gt;&amp;lt;/form&amp;gt;&lt;br/&gt;&amp;lt;% end_if %&amp;gt;&lt;br/&gt;&lt;/pre&gt;
&lt;div&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span style=&quot;line-height: 18px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;line-height: normal;&quot;&gt;
&lt;p&gt;Das Formular ist auf YAML-Art gestaltet. Mit $CustomHtmlFormFieldByName() werden die einzelnen Felder eingebaut. Der Parameter ist der Identifier des Feldes. Zum restlichen Zauber kann ich nicht viel sagen, das muss euch Sascha näher bringen ;)&lt;/p&gt;
&lt;p&gt;Jetzt muss das Formular noch in einem Controller „angemeldet“ und aufgerufen werden. Das geschieht in der init() Methode des Controllers:&lt;/p&gt;
&lt;pre&gt;&lt;span style=&quot;font-family: Verdana, Lucida, Arial, sans-serif;&quot;&gt;public function init() {&lt;br/&gt;        $this-&amp;gt;registerCustomHtmlForm('ContactForm', new ContactForm($this));&lt;br/&gt;        parent::init();&lt;br/&gt;    }&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Der Aufruf im Template des Controllers findet dann durch&lt;/p&gt;
&lt;pre&gt;&lt;span style=&quot;font-family: Verdana, Lucida, Arial, sans-serif;&quot;&gt;$InsertCustomHtmlForm(ContactForm)&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;statt. So einfach geht das mit SilverStripe, ein wenig pixeltricks und unserem Modul CustomHtmlForm.&lt;/p&gt;
&lt;p&gt;Das Modul CustomHtmlForm kann &lt;a title=&quot;Das CustomHtmlForm-Module für SilverStripe herunterladen&quot; href=&quot;https://bitbucket.org/silvercart/customhtmlform/overview&quot;&gt;hier auf bitbucket&lt;/a&gt; heruntergeladen werden.&lt;/p&gt;
&lt;p&gt;Die (nur auf englisch verfügbare) API-Dokumentation ist &lt;a title=&quot;API-Docs für CustomHtmlForm-Module für SilverStripe herunterladen&quot; href=&quot;http://doc.silvercart.org/modules/other/customhtmlform/1.0/&quot;&gt;hier auf unserer SilverCart-Projektseite&lt;/a&gt;.&lt;/p&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;</description>
			<pubDate>Tue, 05 Apr 2011 21:08:39 +0200</pubDate>
			
			
			<guid>http://www.pixeltricks.de/blog/wer-yaml-sagt-muss-auch-b-sagen/</guid>
		</item>
		
		<item>
			<title>SilverStripe 3: Roadmap Preview</title>
			<link>http://www.pixeltricks.de/blog/silverstripe-3-roadmap-preview/</link>
			<description>&lt;p&gt;Es gibt erste Informationen über die sehnsüchtig erwartete Version 3 des Open Source CMS Frameworks SilverStripe.&lt;/p&gt;
&lt;p&gt;Seit SilverStripe im Jahre 2007 in der Version 2.0 veröffentlicht wurde, sprang der Versionszähler jährlich um einen Minor-Release nach oben. Letztlich wurde 2010 die Version 2.4 veröffentlicht. Laut der Roadmap soll die Finale 3.0 noch in diesem Jahr veröffentlicht werden; eine Alpha-Version wird bis Mitte des Jahres erwartet.&lt;/p&gt;
&lt;h2&gt;Was wird uns SilverStripe 3.0 bringen?&lt;/h2&gt;
&lt;p&gt;Zunächst einmal soll das Backend der 3.0 für Entwickler einfacher anzupassen sein. Das ist der richtige Schritt, denn während einfache Dinge auch wirklich einfach sind, verlangen schwierige Dinge einen wirklich tiefen Griff in die Trickkiste.&lt;/p&gt;
&lt;p&gt;Die Entwicklungsfortschritte sollen weiterhin für jeden transparent sein. Backlog und Ticket-Stati sind nach wie vor auf &lt;a href=&quot;http://open.silverstripe.org/&quot;&gt;open.silverstripe.org&lt;/a&gt; ersichtlich.&lt;/p&gt;
&lt;p&gt;Es soll bei kurzen Zyklen (um nicht zu sagen: Sprints) bleiben, die ein meßbares Ziel haben. Kollaboration und dezentrale Entwicklung nach wie vor über github.com.&lt;/p&gt;
&lt;p&gt;Die (aus meiner Sicht) wichtigsten Aspekte:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Das ORM soll flexibler werden.&lt;/li&gt;
&lt;li&gt;Der Sapphire Core soll vom CMS getrennt werden&lt;/li&gt;
&lt;li&gt;UI des CMS soll schrittweise verbessert werden&lt;/li&gt;
&lt;li&gt;Inline Editing wird es (noch) nicht geben.&lt;/li&gt;
&lt;li&gt;Template flexibler: mehr als 2 Argumente im &amp;lt;% if %&amp;gt;&lt;/li&gt;
&lt;li&gt;Performanz, Datenbankabfragen sollen verbessert werden&lt;/li&gt;
&lt;li&gt;Es soll weniger statische Methodenaufrufe geben, dafür mehr &lt;a href=&quot;http://www.pixeltricks.de/blog/dependency-injection/&quot;&gt;Depency Injection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Konfiguration wie gehabt durch Entwickler im Code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Datenbank: Fremdschlüssel und Contraints &lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;verbessertes Modulmanagement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;versionerbare Assets (Bilder und Dokumente) mit einem verbesserten Workflow&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Ich finde die Roadmap sehr überzeugend. Es ist schön zu sehen, dass die Entwickler von SilverStripe dort anpacken, wo es nötig ist und nicht dort, wo es für die Marketingabteilung zweckmässiger ist.&lt;/p&gt;
&lt;p&gt;Es schein eine stetige und sinnvolle Weiterentwicklung zu werden und kein &quot;Big-Bang-Release&quot;.&lt;/p&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;p&gt;Herzlichen Dank, SilverStripe :-)&lt;/p&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;p&gt;Quelle: &lt;a href=&quot;http://prezi.com/lr3lmrgdhlgj/silverstripe-3-roadmap-preview/&quot;&gt;SilverStripe 3: Roadmap Preview by Ingo Schommer&lt;/a&gt;&lt;/p&gt;</description>
			<pubDate>Thu, 17 Feb 2011 15:51:28 +0100</pubDate>
			
			
			<guid>http://www.pixeltricks.de/blog/silverstripe-3-roadmap-preview/</guid>
		</item>
		
		<item>
			<title>Mit SilverStripe nach Babylon II</title>
			<link>http://www.pixeltricks.de/blog/mit-silverstripe-nach-babylon-2/</link>
			<description>&lt;p&gt;Zur Zeit entwickele ich zusammen mit Sascha und Sebastian ein SilverStripe-Modul, das kurz vor der Veröffentlichung steht. Einer der letzten Schritte ist die Implementierung der Mehrsprachigkeit. Dazu müssen allte Texte und Wörter aus Klassen und Templates, die im Frontend oder Backend erscheinen, durch eine Funktion ersetzt werden. Diese Funktion(_t()) setzt je nach eingestellter Sprache dann die passenden Sprachkonstanten ein.&lt;/p&gt;
&lt;h3&gt;Text Collector&lt;/h3&gt;
&lt;p&gt;Die erste Hürde, die es dabei zu nehmen gilt, ist der innere Schweinehund, denn bei diesem Arbeitsschritt handelt es sich größtenteils um eine Fleißarbeit. Jetzt da ich fertig bin, habe ich über 600 mal Text durch die _t()-Funktion ersetzt. Hilfe gibt es beim Erstellen der Sprachkonstanten vom &quot;Text Collector&quot;. Dieser liest die Aufrufe der _t()-Funktion in allen Templates und Klassen und erstellt eine entsprechende Zeile in der Datei /lang/de_DE.php, dem sogenannten Sprachpaket. Der Text Collector wird mit folgender URL aufgerufen:&lt;/p&gt;
&lt;pre&gt;&lt;span style=&quot;font-family: Verdana, Lucida, Arial, sans-serif;&quot;&gt;http://&amp;lt;mysite&amp;gt;/dev/tasks/i18nTextCollectorTask/?module=&amp;lt;modulename&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Da ich zum ersten mal mit dem Text Collector gearbeitet hatte, wusste ich nicht, dass er dass Sprachpaket der in der _config.php eingestellten Standardsprache beschreibt, denn ich hatte dummerweise alle _t()-Funktionen mit englischem zweiten Parameter befüllt. Hier ein Beispiel:&lt;/p&gt;
&lt;pre&gt;&lt;span style=&quot;font-family: Verdana, Lucida, Arial, sans-serif;&quot;&gt;_t('DataPage.TITLE', 'my data')&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Der Text Collector macht daraus im Sprachpaket folgende Zeile:&lt;/p&gt;
&lt;pre&gt;&lt;span style=&quot;font-family: Verdana, Lucida, Arial, sans-serif;&quot;&gt;$lang['de_DE']['DataPage']['TITLE'] = 'my data';&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Der Text Collector verarbeitet zudem automatisch die Klassenattribute $singular_name und $plural_name. Diese müssen an keiner Stelle mit _t() dynamisiert werden, denn das Framework ersetzt die Klassenattribute automatisch, wenn sie mit dem Bezeichner SINGULARNAME bez. PLURALNAME im Sprachpaket vorhanden sind. Hier ein Beispiel:&lt;/p&gt;
&lt;pre&gt;&lt;p&gt;$lang['de_DE']['DataPage']['SINGULARNAME'] = 'my data'&lt;/p&gt;&lt;/pre&gt;
&lt;p&gt;Der Wert 'My data' kam dabei aus der Klassenkonstanten $singular_name:&lt;/p&gt;
&lt;pre&gt;&lt;p&gt;class DataPage extends Page {&lt;/p&gt;&lt;p&gt;public static $singular_name = &quot;My data&quot;;&lt;/p&gt;&lt;/pre&gt;
&lt;h3&gt;Die anderen statischen Attribute&lt;/h3&gt;
&lt;p&gt;In PHP ist es nicht möglich einem statischen Attribut einer Klasse in der Definition einen dynamischen Wert zuzuweisen. Das muss im Constructor erfolgen. Auf diese weise lassen sich Attribute wie $field_label übersetzen:&lt;/p&gt;
&lt;pre&gt;&lt;p&gt;public function __construct($record = null, $isSingleton = false) {&lt;/p&gt;&lt;br/&gt;&lt;p&gt;self::$field_labels = array(&lt;/p&gt;&lt;br/&gt;&lt;p&gt;'Title' =&amp;gt; _t('Country.SINGULARNAME'),&lt;/p&gt;&lt;br/&gt;&lt;p&gt;'ISO2' =&amp;gt; 'ISO2 Code',&lt;/p&gt;&lt;br/&gt;&lt;p&gt;'ISO3' =&amp;gt; 'ISO3 Code',&lt;/p&gt;&lt;br/&gt;&lt;p&gt;'AttributedZones' =&amp;gt; _t('Country.ATTRIBUTED_ZONES', 'attributed zones'),&lt;/p&gt;&lt;br/&gt;&lt;p&gt;);&lt;/p&gt;&lt;br/&gt;&lt;p&gt;parent::__construct($record, $isSingleton);&lt;/p&gt;&lt;br/&gt;&lt;p&gt;}&lt;/p&gt;&lt;br/&gt;&lt;/pre&gt;
&lt;h3&gt;Workflow&lt;/h3&gt;
&lt;p&gt;Ich finde es sinnvoll, das zweite Attribut der _t()-Funktion in Englisch zu pflegen. So weis jeder Programmierer gleich, an welcher Stelle er gerade bastelt und muss nicht erst im Sprachpaket nachschauen, wenn er des Deutschen nicht mächtig ist. Ich setzte dabei voraus, dass jeder Programmierer Englisch kann.&lt;/p&gt;
&lt;p&gt;Beim Aufruf des Text Collectors wir das Sprachpaket der Systemsprache komplett überschrieben und alle Ã„nderungen gehen verloren. Vor dem Aufruf des Text Collectors sollte man die Systemsprache auf en_US setzten, denn die _t()-Funktionen liefern ja englische Sprachwerte. Das $lang-Array habe ich dann mit der Hand in die de_DE.php kopiert und mit &quot;replace&quot; alle &quot;en_US&quot; in &quot;de_DE&quot; verwandelt. Jetzt muss ich nur noch 600 Textstellen ins Deutsche übersetzten :(&lt;/p&gt;
&lt;h3&gt;Fazit&lt;/h3&gt;
&lt;p&gt;Internationalisierung ist eine wichtiger Arbeitsschritt beim Bau eines Moduls. Ein Modul kann sich nur verbreiten, wenn Entwickler möglichst vieler Länder damit arbeiten. Dass man seine Sprachpakete automatisiert erstellt bekommt, ist ein super Feature.&lt;/p&gt;
&lt;p&gt;Danke SilverStripe-Team :)&lt;/p&gt;</description>
			<pubDate>Wed, 02 Feb 2011 20:22:13 +0100</pubDate>
			
			
			<guid>http://www.pixeltricks.de/blog/mit-silverstripe-nach-babylon-2/</guid>
		</item>
		
		<item>
			<title>SilverStripe 2.4.5 und 2.3.11 veröffentlicht</title>
			<link>http://www.pixeltricks.de/blog/silverstripe-2-4-5-und-2-3-11-ver-ffentlicht/</link>
			<description>&lt;p&gt;Es gibt neues von SilverStripe: heute wurden die Versionen  SilverStripe 2.4.5 und 2.3.11 veröffentlicht. Beim Update zur 2.3.11 handelt es sich um einen Bugfix, der mit dem Rollback zu einer älteren Content-Version unter bestimmten Umständen aus Sicherheitsgründen zum Schutz vor einer &lt;a href=&quot;http://www.pixeltricks.de/#http://de.wikipedia.org/wiki/CSRF&quot;&gt;Cross-Site Request Forgery (CSRF)&lt;/a&gt; zu einem Fehler geführt hat.&lt;/p&gt;
&lt;p&gt;Das Update der 2.4.5 war etwas umfangreicher. Neben dem Rollback-Bug wurden auch noch andere kleine Fehler behoben. Ausserdem wurde der Installationsprozess verbessert. Genauere Informationen zum Patch stehen in der &lt;a title=&quot;2.4.5. Patch Beschreibung&quot; href=&quot;http://doc.silverstripe.org/sapphire/en/changelogs/2.4.5&quot;&gt;SilverStripe Dokumentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Das waren keine dramatischen Updates und die behobenen Fehler waren auch nicht sehr verbreitet. Aber es ist schön zu sehen, wie SilverStripe immer weiter voran getrieben und stetig verbessert wird. Wir sind alle gespannt auf SilverStripe 3.0. Auf dem Wellington Meetup am 16. Februar soll es erste Informationen zur Version 3.0 geben.&lt;/p&gt;</description>
			<pubDate>Wed, 02 Feb 2011 08:22:35 +0100</pubDate>
			
			
			<guid>http://www.pixeltricks.de/blog/silverstripe-2-4-5-und-2-3-11-ver-ffentlicht/</guid>
		</item>
		
		<item>
			<title>Abfragen auf Relationen in Silverstripe in den Cache auslagern</title>
			<link>http://www.pixeltricks.de/blog/abfragen-auf-relationen-in-silverstripe-in-den-cache-auslagern/</link>
			<description>&lt;h2&gt;
&lt;/h2&gt;&lt;p&gt;In Silverstripe arbeitet man für gewöhnlich viel mit Objekten, die  über Relationen miteinander verknüpft sind. Diese Art der Programmierung  ist sehr angenehm, bringt aber auch den Nachteil mit sich, dass  komplexe Beziehungen über mehrere Objekte die Performance  beeinträchtigen können.&lt;/p&gt;
&lt;p&gt;Aus diesem Grund bietet Silverstripe einen sehr einfach benutzbaren Cachingmechanismus an, der im folgenden beschrieben wird.&lt;/p&gt;
&lt;p&gt;  &lt;/p&gt;

&lt;h2&gt;&lt;a name=&quot;Abschnitt2&quot;&gt;  &lt;/a&gt;Beispiel zum Einbau des Caches&lt;/h2&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;h3/&gt;
&lt;h3/&gt;
&lt;h3&gt;Das Ausgangsobjekt&lt;/h3&gt;
&lt;p&gt;Angenommen, wir haben ein Objekt &quot;MotherOfAllAttachments&quot;, das  hunderte von Anhängen (Attachments) hat. Um die zugeordneten Attachments  zu bekommen, benutzt man folgenden Aufruf:&lt;/p&gt;
&lt;pre&gt;$motherOfAllAttachments = DataObject::get_by_id(&lt;br/&gt;    'MotherOfAllAttachments',&lt;br/&gt;    1&lt;br/&gt;);&lt;br/&gt;$attachments = $motherOfAllAttachments-&amp;gt;Attachments();&lt;br/&gt;&lt;/pre&gt;
&lt;p&gt;Hier holen wir uns zuerst über &quot;DataObject::get_by_id&quot; eine  Objektinstanz der Klasse &quot;MotherOfAllAttachments&quot;, die über Daten  verfügt; der Einfachheit halber sei hier vorausgesetzt, dass es eine  solche Instanz mit der ID 1 gibt.&lt;/p&gt;
&lt;p&gt;Anschließend greifen wir auf die Relation &quot;Attachments&quot; zu, mit der wir alle zugeordneten Attachments bekommen.&lt;/p&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;h3/&gt;
&lt;h3/&gt;
&lt;h3&gt;Eine neue Methode zum Abfangen der Abfrage auf die Relation&lt;/h3&gt;
&lt;p&gt;Dieser Aufruf kann bei vielen Attachments zu Performanceproblemen  führen, weshalb es sich anbietet, das Ergebnis nach dem ersten Aufruf in  den Cache zu legen.&lt;/p&gt;
&lt;p&gt;Dazu schreibt man einfach eine neue Methode in der Klasse &quot;MotherOfAllAttachments&quot;, die genau das erledigt:&lt;/p&gt;
&lt;pre&gt;public function getAttachments() {&lt;br/&gt;       $cachekey = 'Attachments'.$this-&amp;gt;ID;&lt;br/&gt;       $cache       = SS_Cache::factory($cachekey);&lt;br/&gt;       $result     = $cache-&amp;gt;load($cachekey);&lt;br/&gt;&lt;br/&gt;       if ($result) {&lt;br/&gt;               $result = unserialize($result);&lt;br/&gt;       } else {&lt;br/&gt;               $result = $this-&amp;gt;Attachments();&lt;br/&gt;               $cache-&amp;gt;save(serialize($result));&lt;br/&gt;       }&lt;br/&gt;&lt;br/&gt;       return $result;&lt;br/&gt;}&lt;br/&gt;&lt;/pre&gt;
&lt;p&gt;Hier erzeugen wir zuerst einen Bezeichner ($cachekey), unter dem die  Daten in den Cache gelegt und wiederhergestellt werden können. Da die  Abfrage sich auf das Objekt &quot;MotherOfAllAttachments&quot; bezieht, benutzen  wir dessen ID zur eindeutigen Identifizierung der Cache-Datei.&lt;/p&gt;
&lt;p&gt;Anschließend holen wir uns anhand des eben erzeugten Bezeichners ein  Cache-Objekt; dieses wird über eine Factory-Methode erzeugt, der als  Parameter der Bezeichner übergeben wird.&lt;/p&gt;
&lt;p&gt;Den gleichen Bezeichnis verwenden wir, um die Inhalte des Cache-Objekts über &quot;$cache-&amp;gt;load&quot; zu laden.&lt;br/&gt;Wenn dieser Aufruf ein Ergebnis liefert, erzeugen wir über die PHP Methode &quot;&lt;a title=&quot;Die Dokumentation zur Methode &amp;quot;unserialize&amp;quot; auf de.php.net anzeigen&quot; href=&quot;http://de.php.net/manual/de/function.unserialize.php&quot;&gt;unserialize&lt;/a&gt;&quot;  PHP-Objekte aus den Rohdaten. Andernfalls holen wir die Ergebnisse aus  der Datenbank und speichern sie im Cache. Da es sich um Objekte handelt,  müssen diese über die PHP Methode &quot;&lt;a title=&quot;Die Dokumentation zur Methode &amp;quot;serialize&amp;quot; auf de.php.net anzeigen&quot; href=&quot;http://de.php.net/manual/de/function.serialize.php&quot;&gt;serialize&lt;/a&gt;&quot; serialisiert werden, bevor sie in die Cache-Datei gelegt werden.&lt;/p&gt;
&lt;p&gt;Bei diesem Beispiel sollte der Zugewinn an Performance noch relativ  niedrig sein. Werden jedoch Relationen in der zweiten, dritten oder noch  tieferen Ebene benötigt, ist eine deutliche Steigerung messbar.&lt;/p&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;Abschnitt3&quot;&gt;  &lt;/a&gt;Beispiel zur Anwendung des Caches&lt;/h2&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;h3/&gt;
&lt;h3/&gt;
&lt;h3&gt;Aufruf aus Templates&lt;/h3&gt;
&lt;p&gt;Wird in einem Template auf die Relation &quot;Attachments&quot; des Objekts  &quot;MotherOfAllAttachments&quot; zugegriffen, müssen wir nichts ändern. Durch  die Silverstripe &quot;Magie&quot; werden Template-Aufrufe auf Relationen durch  gleichnamige Methoden mit dem Präfix &quot;get&quot; abgefangen.&lt;/p&gt;
&lt;p&gt;Der Aufruf&lt;/p&gt;
&lt;pre&gt;&amp;lt;% control Attachments %&amp;gt;&lt;br/&gt;&amp;lt;% end_control %&amp;gt;&lt;br/&gt;&lt;/pre&gt;
&lt;p&gt;ist also gleichwertig zu dem Aufruf&lt;/p&gt;
&lt;pre&gt;&amp;lt;% control getAttachments %&amp;gt;&lt;br/&gt;&amp;lt;% end_control %&amp;gt;&lt;br/&gt;&lt;/pre&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;h3/&gt;
&lt;h3/&gt;
&lt;h3&gt;Aufruf aus Controllern und DataObjects&lt;/h3&gt;
&lt;p&gt;Diese Magie funktioniert leider (oder zum Glück) nicht im PHP-Code  der Controller und DataObjects. Das heißt, dass wir dort den Aufruf&lt;/p&gt;
&lt;pre&gt;$attachments = $motherOfAllAttachments-&amp;gt;Attachments();&lt;br/&gt;&lt;/pre&gt;
&lt;p&gt;ersetzen müssen durch&lt;/p&gt;
&lt;pre&gt;$attachments = $motherOfAllAttachments-&amp;gt;getAttachments();&lt;br/&gt;&lt;/pre&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;h2&gt;&lt;a name=&quot;Abschnitt4&quot;&gt;  &lt;/a&gt;Links&lt;/h2&gt;
&lt;p&gt;Dokumentation der Methode &quot;serialize&quot; auf de.php.net:&lt;br/&gt;&lt;a title=&quot;Die Dokumentation zur Methode &amp;quot;serialize&amp;quot; auf de.php.net anzeigen&quot; href=&quot;http://de.php.net/manual/de/function.serialize.php&quot;&gt;http://de.php.net/manual/de/function.serialize.php&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dokumentation der Methode &quot;unserialize&quot; auf de.php.net:&lt;br/&gt;&lt;a title=&quot;Die Dokumentation zur Methode &amp;quot;unserialize&amp;quot; auf de.php.net anzeigen&quot; href=&quot;http://de.php.net/manual/de/function.unserialize.php&quot;&gt;http://de.php.net/manual/de/function.unserialize.php&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dokumentation der Silverstripe Cache Klasse auf api.silverstripe.org:&lt;br/&gt;&lt;a title=&quot;Die Dokumentation der Klasse &amp;quot;SS_Cache&amp;quot; auf api.silverstripe.org anzeigen&quot; href=&quot;http://api.silverstripe.org/2.4/sapphire/core/SS_Cache.html&quot;&gt;http://api.silverstripe.org/2.4/sapphire/core/SS_Cache.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;  &lt;/p&gt;</description>
			<pubDate>Thu, 27 Jan 2011 16:07:33 +0100</pubDate>
			
			
			<guid>http://www.pixeltricks.de/blog/abfragen-auf-relationen-in-silverstripe-in-den-cache-auslagern/</guid>
		</item>
		
		<item>
			<title>Silverstripe: Enum-Werte eines Objektfelds als Array holen</title>
			<link>http://www.pixeltricks.de/blog/silverstripe-enum-werte-eines-objektfelds-als-array-holen/</link>
			<description>&lt;h1&gt;&lt;span style=&quot;color: #666666; font-family: Verdana, Lucida, Arial, sans-serif; font-weight: normal; font-size: 11px; line-height: 18px;&quot;&gt;Heute kam die Frage auf, wie Feldwerte eines Enumfelds aus einem DataObject ausgelesen werden können.&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;Im konkreten Fall wollen wir aus dem folgenden Code die Werte für das Feld &quot;Salutation&quot; als Array zurückbekommen:&lt;/p&gt;
&lt;pre&gt;class Customer extends Member {&lt;br/&gt;    public static $db = array(&lt;br/&gt;        'Salutation' =&amp;gt; 'Enum(&quot;Firma,Herr,Frau&quot;,&quot;Frau&quot;)'&lt;br/&gt;    );&lt;br/&gt;}&lt;br/&gt;&lt;/pre&gt;
&lt;p&gt;Da es sich bei dem Feld &quot;Salutation&quot; um ein Silverstripe Enumfeld  handelt,könnten wir dessen Methode &quot;enumValues()&quot; nutzen, welche uns die  Feldwerte als Array zurückliefert, also genau das tut, was wir wollen.&lt;/p&gt;
&lt;p&gt;Da die Variable $db aber nur ein statisches Array ist, das lediglich  definiert, wie ein Feld auszusehen hat, aber keinen Zugriff auf das  Feldobjekt selbst bietet, nutzen wir die Silverstripe-Magie, um uns ganz  einfach das entsprechende Feldobjekt zu holen:&lt;/p&gt;
&lt;pre&gt;singleton('Customer')-&amp;gt;dbObject('Salutation')-&amp;gt;enumValues();&lt;br/&gt;&lt;/pre&gt;
&lt;p&gt;Dieser Aufruf liefert uns das gewünschte Ergebnis:&lt;/p&gt;
&lt;pre&gt;Array(
    [Firma] =&amp;gt; Firma,
    [Herr]  =&amp;gt; Herr,
    [Frau]  =&amp;gt; Frau
)&lt;/pre&gt;
&lt;p&gt;Der Hebel ist die Methode &quot;dbObject&quot; aus der Klasse &quot;DataObject&quot; (in  &quot;/sapphire/core/model/DataObject.php&quot;), welche in der Lage ist, zu dem  angegebenen Feld aus dem Array &quot;$db&quot; das entsprechende Feldobjekt zu  liefern.&lt;/p&gt;</description>
			<pubDate>Wed, 15 Dec 2010 14:30:52 +0100</pubDate>
			
			
			<guid>http://www.pixeltricks.de/blog/silverstripe-enum-werte-eines-objektfelds-als-array-holen/</guid>
		</item>
		

	</channel>
</rss>
