<?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>Axel Jung &#187; Javascript</title>
	<atom:link href="http://www.ajung.de/tag/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ajung.de</link>
	<description>Privater Blog von Axel Jung aus Wiesbaden</description>
	<lastBuildDate>Mon, 03 May 2010 19:12:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Ext: js_css_optimizer und t3lib_PageRenderer</title>
		<link>http://www.ajung.de/2009/10/06/ext-js_css_optimizer-und-t3lib_pagerenderer/</link>
		<comments>http://www.ajung.de/2009/10/06/ext-js_css_optimizer-und-t3lib_pagerenderer/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 18:55:40 +0000</pubDate>
		<dc:creator>ajung</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Typo3]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://www.ajung.de/?p=539</guid>
		<description><![CDATA[In der neuen Typo3 Version 4.3 existiert eine neue Klasse t3lib_PageRenderer in der die CSS und Javascript Dateien registriert werden können. In dieser Klasse ist es vorgesehen die CSS Dateien zu bündeln und zu komprimieren. Da diese Funktionen noch nicht implementiert sind und es aber die Möglichkeit für Hooks gibt habe ich die Extension js_css_optimizer [...]]]></description>
			<content:encoded><![CDATA[<p>In der neuen Typo3 Version 4.3 existiert eine neue Klasse t3lib_PageRenderer in der die CSS und Javascript Dateien registriert werden können. In dieser Klasse ist es vorgesehen die CSS Dateien zu <strong>bündeln </strong>und zu <strong>komprimieren</strong>. Da diese Funktionen noch nicht implementiert sind und es aber die Möglichkeit für Hooks gibt habe ich die Extension <strong>js_css_optimizer </strong>erstellt, die diese Lücke füllt.</p>
<p>Die Extension registriert folgende Hooks:</p>
<ul>
<li>cssCompressHandler &#8211; zum Komprimieren der CSS Dateien</li>
<li>jsCompressHandler &#8211; zum Komprimieren der JavaScript Dateien</li>
<li>concatenateHandler &#8211; zum Bündeln der Dateien</li>
<li>clearCachePostProc &#8211; zum Löschen der gecachten Dateien im typo3temp Verzeichnis</li>
</ul>
<h3>CSS Komrpimierung</h3>
<p>Hierbei wird das Tool <a href="http://csstidy.sourceforge.net/">CSSTidy</a> verwendet.  Die Konfiguration lässt sich über den Extension Manager in Typo3 einstellen.</p>
<p><img class="alignnone size-full wp-image-540" title="js_opt" src="http://www.ajung.de/wp-content/uploads/2009/10/js_opt.png" alt="js_opt" width="336" height="347" /></p>
<p>Die CSS Datei wird in einem neuen Verzeichnis abgelegt. Die Extension versucht dabei die relativen Pfade in der CSS Datei auf Bilder um zuschreiben. Hier ist eventuell noch Anpassungbedarf.</p>
<p>Damit die CSS Datei komprimiert wird muss folgender Typo Script Code ergänzt werden:</p>
<pre>page {
includeCSS {
 screenStyle = ..../base.css
 screenStyle {
   media = screen
   import = 0
   <span style="color: #ff0000;">compress=1</span>
 }</pre>
<h3>JavaScript Komprimierung</h3>
<p>Für das JavaScript wird die <a href="http://www.crockford.com/javascript/jsmin.html">JSMin</a> Klasse aus dem Typo3 Core verwendet. Es wird nicht die t3lib::minify&#8230; verwendet, da diese nicht so effektiv ist.</p>
<p>In TypoScript kann die Komprimierung einzeln ein und ausgeschaltet werden:</p>
<pre>page{
 includeJS {
 file1 = ....common.js
 file1.<span style="color: #ff0000;">compress=1</span>
...</pre>
<h3>Bündelung</h3>
<p>Die Bündelung der Javascripte und CSS Dateien kann über TypoScript aktiviert werden.  Dafür gibt es diese Einstellung:</p>
<pre>config.concatenateJsAndCss = 1</pre>
<p>Hierbei ist nicht möglich CSS und JavaScript unterschiedlich zu behandeln. Deshalb gibt es in der Extension die Möglichkeit über den Extension Manager die Bündelung beispielsweise für CSS auszuschalten.</p>
<p><img class="alignnone size-full wp-image-541" title="js_opt_1" src="http://www.ajung.de/wp-content/uploads/2009/10/js_opt_1.png" alt="js_opt_1" width="192" height="125" /></p>
<p>Wenn bestimmte Dateien auf jeder Seite benötigt werden, dann macht es Sinn diese als Libs einzubinden. Dafür gibt es im TypoScript die Option includeJSlibs.</p>
<pre>page.includeJSlibs{
  jquery = ...jquery-1.3.2.min.js
  ...
}</pre>
<p>Dann werden die in eine separate Datei geschrieben und können vom Browser separat gecacht werden.</p>
<h3>Caching</h3>
<p>Die komprimierten und gebündelten Dateien werden in dem typo3Temp Verzeichnis abgelegt. Die Cache Datei werden nicht erneuert sondern müssen gelöscht werden um neu erzeugt zu werden. Das Löschen passiert automatisch wenn im Typo3 Backend der Cache gelöscht wird.</p>
<h3>Javascript und CSS aus den Plugins hinzufügen</h3>
<p>Wenn man früher in einem Plugin JavaScript oder CSS Daten hinzufügen wollte ohne TypoScript hat man das über $GLOBALS['TSFE']-&gt;additionalHeaderData machen. Da diese Daten nicht als JS oder CSS deklariert sind nutzen sie in diesen Kontext nichts mehr.  Man kann jetzt mittels $GLOBALS['TSFE']-&gt;getPageRenderer() auf den PageRenderer zugreifen und diesen die JS und CSS Dateien bekannt machen. Wenn man mit dem PageRenderer arbeitet kann man auch die Vorteile der Komprimierung und Bündelung nutzen. Es lohnt sich deshalb die Klasse t3lib_PageRenderer genauer anzuschauen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajung.de/2009/10/06/ext-js_css_optimizer-und-t3lib_pagerenderer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ExtJs Erweiterter List Filter</title>
		<link>http://www.ajung.de/2009/03/24/extjs-erweiterter-list-filter/</link>
		<comments>http://www.ajung.de/2009/03/24/extjs-erweiterter-list-filter/#comments</comments>
		<pubDate>Tue, 24 Mar 2009 16:29:32 +0000</pubDate>
		<dc:creator>ajung</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Typo3]]></category>
		<category><![CDATA[ExtJs]]></category>

		<guid isPermaLink="false">http://www.ajung.de/?p=506</guid>
		<description><![CDATA[In dem ExtJS Framework gibt es für die Grids, die praktischen Grid Filter. Diese lassen sich ganz einfach einbauen und das ganze sieht dann zum Beispiel so aus: Mit dem List Filter lassen sich diese Checkboxen darstellen. Die Werte darin sind aber statisch hinterlegt. Man kann auch einen Store im Filter hinterlegen und dann die [...]]]></description>
			<content:encoded><![CDATA[<p>In dem ExtJS Framework gibt es für die Grids, die praktischen Grid Filter. Diese lassen sich ganz einfach einbauen und das ganze sieht dann zum Beispiel so aus:</p>
<p><img class="alignnone size-full wp-image-507" title="grid_filter" src="http://www.ajung.de/wp-content/uploads/2009/03/grid_filter.jpg" alt="grid_filter" width="442" height="292" /></p>
<p>Mit dem List Filter lassen sich diese Checkboxen darstellen. Die Werte darin sind aber statisch hinterlegt. Man kann auch einen Store im Filter hinterlegen und dann die Werte serverseitig laden. In meinen Fall sollte ich aber die Werte aus den Daten des Grid automatisch ermitteln.</p>
<p>Dazu habe ich erst mal den <strong>Ext.data.Store</strong> um einen Methode erweitert, die mir die eindeutigen Wert einer Spalte zurückgibt:</p>
<pre>Ext.override(Ext.data.Store, {
    getUniqueData:function (index){
        this.unique_data = new Array();
        this.each(function(record){
            var value = record.get(index);
            if(this.unique_data.indexOf(value)==-1){
                this.unique_data.push(value);
            }

        },this);
        return this.unique_data;
    }
});</pre>
<p>Dann habe ich mir einen neuen Filter erzeugt, abgeleitet von der Klasse:<strong> Ext.ux.grid.filter.ListFilter</strong> die nur zwei Optionen benötigt:</p>
<ol>
<li>uniqueStore: eine Referenz auf den Store des Grid</li>
<li>dataIndex: der Spalten Index</li>
</ol>
<p>Der Filter hängt sich an den load Event des Store vom Grid und erzeugt danach seine eigenen Optionen:</p>
<pre>Ext.ux.grid.filter.UniqueListFilter  = Ext.extend(Ext.ux.grid.filter.ListFilter, {
    init : function(){
        this.uniqueStore.addListener('load',function(){
            this.options = [];
            var values = this.uniqueStore.getUniqueData(this.dataIndex);
            Ext.each(values,function(value){
                this.options.push([value, value]);
            },this);
            Ext.ux.grid.filter.UniqueListFilter.superclass.init.call(this);
        },
        this
        );
    }
});</pre>
<p>Diesen Filter kann einfach in meinen GridFilters instanzieren:</p>
<pre>var filters = new Ext.ux.grid.GridFilters(
            {
                local:true,
                filters:[
                    {type: 'string',  dataIndex: 'Account'},
                    {type: 'numeric', dataIndex: 'BasePrice'},
                    new Ext.ux.grid.filter.UniqueListFilter({
                        uniqueStore:ds,
                        dataIndex: 'BaseCurrency'

                    }),
                ]
            }
        );</pre>
<p>Im Grid werden die filter über die plugin Schnittstelle eingebunden:</p>
<pre>plugins: [filters,...],</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ajung.de/2009/03/24/extjs-erweiterter-list-filter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Im XmlReader von ExtJS individuell konvertieren.</title>
		<link>http://www.ajung.de/2009/01/27/im-xmlreader-von-extjs-individuell-konvertieren/</link>
		<comments>http://www.ajung.de/2009/01/27/im-xmlreader-von-extjs-individuell-konvertieren/#comments</comments>
		<pubDate>Tue, 27 Jan 2009 17:59:15 +0000</pubDate>
		<dc:creator>ajung</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[ExtJs]]></category>

		<guid isPermaLink="false">http://www.ajung.de/?p=492</guid>
		<description><![CDATA[Der Ext.data.XmlReader in dem ExtJs Framework ist einer wunderbare Sache. Mit ihm lassen sich XML Daten per Ajax wunderbar auslesen und verarbeiten. Dieser Reader wird in der Regel in Grids verwendet. Im Reader definiert man auch den Dataindex für das Grid und dessen Header. Darauf wiederum greifen bestimmte Plugin, wie das Grid Filter Plugin zu. [...]]]></description>
			<content:encoded><![CDATA[<p>Der <strong>Ext.data.XmlReader </strong>in dem ExtJs Framework ist einer wunderbare Sache. Mit ihm lassen sich XML Daten per Ajax wunderbar auslesen und verarbeiten. Dieser Reader wird in der Regel in Grids verwendet. Im Reader definiert man auch den Dataindex für das Grid und dessen Header. Darauf wiederum greifen bestimmte Plugin, wie das Grid Filter Plugin zu.</p>
<p>In meinen Projekt kam es öfters vor das die Werte nicht eins zu eins aus der XML Datei übernommen wurden, sondern mittels einer individuellen Render Funktion für die Ausgabe abgepasst wurde.</p>
<pre>cm: new Ext.grid.ColumnModel([
            {
                header: "XY",
                width:80,
                sortable:true,
                dataIndex:'abc',
                renderer :function(...
            },</pre>
<p>Das funktioniert zwar einwandfrei, aber da das nur in der Ausgabe geschieht, kann ich nicht nach dieser Spalte sortieren, oder in dieser per Filter suchen.</p>
<p>Auch an anderen Stellen habe ich deshalb nach einer Möglichkeit gesucht, den Wert im Reader manuell anzupassen.Versteckt in der der Dokumentation der Klasse Ext.data.Record habe ich die Möglichkeit einer <strong>convert</strong> Funktion gefunden.</p>
<p>Neben dem Mapping kann man über die Eigenschaft convert eine Callback Funktion angeben mit der man den Wert individuell bearbeiten kann.</p>
<pre>reader: new Ext.data.XmlReader({
                    record: 'item'
                }, [{
                    name: 'nominal',
                    mapping: 'price@nominal',
                    convert:function(v,r){
                        var value = "K";
                        if(parseFloat(v)&lt;0){
                            value =  "V";
                        }

                        value += '-' + Ext.DomQuery.selectValue('base-currency', r);
                        value += '/' +Ext.DomQuery.selectValue('quote-currency', r);
                        return value;
                    }
                }</pre>
<p>Somit erzeuge ich einen individuellen Dataindex nach dem ich auch sortieren und filtern kann.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajung.de/2009/01/27/im-xmlreader-von-extjs-individuell-konvertieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javascript und CSS komprimieren mit Jawr</title>
		<link>http://www.ajung.de/2009/01/13/javascript-und-css-komprimieren-mit-jawr/</link>
		<comments>http://www.ajung.de/2009/01/13/javascript-und-css-komprimieren-mit-jawr/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 18:09:05 +0000</pubDate>
		<dc:creator>ajung</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.ajung.de/?p=478</guid>
		<description><![CDATA[Jawr ist ein Java Servlet zum komprimieren der Javascript und CSS Dateien auf dem Webserver.  Dieses Komprimieren geschieht serverseitig und der Entwickler muss die Dateien nicht per Hand komprimieren. Bundles Besonders praktisch ist die Möglichkeit, viele Dateien zu einen Bundle zusammenzufügen. Somit kann man auch die Anzahl der Request reduzieren, aber in der Entwicklung mit [...]]]></description>
			<content:encoded><![CDATA[<p><a href="https://jawr.dev.java.net/"><img class="alignright size-full wp-image-481" title="logo" src="http://www.ajung.de/wp-content/uploads/2009/01/logo.png" alt="logo" width="465" height="82" /></a><a href="https://jawr.dev.java.net/">Jawr</a> ist ein Java Servlet zum komprimieren der Javascript und CSS Dateien auf dem Webserver.  Dieses Komprimieren geschieht serverseitig und der Entwickler muss die Dateien nicht per Hand komprimieren.</p>
<h3><strong>Bundles</strong></h3>
<p>Besonders praktisch ist die Möglichkeit, viele Dateien zu einen Bundle zusammenzufügen. Somit kann man auch die Anzahl der Request reduzieren, aber in der Entwicklung mit vielen einzelnen JS und CSS Dateien arbeiten.  Optimalerweise, sollte man für jede Javascript Klasse eine eigene Datei verwenden.</p>
<h3><strong>Installation mit Maven 2</strong></h3>
<p>Die Installation<strong> </strong>in einen Maven Projekt ist genial einfach. Man fügt in die Pom Datei nur folgende Zeile ein:</p>
<pre>&lt;dependency&gt;
      &lt;groupId&gt;net.jawr&lt;/groupId&gt;
      &lt;artifactId&gt;jawr&lt;/artifactId&gt;
      &lt;version&gt;[2,]&lt;/version&gt;
&lt;/dependency&gt;</pre>
<p>Ein Repository muss man auch noch einfügen:</p>
<pre>&lt;repository&gt;
          &lt;id&gt;maven2-repository.dev.java.net&lt;/id&gt;
          &lt;name&gt;Java.net Repository for Maven&lt;/name&gt;
          &lt;url&gt;http://download.java.net/maven/2/&lt;/url&gt;
          &lt;layout&gt;default&lt;/layout&gt;
&lt;/repository&gt;</pre>
<p>Log4J</p>
<p>Jawr benötigt zusätzlich Log4J. Deshalb muss noch folgende Abhängigkeit eingefügt werden:</p>
<pre>&lt;dependency&gt;
        &lt;groupId&gt;log4j&lt;/groupId&gt;
        &lt;artifactId&gt;log4j&lt;/artifactId&gt;
        &lt;version&gt;1.2.15&lt;/version&gt;
        &lt;type&gt;jar&lt;/type&gt;
        &lt;scope&gt;compile&lt;/scope&gt;
        &lt;exclusions&gt;
            &lt;exclusion&gt;
                &lt;groupId&gt;com.sun.jmx&lt;/groupId&gt;
                &lt;artifactId&gt;jmxri&lt;/artifactId&gt;
            &lt;/exclusion&gt;
            &lt;exclusion&gt;
                &lt;groupId&gt;com.sun.jdmk&lt;/groupId&gt;
                &lt;artifactId&gt;jmxtools&lt;/artifactId&gt;
            &lt;/exclusion&gt;
            &lt;exclusion&gt;
                &lt;groupId&gt;javax.jms&lt;/groupId&gt;
                &lt;artifactId&gt;jms&lt;/artifactId&gt;
            &lt;/exclusion&gt;
        &lt;/exclusions&gt;
 &lt;/dependency&gt;</pre>
<p>Hierbei ist es wichtig dass die <strong>JMX Abhängigkeit</strong> ausgeklammert wird, da Maven sonst eventuell nicht startet.</p>
<p>In die <strong>web.xml</strong> müssen nun noch die Servlets und das Mapping eingetragen werden:</p>
<pre>&lt;servlet&gt;
        &lt;servlet-name&gt;JavascriptServlet&lt;/servlet-name&gt;
        &lt;servlet-class&gt;net.jawr.web.servlet.JawrServlet&lt;/servlet-class&gt;
        &lt;init-param&gt;
            &lt;param-name&gt;configLocation&lt;/param-name&gt;
            &lt;param-value&gt;jawr.properties&lt;/param-value&gt;
        &lt;/init-param&gt;
        &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
    &lt;/servlet&gt;
    &lt;servlet&gt;
        &lt;servlet-name&gt;CSSServlet&lt;/servlet-name&gt;
        &lt;servlet-class&gt;net.jawr.web.servlet.JawrServlet&lt;/servlet-class&gt;
        &lt;init-param&gt;
                &lt;param-name&gt;configLocation&lt;/param-name&gt;
                &lt;param-value&gt;jawr.properties&lt;/param-value&gt;
        &lt;/init-param&gt;
        &lt;init-param&gt;
                &lt;param-name&gt;type&lt;/param-name&gt;
                &lt;param-value&gt;css&lt;/param-value&gt;
        &lt;/init-param&gt;
        &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;
    &lt;/servlet&gt;
    &lt;servlet-mapping&gt;
        &lt;servlet-name&gt;JavascriptServlet&lt;/servlet-name&gt;
        &lt;url-pattern&gt;*.js&lt;/url-pattern&gt;
    &lt;/servlet-mapping&gt;
    &lt;servlet-mapping&gt;
        &lt;servlet-name&gt;CSSServlet&lt;/servlet-name&gt;
        &lt;url-pattern&gt;*.css&lt;/url-pattern&gt;
    &lt;/servlet-mapping&gt;</pre>
<h3>Konfiguration</h3>
<p>Die Konfiguration geschieht in der <strong>jawr.properties</strong></p>
<pre>jawr.debug.on=false
jawr.gzip.on=true
jawr.gzip.ie6.on=false
jawr.charset.name=UTF-8</pre>
<p>Jawr erkennt automatisch ob der Browser <strong>gzip </strong>unterstützt. Wenn die Einstellung <strong>jawr.debug.on</strong> auf <strong>true </strong>steht, werden Dateien nicht komprimiert und die  Bundles werden einzeln geladen. Das ist in der Entwicklung sehr wichtig.</p>
<pre>jawr.js.bundle.basedir=/js
jawr.js.bundle.names=lib,core,model

jawr.js.bundle.lib.id=/bundles/lib.js
jawr.js.bundle.lib.mappings=/js/lib/**

jawr.js.bundle.core.id=/bundles/core.js
jawr.js.bundle.core.mappings=/js/helper/**,/js/.../version.js,/js/.../all/**

jawr.js.bundle.model.id=/bundles/model.js
jawr.js.bundle.model.mappings=/js/kosmos/cockpit/**,/js/.../../DragAndDrop.js,/js/.../reportone/**</pre>
<p>Hier definiere ich 3 verschiedene Bundles. Die Bundles können aus ganzen Ordnern oder einzeln Dateien bestehen. Doppelte Dateien überspringt Jawr automatisch.</p>
<pre>jawr.css.bundle.basedir=/css
jawr.css.bundle.names=style
jawr.css.bundle.style.id=/style.css
jawr.css.bundle.style.mappings=/css/**
jawr.csslinks.flavor = xhtml</pre>
<p>Hier wird ein CSS Bundle definiert. Wichtig ist die Einstellung<strong> jawr.csslinks.flavor = xhtml </strong>, da der Link Tag sonst nicht geschlossen wird.</p>
<p>In der JSP muss nur noch die Taglib angegeben werden.</p>
<pre>&lt;%@ taglib uri="http://jawr.net/tags" prefix="jwr" %&gt;</pre>
<p>Und dieTags für die Bundles eingefügt werden.</p>
<pre>&lt;jwr:style src="/style.css" media="all" /&gt;
&lt;jwr:script src="/bundles/lib.js"/&gt;
...</pre>
<p>Den Unterschied merkt man bei umfangreichen Javascript Anwenungen deutlich.</p>
<pre></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ajung.de/2009/01/13/javascript-und-css-komprimieren-mit-jawr/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lightbox mit Dojo und dem Zend Framework</title>
		<link>http://www.ajung.de/2009/01/12/lightbox-mit-dojo-und-dem-zend-framework/</link>
		<comments>http://www.ajung.de/2009/01/12/lightbox-mit-dojo-und-dem-zend-framework/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 18:00:06 +0000</pubDate>
		<dc:creator>ajung</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[dojo]]></category>
		<category><![CDATA[zend-framework]]></category>

		<guid isPermaLink="false">http://www.ajung.de/?p=470</guid>
		<description><![CDATA[Das Javascript Framework Dojo lässt sich mit dem Zend Framework besonders elegant einsetzen. Man kann die Integration von Dojo im der Controler Schicht, also in den Actions aktivieren und auch von dort angeben welche Module von Dojo man benötigt. So kann man sichergehen das die benötigten Javascript Dateien nur auf den Seiten geladen werden, wo [...]]]></description>
			<content:encoded><![CDATA[<p>Das Javascript Framework Dojo lässt sich mit dem Zend Framework besonders elegant einsetzen. Man kann die Integration von Dojo im der Controler Schicht, also in den Actions aktivieren und auch von dort angeben welche Module von Dojo man benötigt. So kann man sichergehen das die benötigten Javascript Dateien nur auf den Seiten geladen werden, wo sie auch genutzt werden.</p>
<p>Wenn ich also das Lightbox Modul verwenden möchte, füge ich nur folgenden Code in der Action Methode ein:</p>
<pre>$this-&gt;view-&gt;dojo()-&gt;enable();
$this-&gt;view-&gt;dojo()-&gt;requireModule('dojox.image.Lightbox');
$this-&gt;view-&gt;headLink()-&gt;appendStylesheet('/js/dojox/image/resources/Lightbox.css');</pre>
<p>Zusätzlich hat das Dojo Framework die praktische Eigenschaft, dass es sich alle zu dem Modul notwenigen Module selber nach per Ajax lädt.</p>
<p>Mit der Methode <strong>addOnLoad()</strong> kann ich eine Funktion definieren, die beim Laden der Seite aufgerufen wird. Dadurch kann man an verschiedenen Stellen eine Funktion zum Onload Ereignis hinzufügen ohne dass diese sich überschreiben.</p>
<pre>$this-&gt;view-&gt;dojo()-&gt;addOnLoad('initLightbox');</pre>
<p>In einer seperaten JavaScript Datei habe ich das Initialisieren der Lightbox definiert.</p>
<pre>var initLightbox = function(){
	dojo.query(".thumbs li a").forEach(function(node, index, arr){
		var href = dojo.query('img',node)[0].src.replace('/thumbs/','/pics/');
		var lb = new dojox.image.Lightbox({title:dojo.query('.tipp',node)[0].innerHTML, group:"group2", href:href ,style:'padding:40px;'});
		lb.startup();
		dojo.connect(node,'onclick',function(e){
			e.preventDefault();
			lb.show();
		});
	});
}</pre>
<p>Dieser Code erzeugt aus einer einfachen Liste mit Links auf Bilder einer schönen Light Box mit Blätter Funktion.</p>
<pre>&lt;ul class="thumbs"&gt;
	&lt;li&gt;
		&lt;a id="68" href="/galery/picture/id/68"&gt;&lt;img width="100" height="67" src="/images/galeries/1/thumbs/001.jpg" alt="56 x 42 cm" /&gt;&lt;/a&gt;
	&lt;/li&gt;
	....

<img class="size-full wp-image-475 alignnone" title="light" src="http://www.ajung.de/wp-content/uploads/2009/01/light.png" alt="light" width="283" height="168" /></pre>
]]></content:encoded>
			<wfw:commentRss>http://www.ajung.de/2009/01/12/lightbox-mit-dojo-und-dem-zend-framework/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Viewport Switch mit ExtJs</title>
		<link>http://www.ajung.de/2009/01/05/viewport-switch-mit-extjs/</link>
		<comments>http://www.ajung.de/2009/01/05/viewport-switch-mit-extjs/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 18:14:43 +0000</pubDate>
		<dc:creator>ajung</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.ajung.de/?p=439</guid>
		<description><![CDATA[Ein Viewport ist in dem Javascript Framework ExtJs ein Conatiner für die Panels und Grid. Dieser Viewport füllt die ganze Seite aus und scaliert bei Änderungen des Browser die Größe mit. Für eine typische Webanwendung wird das &#8220;Border&#8221; Layout verwendet. In diesem Border Layout kann man die Regionen south, east, north, west, und center definieren. [...]]]></description>
			<content:encoded><![CDATA[<p>Ein Viewport ist in dem Javascript Framework <a href="http://extjs.com/">ExtJs</a> ein Conatiner für die Panels und Grid. Dieser Viewport füllt die ganze Seite aus und scaliert bei Änderungen des Browser die Größe mit. Für eine typische Webanwendung wird das &#8220;Border&#8221; Layout verwendet. In diesem Border Layout kann man die Regionen south, east, north, west, und center definieren.</p>
<p><img class="alignnone size-full wp-image-441" title="ext-20-layout-examples_12311738467781" src="http://www.ajung.de/wp-content/uploads/2009/01/ext-20-layout-examples_12311738467781.png" alt="ext-20-layout-examples_12311738467781" width="404" height="419" /></p>
<p>In meinen letzten ExtJS Projekt war die Anwendung etwas umfangreicher so das verschiedene Viewports verwendet wurden um die verschiedenen Bereiche abzutrennen. Dazu wurde immer die komplette Seite neu geladen. Bei der Masse an JavaScript Dateien hat sich dieser Switch mit Reload als unangenehm erwiesen. Deshalb habe ich nach einer Möglichkeit gesucht den <strong>Viewport zu Laufzeit auszutauschen</strong>.</p>
<p>Der logische Weg mittels &#8220;destroy&#8221; den alten Viewport zu zerstören und einfach einen neuen zu erzeugen, funktionierte leider nicht, da der Viewport zu stark in den DOM Baum verankert ist.</p>
<p>Nach einigem Suchen wurde mir klar das die<strong> Regionen einens Viewports nicht mehr änderbar sind</strong> sobald sie erzeugt wurden. Man kann nur dessen Inhalt (items) entfernen und dann neue Elemente hinzufügen.</p>
<p>Um die Elemente einer Region zu entfernen habe ich folgende Funktion an mein Viewport ergänzt:</p>
<pre>    /**
     * Remove all Items from a Region
     * @param    string    region
     */
    removeAllItems:function(region){
        this._tempcmp = Ext.getCmp(region);
        var mixedCollection = this._tempcmp.items;
        mixedCollection.each(function(item,index,length){
            this._tempcmp.remove(item);
        },this);
    },</pre>
<p>Nach dem ich die Region geleert habe hole ich mir die Region mit <strong>Ext.getCmp() </strong>und füge mit der add Methode die neuen Items hinzu.<br />
Ganz am Ende muss ich noch die <strong>doLayout()</strong> Methode des Viewports aufrufen damit die neuen Elemente neu gerendert werden.</p>
<p>Wenn man die Code richtig aufbaut kommt man bei dieser Methode auch ohne doppelten Code aus.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajung.de/2009/01/05/viewport-switch-mit-extjs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ExtJS: Darauf kann man sich verlassen</title>
		<link>http://www.ajung.de/2008/12/04/extjs-darauf-kann-man-sich-verlassen/</link>
		<comments>http://www.ajung.de/2008/12/04/extjs-darauf-kann-man-sich-verlassen/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 16:30:17 +0000</pubDate>
		<dc:creator>ajung</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Ext]]></category>

		<guid isPermaLink="false">http://www.ajung.de/?p=415</guid>
		<description><![CDATA[Ich habe jetzt mein erstes Ext JS Projekt fertig gestellt und bin überaus begeistert von diesem JavaScript Framework. Die Einarbeitung hat am Anfang etwas länger gedauert als bei anderen Javascript Frameworks aber als ich dann mal das Prinzip hinter der Architektur erkannt hatte, dann ging die Entwicklung extrem schnell. Ein wenig erinnerte mich das an [...]]]></description>
			<content:encoded><![CDATA[<p>Ich habe jetzt mein erstes Ext JS Projekt fertig gestellt und bin überaus begeistert von diesem JavaScript Framework.</p>
<p>Die Einarbeitung hat am Anfang etwas länger gedauert als bei anderen Javascript Frameworks aber als ich dann mal das Prinzip hinter der Architektur erkannt hatte, dann ging die Entwicklung extrem schnell.</p>
<p><img class="alignnone size-full wp-image-416" title="extjs" src="http://www.ajung.de/wp-content/uploads/2008/12/extjs.gif" alt="" width="437" height="251" /></p>
<p>Ein wenig erinnerte mich das an die ASP.NET Controlls. Bei diesen muss man auch vorher wissen welches Controll für welche Aufgaben geeignet ist und wo die Grenzen sind. Ganz so extrem ist die Auswahl bei ExtJS zum Glück nicht.</p>
<p><strong>Sauberer Code</strong></p>
<p>Der Code von ExtJS ist sehr sauber und einheitlich. Deshalb ist es sehr einfach sich in neue Grids und co einzudenken wenn man das Prinzip einmal verstanden hat.</p>
<p><strong>Dokumentation</strong></p>
<p>Die Dokumention als AIR Applikation ist praktisch und habe ich extrem viel genutzt. Es handelt sich dabei aber um eine reine Code Dokumentation und mit dieser kann man schlecht das Zusammenspiel der Komponenten darstellen. Dafür war für mich ein <strong>Blick in die Sourcen </strong>der Klassen nützlicher als jede Google Suche.</p>
<p><strong>Keine Sackgassen</strong></p>
<p>Oft habe ich beim Einsatz von neuen Frameworks die Erfahrung mit Sackgassen erlebt. Meistens traten diese Probleme auf wenn man verschiedene Komponenten mit einen kombiniert und die dann nicht richtig zusammenarbeiten können. Nicht so bei bei ExtJ, selbst die verrücktestden Aufgaben ließen sich mittels der umfangreichen Plugins lösen.</p>
<p><strong>Ausnahme</strong></p>
<p>Ein Ausnahme war die Verwendung von 2 übereinanderliegenen Dropzonen. Das ließ sich mit einen kleinen unschönen Workarround aber auch lösen. Hier ein Beispiel der Problematik.</p>
<p><img class="alignnone size-full wp-image-418" title="myimage2" src="http://www.ajung.de/wp-content/uploads/2008/12/myimage2.png" alt="" width="500" height="354" /></p>
<p>Gelöst habe ich das Problem indem ich den startdrag Event von dem beiden Grid abfange und dann während des Dragvorgang die andere Dropzone entferne und beim Beenden des Draggen sie wieder neue erstelle.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ajung.de/2008/12/04/extjs-darauf-kann-man-sich-verlassen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
