<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Jaros&#322;aw Zabie&#322;&#322;o - BLOG: Tag dango</title>
    <link>http://blog.zabiello.com/articles/tag/dango</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Szablony i wzorzec MVC - cz. II</title>
      <description>&lt;p&gt;W &lt;a href="http://blog.zabiello.com/articles/2007/01/03/templates-and-mvc"&gt;pierwszej cz&#281;&#347;ci&lt;/a&gt; wyjasniono czym jest wzorzec &lt;span class="caps"&gt;MVC&lt;/span&gt;, szablony i helpery. Pora na przyjrzenie si&#281; szablonom.&lt;/p&gt;


	&lt;p&gt;Jednym z najwa&#380;niejszych kryteri&#243;w, jest podzia&#322; &lt;strong&gt;&amp;#8220;programista czy designer&amp;#8221;&lt;/strong&gt; &amp;#8211; ma on du&#380;y wp&#322;yw na to, &lt;strong&gt;dla kogo&lt;/strong&gt; szablony b&#281;d&#261; proste a dla kogo &amp;#8211; uci&#261;&#380;liwe czy z&#322;o&#380;one. Tzn. czy szablonami b&#281;d&#261; zajmowa&#263; si&#281; programi&#347;ci czy te&#380; klasyczni web designerzy nie posiadaj&#261;cy specjalnie du&#380;ej wiedzy o programowaniu? W wypadku designera, szablony pos&#322;uguj&#261;ce si&#281; pe&#322;nym j&#281;zykiem programowania mog&#261; by&#263; nie lada wyzwaniem. Przeci&#281;tny designer pos&#322;uguje si&#281; Dreamweaverem i najch&#281;tniej w og&#243;le by nie chcia&#322; programowa&#263;. A je&#347;li ju&#380;, to tylko w zakresie jaki jest mu potrzebny do pracy nad szablonem.&lt;/p&gt;


	&lt;p&gt;Je&#347;li zatem mamy zar&#243;wno zesp&#243;&#322; programist&#243;w jak i takich designer&#243;w, i o nie chcemy aby programi&#347;ci musieli &lt;strong&gt;wszystkim si&#281; zajmowa&#263;&lt;/strong&gt;, warto wybra&#263; taki rodzaj szablon&#243;w, kt&#243;ry m&#243;g&#322;by by&#263; &amp;#8220;przyswajalny&amp;#8221; dla designer&#243;w.&lt;/p&gt;


	&lt;h2&gt;Szablony zgodne z &lt;span class="caps"&gt;XML&lt;/span&gt;.&lt;/h2&gt;


	&lt;p&gt;Najbardziej skrajnym przypadkiem jest u&#380;ycie takich szablon&#243;w, kt&#243;re s&#261; &amp;#8220;przezroczyste&amp;#8221; dla edytor&#243;w wizualnie wspomagaj&#261;cych projektowanie kodu &lt;span class="caps"&gt;HTML&lt;/span&gt;, np. Dreamweaver. W tym wypadku designer przygotowuje statyczne pliki &lt;span class="caps"&gt;HTML&lt;/span&gt; za pomoc&#261; takiego edytora i oddaje go programistom aby wt&#322;oczyli w nie &#380;ycie &amp;#8211; czyli dynamik&#281; kodu wykonywalnego po stronie serwera.&lt;/p&gt;


	&lt;p&gt;Szablony tego typo s&#261; w  100% zgodne z &lt;span class="caps"&gt;XML&lt;/span&gt;. Logika skryptu jest za&#347; sprytnie ukryta w dodatkowych atrybutach tag&#243;w &lt;span class="caps"&gt;HTML&lt;/span&gt; (m&#243;wi si&#281; tu o &lt;a href="http://www.zope.org/Wikis/DevSite/Projects/ZPT/TAL"&gt;&lt;span class="caps"&gt;TAL&lt;/span&gt;&lt;/a&gt; czyli tag attribute language &amp;#8211; j&#281;zyk atrybut&#243;w znacznik&#243;w) Kod zawarty w atrybutach tag&#243;w jest ignorowany przez Dreamweavera.&lt;/p&gt;


	&lt;p&gt;Tego typu szablony, cho&#263; s&#261; wygodne dla designer&#243;w (nic nie musz&#261; dodatkowo robi&#263;) s&#261; dosy&#263; uci&#261;&#380;liwe dla programist&#243;w. S&#261; w praktyce bardziej skomplikowane ni&#380; te, kt&#243;re daj&#261; mo&#380;liwo&#347;&#263; u&#380;ycia pe&#322;nego j&#281;zyka. Problemem jest te&#380; trudno&#347;&#263; w generowaniu za pomoc&#261; takich szablon&#243;w kodu niezgodnego z &lt;span class="caps"&gt;XML&lt;/span&gt;, np. &lt;span class="caps"&gt;CSS&lt;/span&gt; (styli kaskadowych) . Zalet&#261; jednak jest to, &#380;e jakakolwiek potrzeba poprawy layoutu sprowadza si&#281; do podrzucenia plik&#243;w designerom. Dreamveaver nie jest w stanie zniszczy&#263; logiki jak&#261; pracowicie programi&#347;ci dodali do atrybut&#243;w &lt;span class="caps"&gt;HTML&lt;/span&gt;. Nie trzeba na nowo za ka&#380;dym razem jej dodawa&#263;.&lt;/p&gt;


	&lt;h4&gt;Python&lt;/h4&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://www.zope.org/Documentation/ZopeBook/ZPT.stx"&gt;&lt;span class="caps"&gt;ZPT&lt;/span&gt;&lt;/a&gt; (Zope Page Templates) &amp;#8211; szablony u&#380;ywane przez serwer aplikacji &lt;a href="http://zope.org"&gt;Zope&lt;/a&gt;. &lt;/li&gt;
		&lt;li&gt;&lt;a href="http://www.owlfish.com/software/simpleTAL/"&gt;SimpleTAL&lt;/a&gt; &amp;#8211; tak jak &lt;span class="caps"&gt;ZPT&lt;/span&gt;, ale dzia&#322;aj&#261;ce jako niezale&#380;na biblioteka, mo&#380;na je u&#380;ywa&#263; bez potrzeby instalacji Zope.&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://kid-templating.org/"&gt;Kid&lt;/a&gt; &amp;#8211; szablony wzorowane te&#380; na &lt;span class="caps"&gt;ZPT&lt;/span&gt; ale atrybuty wykorzystuj&#261; sk&#322;adni&#281; &lt;span class="caps"&gt;XSLT&lt;/span&gt;. Mo&#380;na te&#380; tworzy&#263; kolejne szablony na drodze obiektowego dziedziczenia.&lt;/li&gt;
		&lt;li&gt;&lt;a href="http://genshi.edgewall.org/"&gt;&lt;strong&gt;Genshi&lt;/strong&gt;&lt;/a&gt; &amp;#8211; najlepsze w swej klasie. Wzorowane na &lt;a href="http://genshi.edgewall.org/wiki/Documentation/xpath.html"&gt;&lt;span class="caps"&gt;XSLT&lt;/span&gt;&lt;/a&gt; (np. mo&#380;na u&#380;ywa&#263; XPath) i szablonach Kid. Genshi potrafi kod &lt;span class="caps"&gt;XML&lt;/span&gt; jak i nie-XML. Zosta&#322;y pierwotnie stworzone dla doskona&#322;ego &lt;a href="http://trac.edgewall.org/"&gt;Traca&lt;/a&gt; (kt&#243;ry aktualnie migruje z szablon&#243;w &lt;a href="http://www.clearsilver.net/"&gt;ClearSilver&lt;/a&gt; do Genshi).&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h4&gt;Ruby&lt;/h4&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://masterview.org/"&gt;MasterView&lt;/a&gt; &amp;#8211; ciekawe szablony dla Ruby i Rails&#243;w. Wykorzystuj&#261; pe&#322;n&#261; moc i produktywno&#347;&#263; Rails&#243;w w&#322;&#261;cznie z szablonami wzorcowymi (layouts), podszablonami (partials) oraz mas&#261; helper&#243;w jakimi dysponuje Rails. R&#243;wnocze&#347;nie s&#261; przezroczyste dla Dreamweavera, wi&#281;c nadaj&#261; si&#281; doskonale dla designer&#243;w operuj&#261;cych tego typu edytorem.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h4&gt;&lt;span class="caps"&gt;PHP&lt;/span&gt;&lt;/h4&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://phptal.motion-twin.com"&gt;&lt;span class="caps"&gt;PHP TAL&lt;/span&gt;&lt;/a&gt; jest pehapow&#261; implementacj&#261; pythonowych &lt;span class="caps"&gt;ZPT&lt;/span&gt;. Jak wida&#263; szablony u&#380;ywane w Zope jest &#378;r&#243;d&#322;em inspiracji dla ca&#322;ej reszty. :)&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h2&gt;Szablony uniwersalne (z uproszczonym j&#281;zykiem)&lt;/h2&gt;


	&lt;p&gt;Je&#347;li nie mamy do czynienia z grup&#261; designer&#243;w boj&#261;cych si&#281; dotyka&#263; kodu, mo&#380;na pokusi&#263; si&#281; o u&#380;ycie szablon&#243;w wykorzystuj&#261;cych uproszczony j&#281;zyk programowania.&lt;/p&gt;


	&lt;h3&gt;&lt;span class="caps"&gt;PHP&lt;/span&gt;&lt;/h3&gt;


	&lt;p&gt;Przyk&#322;adem najlepszych szablon&#243;w w tej klasie dla &lt;span class="caps"&gt;PHP&lt;/span&gt; s&#261; &lt;a href="http://smarty.templates.org"&gt;Smarty&lt;/a&gt;. Posiadaj&#261; dosy&#263; wygodn&#261; sk&#322;adni&#281; z mo&#380;e jednym wyj&#261;tkiem. Domy&#347;lne ustawienia dla wstawek kodu wykorzystuj&#261; dosy&#263; niefortunnie klamry. Sprawia to potem problem dla JavaScript. Na szcz&#281;&#347;cie mo&#380;na to przedefiniowa&#263;. Poza tym Smarty oferuj&#261; bardzo wygodne modyfikatory kt&#243;ry niczym uniksowe kaskady pipes filtruj&#261; zawarto&#347;&#263; zmiennej: {$zmienna|filtr1|filtr2}. Maj&#261; te&#380; w&#322;asny cache (cho&#263; oparty tylko na systemie plik&#243;w) Mo&#380;na te&#380; tworzy&#263; w&#322;asne komponenty(cho&#263; w ograniczonym zakresie, np. trudno je iterowa&#263; w p&#281;tli z powodu kolizji nazw &amp;#8211; &lt;span class="caps"&gt;PHP&lt;/span&gt; posiada tylko jedn&#261;, p&#322;ask&#261; przestrze&#324; nazw dla wszystkich funkcji)&lt;/p&gt;


	&lt;h3&gt;Python&lt;/h3&gt;


	&lt;p&gt;Bardzo dobrym przyk&#322;adem szablon&#243;w kt&#243;re mo&#380;na by da&#263; designerom do r&#281;ki s&#261; szablony u&#380;ywane we frameworku &lt;a href="http://djangotemplates.org"&gt;Django&lt;/a&gt;. Korzystaj&#261; one z element&#243;w Smarty i pythonowego &lt;a href="http://cheetahtemplate.org/"&gt;Cheetah&lt;/a&gt;. Posiadaj&#261; swoj&#261; sk&#322;adni&#281;, ale bardzo prost&#261; i wygodny spos&#243;b tworzenia kolejnych szablon&#243;w na bazie ju&#380; istniej&#261;cych. Tzw. w szablonach Smarty kolejne szablony s&#261; tworzone za pomoc&#261; ci&#281;cia i sklejania kawa&#322;k&#243;w kodu (pliki z szablonami mo&#380;na &amp;#8220;includowa&#263;&amp;#8221; do wi&#281;kszej ca&#322;o&#347;ci). W Django mo&#380;na to zrobi&#263; tak&#380;e na drodze obiektowego dziedziczenia. Tw&#243;rcy Django wyci&#261;gn&#281;li te&#380; lekcj&#281; ze Smart&#243;w i u&#380;ywaj&#261; dw&#243;ch klamr, zamiast jednej, co nie powoduje kolizji z kodem JavaScript.&lt;/p&gt;


