<?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>Splatch's devblog &#187; Agavi</title>
	<atom:link href="http://blog.dywicki.pl/category/framework/agavi/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.dywicki.pl</link>
	<description>Pragmatyzm kontrolowany</description>
	<lastBuildDate>Fri, 05 Jun 2009 14:30:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Agavi IDE, prace trwają</title>
		<link>http://blog.dywicki.pl/2007/12/02/agavi-ide-prace-trwaja/</link>
		<comments>http://blog.dywicki.pl/2007/12/02/agavi-ide-prace-trwaja/#comments</comments>
		<pubDate>Sat, 01 Dec 2007 23:54:39 +0000</pubDate>
		<dc:creator>Łukasz Dywicki</dc:creator>
				<category><![CDATA[Agavi]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Wiadomości]]></category>

		<guid isPermaLink="false">http://blog.dywicki.pl/?p=203</guid>
		<description><![CDATA[ Cały dzisiejszy dzień poświęciłem na zbudowanie szkieletu modelu pod Agavi IDE. W trakcie dnia zaszło kilka nagłych zwrotów akcji na miarę dobrego filmu sensacyjnego ;). Początkowo pragnąłem wykorzystać Eclipse Modeling Framework do zarządzania obiektami. Wszystko szło gładko, dopóki nie spróbowałem wygenerować kodu wolnego od zależności EMF. Koniec końców dowiedziałem się, że z EMF nie [...]]]></description>
			<content:encoded><![CDATA[<p><a href='http://blog.dywicki.pl/wp-content/uploads/2007/12/manager.PNG' title='Stored agavi project :)' rel='lightbox' style="text-decoration: none"><img src='http://blog.dywicki.pl/wp-content/uploads/2007/12/manager.thumbnail.PNG' alt='Stored agavi project :)' rel='lightbox' style="margin: 5px"  align="right" /></a> Cały dzisiejszy dzień poświęciłem na zbudowanie szkieletu modelu pod Agavi IDE. W trakcie dnia zaszło kilka nagłych zwrotów akcji na miarę dobrego filmu sensacyjnego ;). Początkowo pragnąłem wykorzystać <a href="http://www.eclipse.org/modeling/">Eclipse Modeling Framework</a> do zarządzania obiektami. Wszystko szło gładko, dopóki nie spróbowałem wygenerować kodu wolnego od zależności EMF. Koniec końców dowiedziałem się, że z EMF nie da się wygenerować zwykłych Java Beanów. Niestety, ale zarządzanie wszystkim poprzez otoczkę EMF niezbyt mi się uśmiechało. Model trzymany w pamięci nie potrzebuje wodotrysków, mogą to być zwykle <a href="http://en.wikipedia.org/wiki/POJO">POJO</a>.<br />
Przepisałem więc cały kod sam, na nowo. Diagram, który początkowo ilustrował całą strukturę, troszkę się zmienił, nie mniej wersję bazową załączam na obrazku.</p>
<p>
<a href='http://blog.dywicki.pl/wp-content/uploads/2007/12/default.png' title='Agavi IDE Model Draft' rel='lightbox' style="text-decoration: none"><img src='http://blog.dywicki.pl/wp-content/uploads/2007/12/default.thumbnail.png' alt='Agavi IDE Model Draft' rel='lightbox' style="margin: 5px" align="right" /></a> Kolejny problem jaki wylazł to zapisywanie obiektów w db4o. Początkowo założyłem sobie, że niektórym elementom będę przypisywał lokalizacje (na diagramie interfejs IResourceLink). Okazało się jednak, że pochodne IResource (IFolder, IFile) w Eclipse zawierają sporo informacji, z których zapisaniem był problem (PreferencesStore), a które z punktu widzenia AgaviIDE były zbyteczne. Ilość zapisanych obiektów była przytłaczająca, już po chwili pracy baza projektu miała ponad 1 megabajt. Biorąc pod uwagę to, że jest tam zapisywany model, który zmienia się często i w którym wyszukiwanie powinno być możliwie najszybsze sytuacja taka była nie do przyjęcia. Znowu przekopałem cały kod modelu, tym razem po to by korzystać ze klasy java.io.File. Masakra, koniec końców udało mi się całość uruchomić. Builder działa, obiekty są zapisywane (drugi obrazek). Teraz dorzucić jeszcze wyciąganie informacji z plików php i powinno być ok..</p>
<p>Oto output, którym w tej chwili częstuje builder.</p>
<div class="igBar"><span id="lcode-2"><a href="#" onclick="javascript:showPlainTxt('code-2'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-2">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">incremental build</div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">create new project</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">project location E:\agavi-ide\org.<span style="">agavi</span>.<span style="">editor</span>.<span style="">module</span>\workspace\Agavi test</div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">project modules <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">change: Agavi test, resource type: Project</div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">change: Admin, resource type: Folder</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">change: actions, resource type: Folder</div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">change: ErrorAction.<span style="">class</span>.<span style="">php</span>, resource type: File </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Pomyślcie jak fajnie będzie się edytować routing.. podanie ścieżki, wskazanie akcji i gotowe.. albo konfiguracja walidatorów na podobna do tej z <a href='http://blog.dywicki.pl/wp-content/uploads/2007/12/facesconfig-validator.png' title='JSF Tools…'>JSF Tools</a><noscript>Une bien longue suite des <a href="http://www.accessiblesociety.net">jeux de casino en ligne</a>.</noscript></p>]]></content:encoded>
			<wfw:commentRss>http://blog.dywicki.pl/2007/12/02/agavi-ide-prace-trwaja/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Agavi IDE, db4o 7.0, ObjectNotStorableException i Ant :)</title>
		<link>http://blog.dywicki.pl/2007/11/30/agavi-ide-db4o-70-objectnotstorableexception-i-ant/</link>
		<comments>http://blog.dywicki.pl/2007/11/30/agavi-ide-db4o-70-objectnotstorableexception-i-ant/#comments</comments>
		<pubDate>Thu, 29 Nov 2007 23:21:25 +0000</pubDate>
		<dc:creator>Łukasz Dywicki</dc:creator>
				<category><![CDATA[Agavi]]></category>
		<category><![CDATA[DB]]></category>
		<category><![CDATA[Inne]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Wiadomości]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://blog.dywicki.pl/?p=201</guid>
		<description><![CDATA[Dnia dzisiejszego zmobilizowałem się by nieco popracować nad modelem dla Agavi IDE. Jest to podstawa bez której ciężko budować kolejne edytory. Trzeba w końcu wiedzieć jakie akcje, widoki etc są w projekcie by sugerować użytkownikowi poprawne wartości.
Jak donosi Michał Mech na swoim blogu, konkurencja nie śpi i wszczęła prace nad integracją Eclipse i Symfony - [...]]]></description>
			<content:encoded><![CDATA[<p>Dnia dzisiejszego zmobilizowałem się by nieco popracować nad modelem dla Agavi IDE. Jest to podstawa bez której ciężko budować kolejne edytory. Trzeba w końcu wiedzieć jakie akcje, widoki etc są w projekcie by sugerować użytkownikowi poprawne wartości.<br />
Jak donosi <a href="http://michalmech.pl">Michał Mech</a> na <a href="http://michalmech.pl/index.php/2007/11/29/symfoclipse-wsparcie-dla-symfony-na-platformie-eclipse/">swoim blogu</a>, konkurencja nie śpi i wszczęła prace nad integracją Eclipse i Symfony - tak też narodziło się <a href="http://">Symfoclipse</a>. Stąd straciłem już palmę pierwszeństwa i pozostaje mi walczyć na polu jakości i funkcjonalności. <a href="http://zend.com">Zend</a> również serwuje wsparcie dla <a href="http://framework.zend.com/">Zend Framework</a>, aczkolwiek po <a href="http://www.zend.com/webinar/studio/EN_11_Zend_Studio_Neon_Zend_Framework_Support/">prezentacji</a> miałem mieszane uczucia. Przede wszystkim lektor mówiący z paskudnym angielskim akcentem. Nie wiem, może jestem wyczulony, ale gdy słyszę te fonetyczne wygibasy to mnie to mierzi, może dla jednych to plus, ale dla mnie lepszym sprzedawcą produktu jest ktoś kto mówi o swoim projekcie chociażby z francuskim akcentem niż wynajęty lektor, który ma pomnożyć wrażenie "powagi" przedsięwzięcia. Na drugim miejscu jakość "wsparcia", bo inaczej jak w cudzysłowach tego nie mogę określić, jest po prostu żenująca. Czy mi się wydaje czy oni każą sobie płacić za dodanie kreatora (wizzarda)? ;) Coś mi się wydaje, że załoga <a href="http://phpeclipse.de/"><acronym title="Pre-Hypertext Processing">PHP</acronym> Eclipse</a> dobrze robi ponownie zwierając szyki!</p>
<p>Oczywiście przy pisaniu napotkałem problemy. Pierwszym z nich było zniknięcie klasy buildera, drugim wywalanie się db4o (dev 7.0). O ile pierwszy uraczył mnie gromadą logów o tyle drugi poza pokaźnym stosem nie dał mi nic. Typ wyjątku <b>com.db4o.ext.ObjectNotStorableException</b> - nazwa w miarę jasna, problem w tym, że za tym żadnego uzasadnienia, powodu dla którego wyjątek by leciał. Zero, dosłownie zero informacji.<br />
Na forum db4o znalazłem parę postów - z nich wyciągnąłem wniosek - konieczne jest użycie taska ant, który zmodyfikuje bytecode klasy, ponieważ w przeciwnym wypadku db4o próbuje serializować obiekt, a gdy mu się nie uda rzuca w/w wyjątek.</p>
<p>Skrypt ant - który załatwia problem, dla potomnych (<a href="http://developer.db4o.com/forums/thread/43766.aspx">przeróbka z forum</a>):</p>
<pre class="brush: xml;">&lt;project name=&quot;db4o enhance project&quot; default=&quot;enhance&quot; basedir=&quot;.&quot;&gt;

	&lt;!-- inny projekt z workspace'a --&gt;
	&lt;property name=&quot;model.classes.location&quot; location=&quot;E:/agavi-ide/org.codehouse.model&quot; /&gt;
	&lt;!--
	położenie eclipse, db4o szpera w poszukiwaniu zależności klas, tak się składa,
	że mój kod korzysta z paru rzeczy z org.eclipse.core.resources, normalnie ta
	wstawka się nie pojawia
	--&gt;
	&lt;property name=&quot;eclipse.location&quot; location=&quot;E:/eclipse-3.3/eclipse&quot; /&gt;

	&lt;target name=&quot;pack-model&quot;&gt;
		&lt;echo message=&quot;Tworzę archiwum z modelem&quot; /&gt;
	    &lt;jar destfile=&quot;lib/model.jar&quot;&gt;
	        &lt;fileset dir=&quot;${model.classes.location}/bin/&quot;&gt;
	        	&lt;!-- włączamy wszystkie skomilowane klasy --&gt;
	            &lt;include name=&quot;**/*.class&quot; /&gt;
	        &lt;/fileset&gt;
	    &lt;/jar&gt;
	&lt;/target&gt;

	&lt;!-- classpath dla projektu --&gt;
	&lt;path id=&quot;project.classpath&quot;&gt;
		&lt;pathelement path=&quot;${basedir}/bin&quot; /&gt;
		&lt;fileset dir=&quot;lib&quot;&gt;
			&lt;include name=&quot;**/*.jar&quot; /&gt;
		&lt;/fileset&gt;
		&lt;fileset dir=&quot;${eclipse.location}/plugins/&quot;&gt;
			&lt;include name=&quot;**/*.jar&quot; /&gt;
		&lt;/fileset&gt;
	&lt;/path&gt;

    &lt;!-- odwołanie do taska z db4o-tools.jar --&gt;
    &lt;taskdef name=&quot;db4o-enhance&quot; classname=&quot;com.db4o.enhance.Db4oEnhancerAntTask&quot; classpathref=&quot;project.classpath&quot; /&gt;

	&lt;target name=&quot;enhance&quot; depends=&quot;pack-model&quot;&gt;
		&lt;!-- przeoranie źródeł i zależności --&gt;
		&lt;db4o -enhance classtargetdir=&quot;${basedir}/bin&quot; jartargetdir=&quot;${basedir}/lib&quot;&gt;
			&lt;classpath refid=&quot;project.classpath&quot; /&gt;
			&lt;sources dir=&quot;${basedir}/bin&quot; /&gt; &lt;!-- w tym katalogu db4o zajmie się plikami .class --&gt;
			&lt;jars dir=&quot;${basedir}/lib&quot;&gt;
				&lt;include name=&quot;*.jar&quot; /&gt;
				&lt;exclude name=&quot;db4o-*.jar&quot; /&gt;
				&lt;exclude name=&quot;ant.jar&quot; /&gt;
				&lt;exclude name=&quot;bloat-1.0.jar&quot; /&gt;

			&lt;/jars&gt;
		&lt;/db4o -enhance&gt;
	&lt;/target&gt;

&lt;/project&gt;</pre>]]></content:encoded>
			<wfw:commentRss>http://blog.dywicki.pl/2007/11/30/agavi-ide-db4o-70-objectnotstorableexception-i-ant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mój pierwszy edytor&#8230;</title>
		<link>http://blog.dywicki.pl/2007/11/07/moj-pierwszy-edytor/</link>
		<comments>http://blog.dywicki.pl/2007/11/07/moj-pierwszy-edytor/#comments</comments>
		<pubDate>Tue, 06 Nov 2007 22:44:39 +0000</pubDate>
		<dc:creator>Łukasz Dywicki</dc:creator>
				<category><![CDATA[Agavi]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[JAXB]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SWT]]></category>
		<category><![CDATA[Wiadomości]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://blog.dywicki.pl/?p=196</guid>
		<description><![CDATA[
Czas jakiś temu udało mi się stworzyć pierwszy działający edytor w oparciu o Eclipse.
Kilka informacji co pod spodem:

SharedHeaderFormEditor - ładny tekstowy nagłówek oraz możliwość dodawania zakładek
FormPage i FormToolkit - użyte do stworzenia układu, który widać na załączonym obrazku
JFace Databinding - zapewnia propagowanie zmian z formularza do obiektów
JAXB 2 - mapowanie plików XML do odpowiednich klas
JFace [...]]]></description>
			<content:encoded><![CDATA[<p><a href='http://blog.dywicki.pl/wp-content/uploads/2007/11/agavi-editor.JPG' title='Agavi module configuration editor' rel="lightbox"><img align="right" src='http://blog.dywicki.pl/wp-content/uploads/2007/11/agavi-editor.thumbnail.JPG' alt='Agavi module configuration editor'  rel="lightbox"/></a></p>
<p>Czas jakiś temu udało mi się stworzyć pierwszy działający edytor w oparciu o Eclipse.<br />
Kilka informacji co pod spodem:</p>
<ul>
<li>SharedHeaderFormEditor - ładny tekstowy nagłówek oraz możliwość dodawania zakładek</li>
<li>FormPage i FormToolkit - użyte do stworzenia układu, który widać na załączonym obrazku</li>
<li>JFace Databinding - zapewnia propagowanie zmian z formularza do obiektów</li>
<li>JAXB 2 - mapowanie plików <acronym title="eXtensible Markup Language">XML</acronym> do odpowiednich klas</li>
<li>JFace - table viewer i parę innych dodatków</li>
</ul>
<p>Całość ogólnie jest prosta niczym konstrukcja cepa, w działaniu sprawia się dobrze. Jak tylko ogarnę kod postaram się opisać krok po kroku jak można coś podobnego stworzyć na własny użytek. </p>
<p>Splatch wraca do gry i będzie grać wysoko! ;-)</p>]]></content:encoded>
			<wfw:commentRss>http://blog.dywicki.pl/2007/11/07/moj-pierwszy-edytor/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Wygodny edytor do konfiguracji XML</title>
		<link>http://blog.dywicki.pl/2007/08/02/wygodny-edytor-do-konfiguracji-xml/</link>
		<comments>http://blog.dywicki.pl/2007/08/02/wygodny-edytor-do-konfiguracji-xml/#comments</comments>
		<pubDate>Thu, 02 Aug 2007 21:46:17 +0000</pubDate>
		<dc:creator>Łukasz Dywicki</dc:creator>
				<category><![CDATA[Agavi]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://blog.dywicki.pl/?p=176</guid>
		<description><![CDATA[Konfiguracja w XMLu ma swoje plusy jak i minusy. Nie jest tak banalna w obsłudze jak zapisana w PHP czy w .ini, ale daje dość spore możliwości. Troszkę dywagacji na ten temat było jakiś czas temu w poście pod tytułem "Dlaczego konfiguracja w XML".
Jednym z problemów związanych z XMLem jest konieczność zapamiętania nazw znaczników i [...]]]></description>
			<content:encoded><![CDATA[<p><a href='http://blog.dywicki.pl/wp-content/uploads/2007/08/xml-catalog.PNG' title='Zdefiniowany katalog ze schematami XML' style="border: 0px" rel="lightbox"><img src='http://blog.dywicki.pl/wp-content/uploads/2007/08/xml-catalog.thumbnail.PNG' alt='Zdefiniowany katalog ze schematami XML' style="margin: 0px" rel="lightbox" align="left" /></a>Konfiguracja w XMLu ma swoje plusy jak i minusy. Nie jest tak banalna w obsłudze jak zapisana w <acronym title="Pre-Hypertext Processing">PHP</acronym> czy w .ini, ale daje dość spore możliwości. Troszkę dywagacji na ten temat było jakiś czas temu w poście pod tytułem "<a href="http://blog.dywicki.pl/?p=101">Dlaczego konfiguracja w <acronym title="eXtensible Markup Language">XML</acronym></a>".<br />
Jednym z problemów związanych z XMLem jest konieczność zapamiętania nazw znaczników i atrybutów, co powoduje z początku problemy. Pisanie w XMLu nie jest wówczas tak wygodne jak w <acronym title="Pre-Hypertext Processing">PHP</acronym> (z resztą nigdy takie nie będzie), ale możemy je sobie uprościć przy pomocy dwóch opcji jakie oferuje edytor <acronym title="eXtensible Markup Language">XML</acronym> dostępny przez <a href="http://www.eclipse.org/webtools/wst/main.php">WST</a>.</p>
<p><a href='http://blog.dywicki.pl/wp-content/uploads/2007/08/catalog-entry.PNG' title='Dodanie nowego wpisu' style="border: 0px" rel="lightbox"><img src='http://blog.dywicki.pl/wp-content/uploads/2007/08/catalog-entry.thumbnail.PNG' alt='Dodanie nowego wpisu' style="margin: 0px" rel="lightbox" align="left" /></a>Pierwszym krokiem jest podpięcie własnych plików z definicjami struktur do Eclipse. Wskakujemy zatem do <b>Window &gt; Preferences</b> a następnie do <b>Web and <acronym title="eXtensible Markup Language">XML</acronym> &gt; <acronym title="eXtensible Markup Language">XML</acronym> Catalog</b>. Mamy tam listę definicji, których używa WST do podpowiadania składni. Jest miejsce na definicje użytkownika - zatem dorzucamy nowy wpis do obsługi autoload. Po pierwsze wybieramy nowy element. Do wyboru mamy dwa rodzaje źródeł - plik ze wskazanego projektu bądź z określonej lokalizacji. Drugi ma tą przewagę, że nie ma problemów z jego przenoszeniem pomiędzy różnymi workspace'ami. Po wskazaniu źródła z poprawnym dokumentem xsd bądź dtd Eclipse samo wypełni pola. Jedyne co pozostaje nam zrobić to kliknąć i potwierdzić.</p>
<p><a href='http://blog.dywicki.pl/wp-content/uploads/2007/08/new-file.PNG' title='Tworzenie nowego pliku ze schematu' style="border: 0px" rel="lightbox"><img src='http://blog.dywicki.pl/wp-content/uploads/2007/08/new-file.thumbnail.PNG' alt='Tworzenie nowego pliku ze schematu' style="margin: 0px" rel="lightbox" align="right" /></a>Po tym zabiegu możemy zabrać się za edytowanie istniejących plików bądź stworzyć nowy w oparciu o kreator.. Aby to zrobić korzystamy z opcji <b>File &gt; New &gt; Other</b> z listy wybieramy <acronym title="eXtensible Markup Language">XML</acronym> i tworzymy na podstawie schematu. Po wybraniu tej opcji mamy dostępną listę schematów, na podstawie których WST jest w stanie wygenerować szablon dokumentu.</p>
<p><a href='http://blog.dywicki.pl/wp-content/uploads/2007/08/xml-editing.PNG' title='Efekt naszych prac - podpowiadanie składni' style="border: 0px" rel="lightbox"><img src='http://blog.dywicki.pl/wp-content/uploads/2007/08/xml-editing.thumbnail.PNG' alt='Efekt naszych prac - podpowiadanie składni' style="margin: 0px" rel="lightbox" align="left" /></a> Koniec końców mamy w pełni funkcjonalne podpowiadanie składni w dokumencie <acronym title="eXtensible Markup Language">XML</acronym>. W podpowiedziach jest również dodawana informacja o krotności elementów * (zero i więcej), + (jeden i więcej), ? (zero lub jeden) a także wyświetlana dokumentacja. Gdy pracuje się z dobrze opisanym schematem - np plikiem xsd, w którym autorzy nie żałowali miejsca na adnotacje z informacjami na temat poszczególnych elementów - nie ma nawet konieczności skakania po oknach w celu doczytania informacji - jakiego atrybutu bądź znacznika użyć - po prostu mamy to od razu w edytorze. Bez jakiegokolwiek wysiłku, kilkoma kliknięciami zyskujemy funkcjonalne narzędzie. :)</p>
<p><a href='http://blog.dywicki.pl/wp-content/uploads/2007/08/template.PNG' title='Definicja szablonu' style="border: 0px" rel="lightbox"><img src='http://blog.dywicki.pl/wp-content/uploads/2007/08/template.thumbnail.PNG' alt='Definicja szablonu' rel="lightbox" style="margin: 5px" align="right" /></a>Druga opcja, która jest dostępna w większości edytorów tekstowych to zdefiniowane szablony. W celu zdefiniowania nowego szablonu w preferencjach otwieramy zakładkę <b>Web and <acronym title="eXtensible Markup Language">XML</acronym> &gt; <acronym title="eXtensible Markup Language">XML</acronym> Files &gt; Templates</b>. Znajdziemy tam listę z możliwością modyfikacji. Opcję tą odkryłem przy okazji walczenia z pisaniem schema.xml dla Propela z ręki. Była niezastąpiona i zastępowała sporo pracy związanej z tępym kopiowaniem tekstu.<a href='http://blog.dywicki.pl/wp-content/uploads/2007/08/template-usage.PNG' title='Szablon w akcji!' style="border: 0px" rel="lightbox"><img src='http://blog.dywicki.pl/wp-content/uploads/2007/08/template-usage.thumbnail.PNG' alt='Szablon w akcji!' rel="lightbox" style="margin: 5px" align="left"  /></a> W definicji szablonów mamy do dyspozycji kilka pre definiowanych zmiennych, są one przydatne podczas tworzenia szablonów nowych plików. Możemy również deklarować własne zmienne - <b>${nazwa_zmiennej}</b>. Po wstawieniu szablonu do pliku możemy się nawigować po miejscach wystąpień zmiennych przy użyciu tabulatora. Miejsca, w których powtarzają się te same nazwy zmiennych są automatycznie uzupełniane, tak, że wpisując przy pierwszej zmiennej ${name} nie musimy powtarzać tej czynności w drugim miejscu.</p>
<p>Mam nadzieję, że przyda się w praktyce! Przy okazji pragnę Was, drodzy czytelnicy, poprosić o opinie na temat lightboxa, czy nie przeszkadza Wam jego użycie, być może wolicie tradycyjne linki do plików? Pomijam efekty graficzne, bo wygaszanie tła etc przy trzecim razie bardziej irytuje niż cieszy oko. Jak sądzicie - usunąć lightboxa? Momentami mam też problemy z rozmieszczaniem "obrazków" stąd są prozżucane po akapitach raz z lewej raz z prawej ponieważ przy mniejszych rozdzielczościach zachodzą na siebie, co powoduje niezbyt miłe efekty.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.dywicki.pl/2007/08/02/wygodny-edytor-do-konfiguracji-xml/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Agavi 0.11 RC5</title>
		<link>http://blog.dywicki.pl/2007/06/18/agavi-011-rc5/</link>
		<comments>http://blog.dywicki.pl/2007/06/18/agavi-011-rc5/#comments</comments>
		<pubDate>Mon, 18 Jun 2007 21:41:11 +0000</pubDate>
		<dc:creator>Łukasz Dywicki</dc:creator>
				<category><![CDATA[Agavi]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wiadomości]]></category>

		<guid isPermaLink="false">http://blog.dywicki.pl/?p=146</guid>
		<description><![CDATA[Dzisiaj rano światło dzienne ukazało się Agavi 0.11 RC5, oprócz poprawek błędów z wersji RC4 doszło parę nowości:
- Pełne wsparcie dla generowania WSDL, automatyczne mapowanie akcji a nawet wsparcie dla obsługi nagłówków SOAP.
- Wsparcie dla transformacji plików konfiguracyjnych poprzez zamieszczanie instrukcji < ?xml-stylesheet?>
- Wsparcie dla przestrzeni nazw w plikach konfiguracyjnych
- Automatyczna obsługa magic_quotes dla zmiennych [...]]]></description>
			<content:encoded><![CDATA[<p>Dzisiaj rano światło dzienne ukazało się Agavi 0.11 RC5, oprócz poprawek błędów z wersji RC4 doszło parę nowości:<br />
- Pełne wsparcie dla generowania <acronym title="Web Services Description Language">WSDL</acronym>, automatyczne mapowanie akcji a nawet wsparcie dla obsługi nagłówków <acronym title="Simple Object Access Protocol">SOAP</acronym>.<br />
- Wsparcie dla transformacji plików konfiguracyjnych poprzez zamieszczanie instrukcji < ?xml-stylesheet?><br />
- Wsparcie dla przestrzeni nazw w plikach konfiguracyjnych<br />
- Automatyczna obsługa magic_quotes dla zmiennych superglobalnych</p>
<p>Pojawiły się drobne zmiany w <acronym title="Application Programming Interface">API</acronym> do obsługi configów oraz nowy sposób ich odczytu, który wejdzie do użytku w wersji 1.0. Póki co jest tylko testowy a jedynym handlerem, który został zaimplementowany "na nowo" jest ten obsługujący <acronym title="Web Services Description Language">WSDL</acronym>.</p>
<p>Dodam, że <a href="http://agavi.org">Agavi</a> to pierwszy framework <acronym title="Pre-Hypertext Processing">PHP</acronym>, który rozwiązuje kwestie dostępu do akcji w tak elastyczny sposób. Niezależnie od tego jakim sposobem zostało przysłane żądanie akcja wygląda tak samo. Jest to krok w stronę dojrzałych rozwiązań tj <a href="http://springframework.org">Spring Framework</a>. Pytanie tylko - czy developerom uda się zachować pierwotną prostotę i ile pracy trzeba będzie włożyć w użycie danego rozwiązania? Odpowiedź na nie pozostaje póki co zagadką a pełnej oceny będziemy mogli dokonać po ukazaniu się wersji 1.0 wraz z dokumentacją.</p>
<p>Zainteresowanych naturalnie Agavi zapraszam do <a href="http://trac.agavi.org/">traca</a> i przeglądania <a href="http://trac.agavi.org/browser/tags/0.11.0RC5/">źródeł wersji 0.11 RC5</a>. :)</p>]]></content:encoded>
			<wfw:commentRss>http://blog.dywicki.pl/2007/06/18/agavi-011-rc5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Agavi 0.11 RC3, flow</title>
		<link>http://blog.dywicki.pl/2007/02/24/agavi-011-rc3-flow/</link>
		<comments>http://blog.dywicki.pl/2007/02/24/agavi-011-rc3-flow/#comments</comments>
		<pubDate>Fri, 23 Feb 2007 22:48:53 +0000</pubDate>
		<dc:creator>Łukasz Dywicki</dc:creator>
				<category><![CDATA[Agavi]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.dywicki.pl/2007/02/24/agavi-011-rc3-flow/</guid>
		<description><![CDATA[Mam niebywałą przyjemność oznajmić, że dnia 23 lutego zostało wydane, jak sam tytuł posta wskazuje, Agavi 0.11 RC3. Do pierwszej, w pełni stabilnej wersji jest już coraz bliżej.
Zgodnie z rozkładem jazdy został otwarty jeden ticket, którego realizacja została odsunięta na sam koniec. Mianowicie, opis migracji z wersji 0.10 do 0.11. Ogrom zmian, które przetaczały się [...]]]></description>
			<content:encoded><![CDATA[<p>Mam niebywałą przyjemność oznajmić, że dnia <a href="http://trac.agavi.org/log/tags/0.11.0RC3">23 lutego</a> zostało wydane, jak sam tytuł posta wskazuje, Agavi 0.11 RC3. Do pierwszej, w pełni stabilnej wersji jest już coraz bliżej.<br />
Zgodnie z rozkładem jazdy został otwarty <a href="http://trac.agavi.org/ticket/340">jeden ticket</a>, którego realizacja została odsunięta na sam koniec. Mianowicie, opis migracji z wersji 0.10 do 0.11. Ogrom zmian, które przetaczały się przez trunk repozytorium mógł przyprawić o zawrót głowy. Zmiany z rewizji na rewizję potrafiły w jednym momencie zniszczyć skrzętnie budowane narzędzia, które opierały się na zmieniających się wciąż mechanizmach.<br />
Co zyskało Agavi o wersji 0.10? Przede wszystkim developerzy uwolnili projekt od niezręcznej i nieporęcznej konfiguracji w plikach INI, która poza łatwością odczytu nastręczała przede wszystkim problemów... a to brak hierarchiczności, brak możliwości łączenia konfiguracji, w końcu brak narzędzia do walidacji zapisanych danych. W poście "<a href="http://blog.dywicki.pl/2006/09/07/dlaczego-konfiguracja-w-xml/">Dlaczego konfiguracja w <acronym title="eXtensible Markup Language">XML</acronym></a>" porównywałem <acronym title="eXtensible Markup Language">XML</acronym> również do YAMLa.<br />
Sporą zmianą, naturalnie, na lepsze było zrezygnowanie z tradycyjnego flowu Mojavi 3. Do tej pory wyglądało to w ten sposób, że każda akcja miała metodę getRequestMethods, która zwracała informacje o tym w jaki sposób dostępna jest akcja. Czy to GET, POST, bądź cokolwiek (odpowiednie stałę w klasie Request - GET, POST, NONE). Teraz o sposób dostępu do akcji determinuje nazw akcji. Akcja o nazwie executeRead będzie wykonana w chwili żądania typu GET. Metoda o nazwie executeWrite będzie wykonana w chwili gdy otrzymamy formularz via POST. Metoda execute będzie wykonywana zawsze (o ile walidacja przebiegnie bez zakłuceń). Zysk z tego jest taki, że implementacja różnych kontrolerów nie wpływa na kształt akcji. W chwili gdy wiązały się z tym stałe GET/POST implementacja wywołań z poziomu konsoli była ciężka. W zapowiedziach pojawia się ConsoleRequest, ponieważ z Agavi 0.11 wyleciały kontrolery zależne od kontekstu. Jest jeden <a href="http://trac.agavi.org/browser/tags/0.11.0RC3/src/controller/AgaviController.class.php">Controller</a>, różne są implementacje requestu vide <a href="http://trac.agavi.org/browser/tags/0.11.0RC3/src/request/AgaviConsoleRequest.class.php">ConsoleRequest</a> (jeszcze niegotowy, będzie w 1.0), <a href="http://trac.agavi.org/browser/tags/0.11.0RC3/src/request/AgaviWebRequest.class.php">WebRequest</a> oraz <a href="http://trac.agavi.org/browser/tags/0.11.0RC3/src/request/AgaviSecureWebRequest.class.php">SecureWebRequest</a>.<br />
W międzyczasie pożegnaliśmy również stałe View::SUCCESS, ERROR, INPUT, ALERT, a metoda <a href="http://trac.agavi.org/browser/tags/0.11.0RC3/samples/app/modules/Default/actions/IndexAction.class.php#L69">getDefaultViewName</a> każdej akcji zwraca po prostu suffix do nazwy widoku (np. metoda akcji "Cart" zwraca wartość "Product", stąd klasa widoku to CartProductView).<br />
Co więcej w połączeniu z innym mechanizmem <a href="http://blog.dywicki.pl/2007/02/22/agavi-output-types/">Agavi, Output types</a>, zmiany formatu widoku oraz języka nie wiążą się z implementacją bądź powielaniem logiki biznesowej. Implementujemy tylko logikę związaną z widokiem.<br />
Warto również wspomnieć, że od tej chwili <strong>metoda Controller::forward(module, action) jak i samo używanie powiązanych akcji jest odradzane</strong>, jako źródło potencjalnych problemów (dlaczego widok nie jest uruchamiany) tym bardziej, że tworzenie widoków i akcji załatwia samo Agavi przez taski dla <a href="http://phing.info">Phinga</a>. W chwili, gdy chcemy użyć innego widoku, spoza tych, które dostarcza sama akca po prostu zwracamy array(module, view name, parameters). Zniknęła również możliwości zrobienia forwarda z widoku (ogólnie problemy z request methods, to co było post-only nie szło przy fowardzie przy żądaniu otrzymanym via get), co wydaje się jak najbardziej uzasadnione.<br />
Widok nie jest organem decyzyjnym, który powinien wskazywać na wykonanie logiki biznesowej. Nie mniej jest możliwość przekierowania do widoku innej akcji.. poprzez redirect bądź poprzez zwrócenie array(module, view name, parameters).</p>
<p>To co jest bolesne w execution flow oferowanym w Agavi to niestety jego prostota. Przede wszystkim brakuje mi (jak w wielu miejscach Agavi) interfejsów. Jest to dla mnie naturalne, że dążę do generalizacji, interfejs jest podstawowym elementem, który uniezależnia od implementacji. Interesuje nas to, co jest widoczne na zewnątrz a nie to co wewnątrz implementacji. Brakuje mi opakowań dla tych tablic, które informacje o widoku. Prosty kontener, bean, który zawiera tylko informacje, ale nie jest tablicą. Przede wszystkim mam możliwość kontroli danych, które otrzymuje. Mogę już w fazie tworzenia obiektu reprezentującego flow wstępnie przeprowadzić jego walidację (czy widok istnieje?).<br />
Zmiany w akcjach i widokach jest jak najbardziej pozytywna i rzeczywiście usprawnia działanie całości. Nie mniej <a href="http://trac.agavi.org/milestone/2.0">do wersji 2.0 </a> w Agavi na pewno zajdzie ich jeszcze sporo, miejmy nadzieję, że również w celu uporządkowania struktur, usunięcia nadmiaru klas abstrakcyjnych i zastąpienia ich interfejsami (pamiętaj, zanim napiszesz linijkę w klasie, która jest autonomiczna, a której implementacja może się zmieniać, generalizuj, twórz typ bazowy).</p>
<p>Pytaniem ciągle jest czy Agavi podąży w stronę Symfony? Jak najmniej pisania.. <a href="http://www.symfony-project.com/weblog/2007/02/19/symfony-1-0-released.html">Twórcy Symfony</a> ochrzcili wersję 1.0 swojego frameworka nazwą, czy też przydomkiem "enterprise". Ciężko mi powiedzieć czy było to uzasadnione. Temat Symfony-Agavi często pojawia się w rozmowach między <a href="http://michalmech.pl">Michałem Mechem</a> a mną. Obaj jesteśmy zgodni w dwóch kwestiach - w Symfony pisze się bardzo szybko oraz ma ono bardzo dobrą dokumentację. Nie ustępuje ona pod żadnym względem dokumentacji <a href="http://framework.zend.com">Zend Frameworka</a>.</p>
<p>Myślę, że najlepszym życzeniem dla nas wszystkich będzie to: <strong>by developerzy Agavi nadążyli z dokumentacją za implementacją</strong>.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.dywicki.pl/2007/02/24/agavi-011-rc3-flow/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Agavi, Output types</title>
		<link>http://blog.dywicki.pl/2007/02/22/agavi-output-types/</link>
		<comments>http://blog.dywicki.pl/2007/02/22/agavi-output-types/#comments</comments>
		<pubDate>Thu, 22 Feb 2007 20:41:37 +0000</pubDate>
		<dc:creator>Łukasz Dywicki</dc:creator>
				<category><![CDATA[Agavi]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.dywicki.pl/2007/02/22/agavi-output-types/</guid>
		<description><![CDATA[Jedną z nowości jaką niesie Agavi w wersji &#62; 0.10 jest mechanizm output types. Jest to bardzo proste rozwiązanie, które umożliwia uniknięcie gimnastyki z tworzeniem widoków w różnych technologiach, z którymi wiąże się różna logika. Banalny przykład. Te same dane prezentujemy w postaci HTML jak i PDF a do tego możemy je pobierać przez XmlHttpRequest. [...]]]></description>
			<content:encoded><![CDATA[<p>Jedną z nowości jaką niesie Agavi w wersji &gt; 0.10 jest mechanizm output types. Jest to bardzo proste rozwiązanie, które umożliwia uniknięcie gimnastyki z tworzeniem widoków w różnych technologiach, z którymi wiąże się różna logika. Banalny przykład. Te same dane prezentujemy w postaci <acronym title="HyperText Markup Language">HTML</acronym> jak i <acronym title="Portable Document Format">PDF</acronym> a do tego możemy je pobierać przez XmlHttpRequest. Dane są praktycznie identyczne, różny jest format wynikowy i proces jego tworzenia. Dla zwykłej strony wskazujemy szablon, dorzucamy dane i koniec, dla XmlHttp zwracamy JSONa. Stworzenie outputu w formacie <acronym title="Portable Document Format">PDF</acronym> nie będzie tak proste jak pozostałych, ponieważ konieczne będzie stworzenie układu strony, dorzucenie fontów etc. Ogólnie w żaden sposób nie da się połączyć tych formatów w jednym widoku bez sporej ilości warunków i "protez". By uniknąć zakopania się w tym wszystkim zwykle tworzy się dodatkową akcję, która w sporej części pokrywała się z pierwotną a różni się tylko widokiem i szablonami. Począwszy od Agavi 0.11 problem przestaje istnieć.</p>
<p>W pliku konfiguracyjnym <a href="http://trac.agavi.org/browser/trunk/samples/app/config/output_types.xml">output_types.xml</a> określamy <a href="http://trac.agavi.org/browser/trunk/src/config/xsd/output_types.xsd#L31">renderer</a> dla danej technologii, dodajemy obiekty przedefiniowane (parameters name="assigns") i następnie konfigurujemy mapowania adresów do plików (swoją drogą najlepsza implementacja tego mechanizmu z jaką się do tej pory spotkałem). Jest <a href="http://trac.agavi.org/browser/trunk/samples/app/config/routing.xml">odpowiedni plik</a> zawierający <a href="http://trac.agavi.org/browser/trunk/src/config/xsd/routing.xsd">definicję routingu</a>.</p>
<p>Zajmijmy się jednak w pierwszej kolejności konfiguracją output types:</p>
<div class="igBar"><span id="lxml-5"><a href="#" onclick="javascript:showPlainTxt('xml-5'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">XML:</span>
<div id="xml-5">
<div class="xml">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;</span>?xml <span style="color: #000066;">version</span>=<span style="color: #ff0000;">"1.0"</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">"UTF-8"</span>?<span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;output_type</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"html"</span><span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;renderer</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">"AgaviPhpRenderer"</span> <span style="color: #000066;">extension</span>=<span style="color: #ff0000;">"tpl.php"</span><span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;parameters<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;parameter</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"assigns"</span><span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;parameters<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;parameter</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"routing"</span><span style="font-weight: bold; color: black;">&gt;</span></span>r<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/parameter<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;parameter</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"request"</span><span style="font-weight: bold; color: black;">&gt;</span></span>req<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/parameter<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;parameter</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"controller"</span><span style="font-weight: bold; color: black;">&gt;</span></span>ctl<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/parameter<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;parameter</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"user"</span><span style="font-weight: bold; color: black;">&gt;</span></span>usr</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/parameter<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;parameter</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"translation_manager"</span><span style="font-weight: bold; color: black;">&gt;</span></span>tm<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/parameter<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/parameters<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/parameter<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;parameter</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"i18n"</span><span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;parameters<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;parameter</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"mode"</span><span style="font-weight: bold; color: black;">&gt;</span></span>subdir<span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/parameter<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/parameters<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/parameter<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/parameters<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/renderer<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;parameters<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;parameter</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"Content-Type"</span><span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; text/html; charset=UTF-8</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/parameter<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/parameters<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/output_type<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;output_type</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"json"</span><span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;renderer</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">"AgaviPhpRenderer"</span> <span style="color: #000066;">extension</span>=<span style="color: #ff0000;">"js.php"</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; ignore_<span style="color: #000066;">slots</span>=<span style="color: #ff0000;">"true"</span> ignore_<span style="color: #000066;">decorators</span>=<span style="color: #ff0000;">"true"</span><span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;parameters<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;parameter</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">"Content-Type"</span><span style="font-weight: bold; color: black;">&gt;</span></span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; &nbsp; text/javascript; charset=UTF-8</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/parameter<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/parameters<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/renderer<span style="font-weight: bold; color: black;">&gt;</span></span></span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;/output_type<span style="font-weight: bold; color: black;">&gt;</span></span></span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Jak widać trochę tej konfiguracji jest, nie mniej celowo usunąłem przekazywanie parametrów do drugiego formatu wynikowego by pokazać, że w najskromniejszej wersji definicja taka potrafi się zmieścić maksymalnie w 10 linijkach.<br />
Do wszystkich parametrów możemy odwoływać się w widoku. Specyficzne są parametry o nazwie assigns oraz i18n. Pierwszy z nich Agavi wykorzysta po to by od razu w fazie tworzenia renderera wrzucić do niego wskazane obiekty, które znajdują się w kontekście. Drugi z atrybutów jest szczególnie przydatny podczas tworzenia aplikacji z wieloma językami. Parametr i18n jest prefiksem dla nazwy pliku. W przypadku gdy przypiszemy mu wartość subdir framework będzie szukał szablonów po katalogach np. <strong>pl/IndexSuccess</strong>, <strong>en/IndexSuccess</strong>. Inne, dopuszczalne wartości to postfix oraz prefix. Nazwy szablonów to odpowiednio <strong>IndexSuccess_pl</strong> oraz <strong>pl_IndexSuccess</strong><br />
Atrybut extension określa suffix dla nazwy pliku, którego użyje Agavi przy wczytywaniu szablonu np <strong>IndexSuccess.tpl.php</strong>.<br />
Argumenty ignore_slots oraz ignore_decorators odnoszą się do strategii budowania widoku. W chwili gdy zrezygnujemy z nich wynik nie będzie dekorowany. Tzn. w odpowiedzi użytkownik zobaczy tylko treść wygenerowaną przez widok akcji.<br />
<b>Tutaj drobna uwaga. W wersji stabilnej Agavi 0.11 mechanizm ten zachowuje się nieco inaczej. Wybór plików oraz zachowanie dekoratora determinuje layout i elementy layer.</b></p>
<p>Następnie w routes.xml dla każdej ścieżki możemy określić również format wynikowy danych. Np:</p>
<div class="igBar"><span id="lxml-6"><a href="#" onclick="javascript:showPlainTxt('xml-6'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">XML:</span>
<div id="xml-6">
<div class="xml">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color: #009900;"><span style="font-weight: bold; color: black;">&lt;route</span> <span style="color: #000066;">pattern</span>=<span style="color: #ff0000;">"/ajax$"</span> output_<span style="color: #000066;">type</span>=<span style="color: #ff0000;">"json"</span> <span style="color: #000066;">stop</span>=<span style="color: #ff0000;">"false"</span> <span style="font-weight: bold; color: black;">/&gt;</span></span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>W tym momencie, wszystkie adresy kończące się na <strong>/ajax</strong> będą obsługiwane w nieco inny sposób niż pozostałe. To znaczy, że nie będzie dekorowany output. Dodatkowo zostaną użyte inne pliki szablonów do generowania treści.</p>
<p>Zdaję sobie sprawę z tego, że opisałem ten mechanizm dość chaotycznie i bardziej skupiłem się na jego konfiguracji, ale na przykładową aplikację będziecie musieli poczekać do czasu gdy skończę artykuł dla <acronym title="Pre-Hypertext Processing">PHP</acronym> Solutions (czyżby Agavi tematem numeru?) bądź do pojawienia się nowego Code-House. :)</p>]]></content:encoded>
			<wfw:commentRss>http://blog.dywicki.pl/2007/02/22/agavi-output-types/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mojavi 4. Dlaczego nie?</title>
		<link>http://blog.dywicki.pl/2006/08/30/mojavi-4-dlaczego-nie/</link>
		<comments>http://blog.dywicki.pl/2006/08/30/mojavi-4-dlaczego-nie/#comments</comments>
		<pubDate>Wed, 30 Aug 2006 21:14:57 +0000</pubDate>
		<dc:creator>Łukasz Dywicki</dc:creator>
				<category><![CDATA[Agavi]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Mojavi4]]></category>
		<category><![CDATA[Wiadomości]]></category>

		<guid isPermaLink="false">http://blog.dywicki.pl/2006/08/30/mojavi-4-dlaczego-nie/</guid>
		<description><![CDATA[Od publikacji ostatniej noty parę osób proponowało mi podjęcie prac nad Mojavi 4. Chcę wyjaśnić, dlaczego Mojavi 4 nie będę się zajmował.
1. Nie ma nikogo kto byłby w stanie pomóc mi przy projekcie. Obaj byli developerzy zakończyli swoją przygodę z PHP. Nie ma również żadnej społeczności, która jest w stanie zająć się forum, wyłapywaniem błędów [...]]]></description>
			<content:encoded><![CDATA[<p>Od publikacji ostatniej noty parę osób proponowało mi podjęcie prac nad Mojavi 4. Chcę wyjaśnić, dlaczego Mojavi 4 nie będę się zajmował.</p>
<p>1. Nie ma nikogo kto byłby w stanie pomóc mi przy projekcie. Obaj byli developerzy zakończyli swoją przygodę z <acronym title="Pre-Hypertext Processing">PHP</acronym>. Nie ma również żadnej społeczności, która jest w stanie zająć się forum, wyłapywaniem błędów - jednym słowem - to by było to samo co robiłem wcześniej przy własnym frameworku.</p>
<p>2. Są projekty, które być może w tej chwili nie dorównują Mojavi 4, lecz są na tyle dobre, że w przyszłości mogą osiągnąć próg czwórki a nawet go przekroczyć.</p>
<p>3. Podobna sytuacja miała miejsce kiedy Sean Kerr zrezygnował z rozwijania Mojavi 3. Później prace nad czwórką przejął Tyler. Gdybym teraz miał zacząć poprawiać Mojavi 4 wyszłaby piątka, której prawdopodobnie bym nie skończył. Czy ktoś by się zajął pozostawioną wcześniejszą wersją?</p>
<p>4. Nie chcę tworzyć większego projektu w <acronym title="Pre-Hypertext Processing">PHP</acronym>, mocno prawdopodobne, że po miesiącu, dwóch po prostu bym zrezygnował z pisania Mojavi pogarszając i tak już wystarczająco ciężką sytuację.<br />
Projekt, na który zwrócę teraz baczniejszą uwagę to <a href="http://agavi.org">Agavi</a>. Jest w nim sporo znajomych rzeczy z trójki. Wersja 0.11 jest dużym krokiem w stosunku do 0.10, w której były same poprawki. W trunku widać, że developerzy nie poprzestali na poprawkach i postanowili dodać funkcjonalności. Do ciekawszych należą: routes (Symfony wymięka), translates, output types (w połączeniu z routes daje świetne możliwości), view renderers.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.dywicki.pl/2006/08/30/mojavi-4-dlaczego-nie/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>View Layout i Agavi</title>
		<link>http://blog.dywicki.pl/2006/05/05/view-layout-i-agavi/</link>
		<comments>http://blog.dywicki.pl/2006/05/05/view-layout-i-agavi/#comments</comments>
		<pubDate>Fri, 05 May 2006 11:17:54 +0000</pubDate>
		<dc:creator>Łukasz Dywicki</dc:creator>
				<category><![CDATA[Agavi]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.dywicki.pl/2006/05/05/view-layout-i-agavi/</guid>
		<description><![CDATA[Zainspirowany ideą Layotów w M4 postanowiłem stworzyć małą wtyczkę do agavi, która umożliwi mi korzystanie z tego rozwiązania. Jest ona bardzo prosta i ułatwia masową zmianę szablonu głównego oraz slotów (o slotach jeszcze będę pisał).
Oto moje rozwiązanie:
PLAIN TEXT
PHP:




&#60;?php


&#160;


class ViewLayout &#123;


&#160;


static public function set&#40;$layout, View $view&#41; &#123;


$config = self::getConfig&#40;$layout&#41;;


&#160;


if&#40;isset&#40;$config&#91;'decorator'&#93;&#91;'directory'&#93;&#41;&#41; &#123;


$view-&#62;setDecoratorDirectory&#40;$config&#91;'decorator'&#93;&#91;'directory'&#93;&#41;;


$view-&#62;setDecoratorTemplate&#40;$config&#91;'decorator'&#93;&#91;'template'&#93;&#41;;


&#125;


if&#40;$config&#91;'database'&#93; == true&#41; &#123;


Propel::init&#40;PropelDatabase::getDefaultConfigPath&#40;&#41;&#41;;


&#125;


if&#40;isset&#40;$config&#91;'slots'&#93;&#41; &#38;&#38; sizeof&#40;$config&#91;'slots'&#93;&#41;&#62; 0&#41; [...]]]></description>
			<content:encoded><![CDATA[<p>Zainspirowany ideą Layotów w M4 postanowiłem stworzyć małą wtyczkę do agavi, która umożliwi mi korzystanie z tego rozwiązania. Jest ona bardzo prosta i ułatwia masową zmianę szablonu głównego oraz slotów (o slotach jeszcze będę pisał).<span id="more-64"></span></p>
<p>Oto moje rozwiązanie:</p>
<div class="igBar"><span id="lphp-12"><a href="#" onclick="javascript:showPlainTxt('php-12'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-12">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#007700; font-weight:bold;">&lt;?php</span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#007700; font-weight:bold;">class</span> ViewLayout <span style="color:#0000BB; font-style: bold;">&#123;</span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#3A6A8B;">static</span> <span style="color:#007700; font-weight:bold;">public</span> <span style="color:#007700; font-weight:bold;">function</span> set<span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#0000BB;">$layout</span>, View <span style="color:#0000BB;">$view</span><span style="color:#0000BB; font-style: bold;">&#41;</span> <span style="color:#0000BB; font-style: bold;">&#123;</span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000BB;">$config</span> = self::<span style="color:#3A6A8B;">getConfig</span><span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#0000BB;">$layout</span><span style="color:#0000BB; font-style: bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#007700;">if</span><span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#3A6A8B;">isset</span><span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#0000BB;">$config</span><span style="color:#0000BB; font-style: bold;">&#91;</span><span style="color:#DD0000;">'decorator'</span><span style="color:#0000BB; font-style: bold;">&#93;</span><span style="color:#0000BB; font-style: bold;">&#91;</span><span style="color:#DD0000;">'directory'</span><span style="color:#0000BB; font-style: bold;">&#93;</span><span style="color:#0000BB; font-style: bold;">&#41;</span><span style="color:#0000BB; font-style: bold;">&#41;</span> <span style="color:#0000BB; font-style: bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000BB;">$view</span>-&gt;<span style="color:#3A6A8B;">setDecoratorDirectory</span><span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#0000BB;">$config</span><span style="color:#0000BB; font-style: bold;">&#91;</span><span style="color:#DD0000;">'decorator'</span><span style="color:#0000BB; font-style: bold;">&#93;</span><span style="color:#0000BB; font-style: bold;">&#91;</span><span style="color:#DD0000;">'directory'</span><span style="color:#0000BB; font-style: bold;">&#93;</span><span style="color:#0000BB; font-style: bold;">&#41;</span>;</div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000BB;">$view</span>-&gt;<span style="color:#3A6A8B;">setDecoratorTemplate</span><span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#0000BB;">$config</span><span style="color:#0000BB; font-style: bold;">&#91;</span><span style="color:#DD0000;">'decorator'</span><span style="color:#0000BB; font-style: bold;">&#93;</span><span style="color:#0000BB; font-style: bold;">&#91;</span><span style="color:#DD0000;">'template'</span><span style="color:#0000BB; font-style: bold;">&#93;</span><span style="color:#0000BB; font-style: bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000BB; font-style: bold;">&#125;</span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#007700;">if</span><span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#0000BB;">$config</span><span style="color:#0000BB; font-style: bold;">&#91;</span><span style="color:#DD0000;">'database'</span><span style="color:#0000BB; font-style: bold;">&#93;</span> == <span style="color:#007700; font-weight:bold;">true</span><span style="color:#0000BB; font-style: bold;">&#41;</span> <span style="color:#0000BB; font-style: bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">Propel::<span style="color:#3A6A8B;">init</span><span style="color:#0000BB; font-style: bold;">&#40;</span>PropelDatabase::<span style="color:#3A6A8B;">getDefaultConfigPath</span><span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#0000BB; font-style: bold;">&#41;</span><span style="color:#0000BB; font-style: bold;">&#41;</span>;</div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000BB; font-style: bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#007700;">if</span><span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#3A6A8B;">isset</span><span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#0000BB;">$config</span><span style="color:#0000BB; font-style: bold;">&#91;</span><span style="color:#DD0000;">'slots'</span><span style="color:#0000BB; font-style: bold;">&#93;</span><span style="color:#0000BB; font-style: bold;">&#41;</span> &amp;&amp; <span style="color:#3A6A8B;">sizeof</span><span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#0000BB;">$config</span><span style="color:#0000BB; font-style: bold;">&#91;</span><span style="color:#DD0000;">'slots'</span><span style="color:#0000BB; font-style: bold;">&#93;</span><span style="color:#0000BB; font-style: bold;">&#41;</span>&gt; <span style="color:#000000; font-style: bold;color:#800000;">0</span><span style="color:#0000BB; font-style: bold;">&#41;</span> <span style="color:#0000BB; font-style: bold;">&#123;</span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">try <span style="color:#0000BB; font-style: bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000BB;">$view</span>-&gt;<span style="color:#3A6A8B;">setSlots</span><span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#0000BB;">$config</span><span style="color:#0000BB; font-style: bold;">&#91;</span><span style="color:#DD0000;">'slots'</span><span style="color:#0000BB; font-style: bold;">&#93;</span><span style="color:#0000BB; font-style: bold;">&#41;</span>;</div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000BB; font-style: bold;">&#125;</span> catch<span style="color:#0000BB; font-style: bold;">&#40;</span>AgaviException <span style="color:#0000BB;">$e</span><span style="color:#0000BB; font-style: bold;">&#41;</span> <span style="color:#0000BB; font-style: bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000BB;">$view</span>-&gt;<span style="color:#3A6A8B;">clearSlots</span><span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#0000BB; font-style: bold;">&#41;</span>;</div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000BB; font-style: bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000BB; font-style: bold;">&#125;</span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000BB; font-style: bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#3A6A8B;">static</span> <span style="color:#007700; font-weight:bold;">protected</span> <span style="color:#007700; font-weight:bold;">function</span> getConfig<span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#0000BB;">$layout</span><span style="color:#0000BB; font-style: bold;">&#41;</span> <span style="color:#0000BB; font-style: bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000BB;">$filename</span> = <span style="color:#3A6A8B;">realpath</span><span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#3A6A8B;">dirname</span><span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#007700; font-weight:bold;">__FILE__</span><span style="color:#0000BB; font-style: bold;">&#41;</span><span style="color:#0000BB; font-style: bold;">&#41;</span> .<span style="color:#DD0000;">'/'</span>. <span style="color:#0000BB;">$layout</span> .<span style="color:#DD0000;">'.layout.ini'</span>;</div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#007700;">if</span><span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#0000BB;">$filename</span> = ConfigCache::<span style="color:#3A6A8B;">checkConfig</span><span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#0000BB;">$filename</span><span style="color:#0000BB; font-style: bold;">&#41;</span><span style="color:#0000BB; font-style: bold;">&#41;</span> <span style="color:#0000BB; font-style: bold;">&#123;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#007700;">return</span> <span style="color:#007700;">include</span><span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#0000BB;">$filename</span><span style="color:#0000BB; font-style: bold;">&#41;</span>;</div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000BB; font-style: bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#007700;">return</span> <span style="color:#3A6A8B;">array</span><span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#0000BB; font-style: bold;">&#41;</span>;</div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000BB; font-style: bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#0000BB; font-style: bold;">&#125;</span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#007700; font-weight:bold;">?&gt;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Instalacja:<br />
Stworzyć w katalogu lib katalog layout a w nim plik ViewLayout.class.php. Jego zawartość jest wyżej.<br />
1. Dodać w autoload.ini:</p>
<div class="igBar"><span id="lcode-13"><a href="#" onclick="javascript:showPlainTxt('code-13'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-13">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">ViewLayout = <span style="color:#CC0000;">"%AG_LIB_DIR%/layout/ViewLayout.class.php"</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>2. Dodac w config_handlers.ini linijki:</p>
<div class="igBar"><span id="lcode-14"><a href="#" onclick="javascript:showPlainTxt('code-14'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-14">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#006600; font-weight:bold;">&#91;</span>*layout.<span style="">ini</span><span style="color:#006600; font-weight:bold;">&#93;</span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">class = ReturnArrayConfigHandler </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>3. Stworzyć plik konfiguracyjny (np. frontend.layout.ini) w tym samym katalogu co plik z klasą. Przykładowy plik:</p>
<div class="igBar"><span id="lcode-15"><a href="#" onclick="javascript:showPlainTxt('code-15'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-15">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">;ścieżki dla dekoratora <span style="color:#006600; font-weight:bold;">&#40;</span>opcjonalnie<span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">decorator.<span style="">template</span>&nbsp; = frontend.<span style="">tpl</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">decorator.<span style="">directory</span> = %AG_TEMPLATE_DIR%</div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">; czy inicjować sesję propela <span style="color:#006600; font-weight:bold;">&#40;</span>opcjonalnie<span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">database = true</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">; uwaga, składnia zgodna z metodą setSlots</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">; klasy View, poprawna notacja</div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">; slots..<span style="">module_name</span> =</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">; slots..<span style="">action_name</span> =</div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">slots.<span style="">slot_last_article</span>.<span style="">module_name</span> = Default</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">slots.<span style="">slot_last_article</span>.<span style="">action_name</span> = LastArticle</div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">slots.<span style="">slot_last_articles</span>.<span style="">module_name</span> = Default</div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">slots.<span style="">slot_last_articles</span>.<span style="">action_name</span> = LastArticles </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>4. Użycie w klasie widoku:</p>
<div class="igBar"><span id="lphp-16"><a href="#" onclick="javascript:showPlainTxt('php-16'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">PHP:</span>
<div id="php-16">
<div class="php">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#007700; font-weight:bold;">&lt;?php</span></div>
</li>
<li style="font-weight: normal;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">ViewLayout::<span style="color:#3A6A8B;">set</span><span style="color:#0000BB; font-style: bold;">&#40;</span><span style="color:#DD0000;">'frontend'</span>, <span style="color:#0000BB;">$this</span><span style="color:#0000BB; font-style: bold;">&#41;</span>;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#007700; font-weight:bold;">?&gt;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p>
Myślę, że mechanizm jest na tyle prosty, że można go rozszeżać do własnych potrzeb. Dla każdego layoutu powinien istnieć plik konfiguracyjny /lib/layout/.layout.ini. W następnej części postaram się opisać filtr umożliwiający request-mapping.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.dywicki.pl/2006/05/05/view-layout-i-agavi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
