<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>weblizards</title>
	<atom:link href="http://www.weblizards.de/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.weblizards.de/blog</link>
	<description>custom internet solutions</description>
	<lastBuildDate>Mon, 29 Apr 2013 12:54:07 +0000</lastBuildDate>
	<language>de-DE</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Weblizards sponsern die Website für den Verein &#8220;Carsharing Kaufbeuren e.V.&#8221;</title>
		<link>http://www.weblizards.de/blog/2013/04/weblizards-sponsern-die-website-fur-den-verein-carsharing-kaufbeuren/</link>
		<comments>http://www.weblizards.de/blog/2013/04/weblizards-sponsern-die-website-fur-den-verein-carsharing-kaufbeuren/#comments</comments>
		<pubDate>Fri, 12 Apr 2013 07:42:47 +0000</pubDate>
		<dc:creator>Robert Schmid</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Weblizards]]></category>

		<guid isPermaLink="false">http://www.weblizards.de/blog/?p=824</guid>
		<description><![CDATA[&#8220;Aller Anfang ist schwer&#8221; &#8211; aus diesem Grund haben wir dem Verein Carsharing Kaufbeuren eine neue Website gesponsort. Was ist Carsharing? Wer selbst ein Auto hat, kann ganz einfach nachrechnen wie viele Minuten er es am Tag benötigt. Spreche ich &#8230; <a href="http://www.weblizards.de/blog/2013/04/weblizards-sponsern-die-website-fur-den-verein-carsharing-kaufbeuren/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.weblizards.de/blog/wp-content/uploads/2013/04/carsharing-kf.png"><img class="alignright size-medium wp-image-827" alt="carsharing-kf" src="http://www.weblizards.de/blog/wp-content/uploads/2013/04/carsharing-kf-300x262.png" width="300" height="262" /></a>&#8220;Aller Anfang ist schwer&#8221; &#8211; aus diesem Grund haben wir dem Verein Carsharing Kaufbeuren eine neue Website gesponsort.</p>
<h2>Was ist Carsharing?</h2>
<p>Wer selbst ein Auto hat, kann ganz einfach nachrechnen wie viele Minuten er es am Tag benötigt.</p>
<p>Spreche ich zum Beispiel von mir, benötige ich mein Auto nur etwa 30 Minuten jeden Tag. Ich könnte das Auto daher 23,5 Stunden jemand bzw. mehreren Anderen zur Verfügung stellen.</p>
<p>Carsharing möchte genau diesen Standzeiten den Kampf ansagen und stellt PKW an bestimmten Orten zur Verfügung, die dann über ein Buchungssystem reserviert werden können. Bezahlt wird dann je gefahrenem Kilometer. Alles in allem eine tolle Geschichte, weshalb wir diese hiermit unterstützen wollten.</p>
<p>Ausführlich kann das ganze auf der Website <a title="Website Verein Carsharing Kaufbeuren" href="http://www.carsharing-kf.de" target="_blank">www.carsharing-kf.de</a> nachgelesen werden.</p>
<p>Technisch wurde die Seite mit TYPO3 realisiert.</p>
<p>Wir wünschen dem Carsharing Verein eine guten Start.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.weblizards.de/blog/2013/04/weblizards-sponsern-die-website-fur-den-verein-carsharing-kaufbeuren/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Userabhängige Toolbar im CK-Editor in Pimcore</title>
		<link>http://www.weblizards.de/blog/2013/04/userabhangige-toolbar-im-ck-editor/</link>
		<comments>http://www.weblizards.de/blog/2013/04/userabhangige-toolbar-im-ck-editor/#comments</comments>
		<pubDate>Mon, 08 Apr 2013 14:07:15 +0000</pubDate>
		<dc:creator>Thomas Keil</dc:creator>
				<category><![CDATA[Codefetzen]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Pimcore]]></category>

		<guid isPermaLink="false">http://www.weblizards.de/blog/?p=800</guid>
		<description><![CDATA[Pimcore verwendet als WYSIWYG-Editor den CK-Editor, ein in JavaScript implementierter Editor der sehr viele Möglichkeiten bietet, einen Text direkt im Browser zu bearbeiten. Da es oft keine gute Idee ist, den User einen Text mit allen Möglichkeiten bearbeiten zu lassen, &#8230; <a href="http://www.weblizards.de/blog/2013/04/userabhangige-toolbar-im-ck-editor/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Pimcore verwendet als WYSIWYG-Editor den <a href="http://ckeditor.com/" target="_blank">CK-Editor</a>, ein in JavaScript implementierter Editor der sehr viele Möglichkeiten bietet, einen Text direkt im Browser zu bearbeiten.<br />
Da es oft keine gute Idee ist, den User einen Text mit allen Möglichkeiten bearbeiten zu lassen, bietet der Editor die Möglichkeit, die Toolbar selbst zu definieren.</p>
<p>Mit ein wenig Geschick lässt sich dies sogar Userabhängig bewerkstelligen, so daß beispielsweise ein Admin-User die vollständige Toolbar sieht, ein normaler User aber nur eine eingeschränkte.<br />
Die Information, welcher User gerade eingeloggt ist, lässt sich dem <i>pimcore.globalmanager</i> mit der Methode <i>get(&#8220;user&#8221;)</i> entlocken.</p>
<p>Ein kleines Script, dass die Konfiguration dann Userabhängig gestaltet, könnte dann so aussehen:</p>
<pre class="brush:javascript">
CKEDITOR.editorConfig = function( config ) {
  var user = pimcore.globalmanager.get("user");

  if (!user.admin) {
    config.toolbar = [
      [ 'Source', '-', 'NewPage', 'Preview', '-', 'Templates' ],
      [ 'Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo' ],
      '/',
      [ 'Bold', 'Italic' ]
    ];
  }
};
</pre>
<p>Dieses Stück Code kann man zum Beispiel in <i>pimcore/static/js/lib/ckeditor/config.js</i> ablegen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.weblizards.de/blog/2013/04/userabhangige-toolbar-im-ck-editor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML Entities im Pimcore Navigation Plugin bzw. der Zend Navigation</title>
		<link>http://www.weblizards.de/blog/2013/03/html-entities-im-pimcore-navigation-plugin-bzw-der-zend-navigation/</link>
		<comments>http://www.weblizards.de/blog/2013/03/html-entities-im-pimcore-navigation-plugin-bzw-der-zend-navigation/#comments</comments>
		<pubDate>Sun, 24 Mar 2013 22:45:26 +0000</pubDate>
		<dc:creator>Robert Schmid</dc:creator>
				<category><![CDATA[Allgemein]]></category>

		<guid isPermaLink="false">http://www.weblizards.de/blog/?p=795</guid>
		<description><![CDATA[Ausgefallene Menü´s machen es manchmal notwendig direkt im Pimcore Navigationstitel HTML-Entities einzutragen. &#60;span style="font-size: 2em;"&#62;AD&#60;/span&#62; VERTISING Grundsätzlich werden die HTML-Entities aber von der Zend Navigation escaped. 1. Möglichkeit (etwas unschön) Das ganze kann ganz einfach umgangen werden, indem man in &#8230; <a href="http://www.weblizards.de/blog/2013/03/html-entities-im-pimcore-navigation-plugin-bzw-der-zend-navigation/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.weblizards.de/blog/wp-content/uploads/2013/03/Bildschirmfoto-2013-04-09-um-11.25.49.png"><img class="alignright size-full wp-image-815" alt="Bildschirmfoto 2013-04-09 um 11.25.49" src="http://www.weblizards.de/blog/wp-content/uploads/2013/03/Bildschirmfoto-2013-04-09-um-11.25.49.png" width="172" height="168" /></a><br />
Ausgefallene Menü´s machen es manchmal notwendig direkt im Pimcore Navigationstitel HTML-Entities einzutragen.</p>
<pre class="brush:applescript">&lt;span style="font-size: 2em;"&gt;AD&lt;/span&gt;
VERTISING</pre>
<p>Grundsätzlich werden die HTML-Entities aber von der Zend Navigation escaped.</p>
<h3>1. Möglichkeit (etwas unschön)</h3>
<p>Das ganze kann ganz einfach umgangen werden, indem man in seinem Controller folgenden Befehl vor seine Navigation schreibt:</p>
<pre class="brush:applescript">$this-&gt;view-&gt;setEscape('trim');</pre>
<p>Bedenklich an dieser Einstellung ist, dass ich mit diesem Befehl die gesamte View-Verarbeitung umstelle und damit höchst wahrscheinlich andere Probleme schaffe.</p>
<h3>2. &amp; solide Möglichkeit</h3>
<p>Die Anpassung des Zend_View_Helper_Navigation bzw. diesen zu überladen.</p>
<p>Schaut man sich in der Klasse Zend_View_Helper_Navigation (zu finden in <em>/pimcore/lib/Zend/View/Helper/Navigation/Menu.php</em>) die Funktion htmlify (Zend_Navigation_Page $page) mal genauer an, sieht man hier im letzten Teil &#8211;&gt; $this-&gt;view-&gt;escape($label) &#8211; welcher für das excapen des Menü´s verantwortlich ist.</p>
<p>Diesen Teil müssen wir nun mit unserem angepassten Teil überladen.</p>
<p>Hierzu habe ich mir im Ordner <em>/website/views/helpers/</em> eine neue Datei MeinMenu.php angelegt, welche mit Extends obige Klasse erweitert.</p>
<pre class="brush:applescript">class Website_Helper_RobertsMenu extends Zend_View_Helper_Navigation_Menu {

  public function htmlify(Zend_Navigation_Page $page) {
    // get label and title for translating
        $label = $page-&gt;getLabel();
        $title = $page-&gt;getTitle();

        // translate label and title?
        if ($this-&gt;getUseTranslator() &amp;&amp; $t = $this-&gt;getTranslator()) {
            if (is_string($label) &amp;&amp; !empty($label)) {
                $label = $t-&gt;translate($label);
            }
            if (is_string($title) &amp;&amp; !empty($title)) {
                $title = $t-&gt;translate($title);
            }
        }

        // get attribs for element
        $attribs = array(
            'id'     =&gt; $page-&gt;getId(),
            'title'  =&gt; $title,
            'class'  =&gt; $page-&gt;getClass()
        );

        // does page have a href?
        if ($href = $page-&gt;getHref()) {
            $element              = 'a';
            $attribs['href']      = $href;
            $attribs['target']    = $page-&gt;getTarget();
            $attribs['accesskey'] = $page-&gt;getAccessKey();
        } else {
            $element = 'span';
        }

        // Add custom HTML attributes
        $attribs = array_merge($attribs, $page-&gt;getCustomHtmlAttribs());

//        return '&lt;' . $element . $this-&gt;_htmlAttribs($attribs) . '&gt;'
//             . $this-&gt;view-&gt;escape($label)
//             . '';

        return '&lt;' . $element . $this-&gt;_htmlAttribs($attribs) . '&gt;'
             . $label
             . '';
  }

  public function RobertsMenu(Zend_Navigation_Container $container = null) {
return $this-&gt;menu($container);
  }

}</pre>
<p>Wie man sieht escaped MeinMenu jetzt das Label des Menü´s nicht mehr.</p>
<p>Wichtig &#8211; mann muss natürlich noch den Helper im Autoloader anmelden (<em>/website/lib/Website/Controller/Action.php</em>):</p>
<pre class="brush:applescript">$this-&gt;view-&gt;addHelperPath(PIMCORE_WEBSITE_PATH . '/views/helpers/', 'Website_Helper');</pre>
<p>Jetzt noch der Aufruf im View:</p>
<pre class="brush:applescript">echo $this-&gt;navigation()-&gt;RobertsMenu()-&gt;renderMenu($nav, array("maxDepth" =&gt; 0));</pre>
<p>In Kürze gibt es auch den Link zur gerade in der Entwicklung befindlichen Website.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.weblizards.de/blog/2013/03/html-entities-im-pimcore-navigation-plugin-bzw-der-zend-navigation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPStorm Filewatcher für LessCss</title>
		<link>http://www.weblizards.de/blog/2013/03/less-als-filewatcher-in-phpstorm/</link>
		<comments>http://www.weblizards.de/blog/2013/03/less-als-filewatcher-in-phpstorm/#comments</comments>
		<pubDate>Fri, 22 Mar 2013 20:44:57 +0000</pubDate>
		<dc:creator>Thomas Keil</dc:creator>
				<category><![CDATA[LessCSS]]></category>
		<category><![CDATA[PhpStorm]]></category>

		<guid isPermaLink="false">http://www.weblizards.de/blog/?p=760</guid>
		<description><![CDATA[Für CSS gibt es eine Anzahl von Präprozessoren, die einem den Umgang mit dieser deklarativen Sprache erleichtern. So werden geschachtelte Definitionen, Variablen, Mathematik und Makros ermöglicht. Einer dieser kleinen Helfer, den wir gerne einsetzen ist Less, die Sprache für &#8222;Less &#8230; <a href="http://www.weblizards.de/blog/2013/03/less-als-filewatcher-in-phpstorm/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Für CSS gibt es eine Anzahl von Präprozessoren, die einem den Umgang mit dieser deklarativen Sprache erleichtern. So werden geschachtelte Definitionen, Variablen, Mathematik und Makros ermöglicht.</p>
<p>Einer dieser kleinen Helfer, den wir gerne einsetzen ist <a href="http://www.lesscss.org" target="_blank">Less</a>, die Sprache für &bdquo;Less CSS&ldquo;</p>
<p>Der Vorgang ist, unabhängig vom verwendeten Dialekt, immer gleich:</p>
<ol>
<li>Erweitertes CSS schreiben</li>
<li>Verarbeiten lassen</li>
<li>dem Browser übermitteln</li>
</ol>
<p>Gebräuchlich sind hierfür nun zwei Methoden;</p>
<ol>
<li>Dem Browser direkt die Rohdaten übermitteln und selbst übersetzen lassen, zum Beispiel mit <a href="http://www.lesscss.org" target="_blank">less.js</a></li>
<li>Die <i>.less</i> Datei vom Server übersetzen lassen und als fertiges CSS ausliefern, zum Beispiel mit <a href="http://leafo.net/lessphp/" target="_blank">lessphp</a></li>
</ol>
<p>Letzteres wird zum Beispiel von Pimcore mit einem Outputfilter realisiert; hierbei wird der HTML-Sourcecode nach einem <span style="font-family: monospace">&lt;link rel=&#8221;stylesheet/less&#8221; type=&#8221;text/css&#8221; href=&#8221;BLAHFASEL.less&#8221;&gt;</span> durchsucht, gefundene Links auf die <i>.less</i>-Quelldateien an <i>lessphp</i> übergeben, der Link auf das Resultat &bdquo;umgebogen&ldquo; und das angepasste HTML schlussendlich an den Browser übergeben.</p>
<p>Seit PHPStorm Version 6 gibt es nun eine dritte Möglichkeit, die noch früher ansetzt: das <i>.less</i> wird direkt von der IDE zu <i>CSS</i> übersetzt.</p>
<h2>Filewatcher</h2>
<p>Es gibt für diese IDE nun sogenannte Filewatcher, also Hintergrundprozesse, die Aufgaben für definierte Files ausführen, sobald sich diese verändern. Dies eröffnet eine ganze Reihe von Möglichkeiten, eine davon ist es, ein <i>.less</i> File direkt nach dem Abspeichern in ein <i>CSS</i> übersetzen zu lassen. Dadurch wird dieser einmalige Task sofort und vom Rechner des Entwicklers erledigt, und weder Webserver noch Browser müssen sich damit jemals wieder mit LessCss beschäftigen.</p>
<p>Darüber hinaus zeigt der Prozess sofort auf, wenn Fehler beim Übersetzen aufgetreten sind, das erleichtert die Erkennung von Fehlern.</p>
<h2>less.js installieren um lesscss zu verarbeiten</h2>
<p>Der Präprozessor für <i>.less</i>&ndash;Files muss als Befehl für die Kommandozeile vorliegen. Hier könnte man zum Beispiel less.php im CLI-Modus von PHP ausführen lassen, ich habe mich der Einfachheit halber aber für die Node.js Variante entschieden.</p>
<p>Zuerst muss natürlich node.js installiert sein. Unter Gentoo erreicht man das mit einem einfachen Befehl:</p>
<pre class="brush:shell">emerge nodejs</pre>
<p>Node.js bringt seinen eigenen Paketmanager mit, damit lässt sich dann leicht less.js nachladen und installieren:</p>
<pre class="brush:shell">npm install -g less</pre>
<p>Das war&#8217;s, mehr ist nicht zu tun.</p>
<h2>Konfiguration des Filewatchers</h2>
<p><div id="attachment_762" class="wp-caption alignright" style="width: 310px"><a href="http://www.weblizards.de/blog/wp-content/uploads/2013/03/PHPStorm_fragt_nach_Watcher.png"><img src="http://www.weblizards.de/blog/wp-content/uploads/2013/03/PHPStorm_fragt_nach_Watcher-300x168.png" alt="PHPStorm frägt, ob ein Watcher eingerichtet werden soll" width="300" height="168" class="size-medium wp-image-762" /></a><p class="wp-caption-text">PHPStorm frägt, ob ein Watcher eingerichtet werden soll</p></div> PHPStorm erkennt anhand der Filekennung automatisch, ob ein File bearbeitet wird, für den sinnvollerweise ein Watcher eingerichtet werden könnte und schlägt dies dann vor. Mit einem Klick auf &#8220;Add watcher&#8221; kann man dies nun tun, bei einem Klick auf &#8220;Dismiss&#8221; verschwindet der Vorschlag &ndash; und kehrt auch nie wieder.</p>
<p><div id="attachment_761" class="wp-caption alignright" style="width: 310px"><a href="http://www.weblizards.de/blog/wp-content/uploads/2013/03/PHPStorm_Watcher_Einstellungen.png"><img src="http://www.weblizards.de/blog/wp-content/uploads/2013/03/PHPStorm_Watcher_Einstellungen-300x255.png" alt="Filewatcher Konfiguration" width="300" height="255" class="size-medium wp-image-761" /></a><p class="wp-caption-text">Filewatcher Konfiguration</p></div> Wenn man den Vorschlag einmal weggeklickt hat, oder den Filewatcher nachträglich bearbeiten muss, kann man dies in den Einstellungen von PHPStorm erledigen, die man über</p>
<p><strong>File &#8211; Settings &#8211; Project Settings &#8211; File Watchers</strong> erreicht.</p>
<p>Man sollte darauf achten, das <i>Immediate file synchronisation</i> und <i>Check file for syntax errors</i> aktiviert ist, der Pfad zum Compiler findet man an der Konsole heraus mit den Kommando</p>
<pre class="brush:shell">which lessc</pre>
<p>Ein Klick auf OK speichert die Einstellungen ab.</p>
<p><div id="attachment_764" class="wp-caption alignright" style="width: 310px"><a href="http://www.weblizards.de/blog/wp-content/uploads/2013/03/PHPStorm_automatisches_Hochladen.png"><img src="http://www.weblizards.de/blog/wp-content/uploads/2013/03/PHPStorm_automatisches_Hochladen-300x212.png" alt="Automatisches Hochladen aktivieren" width="300" height="212" class="size-medium wp-image-764" /></a><p class="wp-caption-text">Automatisches Hochladen aktivieren</p></div> Wer auf Remote Servern arbeitet, sollte noch das automatische Hochladen der resultierenden CSS-Datei aktivieren, sonst ist es erforderlich, diese jedes Mal per Hand hochzuladen.</p>
<p>Dies kann man unter <strong>Tools->Deployment->Options</strong> erreichen, wichtig ist es bei &bdquo;Upload changed files automatically to the default server&ldquo; die Einstellung <strong>always</strong> zu wählen und bei &bdquo;Upload external changes&ldquot; einen Haken zu machen.</p>
<p>Fortan sieht man beim Abspeichern der <i>.less</i>-Datei im File-Transfer Infofenster von PHPStorm, dass zwei Dateien auf den Server übertragen wurden <img src='http://www.weblizards.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Hast Du Kommentare, Fragen oder Anregungen zum LESS-Filewatcher? Wir freuen uns über Beiträge in unserem Kommentarbereich!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.weblizards.de/blog/2013/03/less-als-filewatcher-in-phpstorm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Objekte erzeugen in Pimcore beschleunigen</title>
		<link>http://www.weblizards.de/blog/2013/03/pimcore-objekterzeugung-beschleunigen/</link>
		<comments>http://www.weblizards.de/blog/2013/03/pimcore-objekterzeugung-beschleunigen/#comments</comments>
		<pubDate>Thu, 14 Mar 2013 12:04:36 +0000</pubDate>
		<dc:creator>Thomas Keil</dc:creator>
				<category><![CDATA[Codefetzen]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Pimcore]]></category>

		<guid isPermaLink="false">http://www.weblizards.de/blog/?p=744</guid>
		<description><![CDATA[Wer in Pimcore schon in der Situation war, viele User-Objekte erzeugen zu müssen (zum Beispiel bei Datenabgleichen mit anderen System) wird festgestellt haben, dass dies eher gemächlich vonstatten geht. Mit zwei einfachen Maßnahmen kann man dem Prozess gehörig auf die &#8230; <a href="http://www.weblizards.de/blog/2013/03/pimcore-objekterzeugung-beschleunigen/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Wer in Pimcore schon in der Situation war, viele User-Objekte erzeugen zu müssen (zum Beispiel bei Datenabgleichen mit anderen System) wird festgestellt haben, dass dies eher gemächlich vonstatten geht.</p>
<p>Mit zwei einfachen Maßnahmen kann man dem Prozess gehörig auf die Sprünge helfen.</p>
<h2>Den Cache aktivieren</h2>
<p>Ist in Pimcore kein Cache konfiguriert, wird per Default der Zend_File_Cache verwendet.<br />
Das ist zwar besser wie nichts, aber immer noch sehr langsam.</p>
<p>Der Cache wird nur dann deaktiviert, wenn man dies explizit mit </p>
<pre class="brush:php">Pimcore_Model_Cache::disable();</pre>
<p>so setzt.</p>
<p>Es empfiehlt sich daher, den Cache auf eine schnelle Variante wie <a href="http://memcached.org/" target="_blank">Memcached</a> oder die <a href="http://www.mongodb.org/" target="_blank">MongoDB</a> zu konfigurieren.</p>
<h3>Memcache</h3>
<p>Memcache ist ultraschnell, da er ausschliesslich im Speicher läuft, hat aber einen Nachteil &#8211; alles, was da reingestopft wird, ist global für jeden mit Zugriff auf den Daemon verfügbar. Um hier abgrenzen zu können, setzt Pimcore eine <a href="http://www.pimcore.org/wiki/display/PIMCORE/Custom+Cache+Backends" target="_blank">Zwischenschicht zum Taggen</a> ein, und jene Tags werden wiederum in der normalen SQL-Datenbank abgelegt &#8211; dieser Umstand macht also den Memcache für Pimcore nicht zu ersten Wahl.</p>
<h3>MongoDB</h3>
<p>Die MongoDB ist die schnellere Alternative zum Memcache &ndash; obwohl sie im Prinzip eigentlich die langsamere wäre, es fehlt aber das Tagging-Handicap.<br />
Die Installation der Datenbank sollte einfach zu bewerkstelligen sein, die meisten Distributionen enthalten sie.</p>
<p>Die Konfiguration in Pimcore erfolgt über die Datei <i>website/var/config/cache.xml</i>. Eine Beispiel-Datei existiert schon in dem Verzeichnis.</p>
<p>Eine funktionierende Version der <i>cache.xml</i> für die MongoDB würde Beispielsweise so aussehen:</p>
<pre class="brush: xml">
<zend-config xmlns:zf="http://framework.zend.com/xml/zend-config-xml/1.0/">
    <!-- With this file you can define custom cache interfaces for pimcore, please note that your backend must support tags (Zend's Memcached &#038; APC doesn't :( ) -->
    <frontend>
        <type>Core</type>
        <options>
            <cache_id_prefix>pricelist_</cache_id_prefix>
            <lifetime>99999</lifetime>
            <automatic_serialization>true</automatic_serialization>
        </options>
    </frontend>
    <backend>
        <type>Pimcore_Cache_Backend_Mongodb</type>
        <custom>true</custom>
        <options>
            <dbname>pimcore_cache</dbname>
        </options>
    </backend>
</zend-config>
</pre>
<p>Die Datei wird bei jedem Request an Pimcore gesucht, sobald sie vorhanden ist, ist der Cache aktiv. </p>
<h2>Den Cache nutzen um Zend_Db_Table zu beschleunigen</h2>
<p>Beim Anlegen von vielen Objekten zeigt sich eine kleine, ich will nicht sagen, Unzulänglichkeit, von <a href="http://framework.zend.com/manual/1.12/en/zend.db.table.html#zend.db.table.metadata.caching" target="_blank">Zend_Db_Table</a>:</p>
<p><cite>Standardmäßig fragt Zend_Db_Table_Abstract die darunterliegende Datenbank für die Metadaten der Tabelle ab immer wenn diese diese Daten benötigt werden um Tabellenoperationen durchzuführen. Das Tableobjekt holt die Metadaten der Tabelle von der Datenbank indem es die describeTable() Methode des Adapters verwendet.<br />
[...]<br />
In einigen Fällen, speziell wenn viele Table Objekte auf der gleichen Datenbanktabelle instanziert werden kann das Abfragen der Datenbank nach den Metadaten der Tabelle für jede Instanz unerwünscht sein wegen der Geschwindigkeit. In solchen Fällen, können Benutzer davon profitieren das die Metadaten der Tabelle, die von der Datenbank empfangen werden, gecached werden.</cite></p>
<p>Die Kurzfassung: bei jedem Erzeugen eines Daten-Objekts wird die Datenbank gefragt, wie die Daten denn auszusehen haben.<br />
Dieser Vorgang kostet enorm viel Zeit und kann gecached werden mit <i>Zend_Db_Table_Abstract::setDefaultMetadataCache()</i></p>
<p>Dieser statischen Methode muss einfach nur ein Cache übergeben werden &ndash; und einen solchen stellt Pimcore, wie weiter oben beschrieben, zur Verfügung.</p>
<p>Folgende beiden Zeilen aktivieren daher den Metadaten-Cache für <i>Zend_Db_Table</i>:</p>
<pre class="brush:php">
$cache = Pimcore_Model_Cache::getInstance();
Zend_Db_Table_Abstract::setDefaultMetadataCache($cache);
</pre>
<h2>Die Praxis</h2>
<p>Bei einem Kunden war es notwendig, ca 3500 Objekte (mit Assets, es finden also auch Kopiervorgänge auf der Platte statt) zu importieren.<br />
Ohne Cache dauerte dies ca 2 Stunden, mit Cache 15 Minuten, und mit dem Metadaten-Cache <strong>nur noch fünf Minuten</strong>.</p>
<p>In der Praxis haben diese beiden Maßnahmen uns also enorme Geschwindigkeitssteigerungen gebracht!</p>
<p>EDIT:<br />
Wir haben diese Verbesserung als Issue bei Elements eingereicht: <a href="http://www.pimcore.org/issues/browse/PIMCORE-1902" target="_blank">Activate caching Zend table metadata by default</a>.<br />
Die zwei Zeilen sind angemommen worden, ab Version 1.4.10 ist der Cache daher nun im Core von vornherein mit drin <img src='http://www.weblizards.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.weblizards.de/blog/2013/03/pimcore-objekterzeugung-beschleunigen/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Mobile Chrome am Desktop über USB debuggen</title>
		<link>http://www.weblizards.de/blog/2013/03/android-debugging/</link>
		<comments>http://www.weblizards.de/blog/2013/03/android-debugging/#comments</comments>
		<pubDate>Tue, 05 Mar 2013 14:59:14 +0000</pubDate>
		<dc:creator>Thomas Keil</dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Debugging]]></category>

		<guid isPermaLink="false">http://www.weblizards.de/blog/?p=719</guid>
		<description><![CDATA[Wir beschäftigen uns derzeit start mit Responsive Design in HTML mit Media Queries. Insbesondere interessant ist für uns dabei das Verhalten der mobilen Geräte wie Tablets oder Smartphones. Leider gestaltet sich das Debuggen des HTML/CSS/Javascript sehr viel schwieriger bei mobilen &#8230; <a href="http://www.weblizards.de/blog/2013/03/android-debugging/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Wir beschäftigen uns derzeit start mit <strong>Responsive Design</strong> in HTML mit Media Queries. Insbesondere interessant ist für uns dabei das Verhalten der mobilen Geräte wie Tablets oder Smartphones.</p>
<p>Leider gestaltet sich das Debuggen des HTML/CSS/Javascript sehr viel schwieriger bei mobilen Geräten als am Desktop, da die Konsole, wie sie zum Beispiel Firefox oder Chrome standardmäßig haben, nicht verwendbar ist. Die Nutzung würde sich mangels geeignetem Zeigegerät wie einer Maus und dem geringen Platz am Bildschirm sehr schwierig gestalten.</p>
<h2>Debuggen mit Android</h2>
<p>Google stellt allerdings für Android-Geräte mit dem USB-Debugging-Modus eine Möglichkeit bereit, den eigenen Browser Chrome anzuzapfen!</p>
<p>Um das nutzen zu können, braucht man nur am Desktop ebenfalls den Chrome-Browser sowie das das <strong>Android Software Development Kit (SDK)</strong>, welches unter <a href="http://developer.android.com/sdk/index.html" target="_blank">http://developer.android.com/sdk/index.html</a> heruntergeladen werden kann. Für uns interessant sind hierbei aber nur die <strong>Platform Tools</strong>.</p>
<h2>USB Debugging aktivieren am mobilen Gerät</h2>
<p><div id="attachment_732" class="wp-caption alignright" style="width: 178px"><a href="http://www.weblizards.de/blog/wp-content/uploads/2013/03/Screenshot_2013-03-05-15-20-40.png"><img src="http://www.weblizards.de/blog/wp-content/uploads/2013/03/Screenshot_2013-03-05-15-20-40-168x300.png" alt="Hier aktiviert man das USB-Debugging" width="168" height="300" class="size-medium wp-image-732" /></a><p class="wp-caption-text">Hier aktiviert man das USB-Debuggin</p></div><br />
 Um auf die Daten des Browsers zugreifen zu können, muss erst das Debugging aktiviert werden. Unter Android 4.x macht man dies in den Systemeinstellungen unter &bdquo;Entwickleroptionen&ldquo; In diesem Menü macht man nun einen Haken bei &#8220;USB-Debugging&#8221;; fortan startet der Debugging-Modus, wenn das Gerät an USB angeschlossen wird.<br />
Es empfiehlt sich, den Modus nach dem Debugging wieder zu deaktivieren, da sich hier Angriffsflächen für Hackingversuche bieten, wenn das Gerät in falsche Hände gerät.</p>
<p>Wenn man nun das Gerät an USB anschliesst, muss unter Umständen unter Windows noch der ADK (Android Debugging Kit) Treiber installiert werden, Linux kommt ohne weiteres Zutun klar.</p>
<h2>Die Verbindung zum Browser des Mobilgeräts herstellen</h2>
<p>Als nächstes muss die Verbindung zwischen dem Desktop und dem Browser des Mobilgeräts hergestellt werden. Dies erledigt das <strong>adb</strong> Programm der Platform-Tools:</p>
<pre class="brush:shell">
$ cd adt-bundle-linux-x86_64/sdk/platform-tools 
$ ./adb forward tcp:9222 localabstract:chrome_devtools_remote
</pre>
<p>Wenn kein Fehler auftritt, steht nun unter dem Port 9222 des localhost der mobile Browser zur Verfügung.</p>
<h2>Den mobilen Browser ansprechen</h2>
<p><div id="attachment_730" class="wp-caption alignright" style="width: 310px"><a href="http://www.weblizards.de/blog/wp-content/uploads/2013/03/20130305_140119.jpg"><img src="http://www.weblizards.de/blog/wp-content/uploads/2013/03/20130305_140119-300x225.jpg" alt="Der mobile Chrome kann am Desktop debugged werden" width="300" height="225" class="size-medium wp-image-730" /></a><p class="wp-caption-text">Der mobile Chrome kann am Desktop debugged werden</p></div> Um den mobilen Browser anzusprechen, ruft man mit dem lokalen Chrome die URL <strong>http://localhost:9222</strong> auf. Es erscheint eine Auswahl von aktuell vorhandenen Tabs am entfernten Browser, hier wählt man den Debug-Kandidaten aus.<br />
Es erscheint nun das Entwickler-Fenster, wie man es von Chrome gewohnt ist &ndash; nur dass man jetzt die Interna des entfernten Browsers sieht. Die Werkzeuge verhalten sich exakt wie zum lokalen Pendant; wenn man z.B. ein Node im DOM mit dem Mauszeiger überfährt, wird dieses im Browserfenster des Mobilgeräts hervorgehoben.</p>
<p>Gibt es zum Thema &bdquo;mobiles Debugging&ldquo; Fragen oder Anregungen? Wir freuen uns über Eure Kommentare!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.weblizards.de/blog/2013/03/android-debugging/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pimcore in Version 1.4.9 erschienen</title>
		<link>http://www.weblizards.de/blog/2013/03/pimcore-in-version-1-4-9-erschienen/</link>
		<comments>http://www.weblizards.de/blog/2013/03/pimcore-in-version-1-4-9-erschienen/#comments</comments>
		<pubDate>Mon, 04 Mar 2013 15:57:02 +0000</pubDate>
		<dc:creator>Thomas Keil</dc:creator>
				<category><![CDATA[Pimcore]]></category>

		<guid isPermaLink="false">http://www.weblizards.de/blog/?p=724</guid>
		<description><![CDATA[Es gibt einen neuen Release von Pimcore, diesmal in Version 1.4.9 Neben zahlreichen Bugfixes gibt es auch ein paar Verbesserungen. Am interessantesten finde ich dabei den Update des CKEditors auf Version 4 und die neue Bounce Mail Inbox. REST Was &#8230; <a href="http://www.weblizards.de/blog/2013/03/pimcore-in-version-1-4-9-erschienen/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Es gibt einen neuen Release von Pimcore, diesmal in Version 1.4.9</p>
<p>Neben zahlreichen Bugfixes gibt es auch ein paar Verbesserungen.<br />
Am interessantesten finde ich dabei den Update des CKEditors auf Version 4 und die neue Bounce Mail Inbox.</p>
<h2>REST</h2>
<p>Was auch neu ist, in den Release Notes aber nicht auftaucht: die <a href="http://www.pimcore.org/wiki/display/PIMCORE/REST+%28since+1.4.9%29" target="_blank">REST API</a>, mittels welcher man <a href="http://de.wikipedia.org/wiki/Representational_State_Transfer">RESTful</a> mit Pimcore &bdquo;sprechen&ldquo; kann.</p>
<p>Folgende Aktionen lassen sich zum gegenwärtigen Stand damit ausführen:</p>
<ul>
<li>Get Object By ID</li>
<li>Delete Object By ID</li>
<li>Create a new object</li>
<li>Update existing object</li>
<li>Get Object Metadata</li>
<li>Get Class By ID</li>
<li>Get Field Collection Definition By Key</li>
<li>Object Brick Definition By Key</li>
<li>Get Asset By ID</li>
<li>Delete Asset By ID</li>
<li>Create New Asset</li>
<li>Update Existing Asset</li>
<li>Get Document By ID</li>
<li>Delete Document By ID</li>
<li>Create New Document</li>
<li>Update Existing Document</li>
<li>Search Assets</li>
<li>Search Documents</li>
<li>Search  Objects</li>
<li>Get Asset Count</li>
<li>Get Document Count</li>
<li>Get Object Count</li>
<li>Get User</li>
<li>Get KeyValue Definition</li>
<li>Get Server Info</li>
<li>Override HTTP Method</li>
</ul>
<h2>Die Release Notes</h2>
<p>Hier die Releasenotes für <a href="http://www.pimcore.org/issues/secure/ReleaseNote.jspa?version=10120&#038;projectId=10000" target="_blank">Version 1.4.9</a>:<br />
<strong>Bug</strong></p>
<ul>
<li>maintenance.php: PHP Warning: Error while sending STMT_CLOSE packet. PID=23365 in Unknown on line 0</li>
<li>overwrite hasChilds() in hardlink wrappers respecting children setting in hardlinks</li>
<li>outdated classloader map</li>
<li>Front end translation not working after clean install</li>
<li>Renaming a class results on unknown behavior</li>
<li>Not possible to add object named &#8220;Service&#8221;</li>
<li>Cannot create documents in Plugin (There is already an active transaction)</li>
<li>1.4.8: Sql request problem when saving an object with multiple multihref fields</li>
<li>RTE RichText Wysiwyg Editor in FieldCollections stops working after reordering</li>
<li>Can edit object in &#8220;Search, Edit and Export Tab&#8221;, but the role is not allow</li>
<li>Colon (:) as path separator in /pimcore/cli/classmap_generator.php</li>
<li>Assets: Download as zip does not work for root folder</li>
<li>Classes can create invalid PHP Files</li>
<li>Document_List not autoloading because of bug in function getDocuments()</li>
<li>CSV import with cell containing carriage return does not work properly</li>
<li>postupdate Script for revision 2209 fails</li>
<li>Video-incompatibilities caused by a comma</li>
<li>Modal dialog &#8220;Please wait&#8221; stays there forever if Import Asset from URL is attempted with invalid URL</li>
<li>Data in structured table is truncated after 50 characters</li>
<li>Ext.form.ComboBox items can not be selected in IE</li>
<li>Spelling Mistake &#8211; The desired element is currently opend by an other person:</li>
<li>Session Error (see Screenshot)</li>
<li>Geographical Polygon Selection Editor doesn&#8217;t load if polygon present</li>
<li>1.4.8, isValidKey in class Pimcore_Tool doesn&#8217;t allow the preset key on fresh installation</li>
<li>Deletion of user-/rolefolders containing users/roles doesn&#8217;t remove the content.</li>
<li>Can&#8217;t drop additional editables into areablock after certain number of elements is already added</li>
<li>Asset->setParent() and Document->setParent() does not work</li>
<li>Deleting cache cleans whole folder inclusive .dummy</li>
<li>Implement webservice API for keyvalue data type</li>
<li>Document_Service::render() not overwriting passed $params on sucessive calls</li>
<li>Drop Locks Table on Install</li>
<li>YUICompressor and curilyc</li>
<li>Image cropping doesn&#8217;t work when no thumbnail config is defined</li>
<li>mongodb persist option throws exception (persist parameter is outdated)</li>
<li>Do not allow &#8220;admin&#8221;, &#8220;webservice&#8221;, &#8220;install&#8221; and &#8220;plugin&#8221; as name for documents in the first level (system routes)</li>
<li>Reload after plugin uninstall</li>
<li>PHP5.4 Bugging</li>
<li>rename in document tree breaks path</li>
</ul>
<p><strong>Verbesserung</strong></p>
<ul>
<li>Option for caching images directly after upload should be present somewhere</li>
<li>Thumbnails are resizing gradually in Editmode</li>
<li>HTML 5 Video: Automatically add microdata for search engines (poster thumnail, &#8230;)</li>
<li>In folder view rename buton &#8220;Delete&#8221; to &#8220;Delete folder&#8221;</li>
<li>Allow to turn off opening the last open tabs in backend on user level</li>
<li>Editables: Add &#8220;Show in Tree&#8221; in contextmenu where items are assigend</li>
<li>Pimcore_View parameter is forced to HTTP request rather than abstract</li>
<li>Plugin initialisation array index not defined warnings</li>
<li>Prepare datatypes for better preview and diff view</li>
<li>CKEditor Update (Version 4)</li>
<li>Thumbnails: Support for progressive JPEGs</li>
<li>Custom metadata on pages</li>
<li>Make root nodes in sidebar (&#8220;home&#8221;) translatable</li>
<li>Site-specific robots.txt</li>
<li>Site-specific routes: allow same name for routes of different sites</li>
<li>new Asset_* should have the type predefined</li>
<li>Additional SOAP API Functionality</li>
<li>New style editor should be optional</li>
<li>Add async attribute to minified JS in JavascriptMinify.php</li>
<li>Update Cache after updating Website settings</li>
<li>Tag-Manager: Allow to restrict to sites</li>
<li>Disabling versions doesn&#8217;t work</li>
<li>Asset_Image creation very slow because of low-performant $this->clearThumbnails() function</li>
</ul>
<p><strong>Neue Funktion</strong></p>
<ul>
<li>Bounce Mail Inbox</li>
<li>Option to switch between old and new ckeditor</li>
<li>Add the ability to recursively create Object/Asset folders</li>
<li>Previews for pages (document)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.weblizards.de/blog/2013/03/pimcore-in-version-1-4-9-erschienen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pimcore Dynamic Dropdown Module in neuer Version</title>
		<link>http://www.weblizards.de/blog/2013/02/pimcore-dynamic-dropdown-module-in-neuer-version/</link>
		<comments>http://www.weblizards.de/blog/2013/02/pimcore-dynamic-dropdown-module-in-neuer-version/#comments</comments>
		<pubDate>Fri, 08 Feb 2013 15:44:12 +0000</pubDate>
		<dc:creator>Thomas Keil</dc:creator>
				<category><![CDATA[DynamicDropdown]]></category>
		<category><![CDATA[Pimcore]]></category>

		<guid isPermaLink="false">http://www.weblizards.de/blog/?p=699</guid>
		<description><![CDATA[Eines unser Plugins für Pimcore ist in einer neuen Version erschienen. Es handelt sich hierbei um das Dynamic Dropdown Plugin, das in Objekten ein Dropdown-Eingabeelement zur Verfügung stellt, dessen Inhalte wiederum aus anderen Objekten bzw deren Feldern bestimmt werden. Was &#8230; <a href="http://www.weblizards.de/blog/2013/02/pimcore-dynamic-dropdown-module-in-neuer-version/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Eines unser Plugins für Pimcore ist in einer neuen Version erschienen.</p>
<p>Es handelt sich hierbei um das Dynamic Dropdown Plugin, das in Objekten ein Dropdown-Eingabeelement zur Verfügung stellt, dessen Inhalte wiederum aus anderen Objekten bzw deren Feldern bestimmt werden.</p>
<h2>Was ist neu?</h2>
<div id="attachment_702" class="wp-caption alignright" style="width: 310px"><a href="http://www.weblizards.de/blog/wp-content/uploads/2013/02/DynamicDropdown_Rekursiv.png"><img src="http://www.weblizards.de/blog/wp-content/uploads/2013/02/DynamicDropdown_Rekursiv-300x287.png" alt="Das Plugin kann nun rekursiv verarbeiten und das Ergebnis sortieren." width="300" height="287" class="size-medium wp-image-702" /></a><p class="wp-caption-text">Das Plugin kann nun rekursiv verarbeiten und das Ergebnis sortieren.</p></div>
<ul>
<li>Die Reihenfolge der Elemente kann nun entweder nach ihrer ID oder ihrem Wert sortiert werden, dies ist in der Konfiguration des Eingabelements einstellbar.</li>
<li>Die Ordner, in denen die Elemente liegen müssen, können nun rekursiv durchsucht werden. Auch dies ist in der Konfiguration (de-)aktivierbar.</li>
<li>Der Bug, der dazu führte daß die Methodennamen erst nach einem Reload der Seite zur Verfügung standen, ist behoben.</li>
<li>Das Feld kann nun in der Grid-Ansicht der Objektliste angezeigt werden. Zu beachten ist dabei, daß es sich beim <strong>Dynamic Dropdown</strong> intern um ein <i>Href</i> handelt, es kann daher nicht nach dieser Spalte sortiert werden.</li>
<li>Die eingestellte Breite wird nun berücksichtigt.</li>
</ul>
<p>Die neue Version kann in der Pimcore-eigenen Pluginverwaltung aktualisiert werden.</p>
<p>Feedback ist, wie immer, ausdrücklich erwünscht <img src='http://www.weblizards.de/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Ein Ausblick in die Zukunft</h2>
<p><div id="attachment_704" class="wp-caption alignright" style="width: 310px"><a href="http://www.weblizards.de/blog/wp-content/uploads/2013/02/DynamicDropdown_twoboxes.png"><img src="http://www.weblizards.de/blog/wp-content/uploads/2013/02/DynamicDropdown_twoboxes-300x158.png" alt="Ein Ausblick auf die neue Eingabe" width="300" height="158" class="size-medium wp-image-704" /></a><p class="wp-caption-text">Ein Ausblick auf die neue Eingabe</p></div>Einer unserer Kunden benötigt eine Erweiterung der Eingabeverarbeitung, hierbei ist die Darstellung als zwei Boxen gewünscht wobei die eine die zur Verfügung stehenden Eingaben und die andere die Gewählten darstellen soll. Der Wechsel von der einen Box in die andere soll dabei durch Doppelklick stattfinden.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.weblizards.de/blog/2013/02/pimcore-dynamic-dropdown-module-in-neuer-version/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pimcore translations im Layout</title>
		<link>http://www.weblizards.de/blog/2013/01/pimcore-translations-im-layout/</link>
		<comments>http://www.weblizards.de/blog/2013/01/pimcore-translations-im-layout/#comments</comments>
		<pubDate>Fri, 11 Jan 2013 10:26:16 +0000</pubDate>
		<dc:creator>Thomas Keil</dc:creator>
				<category><![CDATA[Codefetzen]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[Pimcore]]></category>

		<guid isPermaLink="false">http://www.weblizards.de/blog/?p=686</guid>
		<description><![CDATA[Pimcore bietet mit seinem internen Übersetzer die Möglichkeit, &#8220;feststehende&#8221; Begriffe auf Webseiten zu komfortabel zu übersetzen. Der Aufruf hierfür ist, zum Beispiel in einer View: print $this->translate("Der zu übersetzende Begriff"); Wir die Webseite einmal aufgerufen nimmt Pimcore den Satz &#8222;Der &#8230; <a href="http://www.weblizards.de/blog/2013/01/pimcore-translations-im-layout/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Pimcore bietet mit seinem internen Übersetzer die Möglichkeit, &#8220;feststehende&#8221; Begriffe auf Webseiten zu komfortabel zu übersetzen.</p>
<p>Der Aufruf hierfür ist, zum Beispiel in einer View:</p>
<pre class="brush:php">
print $this->translate("Der zu übersetzende Begriff");
</pre>
<p>Wir die Webseite einmal aufgerufen nimmt Pimcore den Satz &bdquo;Der zu übersetzende Begriff&ldquo; in die Liste mit auf. Dort kann man dann die Angaben in den gewünschten Sprachen machen, und abhängig von der im Frontend eingestellten Sprache wird dann die betreffende Übersetzung ausgegeben.</p>
<p>Die Sprache stellt man im Frontend ein über den Zend_Registry Eintrag &#8220;Locale&#8221;:</p>
<pre class="brush:php">
Zend_Registry::set("language", $language);
$locale = new Zend_Locale($language);
Zend_Registry::set("Zend_Locale", $locale);
</pre>
<p>Dies funktioniert wunderbar &#8211; mit einer Ausnahme: im Layout, bzw. Im Actioncontroller <i>Website_Controller_Action</i></p>
<p>Alle Angaben, die hier gemacht werden, werden nicht übersetzt, weil der Translator noch nicht initialisiert ist.</p>
<p>Will man also beispielsweise Übersetzungen für ein Javascript bereits inline und global mitgeben:</p>
<pre class="brush:php">
$this->view->headScript()->captureStart(); ?>
var livesuche = "<?php print $this->view->translate("Livesuche") ?>";
<?php
$this->view->headScript()->captureEnd();
</pre>
<p>wird der String &bdquo;Livesuche&ldquo; nicht übersetzt.</p>
<p>Um auch hier schon Übersetzungen zu erreichen, muss der Translator händisch initialisiert werden bevor das erste Mal die <i>translate()</i> Methode aufgerufen wird. Dies erreicht man mit:</p>
<pre class="brush:php">
      $this->initTranslation();
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.weblizards.de/blog/2013/01/pimcore-translations-im-layout/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pimcore: eine Page in mehreren Navigationen verwenden</title>
		<link>http://www.weblizards.de/blog/2012/11/pimcore-eine-page-in-mehreren-navigationen-verwenden/</link>
		<comments>http://www.weblizards.de/blog/2012/11/pimcore-eine-page-in-mehreren-navigationen-verwenden/#comments</comments>
		<pubDate>Thu, 08 Nov 2012 15:30:56 +0000</pubDate>
		<dc:creator>Thomas Keil</dc:creator>
				<category><![CDATA[Codefetzen]]></category>
		<category><![CDATA[Pimcore]]></category>

		<guid isPermaLink="false">http://www.weblizards.de/blog/?p=650</guid>
		<description><![CDATA[Pimcore stellt eine komfortable Möglichkeit zur Verfügung, einer Webseite eine strukturierte Dokumentenhierarchie zu verleihen. Diese Struktur kann automatisiert ausgelesen und sowohl in eine Navigation für die Webseite selbst als auch in sinnvolle und &#8220;sprechende&#8221; URLs verarbeitet werden. So ist die &#8230; <a href="http://www.weblizards.de/blog/2012/11/pimcore-eine-page-in-mehreren-navigationen-verwenden/">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Pimcore stellt eine komfortable Möglichkeit zur Verfügung, einer Webseite eine strukturierte Dokumentenhierarchie zu verleihen.<br />
Diese Struktur kann automatisiert ausgelesen und sowohl in eine Navigation für die Webseite selbst als auch in sinnvolle und &#8220;sprechende&#8221; URLs verarbeitet werden.<br />
So ist die URL zu einer Seite &#8220;Impressum&#8221; folgerichtig &#8220;/impressum&#8221;, und falls die Seite in einem Unterverzeichnis steckt dann &#8220;/unterverzeichnis/impressum&#8221;.</p>
<p>Häufiger hatten wir hier das Problem, dass auf der Webseite mehrere, voneinander getrennte Navigationen gewünscht sind. Diese kann man in Pimcore dann ganz leicht in Unterordnern zusammenfassen und jeden individuell auslesen und in eine Navigation verwandeln. Dies stellt aus Suchmaschinensicht aber nicht das Optimum dar, da mit jedem Unterpfad die Relevanz der Seite sinkt, von der &#8220;merkwüdigen&#8221; URL wie &#8220;/kopfnavigation/impressum&#8221; ganz zu schweigen.</p>
<p>Wir haben daher mit Hilfe der Eigenschaften, die in Pimcore jeder Seite vergeben werden können, eine Lösung entwickelt.</p>
<p>Folgende Ausgangssituation:<br />
<a href="http://www.weblizards.de/blog/wp-content/uploads/2012/11/Naviagtion_1.jpg"><img src="http://www.weblizards.de/blog/wp-content/uploads/2012/11/Naviagtion_1-300x185.jpg" alt="" title="Die Navigationen der Webseite" width="300" height="185" class="aligncenter size-medium wp-image-651" /></a><br />
Es existieren drei Navigationen:</p>
<ol>
<li>Die <em>Kopfnavigation</em></li>
<li>Die <em>Linke Navigation</em></li>
<li>Die <em>Hauptnavigation</em></li>
</ol>
<p>Zudem gibt es im Fuß der Seite die <em>Gesamtnavigation</em> in der jeder mögliche Navigationspunkt nochmal aufgeführt ist:<br />
<a href="http://www.weblizards.de/blog/wp-content/uploads/2012/11/Navigation_3.jpg"><img src="http://www.weblizards.de/blog/wp-content/uploads/2012/11/Navigation_3-300x110.jpg" alt="" title="Die Gesamtnavigation der Seite im Fuss" width="300" height="110" class="aligncenter size-medium wp-image-655" /></a></p>
<p>In Pimcore sind diese Seiten in einer flachen Hierarchie untergebracht, um möglichst kurze URLs zu produzieren:<br />
<a href="http://www.weblizards.de/blog/wp-content/uploads/2012/11/Navigation_2.jpg"><img src="http://www.weblizards.de/blog/wp-content/uploads/2012/11/Navigation_2-279x300.jpg" alt="" title="Navigation_2" width="279" height="300" class="aligncenter size-medium wp-image-652" /></a></p>
<p>In der Umsetzung bedienen wir uns der <a href="http://framework.zend.com/manual/1.12/de/zend.navigation.html" target="_blank">Zend_Navigation</a>, welche uns sehr viel Arbeit abnimmt.<br />
Mit dem <em>pimcoreNavigation()</em> View Helper stellt uns Pimcore eine komfortable Möglichkeit zur Verfügung, eine fertige Zend_Navigation aus dem Dokumentenbaum zu erzeugen.<br />
Dies erreicht man durch Aufrufen der Methode <em>getNavigation($currentDocument, $navStartNode)</em> des View Helpers. <em>$currentDocument</em> stellt dabei das Dokument dar, das in der Navigation als &#8220;aktiv&#8221; markiert werden soll. In unserem Zusammenhang ist das <em>$this->document</em>. Die Variable <em>$navStartNode</em> beschreibt das Dokument, dessen Kinder die einzelnen Links werden. In unserem Fall ist das &#8220;/home&#8221;.</p>
<pre class="brush:php">
      $navStartNode = Document::getById(1);
      $gesamte_nav = $this->view->pimcoreNavigation()->getNavigation($this->document, $navStartNode);
</pre>
<p>Aus dieser Navigation erzeugen wir nun die anderen, wir müssen jeder Seite nur noch die Information mitgeben, in welcher Navigation sie zusätzlich noch erscheinen soll.<br />
Dies erreichen wir mit den Eigenschaften der Seite. Praktisch hierfür ist es, eine <em>vorgefertige Eigenschaft</em> zu definieren, aus der dann nur noch ausgewählt werden muß. Hier ist das eine &#8220;select&#8221; Eigenschaft mit den Werten &#8220;Kopf,Links,Haupt&#8221;:</p>
<p><a href="http://www.weblizards.de/blog/wp-content/uploads/2012/11/Navigation_4.png"><img src="http://www.weblizards.de/blog/wp-content/uploads/2012/11/Navigation_4-300x50.png" alt="" title="Anlegen einer vorgefertigten Eigenschaft" width="300" height="50" class="aligncenter size-medium wp-image-659" /></a></p>
<p>Diese Eigenschaft kann man nun jeder Seite zuweisen:<br />
<a href="http://www.weblizards.de/blog/wp-content/uploads/2012/11/Navigation_5.png"><img src="http://www.weblizards.de/blog/wp-content/uploads/2012/11/Navigation_5-300x166.png" alt="" title="Eine vorgefertigte Eigenschaft auf die Seite anwenden" width="300" height="166" class="aligncenter size-medium wp-image-661" /></a></p>
<p>Diese Information kann nun bequem ausgewertet werden, um die einzelnen Navigationen zu erzeugen.<br />
Hierbei lesen wir jede Zend_Navigation_Page aus der Navigation aus und werten die Eigenschaft &#8220;navigation&#8221; des Documents der Page aus. Abhängig vom Inhalt wird eine Seite gegebenenfalls einer weiteren Navigation zugewiesen:</p>
<pre class="brush:php">
      $kopf_nav  = new Zend_Navigation();
      $linke_nav = new Zend_Navigation();
      $haupt_nav = new Zend_Navigation();

      foreach ($gesamte_nav as $page) {
        $newpage = clone $page;
        $nav_property = trim($page->getDocument()->getProperty("navigation"));
        if     ($nav_property == "Kopf")  $kopf_nav->addPage($newpage);
        elseif ($nav_property == "Haupt") $haupt_nav->addPage($newpage);
        elseif ($nav_property == "Links") $linke_nav->addPage($newpage);
      }

      $this->view->gesamte_nav = $gesamte_nav;
      $this->view->kopf_nav    = $kopf_nav;
      $this->view->linke_nav   = $linke_nav;
      $this->view->haupt_nav   = $haupt_nav;
</pre>
<p><strong>Ganz wichtig hierbei ist es, $page vor der Zuweisung durch <em>addPage()</em> mit dem <a href="http://php.net/manual/en/language.oop5.cloning.php" target="_blank">clone keywords</a> zu kopieren (Zeile 6)</strong>, da <em>Zend_Navigation_Container</em> der Seite beim <em>addPage()</em>-Vorgang ein neues Parent zuweist und damit der Gesamt-Navigation entziehen würde.</p>
<p>Die so erzeugten Navigationen können im Layout nun bequem ausgegeben werden:</p>
<pre class="brush:php">
echo $this->navigation()->menu()->renderMenu($this->kopf_nav, array("maxDepth" => 0));
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.weblizards.de/blog/2012/11/pimcore-eine-page-in-mehreren-navigationen-verwenden/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

 Served from: www.weblizards.de @ 2013-05-20 14:45:16 by W3 Total Cache -->