<?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>nova blog</title>
	<atom:link href="http://blog.tlsys.hu/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tlsys.hu</link>
	<description></description>
	<lastBuildDate>Sat, 04 Sep 2010 05:49:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Symfony II. rész – admin generator</title>
		<link>http://blog.tlsys.hu/symfony-2-admin-generator/</link>
		<comments>http://blog.tlsys.hu/symfony-2-admin-generator/#comments</comments>
		<pubDate>Sat, 05 Jun 2010 21:08:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.tlsys.hu/?p=351</guid>
		<description><![CDATA[Tovább mennék az első rész folyamányaként. Admin generátorról lesz itt is szó, néhány általános probléma megoldását tenném közzé:

a listában szereplő mezők változtatása
kapcsolt táblák szerinti rendezés


Eljött az idő hogy egy pici, de konkrét adatbázist kreáljunk.
Futtasuk le akár a már telepített phpmyadminban

CREATE DATABASE sandbox;
USE sandbox;
CREATE TABLE `categories` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) [...]]]></description>
			<content:encoded><![CDATA[<p>Tovább mennék az <a href="http://blog.tlsys.hu/symfony-propel-ubuntu-telepit/">első rész</a> folyamányaként. Admin generátorról lesz itt is szó, néhány általános probléma megoldását tenném közzé:</p>
<ul>
<li>a listában szereplő mezők változtatása</li>
<li>kapcsolt táblák szerinti rendezés</li>
</ul>
<p><span id="more-351"></span><br />
Eljött az idő hogy egy pici, de konkrét adatbázist kreáljunk.<br />
Futtasuk le akár a már telepített phpmyadminban</p>
<pre class="brush: sql;">
CREATE DATABASE sandbox;
USE sandbox;
CREATE TABLE `categories` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `products` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `price` float(9,3) default '0.000',
  `category_id` int(11) default NULL,
  PRIMARY KEY  (`id`),
  KEY `category_id` (`category_id`),
  CONSTRAINT `products_fk` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
</pre>
<p>Az első leírásban létrehozott sandbox projectünket fogjuk átszerkeszteni.<br />
Tehát állítsuk be a config könyvtárban lévő adatbázisokhoz tartozó fájlokat (propel.ini és databases.yml) az előbb létrehozott sandbox adatbázisra.<br />
Majd futtassuk le az alábbi parancsokat is:</p>
<pre class="brush: bash;">
# generáljuk le a schema.yml fájlt
./symfony propel:build-schema
#hozzuk létre a formokat, filtereket, modeleket, -C direktiva kihagyja az sql-t (classes only)
./symfony propel:build-all -C
# és a két táblánkhoz tartozó admin felületet készítsük el:
./symfony propel:generate-admin --module=CategoriesAdmin frontend categories
# az apps/frontend/modules/CategoriesAdmin modulunkat
# és a route (apps/frontend/config/routing.yml) szabályt is létre fogja hozni
./symfony propel:generate-admin --module=ProductsAdmin frontend products
</pre>
<p>Máris érdemes létrehozni a PROJECT_DIR/apps/frontend/templates/layout.php fájlban a 2 menüpontunkat. Közvetlenül a body nyitótagja után tegyük be az alábbi sorokat.</p>
<pre class="brush: xml;">
&lt;ul id=&quot;menu&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;&lt;?php echo url_for('@categories')?&gt;&quot;&gt;&lt;/a&gt;Kategóriák&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;&lt;?php echo url_for('@products')?&gt;&quot;&gt;Termékek&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</pre>
<p>A http://mydomain/sandbox/frontend_dev.php/CategoriesAdmin érjük el az alkalmazásunkat. Most próbáljuk meg feltölteni adatokkal. Először vigyünk fel kategóriákat. Majd próbáljunk meg, felvinni termékeket is. Elvileg el kell akadnunk amiatt, hogy a categories modelunknek még nincs __toString() metódusa. Ez egy PHP metódus, ami egy objektum kiíratására szolgál. Jelen esetünkben, mi, a name mezővel jelenítenénk meg a tábla egyes rekordjait. Így hát hozzuk létre ezt a metódust a PROJECT_DIR/lib/model/categories.php fájlban.</p>
<pre class="brush: php;">
class Categories extends BaseCategories {
  public function __toString()
  {
    return $this-&gt;getName();
  }
} // Categories
</pre>
<p>Ezután már sikeresen megjeleníthetjük a listát, és rögzíthetünk új rekordokat. De mint láthatjuk a termékek listában nem a kategóriák neve, hanem annak azonosítója (id) szerepel, ráadásul a felhasználóknak a termékek id-ja is megjelent. Sajnos a generátorunk nem tökéletes, így a létrehozott fájlokat jó pár helyen módosítanunk kell.<br />
Elsőként magát a PROJECT_DIR/apps/frontend/modules/ProductsAdmin/config/generator.yml fájlt módosítjuk. Figyelve a .yml fájlokra jellemző szabályokra (legfőképp, hogy behúzás nem tabulátor, hanem 2 üres hely) a listát tartalmazó sort egészítsük ki:</p>
<pre class="brush: plain;">
list:
  display: [categories, name, price ] # felsoroljuk a megjelenített mezőket, kapcsolt tábla esetén a classt
  peer_method: doSelectJoinAll # modelpeer osztályunk metódusa
</pre>
<p>Másodikként tekintsük meg a létrehozott PROJECT_DIR/apps/frontend/modules/ProductsAdmin/actions/action.class.php fájlt. Mint láthatjuk a ProductsAdminActions osztályunk az autoProductsAdminActions osztályból származik. Ez pedig a cache könyvtárban keresendő, a  PROJECT_DIR/cache/frontend/dev/modules/ProductsAdmin/actions/action.class.php fájlban. Ennek az osztálynak kell 2 függvényét felül definiálnuk:</p>
<pre class="brush: php;">
class ProductsAdminActions extends autoProductsAdminActions
{
  protected function addSortCriteria($criteria)
  {
    if (array(null, null) == ($sort = $this-&gt;getSort()))
    {
      return;
    }

    if ($sort[0] == 'categories.name')
    {
      $column = CategoriesPeer::NAME;
    }
    else
    {
      $column = ProductsPeer::translateFieldName($sort[0], BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME);
    }

    if ('asc' == $sort[1])
    {
      $criteria-&gt;addAscendingOrderByColumn($column);
    }
    else
    {
      $criteria-&gt;addDescendingOrderByColumn($column);
    }
  }

  protected function isValidSortColumn($column)
  {
    if (in_array($column, array('categories.name')))
    {
      return true;
    }
    else
    {
      return parent::isValidSortColumn($column)
    }
  }
}
</pre>
<p>Majd hozzuk létre a PROJECT_DIR/apps/frontend/modules/ProductsAdmin/_list_th_tabular.php fájlt. Ezt is a cacheből másoltam ki és módosítottam.</p>
<pre class="brush: php;">
&lt;?php slot('sf_admin.current_header') ?&gt;
&lt;th class=&quot;sf_admin_text sf_admin_list_th_categories&quot;&gt;
  &lt;?php if ('categories.name' == $sort[0]): ?&gt;
    &lt;?php echo link_to(__('Categories', array(), 'messages'), '@products', array('query_string' =&gt; 'sort=categories.name&amp;sort_type='.($sort[1] == 'asc' ? 'desc' : 'asc'))) ?&gt;
    &lt;?php echo image_tag(sfConfig::get('sf_admin_module_web_dir').'/images/'.$sort[1].'.png', array('alt' =&gt; __($sort[1], array(), 'sf_admin'), 'title' =&gt; __($sort[1], array(), 'sf_admin'))) ?&gt;
  &lt;?php else: ?&gt;
    &lt;?php echo link_to(__('Categories', array(), 'messages'), '@products', array('query_string' =&gt; 'sort=categories.name&amp;sort_type=asc')) ?&gt;
  &lt;?php endif; ?&gt;
&lt;/th&gt;
&lt;?php end_slot(); ?&gt;
&lt;?php include_slot('sf_admin.current_header') ?&gt;

&lt;?php slot('sf_admin.current_header') ?&gt;
&lt;th class=&quot;sf_admin_text sf_admin_list_th_name&quot;&gt;
  &lt;?php if ('name' == $sort[0]): ?&gt;
    &lt;?php echo link_to(__('Name', array(), 'messages'), '@products', array('query_string' =&gt; 'sort=name&amp;sort_type='.($sort[1] == 'asc' ? 'desc' : 'asc'))) ?&gt;
    &lt;?php echo image_tag(sfConfig::get('sf_admin_module_web_dir').'/images/'.$sort[1].'.png', array('alt' =&gt; __($sort[1], array(), 'sf_admin'), 'title' =&gt; __($sort[1], array(), 'sf_admin'))) ?&gt;
  &lt;?php else: ?&gt;
    &lt;?php echo link_to(__('Name', array(), 'messages'), '@products', array('query_string' =&gt; 'sort=name&amp;sort_type=asc')) ?&gt;
  &lt;?php endif; ?&gt;
&lt;/th&gt;
&lt;?php end_slot(); ?&gt;
&lt;?php include_slot('sf_admin.current_header') ?&gt;&lt;?php slot('sf_admin.current_header') ?&gt;
&lt;th class=&quot;sf_admin_text sf_admin_list_th_price&quot;&gt;
  &lt;?php if ('price' == $sort[0]): ?&gt;
    &lt;?php echo link_to(__('Price', array(), 'messages'), '@products', array('query_string' =&gt; 'sort=price&amp;sort_type='.($sort[1] == 'asc' ? 'desc' : 'asc'))) ?&gt;
    &lt;?php echo image_tag(sfConfig::get('sf_admin_module_web_dir').'/images/'.$sort[1].'.png', array('alt' =&gt; __($sort[1], array(), 'sf_admin'), 'title' =&gt; __($sort[1], array(), 'sf_admin'))) ?&gt;
  &lt;?php else: ?&gt;
    &lt;?php echo link_to(__('Price', array(), 'messages'), '@products', array('query_string' =&gt; 'sort=price&amp;sort_type=asc')) ?&gt;
  &lt;?php endif; ?&gt;
&lt;/th&gt;
&lt;?php end_slot(); ?&gt;
&lt;?php include_slot('sf_admin.current_header') ?&gt;
</pre>
<p>Ezzel a fájllal azonban már sikerült teljesen elontanunk a generátort. Hiszen ha új mezőket teszünk be, vagy veszünk ki, akkor ezt a fájlt újra és újra szerkesztenünk kell. Ez ellen a legjobb módszer talán az lenne, ha a cache könyvtárban lévő fájl tennénk bele egy slotba és valami grepes megoldással átírnánk a kategóriák oszlop fejlécét. </p>
<p>Talán később még módosítom ezt a leírást ezen ötletemmel. Feltéve hogy nem találok jobbat. De ez a leírás mindenképp fejlődni fog, ahogy a generátorokkal kapcsolatban problémákba ütközöm. Aki hasznosnak vélte az eddigi rizsámat, érdemes visszatérni.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tlsys.hu/symfony-2-admin-generator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux file kezelés</title>
		<link>http://blog.tlsys.hu/linux-file-kezeles/</link>
		<comments>http://blog.tlsys.hu/linux-file-kezeles/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 05:30:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Nincs kategorizálva]]></category>

		<guid isPermaLink="false">http://blog.tlsys.hu/?p=308</guid>
		<description><![CDATA[
hogyan alakítsunk át egy ISO fromátumban mentett fájlt UTF8-ra:
iconv --from-code=ISO-8859-2 --to-code=UTF-8 iso.txt &#62; utf-8 txt
fájékeresés
find / -mount -name fileneve
fájlok tartalmában keresés
grep -r "tartalom amit keressek" .
]]></description>
			<content:encoded><![CDATA[<p><span id="more-308"></span><br />
hogyan alakítsunk át egy ISO fromátumban mentett fájlt UTF8-ra:<br />
<code>iconv --from-code=ISO-8859-2 --to-code=UTF-8 iso.txt &gt; utf-8 txt</code></p>
<p>fájékeresés<br />
<code>find / -mount -name fileneve</code></p>
<p>fájlok tartalmában keresés<br />
<code>grep -r "tartalom amit keressek" .</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tlsys.hu/linux-file-kezeles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Az ember mindig tanul&#8230;</title>
		<link>http://blog.tlsys.hu/az-ember-mindig-tanul/</link>
		<comments>http://blog.tlsys.hu/az-ember-mindig-tanul/#comments</comments>
		<pubDate>Wed, 07 Apr 2010 19:43:28 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Nincs kategorizálva]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.tlsys.hu/?p=303</guid>
		<description><![CDATA[Már jó pár éve foglalkozom PHP-vel, de még mindig van ami meglepetésként ér(t).
Ilyen például hogy a header parancs nem irányít át azonnal, hanem csak a teljes action lista lefutása után teszi.
header("Location: index.php");
echo 'hehe ez még kiíródik, csak nem látod';
die();
echo 'hehe, de ez már nem';

]]></description>
			<content:encoded><![CDATA[<p>Már jó pár éve foglalkozom PHP-vel, de még mindig van ami meglepetésként ér(t).<br />
<span id="more-303"></span>Ilyen például hogy a header parancs nem irányít át azonnal, hanem csak a teljes action lista lefutása után teszi.<br />
<code>header("Location: index.php");<br />
echo 'hehe ez még kiíródik, csak nem látod';<br />
die();<br />
echo 'hehe, de ez már nem';<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tlsys.hu/az-ember-mindig-tanul/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux felhasználók karbantartása</title>
		<link>http://blog.tlsys.hu/linux-felhasznalok-karbantartasa/</link>
		<comments>http://blog.tlsys.hu/linux-felhasznalok-karbantartasa/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 19:04:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Nincs kategorizálva]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.tlsys.hu/?p=284</guid>
		<description><![CDATA[Eddig mindig találgatnom kellett hogyan keressek rá a felhasználókat karbantartó parancsokra.
Ennek itt és most véget vetek.

jogok
felhasználók listázása
man helyett
open ssh
felhasználók hozzáadás
felhasználók listája:
cat /etc/passwd &#124; grep "/home" &#124;cut -d: -f1
felhasználó hozzáadása
useradd felhasznalo
felhasználó hozzáadása /home könyvtárral
 sudo useradd -d /home/felhasznalo -m felhasznalo
felhasználó mindenestűl:
adduser felhasznalo
felahsználó jelszavának módosítása
sudo passwd felhasznalo
felhasználó törlése
userdel -r felhasználó #felhasználó könyvtára is törlődik
felhasználói csoport létrehozása
addgroup csoport
felhasználó [...]]]></description>
			<content:encoded><![CDATA[<p>Eddig mindig találgatnom kellett hogyan keressek rá a felhasználókat karbantartó parancsokra.<br />
Ennek itt és most véget vetek.<br />
<span id="more-284"></span><br />
<a href="http://www.slackware.hu/node/444">jogok</a><br />
<a href="http://www.linuxquestions.org/linux/answers/Networking/How_to_list_all_your_USERs">felhasználók listázása</a><br />
<a href="http://www.ahinc.com/linux101/users.htm">man helyett</a><br />
<a href="http://www.cyberciti.biz/tips/openssh-deny-or-restrict-access-to-users-and-groups.html">open ssh</a><br />
<a href="http://www.howtogeek.com/howto/ubuntu/add-a-user-on-ubuntu-server/">felhasználók hozzáadás</a></p>
<p>felhasználók listája:<br />
<code>cat /etc/passwd | grep "/home" |cut -d: -f1</code></p>
<p>felhasználó hozzáadása<br />
<code>useradd </code><code>felhasznalo</code></p>
<p>felhasználó hozzáadása /home könyvtárral<br />
<code> sudo useradd -d /home/felhasznalo -m felhasznalo</code></p>
<p>felhasználó mindenestűl:<br />
<code>adduser felhasznalo</code></p>
<p>felahsználó jelszavának módosítása<br />
<code>sudo passwd felhasznalo</code></p>
<p>felhasználó törlése<br />
<code>userdel -r felhasználó #felhasználó könyvtára is törlődik</code></p>
<p>felhasználói csoport létrehozása<br />
<code>addgroup csoport</code></p>
<p>felhasználó csoportba helyezése<br />
<code>adduser letezofelhasznalo letezocsoport</code></p>
<p>felhasználó törlése minden csoportból, kivéve a sajátjából<br />
<code>usermod -G felhasznalo felhasznalo</code></p>
<p>felhasználó csoport tagságainak listázása<br />
<code>groups felhasznalo</code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tlsys.hu/linux-felhasznalok-karbantartasa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prototye dialógus ablak</title>
		<link>http://blog.tlsys.hu/prototye-dialogus-ablak/</link>
		<comments>http://blog.tlsys.hu/prototye-dialogus-ablak/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 12:42:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Nincs kategorizálva]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://blog.tlsys.hu/?p=272</guid>
		<description><![CDATA[Szerettem volna egy nagyon egyszerű, dialógus ablakot, ami könnyen átlátható.
A legfontosabb kitétel az volt, hogy egy divet hozzon létre, amibe majd bármit bele tudok illeszteni.
Találtam is egyet
Sajnos az én stilusomnak nem felelt meg. Ezért módosítanom kellett.
A módosítás 2 fontosnak vélt ok miatt vált szükségszerűvé.

Egyrészt szeretek névtereket létrehozni
Másrészt a létrehozásnál minden alkalommal újra és újra létrehoztuk [...]]]></description>
			<content:encoded><![CDATA[<p>Szerettem volna egy nagyon egyszerű, dialógus ablakot, ami könnyen átlátható.<br />
A legfontosabb kitétel az volt, hogy egy divet hozzon létre, amibe majd bármit bele tudok illeszteni.<br />
<span id="more-272"></span>Találtam is <a href="http://mattroper.co.uk/2008/05/27/javascript-overlay-using-prototype-and-scriptaculous/">egyet</a><br />
Sajnos az én stilusomnak nem felelt meg. Ezért módosítanom kellett.<br />
A módosítás 2 fontosnak vélt ok miatt vált szükségszerűvé.</p>
<ul>
<li>Egyrészt szeretek névtereket létrehozni</li>
<li>Másrészt a létrehozásnál minden alkalommal újra és újra létrehoztuk a dialógus ablakot és a layert is, így a nyitások számával nőtt az elemek száma is. <img src='http://blog.tlsys.hu/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </li>
</ul>
<pre class="brush: jscript;">
var PrototypeWindow = {
 Dialog : function (content, container)
 {
 // Manage arguments and assign defaults,
 if (typeof container == 'undefined' ) container = document.body;
 if (null == (this.container = $(container))) throw(&quot;container is not valid&quot;);

 // Assign instance variables
 this.content = content;
 if ($('dialogBoxOverlay') == null)
 {
   this.overlay = new Element('div', {'id':'dialogBoxOverlay', 'class': 'overlay' }).hide();
 }
 else
 {
   this.overlay = $('dialogBoxOverlay').hide();
 }
 if ($('dialogBox') == null)
 {
   this.dialog  = new Element('div', {'id':'dialogBox', 'class': 'dialog' }).hide();
 }
 else
 {
   this.dialog = $('dialogBox').hide();
 }

 // Hide the overlay when clicked. Ignore clicks on the dialog.
 Event.observe(this.overlay, 'click', this.hide.bindAsEventListener(this));
 Event.observe(this.dialog, 'click',  function(event) { Event.stop(event) });

 // Insert the elements into the DOM
 this.dialog.insert(this.content);
 this.container.insert(this.overlay);
 this.container.insert(this.dialog);

 // Content may have been hidden if it is embedded in the page
 content.show();
 this.dialog.hide();

 }
}

PrototypeWindow.Dialog.prototype.show = function() {
 new Effect.Appear(this.overlay, { duration: 0.5,  to: 0.8 });
 this.dialog.show();
 return this;
};
PrototypeWindow.Dialog.prototype.hide = function(event) {
 this.dialog.hide();
 this.overlay.hide();
 this.dialog.innerHTML='';
 return this;
};
</pre>
<p>A dialógus ablak használata egyszerű</p>
<pre class="brush: jscript;">
&lt;script type=&quot;text/javascript&quot;&gt;
  var dialog = new Element('div'); // létrehozzunk egy divet
  dialog.insert(new Element('h2').insert('Dialogue')); // felötljük adatokkal, ez a sor opcionális...
  var overlay = new DialogOverlay(dialog); // divünket beletesszük a dialógus ablakba
  overlay.show(); // megjelenítjük a dialógus ablakot
&lt;/script&gt;
</pre>
<p>Szükségünk lehet még némi css-re a működéshez:</p>
<pre class="brush: css;">
.overlay {
 width: 100%;
 height: 100%;
 background: black;
 position: fixed;
 top: 0;
 left: 0;
 z-index: 2;
}
.dialog {
 width: 50%;
 min-height: 50%;
 background: white;
 position: fixed;
 top: 25%;
 left: 25%;
 z-index: 3;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.tlsys.hu/prototye-dialogus-ablak/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Openvpn</title>
		<link>http://blog.tlsys.hu/openvpn/</link>
		<comments>http://blog.tlsys.hu/openvpn/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 20:56:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Nincs kategorizálva]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[openvpn]]></category>

		<guid isPermaLink="false">http://blog.tlsys.hu/?p=233</guid>
		<description><![CDATA[letöltés
Egy jó leírás és ami sajnos kimaradt belőle: 
utólag így adunk hozzá új klienst:

source ./vars
./pkitool --interact --inter client00

Vista/2008 bug
]]></description>
			<content:encoded><![CDATA[<p><a href="http://openvpn.net/index.php/open-source/downloads.html">letöltés</a><br />
Egy <a href="https://csuhai.hu/egroupware/sitemgr/sitemgr-site/?page_name=OpenVPN">jó leírás</a> és ami sajnos kimaradt belőle: <span id="more-233"></span><br />
utólag így adunk hozzá új klienst:</p>
<pre class="brush: bash;">
source ./vars
./pkitool --interact --inter client00
</pre>
<p><a href="http://skriptd.wordpress.com/2007/07/12/openvpn-gui-on-windows-vista/">Vista/2008 bug</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tlsys.hu/openvpn/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony I. rész &#8211; Symfony 1.3 + propel telepítése ubuntu környezetben</title>
		<link>http://blog.tlsys.hu/symfony-propel-ubuntu-telepit/</link>
		<comments>http://blog.tlsys.hu/symfony-propel-ubuntu-telepit/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 19:23:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.tlsys.hu/?p=181</guid>
		<description><![CDATA[Ide egy symfony 1.3 + Propel project elkészítését szánom. Ubuntu rendszeren dolgozom, azért mert egyszerűbb, mint Windowson. Ha Windowson próbálkoznék, akkor is valamilyen virtuális Linuxot (pl: virtualbox) telepítenék fejlesztői teszt környezetnek.
A symfony 1.3-ra pedig azért esett a választás, mert ez az utolsó verzió, ami kompatibilis az 1.0-val. Rengeteg 1.0-as plugin található, aminek nincs 1.2-1.3-1.4-es verziója. [...]]]></description>
			<content:encoded><![CDATA[<p>Ide egy symfony 1.3 + Propel project elkészítését szánom. Ubuntu rendszeren dolgozom, azért mert egyszerűbb, mint Windowson. Ha Windowson próbálkoznék, akkor is valamilyen virtuális Linuxot (pl: virtualbox) telepítenék fejlesztői teszt környezetnek.<br />
A symfony 1.3-ra pedig azért esett a választás, mert ez az utolsó verzió, ami kompatibilis az 1.0-val. Rengeteg 1.0-as plugin található, aminek nincs 1.2-1.3-1.4-es verziója. Ha esetleg gyorsan be kell üzemelnem valamelyiket, akkor 1.3 alatt talán könnyebb lesz. A propelt pedig azért választottam, mert a cég, ahol dolgozom ezt használja és ezért én sem használtam még doctrinet.<br />
A projektemnél az adatbázis már kész volt és használták is. Erre fogjuk ráhúzni a symfonyt admin felületét.<br />
<span id="more-181"></span>Telepítsük a hiányzó szoftvereket:<br />
Az alap rendszer az, hogy a LAMP (Linux-Apache-MySql-PHP) környezet már megvolt.<br />
Ha mégsem, akkor egy már telepített Ubuntu/Debian Linuxon, a <em>sudo apt-get install mysql-server phpmyadmin</em> paranccsal a legegyszerűbb telepíteni, egy mozdulattal mindent <img src='http://blog.tlsys.hu/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Utána jöhet a symfony:</p>
<pre class="brush: bash;">
sudo-s #rendszergazda módba váltunk
apt-get install php-pear
pear channel-discover pear.symfony-project.com
pear install symfony/symfony-1.3.5 #ha van újabb, akkor azt
apt-get install php5-xsl #xsl php kiterjesztés telepítése, a propelhez kell
a2enmod rewrite # mod rewrite
/etc/init.d/apache restart
exit #kilépünk a rendszergazda módból
mkdir sandbox #létrehozzuk a project könyvtárat
cd sandbox #belépünk a könyvtárba
symfony generate:project sandbox --orm=Propel #project készítése
symfony generate:app frontend #alkalmazás létrehozása
# hogy a majdani felület kapja meg az alap symfony designt
ln -s /usr/share/php/data/symfony/web/sf web/sf
</pre>
<p>Ezzel létre is hoztunk egy alkalmazást.<br />
Ami problémával szembesülhetünk hogy valamiért nem lehet újraindítani az apache szervert, mert a 80/443-as portok valamelyike már foglalt. Ez általában az /etc/apache/ports.conf fileban keletkezett duplikált bejegyzés miatt fordulhat elő. Töröljük az egyiket&#8230;</p>
<p>Most be kell állítanunk az adatbázist. Ez most több fájlt érint, hiszen alapból az 1.3 már doctrine modeleket használ, ha a projektet nem <em>&#8211;orm=Propel</em> direktívával hoztuk létre. Mi azzal tettük <img src='http://blog.tlsys.hu/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
De ha mégsem, akkor először is szükségünk lesz egy propel.ini fájlra a sandbox/config könyvtárunkban. A fájlt nekünk kell létrehozni az alábbi sorokkal. Értelemszerűen át kell szerkeszteni (host,dbname, password, user, output dir), akkor is ha nem mi hoztuk létre.</p>
<pre class="brush: plain;">
propel.targetPackage       = lib.model
propel.packageObjectModel  = true
propel.project             = sandbox
propel.database            = mysql
propel.database.driver     = mysql
propel.database.url        = mysql:host=localhost;dbname=teszt
propel.database.creole.url = ${propel.database.url}
propel.database.user       = felhsznalo
propel.database.password   = jelszo
propel.database.encoding   = utf8

; mysql options
propel.mysql.tableType     = InnoDB

propel.addVendorInfo       = true
propel.addGenericAccessors = true
propel.addGenericMutators  = true
propel.addTimeStamp        = true
propel.addValidators       = false

propel.useDateTimeClass       = true
propel.defaultTimeStampFormat = Y-m-d H:i:s
propel.defaultTimeFormat      = H:i:s
propel.defaultDateFormat      = Y-m-d

propel.schema.validate        = false
propel.samePhpName            = false
propel.disableIdentifierQuoting     = false
propel.emulateForeignKeyConstraints = true

; directories
propel.home                    = .
propel.output.dir              = /home/user/sandbox
propel.schema.dir              = ${propel.output.dir}/config
propel.conf.dir                = ${propel.output.dir}/config
propel.phpconf.dir             = ${propel.output.dir}/config
propel.sql.dir                 = ${propel.output.dir}/data/sql
propel.runtime.conf.file       = runtime-conf.xml
propel.php.dir                 = ${propel.output.dir}
propel.default.schema.basename = schema
propel.datadump.mapper.from    = *schema.xml
propel.datadump.mapper.to      = *data.xml

; builder settings
propel.builder.peer.class              = plugins.sfPropelPlugin.lib.builder.SfPeerBuilder
propel.builder.object.class            = plugins.sfPropelPlugin.lib.builder.SfObjectBuilder
propel.builder.objectstub.class        = plugins.sfPropelPlugin.lib.builder.SfExtensionObjectBuilder
propel.builder.peerstub.class          = plugins.sfPropelPlugin.lib.builder.SfExtensionPeerBuilder
propel.builder.objectmultiextend.class = plugins.sfPropelPlugin.lib.builder.SfMultiExtendObjectBuilder
propel.builder.mapbuilder.class        = plugins.sfPropelPlugin.lib.builder.SfMapBuilderBuilder

propel.builder.addIncludes  = false
propel.builder.addComments  = true
propel.builder.addBehaviors = true
</pre>
<p>a config/database.yml fájlt is átszerkesztjük:</p>
<pre class="brush: plain;">
dev:
  propel:
    param:
      classname:  DebugPDO
      debug:
        realmemoryusage: true
        details:
          time:       { enabled: true }
          slow:       { enabled: true, threshold: 0.1 }
          mem:        { enabled: true }
          mempeak:    { enabled: true }
          memdelta:   { enabled: true }

test:
  propel:
    param:
      classname:  DebugPDO

all:
  propel:
    class:        sfPropelDatabase
    param:
      classname:  PropelPDO
      dsn:        mysql:dbname=teszt;host=localhost
      username:   user
      password:  password
      encoding:   utf8
      persistent: true
      pooling:    true
</pre>
<p>Majd át kell szerkeszteni a config/ProjectConfiguration fájlt is. Engedélyezzük a pluginokat.</p>
<pre class="brush: php;">
  public function setup()
  {
     $this-&gt;enableAllPluginsExcept(array('sfDoctrinePlugin'));
     // vagy : $this-&gt;enablePlugins('sfPropelPlugin');
  }
</pre>
<p>Ezekután az adatbázisunkhoz legeneraálhatjuk a schema.yml fájlt. Majd abból a modelt, a formot és a filtereket. Majd végül az első modulunkat is (modelname a modelünk &#8211; táblánk &#8211; neve):</p>
<pre class="brush: bash;">
# az alábbi paranccsal tudjuk a web könyvtárunkba a szükséges symlinkeket
# létrehozni, amire szintén a design miatt lesz szükség
./symfony plugin:publish-assets
./symfony propel:build-schema #ezzel jön létre a config/schema.yml fájl a beállított adatbázis alapján
./symfony propel:build-model #modelek (táblák) legenerálása
./symfony propel:build-form #formok generálása
./symfony propel:build-filter #a táblázatokhoz tartozó filterek legenerálása
# vagy az előző 3 helyett csak egyszerűen
# ./symfony propel:build-all --classes-only
# most pedig következzen a tábláink admin felületének legenerálása:
./symfony propel:generate-admin frontend modelname #a modul is ezt a nevet kapja
# vagy ha más néven szeretnénk:
#./symfony propel:generate-admin --module=&quot;modelnameAdmin&quot; frontend modelname
</pre>
<p>Az utolsó parancsot érdemes az összes modulunkra (értsd: tábla) lefuttatni.<br />
Én két problémába ütköztem, ezen parncsok futtatásakor.</p>
<ul>
<li> A propel nem szereti a default értékként beállított CURRENT_TIMESTAMP-et, viszont a schema.yml-be beírja. Ezért át kellett szerkesztenem a generált fájlban: <em>defaultValue: &#8216;0000-00-00 00:00:00&#8242;</em>.<br />
Ráadásul a hibaüzenet is nagyon buta volt:<em>Szegmens hiba</em>. Na ebből találja ki az ember <img src='http://blog.tlsys.hu/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' /> </li>
<li> A másik probléma pedig az volt, hogy szerettem volna egyben lefuttatni a model, form, filter építő parancsokat, de elfogyott a memória. Nem tudom melyik memória volt kevés, mert a php.ini-ben a négyszeresére emeltem, de még mindig ugyanannyira kevés volt. De legalább a hibaüzenet és az utasítások érthetők voltak</li>
</ul>
<p>Zárjuk le egyszerűen a telepítésünket:<br />
Lehetne szenvedni az apache virtuális könyvtáraival, de az egy másik leírás lesz. <img src='http://blog.tlsys.hu/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Most egy egyszerű Linux link is megteszi nekünk. Tehát létre kell hozni a /var/www könyvtárban egy linket a projectünknek. Ehhez el lehetne mélyednünk az ln parancs használatában, de én mindig a midnight commandert használtam ehhez. Ha nem lenne feltelepítve, akkor a <em>sudo apt-get install mc</em> paranccsal telepíthetjük. A két ablakos rendszerben a CTRL+X, majd utána S gomb lenyomásával hozhatunk létre linket. Hozzuk hát létre a /var/www könyvtárban egy linket sandbox néven, ami a sandbox/web könyvtárunkra mutat. És a máris elérhető a táblázatunk a http://mydomain/sandbox/index.php/modul url alatt. Ehhez lehet rendszergazdai módba kell váltanunk.<br />
<br />
Ha el akarjuk hagyni az <em>index.php</em> -t az URL-ből, akkor az /etc/apache/sites-available/default fájlt kell módosítani. A &#8220;Directory&#8221; szegmens alatt az <em>AllowOverride None</em> sort módosítani kell <em>AllowOverride  Al</em>l -ra. Ezzel engedélyezzük a <em>.htaccess</em> fájlok használatát. Így a <em>http://mydomain/sandbox/index.php/modul</em> helyett használhatjuk simán a <em>http://mydomain/sandbox/modul</em> URL-t is.<br />
<br />
Illetve ha valami hibába ütköznénk, akkor a fehér képernyő helyett a <em>http://mydomain/sandbox/frontend_dev.php/modul</em> alatt informálódhatunk a problémáról. Ha nem localhoston dolgozunk, akkor a frontend_dev.php fájl elején engedélyeznünk kell a saját IP címünket is.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tlsys.hu/symfony-propel-ubuntu-telepit/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Symfony parancsok</title>
		<link>http://blog.tlsys.hu/symfony-parancsok/</link>
		<comments>http://blog.tlsys.hu/symfony-parancsok/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 10:20:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Nincs kategorizálva]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.tlsys.hu/?p=175</guid>
		<description><![CDATA[amiket sokat kerestem, hogy többet ne kelljen   

//sfGuardUser ID:
sfContext::getInstance()-&#62;getUser()-&#62;getGuardUser()-&#62;getId()

//Hogyan alakitsuk egy objetum name tulajdonságát id 'formátumura':
get_id_from_name($name)

// form formázása (&#60;p&#62; stílus):
$formatter = $this-&#62;getWidgetSchema()-&#62;getFormFormatter();
$formatter-&#62;setErrorRowFormat('%errors%');
$formatter-&#62;setErrorListFormatInARow(&#34;%errors%\n&#34;);
$formatter-&#62;setErrorRowFormatInARow(&#34;&#60;p class='error-message'&#62;%error%&#60;/p&#62;&#34;);
$formatter-&#62;setRowFormat(&#34;%error%&#60;p&#62;%label%%field%%help%%hidden_fields%&#60;/p&#62;\n&#34;);

//$this változóinak lekérdezése
$this-&#62;getVarHolder()-&#62;getAll()

//SF_ENVIRONMENT 1.2 alatt:
sfConfig::get('sf_environment')

// összes request paraméter lekérése
$this-&#62;getRequest()-&#62;getParameterHolder()-&#62;getAll();
sfContext::getInstance()-&#62;getRequest()-&#62;getParameterHolder()-&#62;getAll()

// egy bizonyos request paraméter lekérése
$this-&#62;getRequestParameter('parameter', false);
sfContext::getInstance()-&#62;getRequest()-&#62;getParameter('parameter');

// controllerben helper használata
sfLoader::loadHelpers(array('Tag', 'Url'));
sfContext::getInstance()-&#62;getConfiguration()-&#62;loadHelpers(array('Tag', 'Url'));

//i18N akárhol:
sfContext::getInstance()-&#62;getI18N()-&#62;__('Nincs kiválasztva')

// Ez inkább propel. A model osztályból, annak sql neve:
constant(get_class($this-&#62;getPeer()).'::TABLE_NAME')

// [...]]]></description>
			<content:encoded><![CDATA[<p>amiket sokat kerestem, hogy többet ne kelljen <img src='http://blog.tlsys.hu/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  <span id="more-175"></span></p>
<pre class="brush: php;">
//sfGuardUser ID:
sfContext::getInstance()-&gt;getUser()-&gt;getGuardUser()-&gt;getId()

//Hogyan alakitsuk egy objetum name tulajdonságát id 'formátumura':
get_id_from_name($name)

// form formázása (&lt;p&gt; stílus):
$formatter = $this-&gt;getWidgetSchema()-&gt;getFormFormatter();
$formatter-&gt;setErrorRowFormat('%errors%');
$formatter-&gt;setErrorListFormatInARow(&quot;%errors%\n&quot;);
$formatter-&gt;setErrorRowFormatInARow(&quot;&lt;p class='error-message'&gt;%error%&lt;/p&gt;&quot;);
$formatter-&gt;setRowFormat(&quot;%error%&lt;p&gt;%label%%field%%help%%hidden_fields%&lt;/p&gt;\n&quot;);

//$this változóinak lekérdezése
$this-&gt;getVarHolder()-&gt;getAll()

//SF_ENVIRONMENT 1.2 alatt:
sfConfig::get('sf_environment')

// összes request paraméter lekérése
$this-&gt;getRequest()-&gt;getParameterHolder()-&gt;getAll();
sfContext::getInstance()-&gt;getRequest()-&gt;getParameterHolder()-&gt;getAll()

// egy bizonyos request paraméter lekérése
$this-&gt;getRequestParameter('parameter', false);
sfContext::getInstance()-&gt;getRequest()-&gt;getParameter('parameter');

// controllerben helper használata
sfLoader::loadHelpers(array('Tag', 'Url'));
sfContext::getInstance()-&gt;getConfiguration()-&gt;loadHelpers(array('Tag', 'Url'));

//i18N akárhol:
sfContext::getInstance()-&gt;getI18N()-&gt;__('Nincs kiválasztva')

// Ez inkább propel. A model osztályból, annak sql neve:
constant(get_class($this-&gt;getPeer()).'::TABLE_NAME')

// ajax link
echo link_to_remote('postolunk', array(
'update'    =&gt; 'a div id-ja amibe a visszatérő adatokat kapjuk',
'url'       =&gt; 'az ajaxos url',
'method'    =&gt; 'post',
//ez meghívja a validate javascript függvényt:
'condition' =&gt; &quot;validate(Form.serialize('formId'))&quot;,
//és a legfontosabb, így lehet a form adatait is elküldeni:
'submit'    =&gt; &quot;formId&quot;
))

// egy form hibát dob, de az épp rejtett, akkor irassuk ki.
$this-&gt;form-&gt;getErrorSchema()
</pre>
<p>Callback validator</p>
<pre class="brush: php;">
class aForm extends aBaseForm
{
  public function configure()
  {
    parent::configure() ; //esetleg ez nem fontos
    $this-&gt;validatorSchema-&gt;setPostValidator(new sfValidatorCallback(array('callback' =&gt; array($this, 'fuggvenyneve'))));
  }

  public function fuggvenyneve(sfValidatorBase $validator, array $values)
  {
    // $values tartalmazza az összes adatot, feldolgozod és a $hibavan-nak ennek függvényében értéket adsz:
    if ($hibavan)
    {
      throw new sfValidatorError($validator, 'hibaüzenet');
    }

    return $values;
  }
}
</pre>
<p>Propel</p>
<pre class="brush: php;">
$c = new Criteria();
$c-&gt;addJoin(
    array(ReaderFavoritePeer::BOOK_ID,ReaderFavoritePeer::READER_ID),
    array(BookOpinionPeer::BOOK_ID,BookOpinionPeer::READER_ID))

// és irassuk is ki a criteriát SQL-ben
echo $criteria-&gt;toString(); 

// szerezzük meg az ID-kat egy táblából.
$c = new Criteria();
$c-&gt;addSelectColumn(MyClassPeer::ID);
$res = BasePeer::doSelect($c);
$Ids = $res-&gt;fetchAll(PDO::FETCH_COLUMN,0);

// SELECT  FROM `tabla` WHERE (tabla.mezo1='string1' OR (tabla.mezo1='string2' AND tabla.mezo2='0'))
$c = new Criteria();
$cr1 = $c-&gt;getNewCriterion(TablePeer::MEZO1, 'string1');
$cr2 = $c-&gt;getNewCriterion(TablePeer::MEZO1, 'string2');
$cr3 = $c-&gt;getNewCriterion(TablePeer::MEZO2, '0');
$cr2-&gt;addAnd($cr3);
$cr1-&gt;addOr($cr2);
$c-&gt;add($cr1);
$c-&gt;toString();
</pre>
<p>Task</p>
<pre class="brush: php;">
./symfony i18n:extract frontend hu --auto-save
./symfony i18n:extract frontend hu --display-new
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.tlsys.hu/symfony-parancsok/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP ubuntu szerveren</title>
		<link>http://blog.tlsys.hu/cakephp-ubuntu-szerveren/</link>
		<comments>http://blog.tlsys.hu/cakephp-ubuntu-szerveren/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 20:07:44 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Nincs kategorizálva]]></category>
		<category><![CDATA[CakePHP]]></category>

		<guid isPermaLink="false">http://blog.tlsys.hu/?p=164</guid>
		<description><![CDATA[CakePHP telepítése:
sudo apt-get install cakephp
a usr/share/php könyvtárba feltelepíti a CakePHP egy jó régi verzióját. Habár van újabb, de a munkánkhoz mégis megfelelő 1.2-es verzióról van szó.
a következő parancs megmutatja a lehetőségeinket:
apropos cakephp 
A konzol a cake bake paranccsal indítható.
Első kérdés hogy hova kerüljön az application könyvtár tartalma. Ezután &#8211; ha nem abból a könyvtárból indítottuk [...]]]></description>
			<content:encoded><![CDATA[<p>CakePHP telepítése:<br />
<span id="more-164"></span><code>sudo apt-get install cakephp</code><br />
a usr/share/php könyvtárba feltelepíti a CakePHP egy jó régi verzióját. Habár van újabb, de a munkánkhoz mégis megfelelő 1.2-es verzióról van szó.<br />
a következő parancs megmutatja a lehetőségeinket:<br />
<code>apropos cakephp </code><br />
A konzol a <code>cake bake</code> paranccsal indítható.<br />
Első kérdés hogy hova kerüljön az application könyvtár tartalma. Ezután &#8211; ha nem abból a könyvtárból indítottuk &#8211; érdemes kilépni a konzolból és belépni a könyvtárba, mert a további munkánk feleslegessé válik, amikor létrehoznánk az database.php fájlt.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tlsys.hu/cakephp-ubuntu-szerveren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony widgetek</title>
		<link>http://blog.tlsys.hu/symfony-widgetek/</link>
		<comments>http://blog.tlsys.hu/symfony-widgetek/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 14:16:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Nincs kategorizálva]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.tlsys.hu/symfony-widgetek/</guid>
		<description><![CDATA[Symfony widgeteket fogok ide kirakni, néhol egy icipici kis magyarázattal.

datePicker:

class datePickerWidget extends sfWidgetFormInput
{

  public function configure($options = array(), $attributes = array())
  {
    $this-&#62;addOption('ifFormat', &#34;%Y-%m-%d&#34;);
    parent::configure($options, $attributes);
  }

  public function render($name, $value = null, $attributes = array(), $errors = array())
  {
    use_helper('Javascript', [...]]]></description>
			<content:encoded><![CDATA[<p>Symfony widgeteket fogok ide kirakni, néhol egy icipici kis magyarázattal.<br />
<span id="more-139"></span></p>
<p><strong>datePicker:</strong></p>
<pre class="brush: php;">
class datePickerWidget extends sfWidgetFormInput
{

  public function configure($options = array(), $attributes = array())
  {
    $this-&gt;addOption('ifFormat', &quot;%Y-%m-%d&quot;);
    parent::configure($options, $attributes);
  }

  public function render($name, $value = null, $attributes = array(), $errors = array())
  {
    use_helper('Javascript', 'wtCurrency');
    $response = sfContext::getInstance()-&gt;getResponse();
    $response-&gt;addStylesheet('/sf/calendar/calendar-system.css');
    $response-&gt;addJavascript('/sf/calendar/calendar.js');
    $response-&gt;addJavascript('/sf/calendar/lang/calendar-en.js');
    $response-&gt;addJavascript('/sf/calendar/calendar-setup.js');
    $response-&gt;addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/prototype');

    $picker = javascript_tag(&quot;
      Calendar.setup(
      {
        inputField  : '&quot;.$this-&gt;generateId($name).&quot;',
        ifFormat    : '&quot;.$this-&gt;getOption('ifFormat').&quot;',
        button      : 'trigger',    // ID of the button
      })
    &quot;);
    return parent::render($name, $value, $attributes, $errors) . $picker;
  }
}
</pre>
<p><strong>Autocompliter:</strong><br />
<a href="http://www.symfony-project.org/plugins/sfExtraWidgetsPlugin/1_0_5">innen az eredeti</a></p>
<pre class="brush: php;">
class sfExtraWidgetFormInputAutocomplete extends sfWidgetFormInput
{
    public function configure($options = array(), $attributes = array())
    {
        $this-&gt;addRequiredOption('url');
        $this-&gt;addOption('param', 'autocomplete');
        $this-&gt;addOption('min_chars', 2);
        $this-&gt;addOption('afterUpdateElement','');
        parent::configure($options, $attributes);
    }

    public function render($name, $value = null, $attributes = array(), $errors = array())
    {
        $response = sfContext::getInstance()-&gt;getResponse();
        $response-&gt;addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/prototype');
        $response-&gt;addJavascript(sfConfig::get('sf_prototype_web_dir').'/js/scriptaculous.js');
        sfLoader::loadHelpers(array('Javascript'));
        $response-&gt;addStylesheet('/sfExtraWidgetsPlugin/css/autocompleter.css');

        $autocompleteDiv = content_tag('div' , '', array('id' =&gt; $this-&gt;generateId($name) . '_autocomplete', 'class' =&gt; 'autocomplete'));

        $autocompleteJs = javascript_tag(
            &quot;function ac_update_&quot; . $this-&gt;generateId($name) . &quot;(text, li)
            {
                $('&quot; . $this-&gt;generateId($name) . &quot;').value = li.innerHTML;
                &quot;.$this-&gt;getOption('afterUpdateElement').&quot;
            }

            new Ajax.Autocompleter(
                '&quot; . $this-&gt;generateId($name) . &quot;',
                '&quot; . $this-&gt;generateId($name) . '_autocomplete' . &quot;',
                '&quot; . url_for($this-&gt;getOption('url')) . &quot;',
                {
                    paramName: '&quot; . $this-&gt;getOption('param') . &quot;',
                    indicator: 'indicator-&quot; . $this-&gt;generateId($name) . &quot;',
                    minChars: &quot; . $this-&gt;getOption('min_chars') . &quot;,
                    afterUpdateElement: ac_update_&quot; . $this-&gt;generateId($name) . &quot;
                });&quot;
            );

        return parent::render($name, $value, $attributes, $errors) .
        '&lt;span id=&quot;indicator-' . $this-&gt;generateId($name) . '&quot; style=&quot;display: none;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;img src=&quot;/sfExtraWidgetsPlugin/img/ajax-loader.gif&quot; align=&quot;absmiddle&quot; alt=&quot;Loading&quot; /&gt;&lt;/span&gt;' .
        $autocompleteDiv .
        $autocompleteJs;
    }
}
</pre>
<p>használata:<br />
widget:</p>
<pre class="brush: php;">
$this-&gt;widgetSchema['nevsearch']     = new sfExtraWidgetFormInputAutocomplete(array(
            'url'=&gt;'modul/action',
            'afterUpdateElement'=&gt;'afterUpdateElement_nevsearch(text, li)'));
// ezt a javascript függvényt létre kell hozni.
//vagy egyszerűen az eredti módszerrel:
$this-&gt;widgetSchema['projekt']   = new sfExtraWidgetFormInputAutocomplete(array('url'=&gt;'modul/action'));
</pre>
<p>actionSuccess.php</p>
<pre class="brush: php;">
&lt;ul&gt;
  &lt;?php foreach ($words as $value):?&gt;
    &lt;li id='&lt;?php echo $value?&gt;'&gt;&lt;?php echo $value?&gt;&lt;/li&gt;
  &lt;?php endforeach?&gt;
&lt;/ul&gt;
</pre>
<p><strong> checkbox</strong></p>
<pre class="brush: php;">$this-&gt;widgetSchema['checkbox'] = new sfWidgetFormInputCheckbox();
$this-&gt;validatorSchema['checkbox'] = new sfValidatorPass();</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.tlsys.hu/symfony-widgetek/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
