<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-3326160732880350623</atom:id><lastBuildDate>Fri, 03 Oct 2014 06:51:27 +0000</lastBuildDate><category>PHP</category><category>Symfony</category><category>Programming</category><category>tutorials</category><category>I18n</category><category>Javascript</category><category>aie</category><category>fileupload</category><category>Canvas</category><category>Doctrine</category><category>ExtJS</category><category>Firefox</category><category>Fun</category><category>HTML5</category><category>Howto</category><category>Projects</category><category>ajax</category><category>ajax image editor</category><category>as3</category><category>bug</category><category>css</category><category>drupal</category><category>flash</category><category>google</category><category>html</category><category>jsThumbnailPlugin</category><category>plugin</category><category>security</category><category>workaround</category><title>julianstricker.com</title><description>I work as Senior Software Engineer at one of the biggest online marketing agencies in Italy. My primary responsibility is the programming of internet applications using AJAX, PHP, Symfony, Javascript, Prototype.js, Scriptaculous, jQuery, ExtJS, Flash, Flex, Away3D.</description><link>http://www.julianstricker.com/</link><managingEditor>noreply@blogger.com (Julian)</managingEditor><generator>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3326160732880350623.post-7582955549078499907</guid><pubDate>Mon, 15 Nov 2010 19:47:00 +0000</pubDate><atom:updated>2012-03-26T13:38:09.549-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Howto</category><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">Programming</category><category domain="http://www.blogger.com/atom/ns#">Symfony</category><category domain="http://www.blogger.com/atom/ns#">tutorials</category><title>How to add a &quot;Save and List&quot; Action Button to Symfony Admin Generator Form.</title><description>To improve the workflow sometimes it may be better to redirect the user back to the list after the Save-action. This tutorial shows how to implement this in Symfony 1.3 and 1.4&lt;br /&gt;&lt;br /&gt;First copy the &quot;processForm&quot;-function from the action.class.php in your cache-directory ( /cache/dev/modules/auto[Modulename]/actions/actions.class.php ) to your action.class.php and change the lines:&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;&lt;br /&gt;      if ($request-&gt;hasParameter(&#39;_save_and_add&#39;))&lt;br /&gt;      {&lt;br /&gt;        $this-&gt;getUser()-&gt;setFlash(&#39;notice&#39;, $notice.&#39; You can add another one below.&#39;);&lt;br /&gt;&lt;br /&gt;        $this-&gt;redirect(&#39;@[Modulename]_new&#39;);&lt;br /&gt;      }      &lt;br /&gt;      else&lt;br /&gt;      {&lt;br /&gt;        $this-&gt;getUser()-&gt;setFlash(&#39;notice&#39;, $notice);&lt;br /&gt;&lt;br /&gt;        $this-&gt;redirect(array(&#39;sf_route&#39; =&gt; &#39;[Modulename]_edit&#39;, &#39;sf_subject&#39; =&gt; $[Modulename]));&lt;br /&gt;      }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;to:&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;&lt;br /&gt;&lt;br /&gt;      if ($request-&gt;hasParameter(&#39;_save_and_add&#39;))&lt;br /&gt;      {&lt;br /&gt;        $this-&gt;getUser()-&gt;setFlash(&#39;notice&#39;, $notice.&#39; You can add another one below.&#39;);&lt;br /&gt;&lt;br /&gt;        $this-&gt;redirect(&#39;@[Modulename]_new&#39;);&lt;br /&gt;      }&lt;br /&gt;      else if ($request-&gt;hasParameter(&#39;_save_and_list&#39;))&lt;br /&gt;      {&lt;br /&gt;        $this-&gt;getUser()-&gt;setFlash(&#39;notice&#39;, $notice);&lt;br /&gt;&lt;br /&gt;        $this-&gt;redirect(&#39;@[Modulename]&#39;);&lt;br /&gt;      }&lt;br /&gt;      else&lt;br /&gt;      {&lt;br /&gt;        $this-&gt;getUser()-&gt;setFlash(&#39;notice&#39;, $notice);&lt;br /&gt;&lt;br /&gt;        $this-&gt;redirect(array(&#39;sf_route&#39; =&gt; &#39;[Modulename]_edit&#39;, &#39;sf_subject&#39; =&gt; $[Modulename]));&lt;br /&gt;      }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Open the file /apps/[Appname]/modules/[Modulename]/lib/[Modulename]GeneratorHelper.class.php and add the function:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;&lt;br /&gt;public function linkToSaveAndList($object, $params)&lt;br /&gt;  {&lt;br /&gt;    &lt;br /&gt;    return &#39;&lt;li class=&quot;sf_admin_action_save_and_list&quot;&gt;&lt;input type=&quot;submit&quot; value=&quot;&#39;.__($params[&#39;label&#39;], array(), &#39;sf_admin&#39;).&#39;&quot; name=&quot;_save_and_list&quot; /&gt;&lt;/li&gt;&#39;;&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In /apps/[Appname]/modules/[Modulename]/config/generator.yml:&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;&lt;br /&gt;    ...&lt;br /&gt;    config:&lt;br /&gt;      ...&lt;br /&gt;      form:&lt;br /&gt;        actions:&lt;br /&gt;           save_and_list: ~&lt;br /&gt;           ...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now there is a new button &quot;Save and list&quot; at the bottom of the Edit-form that will redirect the user to the list after saving the form. Maybe it would be useful to change the generator-classes to auto generate this button for every module.</description><link>http://www.julianstricker.com/2010/11/how-to-add-save-and-list-action-button.html</link><author>noreply@blogger.com (Julian)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3326160732880350623.post-2004198694619367738</guid><pubDate>Tue, 14 Sep 2010 15:51:00 +0000</pubDate><atom:updated>2014-05-27T01:00:26.807-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Canvas</category><category domain="http://www.blogger.com/atom/ns#">Fun</category><category domain="http://www.blogger.com/atom/ns#">HTML5</category><category domain="http://www.blogger.com/atom/ns#">Javascript</category><title>Fun with HTML5 Canvas Effects</title><description>During my work on the new AIE Ajax Image Editor, I have done some experiments with the new HTML5 features, especially the new Canvas tag. This script is basically a new implementation in JavaScript of a old Director-Movie which I have made about 10 years ago. &lt;br /&gt;&lt;br /&gt;&lt;img id=&quot;canvasSource&quot; src=&quot;http://1.bp.blogspot.com/-WM5LEaM9BqI/U4RAFbTUccI/AAAAAAAAKpE/3Waq7OcyNLQ/s1600/a941a55af.6398154.jpg&quot; alt=&quot;Canvas Source&quot; style=&quot;display:none&quot; /&gt;&lt;br /&gt;&lt;canvas id=&quot;area&quot; width=&quot;140&quot; height=&quot;185&quot; style=&quot;margin-right:5px&quot; align=&quot;left&quot;&gt;&lt;/canvas&gt;Simply move over the image to distort it. Click to switch effect. &lt;br /&gt;    &lt;!-- Javascript Code --&gt;&lt;br /&gt;     &lt;script type=&#39;text/javascript&#39;&gt;/*&lt;![CDATA[*/   var Mouse = {x:0, y:0};        $(document).mousemove(function(evt) {         var e = window.event || evt;         Mouse.x = e.x || e.pageX || 0;         Mouse.y = e.y || e.pageY || 0;               });              canvas = false;       context = false;       image = false;       imgdo = false;       imgsizex=140;       imgsizey=185;       mode=0;       function draw(){         var imgd = context.getImageData(0, 0, imgsizex, imgsizey);         var opix = imgdo.data;         var npix = imgd.data;         var mpos={x:100,y:100};         var area=document.getElementById(&quot;area&quot;);         mpos.x=Mouse.x-area.offsetLeft;         mpos.y=Mouse.y-area.offsetTop;         for (iy=0; iy&lt;imgsizey; iy++){           for (ix=0; ix&lt;imgsizex; ix++){             var a=(ix - mpos.x);             var b=(iy - mpos.y);             var c=Math.abs(Math.sqrt(Math.abs(a*a)+Math.abs(b*b)));             var w=getwinkel(a,b);             if (mode==0) {               var wd=90-(c);               if (wd&lt;0) wd=0;               if (wd&gt;90) wd=90;               var neww=grad2rad(w+wd/1);               var newa=Math.sin(neww)*c;               var newb=Math.cos(neww)*c;               var z=(iy*imgsizex+ix)*4;               var nz=Math.round((Math.round(mpos.y+newb)*imgsizex+Math.round(mpos.x+newa)))*4;             }else if (mode==1){               var wd=90-(c);               if (wd&lt;0) wd=0;               if (wd&gt;90) wd=90;               var neww=grad2rad(w);               var newc=c+wd/10;               var newa=Math.sin(neww)*newc;               var newb=Math.cos(neww)*newc;               var z=(iy*imgsizex+ix)*4;               var nz=Math.round((Math.round(mpos.y+newb)*imgsizex+Math.round(mpos.x+newa)))*4;             }else{               var wd=(c);               if (wd&lt;0) wd=0;               if (wd&gt;90) wd=90;               var neww=grad2rad(w);               var newc=c+wd/10;               var newa=Math.sin(neww)*newc;               var newb=Math.cos(neww)*newc;               var z=(iy*imgsizex+ix)*4;               var nz=Math.round((Math.round(mpos.y+newb)*imgsizex+Math.round(mpos.x+newa)))*4;             }             npix[z  ] = opix[nz  ] || 0; 	// red             npix[z+1] = opix[nz+1] || 0; 	// green             npix[z+2] = opix[nz+2] || 0; 	// blue            }         }         var a=10;         var b=10;         var c=Math.sqrt(a*a+b*b);                 context.putImageData(imgd, 0, 0);       }        $(window).load(function(){                  canvas = document.getElementById(&quot;area&quot;);         context = canvas.getContext(&quot;2d&quot;);         image = document.getElementById(&quot;canvasSource&quot;);         context.drawImage(image, 0, 0);         imgdo = context.getImageData(0, 0, imgsizex, imgsizey);         document.getElementById(&quot;area&quot;).onmousemove=draw;  	 document.getElementById(&quot;area&quot;).onclick=function(){ mode++; if(mode&gt;2) mode=0; }; 	 draw();         });       function rad2grad(rad){         return rad*180/Math.PI;       }       function grad2rad(grad){         return grad*Math.PI/180;       }       function getwinkel(a,b){         var c=Math.abs(Math.sqrt(Math.abs(a*a)+Math.abs(b*b)));         var nw=rad2grad(Math.asin(a/c));         if (a&lt;0 &amp;&amp; b&lt;0){           nw= -nw-180;         }else if (b&lt;0){           nw= 180-nw;         }         return nw;       }  /*]]&gt;*/ &lt;/script&gt;&lt;br /&gt;The script is very simple: first it gets the content of a image (&quot;getImageData&quot;-function).  &lt;br /&gt;&lt;pre class=&quot;brush: javascript;&quot;&gt;&lt;br /&gt;&lt;br /&gt;window.onload = function() {&lt;br /&gt;&lt;br /&gt;  canvas = document.getElementById(&quot;area&quot;);&lt;br /&gt;&lt;br /&gt;  context = canvas.getContext(&quot;2d&quot;);&lt;br /&gt;&lt;br /&gt;  image = document.getElementById(&quot;canvasSource&quot;);&lt;br /&gt;&lt;br /&gt;  context.drawImage(image, 0, 0);&lt;br /&gt;&lt;br /&gt;  imgdo = context.getImageData(0, 0, imgsizex, imgsizey);&lt;br /&gt;&lt;br /&gt;  document.getElementById(&quot;area&quot;).onmousemove=draw;&lt;br /&gt;&lt;br /&gt;  document.getElementById(&quot;area&quot;).onclick=function(){ mode++; if(mode&gt;2) mode=0; }; &lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then it distorts the image using some trigonometric functions: &lt;br /&gt;&lt;pre class=&quot;brush: javascript;&quot;&gt;&lt;br /&gt;&lt;br /&gt;function draw(){&lt;br /&gt;&lt;br /&gt;  var imgd = context.getImageData(0, 0, imgsizex, imgsizey);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  var opix = imgdo.data;&lt;br /&gt;&lt;br /&gt;  var npix = imgd.data;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  var mpos={x:100,y:100};&lt;br /&gt;&lt;br /&gt;  var area=document.getElementById(&quot;area&quot;);&lt;br /&gt;&lt;br /&gt;  mpos.x=Mouse.x-area.offsetLeft;&lt;br /&gt;&lt;br /&gt;  mpos.y=Mouse.y-area.offsetTop;&lt;br /&gt;&lt;br /&gt;  for (iy=0; iy&lt;imgsizey; iy++){&lt;br /&gt;&lt;br /&gt;    for (ix=0; ix&lt;imgsizex; ix++){&lt;br /&gt;&lt;br /&gt;      var a=(ix - mpos.x);&lt;br /&gt;&lt;br /&gt;      var b=(iy - mpos.y);&lt;br /&gt;&lt;br /&gt;      var c=Math.abs(Math.sqrt(Math.abs(a*a)+Math.abs(b*b)));&lt;br /&gt;&lt;br /&gt;      var w=getwinkel(a,b);&lt;br /&gt;&lt;br /&gt;      if (mode==0) {&lt;br /&gt;&lt;br /&gt;              var wd=90-(c);&lt;br /&gt;&lt;br /&gt;              if (wd&lt;0) wd=0;&lt;br /&gt;&lt;br /&gt;              if (wd&gt;90) wd=90;&lt;br /&gt;&lt;br /&gt;              var neww=grad2rad(w+wd/1);&lt;br /&gt;&lt;br /&gt;              var newa=Math.sin(neww)*c;&lt;br /&gt;&lt;br /&gt;              var newb=Math.cos(neww)*c;&lt;br /&gt;&lt;br /&gt;              var z=(iy*imgsizex+ix)*4;&lt;br /&gt;&lt;br /&gt;              var nz=Math.round((Math.round(mpos.y+newb)*imgsizex+Math.round(mpos.x+newa)))*4;&lt;br /&gt;&lt;br /&gt;            }else if (mode==1){&lt;br /&gt;&lt;br /&gt;              var wd=90-(c);&lt;br /&gt;&lt;br /&gt;              if (wd&lt;0) wd=0;&lt;br /&gt;&lt;br /&gt;              if (wd&gt;90) wd=90;&lt;br /&gt;&lt;br /&gt;              var neww=grad2rad(w);&lt;br /&gt;&lt;br /&gt;              var newc=c+wd/10;&lt;br /&gt;&lt;br /&gt;              var newa=Math.sin(neww)*newc;&lt;br /&gt;&lt;br /&gt;              var newb=Math.cos(neww)*newc;&lt;br /&gt;&lt;br /&gt;              var z=(iy*imgsizex+ix)*4;&lt;br /&gt;&lt;br /&gt;              var nz=Math.round((Math.round(mpos.y+newb)*imgsizex+Math.round(mpos.x+newa)))*4;&lt;br /&gt;&lt;br /&gt;            }else{&lt;br /&gt;&lt;br /&gt;              var wd=(c);&lt;br /&gt;&lt;br /&gt;              if (wd&lt;0) wd=0;&lt;br /&gt;&lt;br /&gt;              if (wd&gt;90) wd=90;&lt;br /&gt;&lt;br /&gt;              var neww=grad2rad(w);&lt;br /&gt;&lt;br /&gt;              var newc=c+wd/10;&lt;br /&gt;&lt;br /&gt;              var newa=Math.sin(neww)*newc;&lt;br /&gt;&lt;br /&gt;              var newb=Math.cos(neww)*newc;&lt;br /&gt;&lt;br /&gt;              var z=(iy*imgsizex+ix)*4;&lt;br /&gt;&lt;br /&gt;              var nz=Math.round((Math.round(mpos.y+newb)*imgsizex+Math.round(mpos.x+newa)))*4;&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;      npix[z  ] = opix[nz  ] || 0; 	// red&lt;br /&gt;&lt;br /&gt;      npix[z+1] = opix[nz+1] || 0; 	// green&lt;br /&gt;&lt;br /&gt;      npix[z+2] = opix[nz+2] || 0; 	// blue&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  var a=10;&lt;br /&gt;&lt;br /&gt;  var b=10;&lt;br /&gt;&lt;br /&gt;  var c=Math.sqrt(a*a+b*b);        &lt;br /&gt;&lt;br /&gt;  context.putImageData(imgd, 0, 0);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It basically calculates the distance and the angle to the mouse position of every pixel. Then it adds a percentage of the distance to the angle and recalculates the new pixel-position. Then it copies the RGB-value of the pixel at the calculated position in the original image to the pixel in the new image. &lt;br /&gt;&lt;br /&gt;I have made those functions to convert between Rad and grad and to calculate the angle: &lt;br /&gt;&lt;pre class=&quot;brush: javascript;&quot;&gt;&lt;br /&gt;&lt;br /&gt;function rad2grad(rad){&lt;br /&gt;&lt;br /&gt;  return rad*180/Math.PI;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function grad2rad(grad){&lt;br /&gt;&lt;br /&gt;  return grad*Math.PI/180;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function getwinkel(a,b){&lt;br /&gt;&lt;br /&gt;  var c=Math.abs(Math.sqrt(Math.abs(a*a)+Math.abs(b*b)));&lt;br /&gt;&lt;br /&gt;  var nw=rad2grad(Math.asin(a/c));&lt;br /&gt;&lt;br /&gt;  if (a&lt;0 &amp;&amp; b&lt;0){&lt;br /&gt;&lt;br /&gt;    nw= -nw-180;&lt;br /&gt;&lt;br /&gt;  }else if (b&lt;0){&lt;br /&gt;&lt;br /&gt;    nw= 180-nw;&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return nw;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;...and the complete Code: &lt;br /&gt;&lt;pre class=&quot;brush: javascript;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Fun with HTML5 Canvas Effects Example&lt;br /&gt;&lt;br /&gt;Author: 2010 Julian Stricker - http://www.julianstricker.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;&lt;br /&gt;&lt;br /&gt;  &lt;head&gt;&lt;br /&gt;&lt;br /&gt;    &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;title&gt;Fun with HTML5 Canvas Effects&lt;/title&gt;&lt;br /&gt;&lt;br /&gt;  &lt;/head&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  &lt;body&gt;&lt;br /&gt;&lt;br /&gt;    Fun with HTML5 Canvas Effects - Example &lt;br/&gt;&lt;br /&gt;&lt;br /&gt;    Author: 2010 Julian Stricker - &lt;a href=&quot;http://www.julianstricker.com/&quot; title=&quot;www.julianstricker.com&quot;&gt;www.julianstricker.com&lt;/a&gt;&lt;br/&gt;&lt;br /&gt;&lt;br /&gt;    &lt;img id=&quot;canvasSource&quot; src=&quot;http://www.julianstricker.com/tests/a941a55af.6398154.jpg&quot; alt=&quot;Canvas Source&quot; /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;canvas id=&quot;area&quot; width=&quot;140&quot; height=&quot;185&quot;&gt;&lt;/canvas&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    &lt;!-- Javascript Code --&gt;&lt;br /&gt;&lt;br /&gt;    &lt;script type=&quot;text/javascript&quot;&gt;&lt;br /&gt;&lt;br /&gt;      //mouse-positon (with scroll-pos on ie)&lt;br /&gt;&lt;br /&gt;      var Mouse = {x:0, y:0};&lt;br /&gt;&lt;br /&gt;      document.onmousemove = function (evt) {&lt;br /&gt;&lt;br /&gt;        var e = window.event || evt;&lt;br /&gt;&lt;br /&gt;        Mouse.x = e.x || e.pageX || 0;&lt;br /&gt;&lt;br /&gt;        Mouse.y = e.y || e.pageY || 0;        &lt;br /&gt;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      canvas = false;&lt;br /&gt;&lt;br /&gt;      context = false;&lt;br /&gt;&lt;br /&gt;      image = false;&lt;br /&gt;&lt;br /&gt;      imgdo = false;&lt;br /&gt;&lt;br /&gt;      imgsizex=140;&lt;br /&gt;&lt;br /&gt;      imgsizey=185;&lt;br /&gt;&lt;br /&gt;      mode=1;&lt;br /&gt;&lt;br /&gt;      function draw(){&lt;br /&gt;&lt;br /&gt;        var imgd = context.getImageData(0, 0, imgsizex, imgsizey);&lt;br /&gt;&lt;br /&gt;        var opix = imgdo.data;&lt;br /&gt;&lt;br /&gt;        var npix = imgd.data;&lt;br /&gt;&lt;br /&gt;        var mpos={x:100,y:100};&lt;br /&gt;&lt;br /&gt;        var area=document.getElementById(&quot;area&quot;);&lt;br /&gt;&lt;br /&gt;        mpos.x=Mouse.x-area.offsetLeft;&lt;br /&gt;&lt;br /&gt;        mpos.y=Mouse.y-area.offsetTop;&lt;br /&gt;&lt;br /&gt;        for (iy=0; iy&lt;imgsizey; iy++){&lt;br /&gt;&lt;br /&gt;          for (ix=0; ix&lt;imgsizex; ix++){&lt;br /&gt;&lt;br /&gt;            var a=(ix - mpos.x);&lt;br /&gt;&lt;br /&gt;            var b=(iy - mpos.y);&lt;br /&gt;&lt;br /&gt;            var c=Math.abs(Math.sqrt(Math.abs(a*a)+Math.abs(b*b)));&lt;br /&gt;&lt;br /&gt;            var w=getwinkel(a,b);&lt;br /&gt;&lt;br /&gt;            &lt;br /&gt;&lt;br /&gt;            &lt;br /&gt;&lt;br /&gt;            if (mode==0) {&lt;br /&gt;&lt;br /&gt;              var wd=90-(c);&lt;br /&gt;&lt;br /&gt;              if (wd&lt;0) wd=0;&lt;br /&gt;&lt;br /&gt;              if (wd&gt;90) wd=90;&lt;br /&gt;&lt;br /&gt;              var neww=grad2rad(w+wd/1);&lt;br /&gt;&lt;br /&gt;              var newa=Math.sin(neww)*c;&lt;br /&gt;&lt;br /&gt;              var newb=Math.cos(neww)*c;&lt;br /&gt;&lt;br /&gt;              var z=(iy*imgsizex+ix)*4;&lt;br /&gt;&lt;br /&gt;              var nz=Math.round((Math.round(mpos.y+newb)*imgsizex+Math.round(mpos.x+newa)))*4;&lt;br /&gt;&lt;br /&gt;            }else if (mode==1){&lt;br /&gt;&lt;br /&gt;              var wd=90-(c);&lt;br /&gt;&lt;br /&gt;              if (wd&lt;0) wd=0;&lt;br /&gt;&lt;br /&gt;              if (wd&gt;90) wd=90;&lt;br /&gt;&lt;br /&gt;              var neww=grad2rad(w);&lt;br /&gt;&lt;br /&gt;              var newc=c+wd/10;&lt;br /&gt;&lt;br /&gt;              var newa=Math.sin(neww)*newc;&lt;br /&gt;&lt;br /&gt;              var newb=Math.cos(neww)*newc;&lt;br /&gt;&lt;br /&gt;              var z=(iy*imgsizex+ix)*4;&lt;br /&gt;&lt;br /&gt;              var nz=Math.round((Math.round(mpos.y+newb)*imgsizex+Math.round(mpos.x+newa)))*4;&lt;br /&gt;&lt;br /&gt;            }else{&lt;br /&gt;&lt;br /&gt;              var wd=(c);&lt;br /&gt;&lt;br /&gt;              if (wd&lt;0) wd=0;&lt;br /&gt;&lt;br /&gt;              if (wd&gt;90) wd=90;&lt;br /&gt;&lt;br /&gt;              var neww=grad2rad(w);&lt;br /&gt;&lt;br /&gt;              var newc=c+wd/10;&lt;br /&gt;&lt;br /&gt;              var newa=Math.sin(neww)*newc;&lt;br /&gt;&lt;br /&gt;              var newb=Math.cos(neww)*newc;&lt;br /&gt;&lt;br /&gt;              var z=(iy*imgsizex+ix)*4;&lt;br /&gt;&lt;br /&gt;              var nz=Math.round((Math.round(mpos.y+newb)*imgsizex+Math.round(mpos.x+newa)))*4;&lt;br /&gt;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            //if (iy==0)console.log(Math.round(mpos.y+newb), Math.round(mpos.x+newa),iy,ix);&lt;br /&gt;&lt;br /&gt;            npix[z  ] = opix[nz  ] || 0; 	// red&lt;br /&gt;&lt;br /&gt;            npix[z+1] = opix[nz+1] || 0; 	// green&lt;br /&gt;&lt;br /&gt;            npix[z+2] = opix[nz+2] || 0; 	// blue&lt;br /&gt;&lt;br /&gt;          }&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        var a=10;&lt;br /&gt;&lt;br /&gt;        var b=10;&lt;br /&gt;&lt;br /&gt;        var c=Math.sqrt(a*a+b*b);&lt;br /&gt;&lt;br /&gt;        context.putImageData(imgd, 0, 0);&lt;br /&gt;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;      window.onload = function() {&lt;br /&gt;&lt;br /&gt;        canvas = document.getElementById(&quot;area&quot;);&lt;br /&gt;&lt;br /&gt;        context = canvas.getContext(&quot;2d&quot;);&lt;br /&gt;&lt;br /&gt;        image = document.getElementById(&quot;canvasSource&quot;);&lt;br /&gt;&lt;br /&gt;        context.drawImage(image, 0, 0);        &lt;br /&gt;&lt;br /&gt;        imgdo = context.getImageData(0, 0, imgsizex, imgsizey);&lt;br /&gt;&lt;br /&gt;        document.getElementById(&quot;area&quot;).onmousemove=draw; &lt;br /&gt;&lt;br /&gt;        document.getElementById(&quot;area&quot;).onclick=function(){ mode++; if(mode&gt;2) mode=0; };&lt;br /&gt;&lt;br /&gt;      };&lt;br /&gt;&lt;br /&gt;      function rad2grad(rad){&lt;br /&gt;&lt;br /&gt;        return rad*180/Math.PI;&lt;br /&gt;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      function grad2rad(grad){&lt;br /&gt;&lt;br /&gt;        return grad*Math.PI/180;&lt;br /&gt;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      function getwinkel(a,b){&lt;br /&gt;&lt;br /&gt;        var c=Math.abs(Math.sqrt(Math.abs(a*a)+Math.abs(b*b)));&lt;br /&gt;&lt;br /&gt;        var nw=rad2grad(Math.asin(a/c));&lt;br /&gt;&lt;br /&gt;        if (a&lt;0 &amp;&amp; b&lt;0){&lt;br /&gt;&lt;br /&gt;          nw= -nw-180;&lt;br /&gt;&lt;br /&gt;        }else if (b&lt;0){&lt;br /&gt;&lt;br /&gt;          nw= 180-nw;&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return nw;&lt;br /&gt;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;    &lt;/script&gt;&lt;br /&gt;&lt;br /&gt;  &lt;/body&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/html&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;!--[if IE]&gt;&lt;script src=&quot;excanvas.compiled.js&quot;&gt;&lt;/script&gt;&lt;![endif]--&gt;</description><link>http://www.julianstricker.com/2010/09/fun-with-html5-canvas-effects.html</link><author>noreply@blogger.com (Julian)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-WM5LEaM9BqI/U4RAFbTUccI/AAAAAAAAKpE/3Waq7OcyNLQ/s72-c/a941a55af.6398154.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3326160732880350623.post-6708328569262118996</guid><pubDate>Thu, 24 Jun 2010 20:41:00 +0000</pubDate><atom:updated>2012-03-26T13:29:05.278-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">fileupload</category><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">Programming</category><category domain="http://www.blogger.com/atom/ns#">Symfony</category><category domain="http://www.blogger.com/atom/ns#">tutorials</category><title>Validate size of a uploaded Image in Symfony 1.3/1.4</title><description>The sfValidatorFile has no options to check the size of a image in pixel. For that I have written a simple validator that extends the sfValidatorFile-class.&lt;br /&gt;&lt;br /&gt;Create the file jsValidatorImage.php in your /lib directory:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;class jsValidatorImage extends sfValidatorFile&lt;br /&gt;{&lt;br /&gt;  protected function configure($options = array(), $messages = array())&lt;br /&gt;  {&lt;br /&gt;    parent::configure($options, $messages);&lt;br /&gt;    &lt;br /&gt;    $this-&gt;addOption(&#39;minx&#39;, false);&lt;br /&gt;    $this-&gt;addOption(&#39;miny&#39;, false);&lt;br /&gt;    $this-&gt;addOption(&#39;maxx&#39;, false);&lt;br /&gt;    $this-&gt;addOption(&#39;maxy&#39;, false);&lt;br /&gt;    &lt;br /&gt;    $this-&gt;addMessage(&#39;not_a_image&#39;, &#39;The file is not a image.&#39;);&lt;br /&gt;    $this-&gt;addMessage(&#39;minx&#39;, &#39;Das Bild muss mindestens %minx% Pixel breit sein.&#39;);&lt;br /&gt;    $this-&gt;addMessage(&#39;maxx&#39;, &#39;Das Bild darf maximal %maxx% Pixel breit sein.&#39;);&lt;br /&gt;    $this-&gt;addMessage(&#39;miny&#39;, &#39;Das Bild muss mindestens %miny% Pixel hoch sein.&#39;);&lt;br /&gt;    $this-&gt;addMessage(&#39;maxy&#39;, &#39;Das Bild darf maximal %maxy% Pixel hoch sein.&#39;);   &lt;br /&gt;    &lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt; &lt;br /&gt;  protected function doClean($value)&lt;br /&gt;  {&lt;br /&gt;    $validatedFile = parent::doClean($value);   &lt;br /&gt;    &lt;br /&gt;    // check image size&lt;br /&gt;    &lt;br /&gt;    $imagedata=getimagesize($value[&#39;tmp_name&#39;]);&lt;br /&gt;    &lt;br /&gt;    if (!$imagedata){&lt;br /&gt;      throw new sfValidatorError($this, &#39;not_a_image&#39;);&lt;br /&gt;    }&lt;br /&gt;    if ($this-&gt;hasOption(&#39;minx&#39;) &amp;&amp; $this-&gt;getOption(&#39;minx&#39;)!==false &amp;&amp; $imagedata[0] &lt; $this-&gt;getOption(&#39;minx&#39;))&lt;br /&gt;    {&lt;br /&gt;      throw new sfValidatorError($this, &#39;minx&#39;, array(&#39;minx&#39; =&gt; $this-&gt;getOption(&#39;minx&#39;), &#39;size&#39; =&gt; (int) $imagedata[0]));&lt;br /&gt;    }&lt;br /&gt;    if ($this-&gt;hasOption(&#39;maxx&#39;) &amp;&amp; $this-&gt;getOption(&#39;maxx&#39;)!==false &amp;&amp; $imagedata[0] &gt; $this-&gt;getOption(&#39;maxx&#39;))&lt;br /&gt;    {&lt;br /&gt;      throw new sfValidatorError($this, &#39;maxx&#39;, array(&#39;maxx&#39; =&gt; $this-&gt;getOption(&#39;maxx&#39;), &#39;size&#39; =&gt; (int) $imagedata[0]));&lt;br /&gt;    }&lt;br /&gt;    if ($this-&gt;hasOption(&#39;miny&#39;) &amp;&amp; $this-&gt;getOption(&#39;miny&#39;)!==false &amp;&amp; $imagedata[1] &lt; $this-&gt;getOption(&#39;miny&#39;))&lt;br /&gt;    {&lt;br /&gt;      throw new sfValidatorError($this, &#39;miny&#39;, array(&#39;miny&#39; =&gt; $this-&gt;getOption(&#39;miny&#39;), &#39;size&#39; =&gt; (int) $imagedata[1]));&lt;br /&gt;    }&lt;br /&gt;    if ($this-&gt;hasOption(&#39;maxy&#39;) &amp;&amp; $this-&gt;getOption(&#39;maxy&#39;)!==false &amp;&amp; $imagedata[1] &gt; $this-&gt;getOption(&#39;maxy&#39;))&lt;br /&gt;    {&lt;br /&gt;      throw new sfValidatorError($this, &#39;maxy&#39;, array(&#39;maxy&#39; =&gt; $this-&gt;getOption(&#39;maxy&#39;), &#39;size&#39; =&gt; (int) $imagedata[1]));&lt;br /&gt;    }&lt;br /&gt;      &lt;br /&gt;    return $validatedFile;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In your [model]Form.class.php extend the &quot;configure()&quot;-function with something like this:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;&lt;br /&gt;  public function configure()&lt;br /&gt;  {&lt;br /&gt;    ...&lt;br /&gt;    $this-&gt;widgetSchema[&#39;img&#39;] = new sfWidgetFormInputFileEditable(array(&lt;br /&gt;      ...&lt;br /&gt;    ));        &lt;br /&gt;    $this-&gt;validatorSchema[&#39;img&#39;] = new jsValidatorImage(array(&lt;br /&gt;      &#39;required&#39;        =&gt; true, &lt;br /&gt;      &#39;path&#39;            =&gt; sfConfig::get(&#39;sf_upload_dir&#39;).&#39;/images&#39;,              &lt;br /&gt;      &#39;mime_categories&#39; =&gt; &#39;web_images&#39;,&lt;br /&gt;      &#39;minx&#39;            =&gt; 100,&lt;br /&gt;      &#39;maxx&#39;            =&gt; 120,&lt;br /&gt;      &#39;miny&#39;            =&gt; 80,&lt;br /&gt;      &#39;maxy&#39;            =&gt; 90&lt;br /&gt;      &lt;br /&gt;    ));&lt;br /&gt;    ...&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The validator will now throw a error if the image-width is not between 100 and 120 pixel or the image-height is not between 80 and 90 pixel</description><link>http://www.julianstricker.com/2010/06/validate-size-of-uploaded-image-in.html</link><author>noreply@blogger.com (Julian)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3326160732880350623.post-2279548445334486465</guid><pubDate>Thu, 20 May 2010 16:17:00 +0000</pubDate><atom:updated>2012-03-26T13:27:50.218-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">css</category><category domain="http://www.blogger.com/atom/ns#">google</category><category domain="http://www.blogger.com/atom/ns#">html</category><category domain="http://www.blogger.com/atom/ns#">tutorials</category><title>Googles Web Fonts</title><description>Increasing the diversity of fonts on the web using the Google Font API, the Google Font Directory and the Webfont Loader.&lt;br /&gt;&lt;br /&gt;The selection of fonts used on the Web is very small. This has changed with the new in CSS3 defined @font-face. This allows fonts to be loaded from the web, which works in all modern browsers. This mechanism requires appropriate fonts and the right to make them available on the web or to download from other sources. For this Google has created his Google Font Directory and the Google Font API.&lt;br /&gt;&lt;br /&gt;http://code.google.com/intl/de/apis/webfonts/&lt;br /&gt;&lt;br /&gt;Embedding the font into your page is very easy. Embed the right stylesheet of the font in your page:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: html;&quot;&gt;&lt;br /&gt;&lt;link href=&#39;http://fonts.googleapis.com/css?family=Lobster&#39; rel=&#39;stylesheet&#39; type=&#39;text/css&#39;&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Simply use the font in your CSS font stack like any other font, for example:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: css;&quot;&gt;&lt;br /&gt;h1 { font-family: &#39;Lobster&#39;, arial, serif; }&lt;br /&gt;&lt;/pre&gt;</description><link>http://www.julianstricker.com/2010/05/googles-web-fonts.html</link><author>noreply@blogger.com (Julian)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3326160732880350623.post-4555612846298429287</guid><pubDate>Wed, 31 Mar 2010 14:45:00 +0000</pubDate><atom:updated>2012-03-26T13:26:36.139-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Doctrine</category><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">Programming</category><category domain="http://www.blogger.com/atom/ns#">Symfony</category><category domain="http://www.blogger.com/atom/ns#">tutorials</category><title>Filter Admin-List in Symfony 1.4 + Doctrine</title><description>Some time ago I wrote an article about filtering the admin-list in Symfony 1.0 and Propel. Now in Symfony 1.4 and Doctrine the steps to do this are completely different:&lt;br /&gt;&lt;br /&gt;First we have to change the auto-generated file in apps/[APP]/modules/[MODULE]/actions/actions.class.php and to add a function &quot;buildQuery()&quot; to the [module]Actions-class:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;&lt;br /&gt;class hotelActions extends autoHotelActions&lt;br /&gt;{&lt;br /&gt;  protected function buildQuery()&lt;br /&gt;  { &lt;br /&gt;    $query = parent::buildQuery();&lt;br /&gt;    //Here you can extend your $query to filter the result.&lt;br /&gt;    return $query;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So if we have a &quot;creator_id&quot;-field in our schema and we want to filter the result to show only the entries created by the current user, we have to add the following code:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;&lt;br /&gt;class hotelActions extends autoHotelActions&lt;br /&gt;{&lt;br /&gt;  protected function buildQuery()&lt;br /&gt;  { &lt;br /&gt;    $query = parent::buildQuery();&lt;br /&gt;    $rootAlias = $query-&gt;getRootAlias(); &lt;br /&gt;    $query-&gt;andWhereIn($rootAlias.&#39;.creator_id&#39;, Array($this-&gt;getUser()-&gt;getGuardUser()-&gt;getId()));&lt;br /&gt;    return $query;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;</description><link>http://www.julianstricker.com/2010/03/filter-admin-list-in-symfony-14.html</link><author>noreply@blogger.com (Julian)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3326160732880350623.post-8717715953005520327</guid><pubDate>Fri, 27 Nov 2009 19:31:00 +0000</pubDate><atom:updated>2012-03-26T13:25:31.001-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Firefox</category><category domain="http://www.blogger.com/atom/ns#">Programming</category><title>Firefox implements new W3C File API specification</title><description>Web applications can access local files and upload multiple files.&lt;br /&gt;&lt;br /&gt;The current fourth beta of Firefox 3.6 comes with support for the File API. The relevant W3C draft specification is from Mozilla developer Arun Ranganathan. The File API provides different objects. This includes FileList containing an array of individually responsive files. It should be integrated over an input tag in HTML 5 pages. Several files can be uploaded at once. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This allows Firefox to upload via drag and drop, so that files can be moved easily from the desktop into a corresponding area in a website. It is also possible to directly create smaller thumbnails in the browser and display, even during the upload of files running in the background.&lt;br /&gt;&lt;br /&gt;Checkout &lt;a href=&quot;https://developer.mozilla.org/en/Using_files_from_web_applications&quot;&gt;developer.mozilla.org&lt;/a&gt; for examples for using the File API.</description><link>http://www.julianstricker.com/2009/11/firefox-implements-new-w3c-file-api.html</link><author>noreply@blogger.com (Julian)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3326160732880350623.post-6286710865023750542</guid><pubDate>Thu, 25 Jun 2009 20:33:00 +0000</pubDate><atom:updated>2012-03-26T13:24:31.706-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">as3</category><category domain="http://www.blogger.com/atom/ns#">bug</category><category domain="http://www.blogger.com/atom/ns#">flash</category><category domain="http://www.blogger.com/atom/ns#">I18n</category><category domain="http://www.blogger.com/atom/ns#">Programming</category><category domain="http://www.blogger.com/atom/ns#">workaround</category><title>Workaround for Flash CS3 Bug in internationalization using Strings Panel : Error 1009</title><description>Flash CS3 has a Bug when creating multilanguage projects using the Strings-Panel with String-replacement-setting set to &quot;Automatically at Runtime&quot;.&lt;br /&gt;&lt;br /&gt;A Bug description can be found at http://www.kirupa.com/forum/showthread.php?t=281170&lt;br /&gt;I did spend a lot of time on trying to find a solution for that problem:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Assuming you have a dynamic textbox linked to a Strings-Panel-ID in Frame 1 - 5 you will receive a TypeError #1009 if the Player comes to frame 6. &lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: javascript;&quot;&gt;&lt;br /&gt;TypeError: Error #1009: Cannot access a property or method of a null object reference.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Workaround: The error does not occur if the textbox is embedded in a movieclip that has only one frame.</description><link>http://www.julianstricker.com/2009/06/workaround-for-flash-cs3-bug-in.html</link><author>noreply@blogger.com (Julian)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3326160732880350623.post-5244317513480762099</guid><pubDate>Tue, 23 Jun 2009 15:50:00 +0000</pubDate><atom:updated>2012-03-26T13:23:21.336-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">fileupload</category><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">security</category><title>Filter filename on fileupload and prevent execution of uploaded files</title><description>Its a good way to allways rename uploaded files using something like a MD5-hash and store the original filename in a database.&lt;br /&gt;&lt;br /&gt;If for some reason you dont want to rename it using a hash, you should filter the filename using some code like this one:&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;&lt;br /&gt;$filename = strip_tags($_FILES[&quot;upload&quot;][&quot;name&quot;]);&lt;br /&gt;$filename = str_replace(array(&#39;|&#39;,&#39;&lt;&#39;,&#39;&gt;&#39;,&#39;&quot;&#39;,&#39;\&#39;&#39;,&#39;:&#39;,&#39;\\&#39;,&#39;/&#39;,&#39;*&#39;,&#39;?&#39;),&#39;&#39;,$filename); &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It&#39;s a good idea to deny the execution of all uploaded files: place a .htaccess file in your upload-directory:&lt;br /&gt;&lt;pre class=&quot;brush: bash;&quot;&gt;&lt;br /&gt;RemoveHandler .cgi .shtm .shtml&lt;br /&gt;RemoveType .php .php3 .php4 .php5&lt;br /&gt;&lt;FilesMatch &quot;\.(pl|cgi|py|php|php3|php4|php5|phtml?|shtml?)$&quot;&gt;&lt;br /&gt;deny from all&lt;br /&gt;&lt;/FilesMatch&gt;&lt;br /&gt;&lt;Files ~ &quot;\.htaccess$&quot;&gt;&lt;br /&gt;order deny,allow&lt;br /&gt;deny from all&lt;br /&gt;&lt;/Files&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;</description><link>http://www.julianstricker.com/2009/06/filter-filename-on-fileupload-and.html</link><author>noreply@blogger.com (Julian)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3326160732880350623.post-6732321818328455782</guid><pubDate>Wed, 17 Jun 2009 19:29:00 +0000</pubDate><atom:updated>2012-03-26T13:22:17.365-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">aie</category><category domain="http://www.blogger.com/atom/ns#">ajax image editor</category><category domain="http://www.blogger.com/atom/ns#">drupal</category><category domain="http://www.blogger.com/atom/ns#">tutorials</category><title>AIE AJAX Image Editor for Drupal</title><description>Today I found this great tutorial on how to integrate my AIE (Ajax Image Editor) into the Drupal imagefield module:&lt;br /&gt;&lt;br /&gt;http://drupal.org/node/442800&lt;br /&gt;&lt;br /&gt;As expected, it seems to be pretty easy to integrate AIE into Drupal :-)</description><link>http://www.julianstricker.com/2009/06/aie-ajax-image-editor-for-drupal.html</link><author>noreply@blogger.com (Julian)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3326160732880350623.post-5447310586549449019</guid><pubDate>Tue, 19 May 2009 15:48:00 +0000</pubDate><atom:updated>2012-03-26T13:21:07.320-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">Symfony</category><title>Symfony 1.0 Admin List: Highlight last edited entry</title><description>To highlight the last created or edited entry in a Admin-Generator-List copy the _list.php file from cache to your /apps/[APPNAME]/modules[MODULENAME]/templates directory and modify the code:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;tbody&amp;gt;&lt;br /&gt;&lt;?php $i = 1; foreach ($pager-&gt;getResults() as $mymodel): $odd = fmod(++$i, 2) ?&gt;&lt;br /&gt;&amp;lt;tr class=&quot;sf_admin_row_&lt;?php echo $odd ?&gt;&lt;strong&gt;&lt;?php if($sf_request-&gt;getParameter(&quot;id&quot;,0)==$mymodel-&gt;getId()) echo &quot; rowsel&quot;; ?&gt;&lt;/strong&gt;&quot;&amp;gt;&lt;br /&gt;&lt;?php include_partial(&#39;list_td_tabular&#39;, array(&#39;mymodel&#39; =&gt; $mymodel)) ?&gt;&lt;br /&gt;&lt;?php include_partial(&#39;list_td_actions&#39;, array(&#39;mymodel&#39; =&gt; $mymodel)) ?&gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;?php endforeach; ?&gt;&lt;br /&gt;&amp;lt;/tbody&amp;gt;&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Add a stylesheet like this:&lt;br /&gt;&lt;pre class=&quot;brush: css;&quot;&gt;&lt;br /&gt;#sf_admin_container .sf_admin_list .rowsel td {&lt;br /&gt;border-bottom:1px solid #DDDDDD;&lt;br /&gt;border-right:1px solid #DDDDDD;&lt;br /&gt;padding:3px;&lt;br /&gt;background-color: #DDDDEE !important;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Done!</description><link>http://www.julianstricker.com/2009/05/symfony-10-admin-list-highlight-last.html</link><author>noreply@blogger.com (Julian)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3326160732880350623.post-4727449434729604975</guid><pubDate>Mon, 18 May 2009 18:50:00 +0000</pubDate><atom:updated>2012-03-26T13:19:38.129-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">I18n</category><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">Symfony</category><title>Symfony Sortable I18n-field in Admin-List</title><description>Works with Symfony 1.0&lt;br /&gt;&lt;br /&gt;This Article shows how to make a I18n Field in a Symfony-Admin-List Sortable.&lt;br /&gt;In this example i use the &quot;name&quot;-field as I18n-field.&lt;br /&gt;&lt;br /&gt;First, open the file apps/[APPNAME]/modules/[MODULENAME]/action/actions.class.php and add the function:&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;&lt;br /&gt;protected function addSortCriteria($c)&lt;br /&gt;  {&lt;br /&gt;    if ($sort_column = $this-&gt;getUser()-&gt;getAttribute(&#39;sort&#39;, null, &#39;sf_admin/[MODULENAME]/sort&#39;))&lt;br /&gt;    {&lt;br /&gt;      if ($sort_column==&#39;name&#39;){      &lt;br /&gt;        if (strlen(sfContext::getInstance()-&gt;getUser()-&gt;getCulture())==2) {&lt;br /&gt;          $culture=sfContext::getInstance()-&gt;getUser()-&gt;getCulture();&lt;br /&gt;        }else{&lt;br /&gt;          $culture=&quot;de&quot;;&lt;br /&gt;        }&lt;br /&gt;        $culture=strtolower($culture);        &lt;br /&gt;        $c-&gt;addJoin([MODULENAME]I18nPeer::ID,[MODULENAME]Peer::ID);&lt;br /&gt;        $c-&gt;add([MODULENAME]I18nPeer::CULTURE, $culture);&lt;br /&gt;        $sort_column=[MODULENAME]I18nPeer::NAME;&lt;br /&gt;      }else{&lt;br /&gt;        $sort_column = [MODULENAME]Peer::translateFieldName($sort_column, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME);&lt;br /&gt;      }&lt;br /&gt;      if ($this-&gt;getUser()-&gt;getAttribute(&#39;type&#39;, null, &#39;sf_admin/[MODULENAME]/sort&#39;) == &#39;asc&#39;)&lt;br /&gt;      {&lt;br /&gt;        $c-&gt;addAscendingOrderByColumn($sort_column);&lt;br /&gt;      }&lt;br /&gt;      else&lt;br /&gt;      {&lt;br /&gt;        $c-&gt;addDescendingOrderByColumn($sort_column);&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Create a __toString function in /lib/model/[MODULENAME].php:&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;&lt;br /&gt;public function __toString () {&lt;br /&gt;    if (strlen(sfContext::getInstance()-&gt;getUser()-&gt;getCulture())==2) {&lt;br /&gt;      $culture=sfContext::getInstance()-&gt;getUser()-&gt;getCulture();&lt;br /&gt;    }else{&lt;br /&gt;      $culture=&quot;de&quot;;&lt;br /&gt;    }&lt;br /&gt;    $culture=strtolower($culture);&lt;br /&gt;    $culture[0]=strtoupper($culture[0]);&lt;br /&gt;    return $this-&gt;__call(&quot;getNameI18n&quot;.$culture,&quot;&quot;);&lt;br /&gt;  }   &lt;br /&gt;  public function __call($m, $a)&lt;br /&gt;  {&lt;br /&gt;    $data = @split(&#39;I18n&#39;, $m, 2);&lt;br /&gt;    if( count($data) != 2 ) &lt;br /&gt;      throw new Exception(&#39;Tried to call unknown method &#39;.get_class($this).&#39;::&#39;.$m);&lt;br /&gt;    list( $method, $culture ) = $data;&lt;br /&gt;    $this-&gt;setCulture( $culture );&lt;br /&gt;    return call_user_func_array(array($this, $method), $a);&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Next, create a File &quot;_name.php&quot; in apps/[APPNAME]/modules/[MODULENAME]/templates/_name.php:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;echo $[MODELNAME]-&gt;__toString();&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In generator.yml add the _name-field to the display section in list:&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;&lt;br /&gt;...&lt;br /&gt;  list:&lt;br /&gt;    display: [_name, ... ]&lt;br /&gt;....&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Next, copy the _list_th_tabular.php file from the cache-directory to your apps/[APPNAME]/modules/[MODULENAME]/templates directory and change the &amp;lt;th /&amp;gt;-tag of the name-field to something like this:&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;&lt;br /&gt;...&lt;br /&gt;&amp;lt;th id=&quot;sf_admin_list_th_name&quot;&amp;gt;&lt;br /&gt;        &lt;?php if ($sf_user-&gt;getAttribute(&#39;sort&#39;, null, &#39;sf_admin/[MODULENAME]/sort&#39;) == &#39;name&#39;): ?&gt;&lt;br /&gt;      &lt;?php echo link_to(__(&#39;Name&#39;), &#39;[MODULENAME]/list?sort=name&amp;type=&#39;.($sf_user-&gt;getAttribute(&#39;type&#39;, &#39;asc&#39;, &#39;sf_admin/[MODULENAME]/sort&#39;) == &#39;asc&#39; ? &#39;desc&#39; : &#39;asc&#39;)) ?&gt;&lt;br /&gt;      (&lt;?php echo __($sf_user-&gt;getAttribute(&#39;type&#39;, &#39;asc&#39;, &#39;sf_admin/[MODULENAME]/sort&#39;)) ?&gt;)&lt;br /&gt;      &lt;?php else: ?&gt;&lt;br /&gt;      &lt;?php echo link_to(__(&#39;Name&#39;), &#39;[MODULENAME]/list?sort=name&amp;type=asc&#39;) ?&gt;&lt;br /&gt;      &lt;?php endif; ?&gt;        &lt;br /&gt;&amp;lt;/th&amp;gt;&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;That&#39;s it</description><link>http://www.julianstricker.com/2009/05/symfony-sortable-i18n-field-in-admin.html</link><author>noreply@blogger.com (Julian)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3326160732880350623.post-2747619742457976541</guid><pubDate>Thu, 04 Dec 2008 00:37:00 +0000</pubDate><atom:updated>2012-03-26T13:18:22.410-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">jsThumbnailPlugin</category><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">Symfony</category><title>New version of jsThumbnailPlugin released</title><description>Today I have released version 1.1.0 of the jsThumbnailPlugin for the Symfony framework. It contains a important bugfix for Symfony 1.1 and a new feature.&lt;br /&gt;&lt;br /&gt;I fixed a bug with the sfFileCache object: In version 1.0 the sfFileCache wants a string as $file_cache_dir parameter, but version 1.1 wants a Array containing the parameters:&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;&lt;br /&gt;Symfony 1.0: $cache = new sfFileCache($file_cache_dir);&lt;br /&gt;Symfony 1.1: $cache = new sfFileCache(Array(&#39;cache_dir&#39;=&gt;$file_cache_dir));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The problem was to find out which version of Symfony is running. I solved the problem by checking if the function &quot;setFileLocking&quot; exists. This function exists only in version 1.0 of Symfony:&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;&lt;br /&gt;if (method_exists(&#39;sfFileCache&#39;, &#39;setFileLocking&#39;)){ //symfony 1.0&lt;br /&gt;$cache = new sfFileCache($file_cache_dir);&lt;br /&gt;}else{ //symfony 1.1&lt;br /&gt;$cache = new sfFileCache(array(&#39;cache_dir&#39; =&gt; $file_cache_dir));&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;jsThumbnailPlugin 1.1.0 accepts a new parameter &quot;mode&quot;. This parameter can be set to  &quot;normal&quot;, &quot;crop&quot; or &quot;stretch&quot;.&lt;br /&gt;normal: Sets the image to the maximum height or width, without changing the width/height proportion;&lt;br /&gt;crop: The image will be cropped exactly to the given height and width without changing the width/height proportion;&lt;br /&gt;stretch: Sets the image to the maximum height or width, the width/height proportion changes.</description><link>http://www.julianstricker.com/2012/03/new-version-of-jsthumbnailplugin.html</link><author>noreply@blogger.com (Julian)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3326160732880350623.post-4231149811346415874</guid><pubDate>Wed, 03 Dec 2008 01:59:00 +0000</pubDate><atom:updated>2012-03-26T13:16:27.937-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">Symfony</category><category domain="http://www.blogger.com/atom/ns#">tutorials</category><title>New great set of 24 Symfony tutorials</title><description>The Symfony team has released a new set of 24 tutorials published day-by-day between December 1st and Christmas, like the &quot;&lt;a href=&quot;http://www.symfony-project.org/askeet/1_0/en/&quot;&gt;Askeet tutorial&lt;/a&gt;&quot; in 2005.&lt;br /&gt;&lt;br /&gt;As for askeet, every day including week-ends, a new tutorial will be published. Each tutorial is meant to last about one hour, and will be the occasion to learn symfony by coding a real web application, from start to finish.</description><link>http://www.julianstricker.com/2008/12/new-great-set-of-24-symfony-tutorials.html</link><author>noreply@blogger.com (Julian)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3326160732880350623.post-1916753602762836604</guid><pubDate>Wed, 05 Nov 2008 03:48:00 +0000</pubDate><atom:updated>2012-03-26T13:15:00.483-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">plugin</category><category domain="http://www.blogger.com/atom/ns#">Programming</category><category domain="http://www.blogger.com/atom/ns#">Symfony</category><title>New Symfony Plugin &quot;jsThumbnailPlugin&quot; for on-the-fly Thumbnails Creation</title><description>&lt;span&gt;Today I have released my first plugin for the Symfony-Framework. The jsThumbnailPlugin creates Thumbnails on the fly using the GD library. It uses the Symfony cache system to cache the thumbnails.&lt;/span&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;The plugin consists of a action and a helper. It creates a thumbnail of a image in the given size and stores it in cache for the next calls, until the image changes. You can download it from http://www.symfony-project.org/plugins/jsThumbnailPlugin&lt;br /&gt;&lt;br /&gt;The use is very simple:&lt;br /&gt;1. Install it:&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;$ symfony plugin-install http://plugins.symfony-project.com/jsThumbnailPlugin&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. Enable the module in the setting.yml file of your application:&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;all:&lt;br /&gt; .settings:&lt;br /&gt;   enabled_modules:        [ default, jsThumbnail ]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3. Now you can view the thumbnail simply by open a link like this:&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;http://www.yourhost.com/yourapp.php/jsThumbnail/thumbnail?img=uploads/pictures/image.jpg&amp;amp;maxx=100&amp;amp;maxy=80&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;4. The plugin has a helper that creates a image-tag for a thumbnail. Include the helper in your template-file:&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;&lt;!--?php use_helper(&#39;Thumbnail&#39;) ?--&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;5. Call the Helper. The helper needs some params: the imagepath on server, maximum-width and maximum-height. The last parameter are additional HTML compliant &lt;img src=&quot;&quot; /&gt; tag parameters:&lt;br /&gt;&lt;pre class=&quot;brush: php;&quot;&gt;&lt;!--?php echo thumbnail_tag(&#39;uploads/pictures/image.jpg&#39;,100, 80, array(&#39;style&#39; =--&gt; &#39;border: 1px solid #ff0000&#39;)) ?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;6. The Plugin automatically checks if the Original image was modificated.&lt;br /&gt;&lt;br /&gt;7. To delete the cached thumbnails call:&lt;br /&gt;&lt;pre class=&quot;brush: bash;&quot;&gt;$ symfony cc&lt;br /&gt;&lt;/pre&gt;</description><link>http://www.julianstricker.com/2008/11/new-symfony-plugin-jsthumbnailplugin.html</link><author>noreply@blogger.com (Julian)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3326160732880350623.post-901870382787412268</guid><pubDate>Wed, 22 Oct 2008 19:21:00 +0000</pubDate><atom:updated>2012-03-26T13:00:30.092-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">aie</category><category domain="http://www.blogger.com/atom/ns#">ajax</category><category domain="http://www.blogger.com/atom/ns#">Javascript</category><title>Akoie is now AIE (Ajax-Image-Editor)!</title><description>&lt;span &gt;Akoie´s new name is AIE (Ajax-Image-Editor)! Also akoie moved from akoie.akanai.eu to his new official domain http://www.ajax-image-editor.com! New version comming soon!&lt;/span&gt;</description><link>http://www.julianstricker.com/2008/10/akoie-is-now-aie-ajax-image-editor.html</link><author>noreply@blogger.com (Julian)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3326160732880350623.post-4041984429286886873</guid><pubDate>Thu, 04 Sep 2008 06:51:00 +0000</pubDate><atom:updated>2012-03-26T12:58:16.939-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">Programming</category><category domain="http://www.blogger.com/atom/ns#">Symfony</category><title>Symfony - Listen im Admin Generator filtern</title><description>&lt;p style=&quot;margin-top: 4px; margin-right: 0px; margin-bottom: 4px; margin-left: 0px; color: rgb(68, 68, 68); font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: rgb(229, 229, 229); &quot;&gt;Einträge in Selectboxen einer foreignTable filtern (z.B. nach creator):&lt;/p&gt;&lt;p style=&quot;margin-top: 4px; margin-right: 0px; margin-bottom: 4px; margin-left: 0px; color: rgb(68, 68, 68); font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: rgb(229, 229, 229); &quot;&gt;schema.yml:&lt;/p&gt;&lt;p style=&quot;margin-top: 4px; margin-right: 0px; margin-bottom: 4px; margin-left: 0px; color: rgb(68, 68, 68); font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: rgb(229, 229, 229); &quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 4px; margin-right: 0px; margin-bottom: 4px; margin-left: 0px; color: rgb(68, 68, 68); font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: rgb(229, 229, 229); &quot;&gt;&lt;/p&gt;&lt;pre style=&quot;color: rgb(0, 0, 0); text-align: -webkit-auto; &quot;&gt;&lt;blockquote&gt;propel:     project:     _attributes:            { phpName: Project }     id:     creator_id:                { type: integer, foreignTable: creator foreignReference: id, required: true, onDelete: cascade }       name:                   { type: VARCHAR, size: 255, required: true }     description:            { type: VARCHAR, size: 255, required: true } ...&lt;/blockquote&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;/blockquote&gt; &lt;span style=&quot;color: rgb(68, 68, 68); font-family: Arial, Helvetica, sans-serif; text-align: left; white-space: normal; &quot;&gt;/lib/model/ProjectPeer.php:&lt;/span&gt; &lt;/pre&gt;&lt;pre style=&quot;color: rgb(0, 0, 0); text-align: -webkit-auto; &quot;&gt;&lt;span style=&quot;color: rgb(68, 68, 68); font-family: Arial, Helvetica, sans-serif; text-align: left; white-space: normal; &quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre style=&quot;color: rgb(0, 0, 0); text-align: -webkit-auto; &quot;&gt;&lt;pre&gt;&lt;blockquote&gt;class ProjectPeer extends BaseProjectPeer {   public static function getCreatorfiltered() {   $c = new Criteria();        $c-&amp;gt;add(ProjectPeer::CREATOR_ID, sfContext::getInstance()-&amp;gt;getUser()-&amp;gt;getGuardUser()-&amp;gt;getId());      //oder Creator ID     }   return ProjectPeer::doSelect($c);  } }&lt;/blockquote&gt;&lt;/pre&gt;  &lt;span style=&quot;color: rgb(68, 68, 68); font-family: Arial, Helvetica, sans-serif; text-align: left; white-space: normal; &quot;&gt;generator.yml:&lt;/span&gt; &lt;/pre&gt;&lt;pre style=&quot;color: rgb(0, 0, 0); text-align: -webkit-auto; &quot;&gt;&lt;pre&gt;&lt;blockquote&gt;..     fields:                project_id:               params:           name:         Project           peer_method:  getCreatorfiltered&lt;/blockquote&gt;&lt;/pre&gt; &lt;/pre&gt;&lt;p&gt;&lt;/p&gt;</description><link>http://www.julianstricker.com/2008/09/symfony-listen-im-admin-generator.html</link><author>noreply@blogger.com (Julian)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-3326160732880350623.post-8363560359137602873</guid><pubDate>Fri, 22 Aug 2008 20:02:00 +0000</pubDate><atom:updated>2012-03-26T12:58:55.089-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ExtJS</category><category domain="http://www.blogger.com/atom/ns#">PHP</category><category domain="http://www.blogger.com/atom/ns#">Programming</category><category domain="http://www.blogger.com/atom/ns#">Projects</category><title>Akoie 0.5</title><description>&lt;span style=&quot;color: rgb(68, 68, 68); font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: rgb(229, 229, 229); &quot;&gt;Recently, I have released version 0.5 of my online image editor &quot;Akoie&quot;. Because of the great interest and the many positive reactions, I&#39;m already working on the next version. The new Version will use the Canvas tag to make possible a lot of new features for client-side image manipulation. This allows the free rotation of text and watermarks in smaller steps than 90°.&lt;/span&gt;</description><link>http://www.julianstricker.com/2008/08/akoie-05.html</link><author>noreply@blogger.com (Julian)</author><thr:total>0</thr:total></item></channel></rss>