<?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>iTopiaBlog &#187; Web2.0</title>
	<atom:link href="http://blog.itopia.de/category/web20/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.itopia.de</link>
	<description>liVe iN oRder tO lEArN</description>
	<lastBuildDate>Thu, 26 Jan 2012 16:41:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>symfony: How to build a dojo dijit autocompleter sfForm widget</title>
		<link>http://blog.itopia.de/symfony-how-to-dojo-dijit-autocompleter-sfform-widget/260</link>
		<comments>http://blog.itopia.de/symfony-how-to-dojo-dijit-autocompleter-sfform-widget/260#comments</comments>
		<pubDate>Thu, 29 Oct 2009 13:20:36 +0000</pubDate>
		<dc:creator>TBA</dc:creator>
				<category><![CDATA[AJAX/AXAH]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Web2.0]]></category>
		<category><![CDATA[autocompleter]]></category>
		<category><![CDATA[dijit]]></category>
		<category><![CDATA[dojo]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[sfform]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[widget]]></category>

		<guid isPermaLink="false">http://blog.itopia.de/?p=260</guid>
		<description><![CDATA[I was searching long time for a good auto completer widget, but I couldn&#8217;t find one. So I created it<a href="http://blog.itopia.de/symfony-how-to-dojo-dijit-autocompleter-sfform-widget/260" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>I was searching long time for a good auto completer widget, but I couldn&#8217;t find one. So I created it by my self.<br />
I did the same with the build in symfony auto completer widget. When I have time I&#8217;ll post it, too.<br />
I hope I could help someboby with this small tutorial. Please give me feedback if there are any questions or suggestions.</p>
<p>Now lets start:</p>
<p><strong>1. Copy the dojo package to the js folder</strong><br />
Resulting path to dojo.js: <em>web/js/dojoToolkit/dojo/dojo.js</em></p>
<p><strong>2. Enable dojo.js</strong><br />
If not yet happend elsewhere:<br />
Modify the view.yml: <em>apps/[YOUR_APP]/config/view.yml</em><br />
<code><br />
</code></p>
<pre class="brush:plain">default:
javascripts: [dojoToolkit/dojo/dojo.js]</pre>
<p><strong>3. Create the widget</strong><br />
<em>lib/widget/itWidgetFormInputTextDijitAutocomplete.php</em></p>
<pre class="brush:php">class itWidgetFormInputTextDijitAutocomplete extends sfWidgetForm
{
/**
* Constructor.
*
* Available options:
*
* * model: Name of the Model
* * searchfield: Table field in which will be searched
* * action: Optional: request action or url
* * value_method: Optional: getter for form field value
* * output_method: Optional: getter for form field name
* * criteria_method: Optional: getter for additional cirteria
* * add_empty: Optional: add emtpy value option to the list
* * choices: An array of possible choices (n/a)
* * formatter: A callable to call to format the checkbox choices
*
* @see sfWidgetForm
*/
protected function configure($options = array(), $attributes = array())
{
$this-&gt;addRequiredOption('model');
$this-&gt;addRequiredOption('search_field');
$this-&gt;addOption('action', 'default/ajaxAutocomplete');
$this-&gt;addOption('value_method', 'getPrimaryKey');
$this-&gt;addOption('output_method', 'getPrimaryKey');
$this-&gt;addOption('choices', array());
$this-&gt;addOption('criteria_method', '');
$this-&gt;addOption('formatter', array($this, 'formatter'));
$this-&gt;addOption('add_empty', false);
}

/**
* Renders the widget as HTML.
*
* @param string The name of the HTML widget
* @param mixed The value of the widget
* @param array An array of HTML attributes
* @param array An array of errors
*
* @return string A HTML representation of the widget
*
* @see sfWidgetForm
*/
public function render($name, $value = null, $attributes = array(), $errors = array())
{
$choices = $this-&gt;getOption('choices');
if ($choices instanceof sfCallable)
{
$choices = $choices-&gt;call();
}

$baseAttributes = array(
'action' =&gt; $this-&gt;getOption('action'),
'name' =&gt; $name,
'type' =&gt; 'text',
'value' =&gt; $value,
'id' =&gt; $id = $this-&gt;generateId($name, self::escapeOnce($name)),
);

return call_user_func($this-&gt;getOption('formatter'), $this, $baseAttributes);
}

/**
* Renders the input fields as HTML.
*
* @param widget
* @param attributes
*
* @return string A HTML representation of the input fields
*/
public function formatter($widget, $attributes)
{
sfLoader::loadHelpers(array('Form', 'Url'));
$request = sfContext::getInstance()-&gt;getRequest();
$field_id = $attributes['id'];
$field_name = $attributes['name'];
$ajax_field_id = 'ajax_'.$attributes['id'];
$out_field_id = 'out_'.$attributes['id'];
$object = @call_user_func(array($this-&gt;getOption('model').'Peer', 'retrieveByPk'), $attributes['value']);
$default_out = $request-&gt;getParameter('ajax_'.$attributes['name'], is_object($object) ? call_user_func(array(&amp;$object, $this-&gt;getOption('output_method'))) : '');
$default_value = $request-&gt;getParameter($attributes['name'], is_object($object) ? $attributes['value'] : '');

$html = '';
$ajaxParams=array(
'model' =&gt; $this-&gt;getOption('model'),
'value_method' =&gt; $this-&gt;getOption('value_method'),
'output_method' =&gt; $this-&gt;getOption('output_method'),
'search_field' =&gt; $this-&gt;getOption('search_field'),
'criteria_method' =&gt; $this-&gt;getOption('criteria_method'),
'field_name' =&gt; 'ajax_'.$attributes['name']
);
if($this-&gt;getOption('add_empty')===false) $ajaxParams['add_empty'] = 'false';
elseif($this-&gt;getOption('add_empty')===true) $ajaxParams['add_empty'] = 'true';
else $ajaxParams['add_empty'] = $this-&gt;getOption('add_empty');

$requestUrl = url_for($attributes['action'].'?'.http_build_query($ajaxParams), true);
$requestUrl = str_replace('frontend_dev.php/', '', $requestUrl);
$requestUrl = str_replace('backend_dev.php/', 'backend.php/', $requestUrl);

$html .= &lt;&lt;
&lt;script type="text/javascript"&gt;
dojo.require("dojo.data.ItemFileReadStore");
dojo.require("dijit.form.FilteringSelect");
&lt;/script&gt;
&lt;div dojoType="dojo.data.ItemFileReadStore"
jsId="{$field_id}Store" url="{$requestUrl}"&gt;&lt;/div&gt;
EOF;

$input_text = &lt;&lt;
&lt;input dojoType="dijit.form.FilteringSelect"
store="{$field_id}Store"
class="medium"
id="{$field_id}"
name="{$field_name}"
value="{$default_value}"
hasDownArrow="true",
invalidMessage="",
ignoreCase="true" /&gt;
}</pre>
<p><strong>4. Create action for the AJAX request</strong><br />
<em>apps/[APP_NAME]/modules/default/actions/actions.class.php</em></p>
<pre class="brush:php">&lt;?php
class defaultActions extends sfActions
{
public function executeAjaxAutocomplete($request)
{
$model = $request-&gt;getParameter('model');
$criteria_method = $request-&gt;getParameter('criteria_method');
$add_empty = $request-&gt;getParameter('add_empty', 'false');
$this-&gt;value_method = $request-&gt;getParameter('value_method');
$this-&gt;output_method = $request-&gt;getParameter('output_method');

$peer_object = $model.'Peer';

if($criteria_method!='') $criteria = call_user_func(array($peer_object, $criteria_method));
else $criteria = new Criteria();

$search_field = $request-&gt;getParameter('search_field');
$field_name = $request-&gt;getParameter('field_name');
$var = $request-&gt;getParameter($field_name);

$j_object = array('identifier' =&gt; 'abbreviation', 'items'=&gt;array());

$search_field = strtoupper($search_field);

$sql_field = constant($peer_object.'::'.$search_field);

$c = $criteria;
$c-&gt;add($sql_field, $var . '%', Criteria::LIKE);
$this-&gt;list = call_user_func(array($peer_object,'doSelect'), $c);

if($add_empty!='false')
{
$j_object['items'][] = array(
'name' =&gt; $add_empty=='true' ? '' : $add_empty,
'label' =&gt; '',
'abbreviation' =&gt; ''
);
}

foreach($this-&gt;list AS $v)
{
$j_object['items'][] = array(
'name' =&gt; call_user_func(array(&amp;$v, $this-&gt;output_method)),
'label' =&gt; call_user_func(array(&amp;$v, $this-&gt;output_method)),
'abbreviation' =&gt; call_user_func(array(&amp;$v, $this-&gt;value_method))
);
}
$this-&gt;j_object = $j_object;
}
}</pre>
<p><strong>5. Create template for the AJAX request</strong><br />
<em>apps/[APP_NAME]/modules/default/templates/ajaxAutocompleteSuccess.php</em><br />
<code></p>
<pre class="brush:php">&lt;?php decorate_with(false); ?&gt;
&lt;?php print_r(json_encode($j_object)); ?&gt;</pre>
<p></code></p>
<p><strong>6. Insert the new widget into your sfForm</strong><br />
<em>apps/[APP_NAME]/modules/default/templates/ajaxAutocompleteSuccess.php</em><br />
<code></p>
<pre class="brush:php">...
# $widgets['user_id'] = new sfWidgetFormInput();
$widgets['user_id'] = new stWidgetFormInputTextDijitAutocomplete(array(
'model' =&gt; 'User',
'search_field' =&gt; 'username',
'value_method' =&gt; 'getId',
'output_method' =&gt; 'getUsername',
'criteria_method' =&gt; 'getCriteriaRegisteredUsers'
));</pre>
<p></code></p>
<p><strong>6. Clear symfony cache</strong></p>
<p><strong>Links:</strong></p>
<ul>
<li>http://api.dojotoolkit.org/jsdoc/1.3.2/dijit.form.FilteringSelect</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.itopia.de/symfony-how-to-dojo-dijit-autocompleter-sfform-widget/260/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ning</title>
		<link>http://blog.itopia.de/ning/85</link>
		<comments>http://blog.itopia.de/ning/85#comments</comments>
		<pubDate>Wed, 07 Mar 2007 00:20:14 +0000</pubDate>
		<dc:creator>TBA</dc:creator>
				<category><![CDATA[Web2.0]]></category>
		<category><![CDATA[Weblog]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Ning]]></category>
		<category><![CDATA[Plattform]]></category>

		<guid isPermaLink="false">http://blog.itopia.de/?p=85</guid>
		<description><![CDATA[Gerade war ich dabei eine Seite zusammen zu bauen, fÃ¼r alle meine Freunde hier aus der Gegend. Viele von uns<a href="http://blog.itopia.de/ning/85" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Gerade war ich dabei eine Seite zusammen zu bauen, fÃ¼r alle meine Freunde hier aus der Gegend. Viele von uns sind weggezogen um zu studieren und keiner ist mehr auf dem Laufenden. AuÃŸerdem ist es immer wieder schwierig die Wochenendplanung, Urlaube, oder sonstiges zu organisieren. Nach diesen Veranstalltungen gibt es immer jede Menge Fotos und Videos. Hierbei ist das Problem, dass keiner einen Foto- oder Video-Speicherplatz im Web kaufen will. Ein <a href="http://www.flickr.com">Flickr</a> Account fÃ¼r alle ist auch doof (vorallem die Einbindung in die Homepage).</p>
<p>So nun hatte ich schon einen <a href="http://www.wordpress.org">WordPress</a>-Blog mit sÃ¤mtlichen Plugins fertiggestellt. Aber gestern stieÃŸ ich auf diesen Beitrag im <a href="http://www.visualblog.de/?p=510">VisualBlog</a>. </p>
<p><a href="http://www.ning.com/">Ning</a> hatte ich zwar schon vor einigen Monaten entdeckt, aber der Nutzen war mir damals beim &#8220;DrÃ¼bersurfen&#8221; nicht ganz klar. So vergaÃŸ ich Ning wieder. Aber heute finde ich es eine sehr gute Idee (und beiÃŸe mir wiedermal in den H****, weil ich nicht selbst auf sowas gekommen bin).</p>
<p>Schnell angemeldet, Design und Module ausgewÃ¤lt, zack fertig. Das ist auf den ersten Blick echt super einfach.<br />
Das beste an Ning ist, dass es fÃ¼r die Community-Mitglieder kinderleicht ist, BlogeintrÃ¤ge zu schreiben oder Fotos und Videos hochzuladen. Und das alles kostenlos.</p>
<p>ABER dennoch fÃ¤llt mir viel auf, was noch nicht so gut gelÃ¶st ist und besser gemacht werden kÃ¶nnte:</p>
<ul style="list-style:disc; padding-left: 20px; padding-top: 10px">
<li style="list-style:disc;">Die Werbung (adsense) rechts ist echt zu viel, unten am Footer wÃ¤re sie ok</li>
<li style="list-style:disc; padding: 3px;">BlogeintrÃ¤ge kÃ¶nnen nicht kategorisiert oder getaggt werden</li>
<li style="list-style:disc; padding: 3px;">Mitgliederbeziehungen und Rechtemanagement ist nicht sehr durchsichtig und an vielen Stellen unklar (bei Blog, Minichat, Fotos etc.)</li>
<li style="list-style:disc; padding: 3px;">Man kann keine Bookmarks anlegen (ich finde das bei WordPresss eine gute Funktion)</li>
<li style="list-style:disc; padding: 3px;">Es gibt nur englische Seitenvorlagen</li>
<li style="list-style:disc; padding: 3px;">Das Photomanagement ist sehr mÃ¼hseelig (Upload, Bestichwortung nachtrÃ¤glich bearbeiten und Verschieben)</li>
<li style="list-style:disc; padding: 3px;">Und zu guter Letzt, die Seite ist irrsinng langsam, egal zu wechler Tages- und Nachtzeit</li>
</ul>
<p>Trotz dieser vielen negativen Kleinigkeiten finde <a href="http://www.ning.com">Ning</a> ein gute LÃ¶sung fÃ¼r unsere BedÃ¼rfnisse. Und ich hoffe einfach mal, dass die Entwickler von Ning diese Wermutstropfen auf Grund der groÃŸen positiven Resonanz aus der Bloggerszene nach und nach ausbessern und perfektionieren werden.</p>
<p>Zur Frage, warum soll ich ein eigenes Social-Network einrichten wo es doch schon <a href="http://www.studivz.de">studivz</a>, <a href="http://www.xing.com/">xing</a> &#038; <a href="http://www.readwriteweb.com/archives/social_networking_silver_bullet.php">Co.</a> gibt?<br />
Ich finde studivz&#038; Co. einen Tick zu Ã¶ffentlich, man erhÃ¤lt viel zu viele Freundschaftangebote, die man eigtlich garnicht eingehen will, aber der hÃ¶flichkeithalber das Angebot annimmt. Ich meine die Kontakte sind zum Teil einfach Ã¼ber zu viele Ecken entstanden. Fotos, PersÃ¶nliche daten usw. sind dann fÃ¼r viel zu viele Personen einsehbar.</p>
<p>Ich denke auch nicht, dass es ausarten wird, und jeder fÃ¼r die gleichen Personen-Gruppen eine eigenes Network einrichtet, denn fÃ¼r die meisten (Otto-Normal-Surfer) ist das ganze immer noch zu kompliziert und sind froh wenn schon jemand im Dorf, Club oder Stadt-Viertel ein Network eingerichtet hat.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.itopia.de/ning/85/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Das R-PhÃ¤nomen im Web2.0</title>
		<link>http://blog.itopia.de/das-r-phanomen-im-web20/73</link>
		<comments>http://blog.itopia.de/das-r-phanomen-im-web20/73#comments</comments>
		<pubDate>Fri, 19 Jan 2007 00:51:59 +0000</pubDate>
		<dc:creator>TBA</dc:creator>
				<category><![CDATA[Web2.0]]></category>
		<category><![CDATA[Weblog]]></category>

		<guid isPermaLink="false">http://blog.itopia.de/?p=73</guid>
		<description><![CDATA[Beim Surfen durchs Web fallen einem immer mehr URL&#8217;s auf die so aussehen: fragr antwortr Anothr Flagr Browsr Mypictr Weekendr<a href="http://blog.itopia.de/das-r-phanomen-im-web20/73" class="searchmore">Read the Rest...</a><div class="clr"></div>]]></description>
			<content:encoded><![CDATA[<p>Beim Surfen durchs Web fallen einem immer mehr URL&#8217;s auf die so aussehen:</p>
<p><a href="http://www.fragr.de">frag<strong>r</strong></a><br />
<a href="http://www.antwortr.de">antwort<strong>r</strong></a><br />
<a href="http://www.anothr.com">Anoth<strong>r</strong></a><br />
<a href="http://www.Flagr.de">Flag<strong>r</strong></a><br />
<a href="http://www.browsr.com">Brows<strong>r</strong></a><br />
<a href="http://www.Mypictr.com">Mypict<strong>r</strong></a><br />
<a href="http://www.Weekendr.com">Weekend<strong>r</strong></a><br />
etc.<br />
und allen Voraus <a href="http://www.flickr.com">flick<strong>r</strong></a><br />
Sogar ich konnte nicht wiederstehen meinem Frage-Portal <a href="http://www.QUANSR.de">QUANSR</a> einen Vokal zu amputieren.</p>
<p>Und viele scheinen nicht zu wissen, was es damit auf sich hat, und regen sich ziemlich darÃ¼ber auf. So auch dieser <a href="http://www.konsumidioten.de/wp-trackback.php?p=83">Blogeintrag</a> wo sogar ein lusitiges Wortspiel daraus gebastelt wurde.</p>
<p>Ich denke nicht, dass es einfach eine hÃ¤ÃŸliche Mode ist, die Vokale aus den Domain-Namen wegzulassen. Die ErklÃ¤rung fÃ¼r dieses PhÃ¤nomen ist meines Erachtens, dass gute Domain-Namen nunmal knapp sind und bezweifle, dass auch nur eine dieser oben genannten Domains, wÃ¼rde man den Vokal im Namen verweilen lassen, noch frei ist. Diese Domains wurden sicher schon vor fÃ¼nf Jahren gesichert.<br />
Und was macht nun Webentwickler, wenn er fÃ¼r sein neues innovatives Projekt keine freie Domain findet?&#8230;</p>
<p>Ein anderer Aspekt ist die LÃ¤nge einer URL. Umso kÃ¼rzer desto besser. Das Auslassen von Vokalen ist ein guter Kompromiss, denn das Wort ist dennoch erkennbar und aus dem GedÃ¤chtnis abrufbar. Das finde ich fast besser als aus einem s ein z  zu machen, denn dann sucht man meist vergeblich nach dem richtigen Namen, den man zwar weiÃŸ, aber sich bei der Schreibweise nicht mehr sicher ist. War es nun <em>ruls</em> oder <em>rulz</em> oder doch <em>rulez</em>. OK, damit das beim Auslassen von Vokalen nicht passiert, mÃ¼sste man alle Vokale weglassen, oder fix festlegen, dass das nur am Ende des Wortes erlaubt ist.</p>
<p>Ich finde es ist heutzutage auch ein gesellschaftliches PhÃ¤nomen, immer schneller, immer mehr sparen sogar an Buchstaben. SchÃ¶n ist&#8217;s zwar nicht, aber auch nicht Ã¼bertriebn kryptisch, was URL&#8217;s oder SMS angeht! In E-Mails, Foren oder Chats bin ich persÃ¶nlich weiterhin fÃ¼r eine klare korrekte Rechtschreibung und Grammatik.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.itopia.de/das-r-phanomen-im-web20/73/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