base.html
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_html "&gt;&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;
    &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; xml:lang=&amp;quot;en&amp;quot; lang=&amp;quot;en&amp;quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;style.css&amp;quot; /&amp;gt;
    &amp;lt;title&amp;gt;{% block title %}szablon bazowy{% endblock %}&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
  {% block content %}tre&#347;&#263; szablonu bazowego{% endblock %}
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

example.html
&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_html "&gt;{% extends &amp;quot;base.html&amp;quot; %}
{% block title %}Szablon  example.html{% endblock %}
{% block content %}
    &amp;lt;h1&amp;gt;{{ section.title }}&amp;lt;/h1&amp;gt;
    {% for story in story_list %}
    &amp;lt;h2&amp;gt;
      &amp;lt;a href=&amp;quot;{{ story.get_absolute_url }}&amp;quot;&amp;gt;
      {{ story.headline|upper }}
      &amp;lt;/a&amp;gt;
    &amp;lt;/h2&amp;gt;
    &amp;lt;p&amp;gt;{{ story.tease|truncatewords:&amp;quot;100&amp;quot; }}&amp;lt;/p&amp;gt;
   {% endfor %}
{% endblock %}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Szablony Django doczeka&#322;y si&#281; swoich nast&#281;pc&#243;w/na&#347;ladowc&#243;w.&lt;/p&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://wsgiarea.pocoo.org/jinja/"&gt;&lt;strong&gt;Jinja&lt;/strong&gt;&lt;/a&gt; to szablony implementuj&#261;ce funkcjonalno&#347;&#263; Django, ale nie s&#261; zwi&#261;zane z samym frameworkiem. Stanowi&#261; oddzieln&#261; bibliotek&#281; kt&#243;r&#261; mo&#380;na u&#380;ywa&#263; w dowolnym kodzie Pythona. &#321;atwo je w&#322;&#261;czy&#263; np. do &lt;a href="http://pylonshq.com"&gt;Pylons&#243;w&lt;/a&gt;.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;h3&gt;Ruby&lt;/h3&gt;


	&lt;ul&gt;
	&lt;li&gt;&lt;a href="ttp://home.leetsoft.com/liquid"&gt;Liquid&lt;/a&gt; &amp;#8211; implementacja szablon&#243;w Django w j&#281;zyku Ruby. Mo&#380;na je u&#380;ywa&#263; np. we frameworku &lt;a href="http://rubyonrails.org"&gt;Rails&lt;/a&gt;. Nie posiadaj&#261; wszystkich djangowych cech, m.in. najwa&#380;niejszej &amp;#8211; obiektowo&#347;ci. Nie posiadaj&#261; te&#380; wszystkich helper&#243;w jakie s&#261; w Django. Jednak pozwalaj&#261; na u&#380;ywanie ich razem z szablonami  standardowymi &amp;#8211; &lt;a href="http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/"&gt;ERb&lt;/a&gt;.&lt;/li&gt;
	&lt;/ul&gt;


	&lt;p&gt;O kolejnej (w wypadku Pythona &amp;#8211; najliczniejszej)  grupie szablon&#243;w pozwalaj&#261;cej na pe&#322;ny dost&#281;p do j&#281;zyka b&#281;dzie w &lt;a href="http://blog.zabiello.com/articles/2007/01/14/templates-and-mvc-3"&gt;nast&#281;pnej cz&#281;&#347;ci&lt;/a&gt;. Daj&#261; one pe&#322;ny komfort programistom kln&#261;cym na ograniczenia szablon&#243;w u&#380;ywaj&#261;cych swoich w&#322;asnych j&#281;zyk&#243;w.&lt;/p&gt;</description>
      <pubDate>Sat, 06 Jan 2007 11:35:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:bf55ffa0-e3cf-4c19-8889-d97f35f14c94</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2007/01/06/templates-and-mvc-2</link>
      <category>templates</category>
      <category>zpt</category>
      <category>simpletal</category>
      <category>kid</category>
      <category>genshi</category>
      <category>smarty</category>
      <category>dango</category>
      <category>jinja</category>
      <category>liquid</category>
      <category>mvc</category>
    </item>
  </channel>
</rss>
