<?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>Mediovski Technology</title>
	<atom:link href="http://technology.mediovski.pl/feed/lang/en/" rel="self" type="application/rss+xml" />
	<link>http://technology.mediovski.pl</link>
	<description>Wzbudzanie i utrwalanie emocji związanych z technologią</description>
	<lastBuildDate>Tue, 13 Sep 2011 18:34:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Sesja, a aktywność użytkownika</title>
		<link>http://technology.mediovski.pl/2011/08/17/sesja-a-aktywnosc-uzytkownika/lang/en/</link>
		<comments>http://technology.mediovski.pl/2011/08/17/sesja-a-aktywnosc-uzytkownika/lang/en/#comments</comments>
		<pubDate>Wed, 17 Aug 2011 17:29:10 +0000</pubDate>
		<dc:creator>Krzysztof Suszyński</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://technology.mediovski.pl/?p=463&#038;lang=en</guid>
		<description><![CDATA[Aplikacje internetowe pojawiają się w dzisiejszych czasach coraz częściej. Nie są to już proste strony w edycją w stylu CRUD z kilkoma polami edycyjnymi na krzyż. Często formularze bywają złożone i wypełnienie ich użytkownikowi zajmuje dużo czasu. Czy zdarzyło Ci się, developerze, że użytkownicy Twojego systemu byli wylogowywani z niego po 15 minutach &#8220;nieaktywności&#8221;? Oczywiście [...]]]></description>
			<content:encoded><![CDATA[<p>Aplikacje internetowe pojawiają się w dzisiejszych czasach coraz częściej. Nie są to już proste strony w edycją w stylu CRUD z kilkoma polami edycyjnymi na krzyż. Często formularze bywają złożone i wypełnienie ich użytkownikowi zajmuje dużo czasu. Czy zdarzyło Ci się, developerze, że użytkownicy Twojego systemu byli wylogowywani z niego po 15 minutach &#8220;nieaktywności&#8221;? Oczywiście przez cały ten czas siedzieli przy komputerze, pisali na klawiaturze i używali myszy w Twojej aplikacji. Czy tak powinny działać aplikacje?!?</p>
<p><span id="more-463"></span><br />
Otóż oczywiście, że NIE! A rozwiązanie jest bardzo proste. Wystarczy napisać kawałek inteligentnego skryptu który zabezpieczy nas przed taką nieprofesjonalnością.</p>
<p>Skrypt taki powinien:</p>
<ol>
<li>rejestrować zdarzenie poruszenia myszy lub wciśnięcia klawisza</li>
<li>wysyłać żądanie do serwera pod dowolną stronę z obsługą sesji (powinna się ona szybko generować), na przykład w Zend Framework:

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> preserveSession<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_helper<span style="color: #339933;">-&gt;</span><span style="color: #004000;">layout</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">disableLayout</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_helper<span style="color: #339933;">-&gt;</span><span style="color: #004000;">viewRenderer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setNoRender</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

</li>
<li>odpiąć zdarzenia aby nie obciążać przeglądarki</li>
<li>ustawić timeout, który przywróci podpięcie zdarzeń</li>
</ol>
<p>Poniżej zamieściłem skrypt który wykonuje takie właśnie czynności (wymaga do działania jQuery &gt;= 1.4):</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">pl <span style="color: #339933;">=</span> window.<span style="color: #660066;">pl</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
pl.<span style="color: #660066;">mediovski</span> <span style="color: #339933;">=</span> pl.<span style="color: #660066;">mediovski</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
pl.<span style="color: #660066;">mediovski</span>.<span style="color: #660066;">technology</span> <span style="color: #339933;">=</span> pl.<span style="color: #660066;">mediovski</span>.<span style="color: #660066;">technology</span> <span style="color: #339933;">||</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
pl.<span style="color: #660066;">mediovski</span>.<span style="color: #660066;">technology</span>.<span style="color: #660066;">FormSessionHolder</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>parameters<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	parameters <span style="color: #339933;">=</span> parameters <span style="color: #339933;">||</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> defaultSettings <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
		url<span style="color: #339933;">:</span> <span style="color: #3366CC;">'/'</span><span style="color: #339933;">,</span>
		timeout<span style="color: #339933;">:</span> <span style="color: #CC0000;">60</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> settings <span style="color: #339933;">=</span> jQuery.<span style="color: #660066;">extend</span><span style="color: #009900;">&#40;</span>defaultSettings<span style="color: #339933;">,</span> parameters<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> timeout <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #003366; font-weight: bold;">var</span> actionEventHander <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>event<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		jQuery.<span style="color: #660066;">ajax</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
			url<span style="color: #339933;">:</span> settings.<span style="color: #660066;">url</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		jQuery<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">unbind</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'mousemove.session-holder'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		jQuery<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">unbind</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'keyup.session-holder'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		timeout <span style="color: #339933;">=</span> setTimeout<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			jQuery<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">bind</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'mousemove.session-holder'</span><span style="color: #339933;">,</span> actionEventHander<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			jQuery<span style="color: #009900;">&#40;</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">bind</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'keyup.session-holder'</span><span style="color: #339933;">,</span> actionEventHander<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			clearTimeout<span style="color: #009900;">&#40;</span>timeout<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> settings.<span style="color: #660066;">timeout</span> <span style="color: #339933;">*</span> <span style="color: #CC0000;">1000</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
	actionEventHander<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Aby go uruchomić należy załączyć skrypt jako bibliotekę w nagłówku HTML oraz dopisać w dowolnym miejscu poniżej, inicjując obsługę np.:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">new</span> pl.<span style="color: #660066;">mediovski</span>.<span style="color: #660066;">technology</span>.<span style="color: #660066;">FormSessionHolder</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
	timeout<span style="color: #339933;">:</span> <span style="color: #CC0000;">60</span><span style="color: #339933;">,</span>
	url<span style="color: #339933;">:</span> <span style="color: #3366CC;">'/preserve-session'</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>,gdzie:</p>
<ul>
<li>parametr <code>timeout</code> oznacza interwał co jaki czas mają następować odwołania do bramki (podane w sekundach, domyślnie: 60)</li>
<li>parametr <code>url</code> oznacza adres do bramki utrzymującej sesję (domyślnie: &#8216;/&#8217;)</li>
</ul>
<p>Oba parametry są opcjonalne. </p>
<p>Efekt użycia? W momencie gdy użytkownik używa aplikacji, co podany interwał czasu następuje odwołanie do serwera, które powinno nas zabezpieczyć przed wygaśnięciem sesji. Jeżeli użytkownik odejdzie od komputera i nie porusza myszą ani nie pisze na klawiaturze, sesja wygaśnie normalnie. Jest to bardzo prosty trik, który jednakże w znacznym stopniu zmniejsza dyskomfort używania web aplikacji. Nigdy więcej pisania artykułów w Wordzie i kopiowania ich do CMS&#8217;a! <img src='http://technology.mediovski.pl/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Biblioteka do ściągnięcia: <a href="http://technology.mediovski.pl/wp-content/uploads/2011/08/jquery.session-holder.js">jquery.session-holder.js</script></p>
<div class="fullcircle-social-links" style="display: block;"></div><div style="clear: both;"></div>]]></content:encoded>
			<wfw:commentRss>http://technology.mediovski.pl/2011/08/17/sesja-a-aktywnosc-uzytkownika/feed/lang/en/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>@font-face &#8211; dowolne czcionki na strone</title>
		<link>http://technology.mediovski.pl/2011/07/28/font-face-dowolne-czcionki-na-strone/lang/en/</link>
		<comments>http://technology.mediovski.pl/2011/07/28/font-face-dowolne-czcionki-na-strone/lang/en/#comments</comments>
		<pubDate>Thu, 28 Jul 2011 09:05:32 +0000</pubDate>
		<dc:creator>Paweł Kaczmarek</dc:creator>
				<category><![CDATA[css]]></category>
		<category><![CDATA[@font-face]]></category>
		<category><![CDATA[niestandardowe czcionki]]></category>

		<guid isPermaLink="false">http://technology.mediovski.pl/?p=447&#038;lang=pl</guid>
		<description><![CDATA[Dotychczas aby użyć niestandardowej czcionki na stronie www stosowaliśmy cufón lub  sIFR (Scalable Inman Flash Replacement) . Każdy kto używał tych metod wie że wiążą się one z pewnymi ograniczeniami, niedogodnościami. Od pewnego czasu istnieje znacznie lepszy sposób, który pozwala użyć dowolnej czcionki na stronę, która będzie się wyświetlać poprawnie we wszystkich przeglądarkach łącznie z [...]]]></description>
			<content:encoded><![CDATA[<p>Dotychczas aby użyć niestandardowej czcionki na stronie www stosowaliśmy cufón lub <span> <em>sIFR</em> (</span><span><em>Scalable Inman Flash Replacement) . </em></span></p>
<p><span><em>Każdy kto używał tych metod wie że wiążą się one z pewnymi ograniczeniami, niedogodnościami.<br />
</em></span></p>
<p><span><em>Od pewnego czasu istnieje znacznie lepszy sposób, który pozwala użyć dowolnej czcionki na stronę, która będzie się wyświetlać poprawnie we wszystkich przeglądarkach łącznie z IE6.</em></span></p>
<p><span><em><span id="more-447"></span><br />
</em></span></p>
<p>Za pomocą @font-face jesteśmy w stanie dołączyć do naszej strony dowolne czcionki.</p>
<p>Poniżej przykład prawidłowego użycia @font-face w pliku css:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #a1a100;">@font-face {</span>
<span style="color: #000000; font-weight: bold;">font-family</span><span style="color: #00AA00;">:</span> <span style="color: #ff0000;">'DroidSansRegular'</span><span style="color: #00AA00;">;</span>
src<span style="color: #00AA00;">:</span> <span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">'../fonts/droidsans-webfont.eot'</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span>
src<span style="color: #00AA00;">:</span> <span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">'../fonts/droidsans-webfont.eot?#iefix'</span><span style="color: #00AA00;">&#41;</span> format<span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">'embedded-opentype'</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">,</span>
<span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">'../fonts/droidsans-webfont.woff'</span><span style="color: #00AA00;">&#41;</span> format<span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">'woff'</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">,</span>
<span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">'../fonts/droidsans-webfont.ttf'</span><span style="color: #00AA00;">&#41;</span> format<span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">'truetype'</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">,</span>
<span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">'../fonts/droidsans-webfont.svg#DroidSansRegular'</span><span style="color: #00AA00;">&#41;</span> format<span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">'svg'</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">font-weight</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">normal</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">font-style</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">normal</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span>
&nbsp;
body<span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">font-family</span><span style="color: #00AA00;">:</span> DroidSansRegular<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Czcionki umieszczone są w folderze /fonts i przesłane na serwer razem z innymi plikami.</p>
<p>Pytanie brzmi: skąd wziąć czcionki w takich formatach?</p>
<p>Na stronie http://www.fontsquirrel.com/fontface/generator znajdziemy genialne narzędzie do generowania czcionek za pomocą którego używanie niestandardowych czcionek staje się banalnie proste <img src='http://technology.mediovski.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<div class="fullcircle-social-links" style="display: block;"></div><div style="clear: both;"></div>]]></content:encoded>
			<wfw:commentRss>http://technology.mediovski.pl/2011/07/28/font-face-dowolne-czcionki-na-strone/feed/lang/en/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Smarty 3.0 RC3 + Zend Framework 1.10.4</title>
		<link>http://technology.mediovski.pl/2010/08/08/smarty-3-0-rc3-zend-framework-1-10-4/lang/en/</link>
		<comments>http://technology.mediovski.pl/2010/08/08/smarty-3-0-rc3-zend-framework-1-10-4/lang/en/#comments</comments>
		<pubDate>Sun, 08 Aug 2010 14:40:44 +0000</pubDate>
		<dc:creator>Michał Szkodziński</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Smarty]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[smarty 3]]></category>
		<category><![CDATA[smarty3]]></category>
		<category><![CDATA[view]]></category>
		<category><![CDATA[zend]]></category>
		<category><![CDATA[zend view]]></category>

		<guid isPermaLink="false">http://technology.mediovski.pl/?p=402&#038;lang=pl</guid>
		<description><![CDATA[Opis uruchomienia Smarty 3.0 we współpracy z Zend Framework oraz przykłady użycia helperów. Przygotowany na podstawie aplikacji działającej z: Apache 2.2.11 PHP 5.3.1 MySQL 5.1.32 Zend Framework 1.10.4 Smarty 3.0 RC3 Więcej na temat Smarty 3 można przeczytać tutaj. Smarty 3.0 RC3 można pobrać z: http://www.smarty.net/download.php lub bezpośrednio z svn: http://smarty-php.googlecode.com/svn/tags/Smarty_3_RC3/distribution/libs/ Część struktury aplikacji (* [...]]]></description>
			<content:encoded><![CDATA[<p>
Opis uruchomienia <strong>Smarty 3.0</strong> we współpracy z <strong>Zend Framework</strong> oraz przykłady użycia helperów.<span id="more-402"></span></p>
<p>Przygotowany na podstawie aplikacji działającej z:</p>
<ul>
<li>Apache 2.2.11</li>
<li>PHP 5.3.1</li>
<li>MySQL 5.1.32</li>
<li>Zend Framework 1.10.4</li>
<li>Smarty 3.0 RC3</li>
</ul>
<p>Więcej na temat <strong>Smarty 3</strong> można przeczytać <a href="http://technology.mediovski.pl/2009/11/02/smarty-3/" style="color:blue">tutaj</a>.</p>
<p><strong>Smarty 3.0 RC3</strong> można pobrać z:</p>
<ul>
<li><a href="http://www.smarty.net/download.php" style="color:blue" onclick="pageTracker._trackPageview('/outgoing/www.smarty.net/download.php?referer=');">http://www.smarty.net/download.php</a></li>
<li> lub bezpośrednio z svn: <a href="http://smarty-php.googlecode.com/svn/tags/Smarty_3_RC3/distribution/libs/" style="color:blue" onclick="pageTracker._trackPageview('/outgoing/smarty-php.googlecode.com/svn/tags/Smarty_3_RC3/distribution/libs/?referer=');">http://smarty-php.googlecode.com/svn/tags/Smarty_3_RC3/distribution/libs/</a></li>
</ul>
<p>Część struktury aplikacji (<em>* oznaczono pliki, których kod źródłowy jest przedstawiony w dalszej części wpisu</em>):</p>
<p><img class="alignnone size-full wp-image-161" title="structure" src="http://technology.mediovski.pl/wp-content/uploads/2010/08/structure_21.png" alt="structure" width="195" height="457" /></p>
<p>Widok inicjalizujemy w <strong>Bootstrapie</strong> w metodzie _initView() (<em>Bootstrap.php</em>):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Bootstrap
<span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #009900;">&#40;</span><span style="color: #339933;">...</span><span style="color: #009900;">&#41;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	* Inicjalizacja widoku
	*/</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> _initView<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// Połączenie Zend View - Smarty</span>
		<span style="color: #000088;">$view</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> My_View_Smarty<span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
			<span style="color: #0000ff;">'scriptPath'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'application/'</span><span style="color: #339933;">,</span>
			<span style="color: #0000ff;">'params'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
				<span style="color: #0000ff;">'plugins_dir'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'plugins'</span><span style="color: #339933;">,</span>
				<span style="color: #0000ff;">'compile_dir'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'tmp/templates_c'</span>
			<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
			<span style="color: #0000ff;">'helperDirs'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
				<span style="color: #0000ff;">'My/View/Helper'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'My_View_Helper_'</span><span style="color: #339933;">,</span>
				<span style="color: #0000ff;">'Zend/View/Helper'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Zend_View_Helper_'</span>
			<span style="color: #009900;">&#41;</span>
		<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// View Renderer</span>
		Zend_Controller_Action_HelperBroker<span style="color: #339933;">::</span><span style="color: #004000;">getStaticHelper</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ViewRenderer'</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">setViewScriptPathSpec</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">':module/view/:controller/:action.:suffix'</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">setViewSuffix</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'tpl'</span><span style="color: #009900;">&#41;</span>
		<span style="color: #339933;">-&gt;</span><span style="color: #004000;">setView</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$view</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// Zend Layout</span>
		<span style="color: #000088;">$view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">layout</span> <span style="color: #339933;">=</span> Zend_Layout<span style="color: #339933;">::</span><span style="color: #004000;">startMvc</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
			<span style="color: #0000ff;">'inflectorTarget'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'layout/:script.:suffix'</span><span style="color: #339933;">,</span>
			<span style="color: #0000ff;">'layout'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'default'</span><span style="color: #339933;">,</span>
			<span style="color: #0000ff;">'viewSuffix'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'tpl'</span>
		<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setView</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$view</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009900;">&#40;</span><span style="color: #339933;">...</span><span style="color: #009900;">&#41;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Rozszerzamy klasę <strong>Zend_View_Abstract</strong> o obsługę <strong>Smarty</strong>. Klasa wygląda bardzo podobnie do klas używanych podczas łączenia Smarty 2 z ZF (<em>library/My/View/Smarty.php</em>).</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> My_View_Smarty <span style="color: #000000; font-weight: bold;">extends</span> Zend_View_Abstract
<span style="color: #009900;">&#123;</span>
	<span style="color: #009933; font-style: italic;">/**
	* Obiekt Smarty
	*
	* @var My_Smarty
	*/</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$_smarty</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	* Konstruktor
	*
	* @param array $config dane konfiguracyjne
	*/</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_smarty <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> My_Smarty<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_smarty<span style="color: #339933;">-&gt;</span><span style="color: #004000;">setZendView</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'params'</span><span style="color: #009900;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_smarty<span style="color: #339933;">-&gt;</span><span style="color: #000088;">$key</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$value</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setScriptPath</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'scriptPath'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// Ścieżki do helperów</span>
		<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'helperDirs'</span><span style="color: #009900;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$path</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$prefix</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addHelperPath</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$path</span><span style="color: #339933;">,</span> <span style="color: #000088;">$prefix</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Zwraca obiekt Smarty
	 *
	 * @return My_Smarty
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getEngine<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_smarty<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	* Ustawia ścieżkę do szablonów
	*
	* @param string $path ścieżka
	*/</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setScriptPath<span style="color: #009900;">&#40;</span><span style="color: #000088;">$path</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">null</span> <span style="color: #339933;">===</span> <span style="color: #000088;">$path</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_smarty<span style="color: #339933;">-&gt;</span><span style="color: #004000;">template_dir</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$path</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	* Pobiera ścieżki do szablonów
	*
	* @return array tablica ścieżek
	*/</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getScriptPaths<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getScriptPath</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	* Zwraca ściezkę do plików tpl
	*
	* @return string ścieżka
	*/</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getScriptPath<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_smarty<span style="color: #339933;">-&gt;</span><span style="color: #004000;">template_dir</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	* Ustawienie parametru
	*
	* @param string $key klucz
	* @param mixed $value wartość
	*/</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setParam<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_smarty<span style="color: #339933;">-&gt;</span><span style="color: #000088;">$key</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$value</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	* Ustawia zmienną w widoku
	*
	* @param string $key nazwa zmiennej
	* @param mixed $value wartość zmiennej
	*/</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __set<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_smarty<span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	* Pobiera zmienną z widoku
	*
	* @param string $key nazwa zmiennej
	* @return mixed wartość zmiennej
	*/</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __get<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_smarty<span style="color: #339933;">-&gt;</span><span style="color: #004000;">getTemplateVars</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	* Sprawdzenie czy zmienna jest ustawiona w widoku
	*
	* @param string $key nazwa zmiennej
	* @return boolean czy zmienna jest ustawiona
	*/</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __isset<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">null</span> <span style="color: #339933;">===</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_smarty<span style="color: #339933;">-&gt;</span><span style="color: #004000;">getTemplateVars</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	* Usunięcie zmiennej z widoku
	*
	* @param string $key nazwa zmiennej
	*/</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __unset<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_smarty<span style="color: #339933;">-&gt;</span><span style="color: #004000;">clearAssign</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	* Przypisywanie zmiennych do widoku
	*
	* @param string|array $var nazwa zmiennej lucz tablica par (klucz =&gt; wartość)
	* @param mixed $value wartość zmiennej
	*/</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> assign<span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #339933;">,</span> <span style="color: #000088;">$value</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">is_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_smarty<span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_smarty<span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$var</span><span style="color: #339933;">,</span> <span style="color: #000088;">$value</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	* Usunięcie wszystkich przypisanych do widoku zmiennych
	*/</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> clearVars<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_smarty<span style="color: #339933;">-&gt;</span><span style="color: #004000;">clearAllAssign</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	* Renderowanie szablonu
	*
	* @param string $name nazwa szablonu
	* @return string wyrenderowany szablon
	*/</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> render<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getScriptPath</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_smarty<span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetch</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	* Rozszerzenie abstrakcyjnej metody klasy nadrzędnej
	*/</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> _run<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Rozszerzamy klasę <strong>Smarty</strong> o obsługę helperów widoku <strong>Zend Framework</strong> (<em>library/My/Smarty.php</em>):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> My_Smarty <span style="color: #000000; font-weight: bold;">extends</span> Smarty
<span style="color: #009900;">&#123;</span>
	<span style="color: #009933; font-style: italic;">/**
	* Obiekt widoku
	*
	* @var Zend_View_Abstract
	*/</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$_zendView</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	* resource type used if none given
	*
	* @var string
	*/</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$default_resource_type</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'my'</span><span style="color: #339933;">;</span> 
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	* Ustawienie widoku
	*
	* @param Zend_View_Abstract $view obiekt widoku
	*/</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setZendView<span style="color: #009900;">&#40;</span>Zend_View_Abstract <span style="color: #000088;">$view</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_zendView <span style="color: #339933;">=</span> <span style="color: #000088;">$view</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	* Pobranie widoku
	*
	* @param Zend_View_Abstract obiekt widoku
	*/</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getZendView<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_zendView<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * fetches a rendered Smarty template
	 *
	 * @param string $template the resource handle of the template file or template object
	 * @param mixed $cache_id cache id to be used with this template
	 * @param mixed $compile_id compile id to be used with this template
	 * @param object $ |null $parent next higher level of Smarty variables
	 * @return string rendered template output
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> fetch<span style="color: #009900;">&#40;</span><span style="color: #000088;">$template</span><span style="color: #339933;">,</span> <span style="color: #000088;">$cache_id</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$compile_id</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$parent</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$display</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> parent<span style="color: #339933;">::</span><span style="color: #004000;">fetch</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">default_resource_type</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">':'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$template</span><span style="color: #339933;">,</span> <span style="color: #000088;">$cache_id</span><span style="color: #339933;">,</span> <span style="color: #000088;">$compile_id</span><span style="color: #339933;">,</span> <span style="color: #000088;">$parent</span><span style="color: #339933;">,</span> <span style="color: #000088;">$display</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>Plugin Smarty </strong>do obsługi nowego typu zasobów (<em>library/Smarty/plugins/resource.my.php</em>):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Smarty_Resource_My <span style="color: #000000; font-weight: bold;">extends</span> Smarty_Internal_Resource_File <span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$compiler_class</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Smarty_Compiler_My'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>Kompilator</strong> nowego typu zasobów (<em>library/Smarty/plugins/compiler.my.php</em>):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000000; font-weight: bold;">class</span> Smarty_Compiler_My <span style="color: #000000; font-weight: bold;">extends</span> Smarty_Internal_SmartyTemplateCompiler <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> callTagCompiler<span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag</span><span style="color: #339933;">,</span> <span style="color: #000088;">$args</span><span style="color: #339933;">,</span> <span style="color: #000088;">$param1</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$param2</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$param3</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$r</span> <span style="color: #339933;">=</span> parent<span style="color: #339933;">::</span><span style="color: #004000;">callTagCompiler</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tag</span><span style="color: #339933;">,</span> <span style="color: #000088;">$args</span><span style="color: #339933;">,</span> <span style="color: #000088;">$param1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$param2</span><span style="color: #339933;">,</span> <span style="color: #000088;">$param3</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #000088;">$r</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$args</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'_method'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$method</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$args</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'_method'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			<span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$args</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'_method'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$method</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'\''</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$tag</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'\''</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #b1b100;">return</span> <span style="color: #0000ff;">'&lt;?php echo call_user_func_array(array($_smarty_tpl-&gt;smarty-&gt;getZendView()
			-&gt;getHelper(\''</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$tag</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'\'), '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$method</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'), array('</span> <span style="color: #339933;">.</span> <span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">','</span><span style="color: #339933;">,</span> <span style="color: #000088;">$args</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">')); ?&gt;'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Przykłady użycia helperów ZF w szablonach, aby wywołać inną metodę niż domyślną należy jej nazwę podać jako wartość parametru _method.</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">{baseUrl}
{url urlOptions=['module' =&gt; 'Default', 'controller' =&gt; 'index', 'action' =&gt; 'index'] name='default' reset=true}
{myHelper _method='myMethod' options=['key1' =&gt; 'value1', 'key2' =&gt; 'value2'] limit=20}</pre></div></div>

<div class="fullcircle-social-links" style="display: block;"></div><div style="clear: both;"></div>]]></content:encoded>
			<wfw:commentRss>http://technology.mediovski.pl/2010/08/08/smarty-3-0-rc3-zend-framework-1-10-4/feed/lang/en/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Wamp: Xdebug, KCacheGrind and Webgrind</title>
		<link>http://technology.mediovski.pl/2010/07/14/xdebug-kcachegrind-webgrind-wampserver/lang/en/</link>
		<comments>http://technology.mediovski.pl/2010/07/14/xdebug-kcachegrind-webgrind-wampserver/lang/en/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 20:16:47 +0000</pubDate>
		<dc:creator>Michał Szkodziński</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Serwer]]></category>
		<category><![CDATA[kcachegrind]]></category>
		<category><![CDATA[wamp server]]></category>
		<category><![CDATA[webgrind]]></category>
		<category><![CDATA[xdebug]]></category>

		<guid isPermaLink="false">http://technology.mediovski.pl/?p=394&#038;lang=pl</guid>
		<description><![CDATA[Xdebug, KCacheGrind and Webgrind with WampServer View more presentations from Mediovski Technology.]]></description>
			<content:encoded><![CDATA[<div style="width:425px" id="__ss_4755493"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/mediovskitechnology/xdebug-kcachegrind-webgrindwamp" title="Xdebug, KCacheGrind and Webgrind with WampServer  " onclick="pageTracker._trackPageview('/outgoing/www.slideshare.net/mediovskitechnology/xdebug-kcachegrind-webgrindwamp?referer=');">Xdebug, KCacheGrind and Webgrind with WampServer  </a></strong><object id="__sse4755493" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=xdebugkcachegrindwebgrindwamp-100714150222-phpapp02&#038;rel=0&#038;stripped_title=xdebug-kcachegrind-webgrindwamp" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse4755493" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=xdebugkcachegrindwebgrindwamp-100714150222-phpapp02&#038;rel=0&#038;stripped_title=xdebug-kcachegrind-webgrindwamp" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/" onclick="pageTracker._trackPageview('/outgoing/www.slideshare.net/?referer=');">presentations</a> from <a href="http://www.slideshare.net/mediovskitechnology" onclick="pageTracker._trackPageview('/outgoing/www.slideshare.net/mediovskitechnology?referer=');">Mediovski Technology</a>.</div>
</div>
<div class="fullcircle-social-links" style="display: block;"></div><div style="clear: both;"></div>]]></content:encoded>
			<wfw:commentRss>http://technology.mediovski.pl/2010/07/14/xdebug-kcachegrind-webgrind-wampserver/feed/lang/en/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook Connect</title>
		<link>http://technology.mediovski.pl/2010/06/22/facebook-connect/lang/en/</link>
		<comments>http://technology.mediovski.pl/2010/06/22/facebook-connect/lang/en/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 11:35:06 +0000</pubDate>
		<dc:creator>Tomek</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[Społeczność]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[aplikacja]]></category>
		<category><![CDATA[connect]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[facebook connect]]></category>
		<category><![CDATA[fanpage]]></category>
		<category><![CDATA[logowanie]]></category>
		<category><![CDATA[openid]]></category>
		<category><![CDATA[portal]]></category>
		<category><![CDATA[połączenie]]></category>
		<category><![CDATA[przestrzeń nazw]]></category>
		<category><![CDATA[xfbml]]></category>

		<guid isPermaLink="false">http://technology.mediovski.pl/?p=342&#038;lang=pl</guid>
		<description><![CDATA[Facebook opanowuje świat! Użytkownicy portalu niemal na każdej stronie internetowej mogą spotkać się z &#8220;Facebookiem&#8221;. Wiele firm po założeniu &#8220;fanpage&#8217;a&#8221; na tym portalu umieszcza na swojej stronie informacje o liczbie fanów strony wraz z możliwością zostania fanem tej firmy. Lecz Facebook to nie tylko fanpage, ostatnimi czasy bardzo popularną funkcjonalnością staję się &#8220;Facebook Connect&#8220;. Moduł [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Facebook opanowuje świat!</strong> Użytkownicy portalu niemal na każdej stronie internetowej mogą spotkać się z &#8220;Facebookiem&#8221;.<span id="more-342"></span></p>
<p>Wiele firm po założeniu &#8220;fanpage&#8217;a&#8221; na tym portalu umieszcza na swojej stronie informacje o liczbie fanów strony wraz z możliwością zostania fanem tej firmy.</p>
<p>Lecz Facebook to nie tylko fanpage, ostatnimi czasy bardzo popularną funkcjonalnością staję się &#8220;<strong>Facebook Connect</strong>&#8220;. Moduł ten pozwala na osiągnięcie podobnych rezultatów co &#8220;OpenId&#8221;.</p>
<p>W przypadku stron wizytówek <strong>Facebook Connect</strong> raczej nie ma zastosowania, jednak w przypadku bardziej rozbudowanych &#8220;portali&#8221;, w których użytkownicy mają możliwość komentowania, oceniania itp. moduł Facebooka spisuje się idealnie.</p>
<p><strong>Facebook Connect</strong> daje możliwość &#8220;połączenia&#8221; (&#8220;wykorzystania&#8221;) konta na Facebooku na innych portalach, tj. użytkownik może komentować, oceniać, dodawać artykuły bez potrzeby logowania na specjalne konto na danej stronie lecz może zalogować się raz na Facebooku, a następnie strona, na której jest zaimplementowany Facebook Connect wykryje, że użytkownik jest już zalogowany (wcześniej użytkownik musi połączyć konto z Facebooka z aplikacją danej strony &#8211; co odbywa się pół automatycznie) i od tej pory użytkownik może publikować treści na &#8220;naszej&#8221; stronie za pomocą konta na Facebooku.</p>
<p>Aby zaimplementować <strong>Facebook Connect</strong> na naszej stronie należy wykonać kilka czynności:</p>
<ul>
<li>Pierwszym krokiem do zaimplementowania modułu jest stworzenie podstawowej aplikacji, aby to zrobić należy wejść na stronę: <a title="http://www.facebook.com/developers/createapp.php" rel="nofollow" href="http://www.facebook.com/developers/createapp.php" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.facebook.com/developers/createapp.php?referer=');">http://www.facebook.com/developers/createapp.php</a> i wpisać nazwę aplikacji.</li>
</ul>
<ul>
<li>Do podstawowego działania aplikacji nie ma konieczności zmiany domyślnych parametrów aplikacji. Ważnym elementem jest wprowadzenie w dziale &#8220;Połączenie&#8221; (&#8220;Connect&#8221;) adresu strony, z którego użytkownicy będą się łączyli z aplikacją.</li>
</ul>
<ul>
<li>Opcjonalnie można umieścić logo (99px x 22px w formacie  JPG, GIF lub PNG), które będzie pokazywanie w oknie Facebook Connect.</li>
</ul>
<ul>
<li>Kolejnym krokiem podczas integracji modułu na naszej stronie jest umieszczenie specjalnego pliku &#8220;<code>xd_receiver</code>&#8220;, który służy do komunikacji między API Facebooka a naszą stroną, w sekcji body tego pliku powinna znajdować się linijka:</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;script src=&quot;http://static.ak.connect.facebook.com/js/api_lib/v0.4/XdCommReceiver.js&quot; type=&quot;text/javascript&quot;&gt;&lt;!--mce:0--&gt;&lt;/script&gt;</pre></div></div>

<ul>
<li>Następnie należy do sekcji html na naszej stronie dodać przestrzeń nazw Facebooka:</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">xmlns:fb=&quot;http://www.facebook.com/2008/fbml&quot;</pre></div></div>

<p style="padding-left: 30px;">co pozwala na korzystanie z tagów fb (pełna lista tagów XFBML &#8211; <a href="http://wiki.developers.facebook.com/index.php/XFBML" target="_blank" onclick="pageTracker._trackPageview('/outgoing/wiki.developers.facebook.com/index.php/XFBML?referer=');">http://wiki.developers.facebook.com/index.php/XFBML</a>.)</p>
<ul>
<li>Następnie trzeba załadować plik javascript z API</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;script src=&quot;http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php/en_US&quot; type=&quot;text/javascript&quot;&gt;&lt;!--mce:1--&gt;&lt;/script&gt;</pre></div></div>

<p style="padding-left: 30px;">by w pełni korzystać z możliwości <strong>Facebook Connect</strong>.</p>
<ul>
<li>Kolejnym ważnym krokiem jest skopiowanie API_KEY naszej aplikacji tak by kod na naszej stronie komunikował się bezpośrednio z aplikacją napisaną na Facebooku.</li>
</ul>
<p>Podstawowa implementacja <strong>Facebook Connect</strong>, która sprawdza czy użytkownik jest zalogowany, a jeżeli tak to pobiera zdjęcie główne oraz Imię i Nazwisko wygląda następująco:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">	function facebook_onlogin()
	{
		var userBox = document.getElementById('userBox');
&nbsp;
		userBox.innerHTML = &quot;&lt;span&gt;&quot;
		+ &quot;&quot;
		+ &quot;Witaj, &quot;
		+ &quot; jesteś zalogowany przy pomocy konta fecebook.&quot;
		+ &quot;&lt;/span&gt;&quot;;
&nbsp;
		FB.XFBML.Host.parseDomTree();
	}
&nbsp;
	FB.init(&quot;API_KEY&quot;, &quot;xd_receiver&quot;, {&quot;ifUserConnected&quot;:facebook_onlogin} );</pre></div></div>

<p>Podczas ładowania strony jeżeli użytkownik jest zalogowany pobierane są jego dane w przeciwnym wypadku pojawia się przycisk : <img class="aligncenter size-full wp-image-382" title="Connect with Facebook" src="http://technology.mediovski.pl/wp-content/uploads/2010/06/8rc0izvz.gif" alt="Connect with Facebook" width="194" height="25" /></p>
<p>Po kliknięciu tego przycisku użytkownik jest pytany czy chce połączyć konto ze stroną:</p>
<p><img class="aligncenter size-full wp-image-384" title="facebook" src="http://technology.mediovski.pl/wp-content/uploads/2010/06/facebook.jpg" alt="facebook" width="630" height="389" /></p>
<p>Możliwości <strong>Facebook Connect</strong> tak naprawdę są dość duże, wszystko zależy od stopnia skomplikowania aplikacji napisanej na Facebooku.</p>
<div class="fullcircle-social-links" style="display: block;"></div><div style="clear: both;"></div>]]></content:encoded>
			<wfw:commentRss>http://technology.mediovski.pl/2010/06/22/facebook-connect/feed/lang/en/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook &#8211; linki</title>
		<link>http://technology.mediovski.pl/2010/06/11/facebook-linki/lang/en/</link>
		<comments>http://technology.mediovski.pl/2010/06/11/facebook-linki/lang/en/#comments</comments>
		<pubDate>Fri, 11 Jun 2010 22:20:50 +0000</pubDate>
		<dc:creator>Michał Szkodziński</dc:creator>
				<category><![CDATA[Bez kategorii]]></category>
		<category><![CDATA[adres]]></category>
		<category><![CDATA[błąd]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[link]]></category>
		<category><![CDATA[tinyurl]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://technology.mediovski.pl/?p=293&#038;lang=pl</guid>
		<description><![CDATA[Podczas dodawania wpisu na wall&#8217;u Facebook wykrywa zawarte w nim adresy url i pobiera opis oraz miniaturkę stron, do których prowadzą. Jednak wykrywanie adresów nie zawsze działa poprawnie&#8230; Fraza &#8216;www.&#8216; jeżeli nie jest zawarta na początku adresu url powoduje błąd w jego parsowaniu &#8211; sugerowany jest adres od pierwszego wystąpienia tej frazy, bez względu na [...]]]></description>
			<content:encoded><![CDATA[<p>Podczas dodawania wpisu na wall&#8217;u <a title="Facebook" href="http://www.facebook.com" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.facebook.com?referer=');"><strong>Facebook</strong></a> wykrywa zawarte w nim adresy url i pobiera opis oraz miniaturkę stron, do których prowadzą. Jednak wykrywanie adresów nie zawsze działa poprawnie&#8230;<span id="more-293"></span></p>
<div class="wp-caption aligncenter" style="width: 535px"><img title="Facebook - linki" src="http://technology.mediovski.pl/wp-content/uploads/2010/06/fb1.png" alt="Facebook - linki" width="525" height="181" /><p class="wp-caption-text">Przykład poprawnego rozpoznania adresu.</p></div>
<p style="text-align: left">Fraza &#8216;<em>www.</em>&#8216; jeżeli nie jest zawarta na początku adresu url powoduje błąd w jego parsowaniu &#8211; sugerowany jest adres od pierwszego wystąpienia tej frazy, bez względu na poprzedzenie całego adresu prefixem z nazwą protokołu &#8216;<em>http://</em>&#8216;.</p>
<p><strong>Przykłady błędnie rozpoznawanych adresów:</strong></p>
<div class="wp-caption aligncenter" style="width: 535px"><img title="Facebook - linki" src="http://technology.mediovski.pl/wp-content/uploads/2010/06/fb2.png" alt="fb2" width="525" height="169" /><p class="wp-caption-text">Przykład błędnego rozpoznania adresu.</p></div>
<p style="text-align: center;"><strong> </strong></p>
<ul>
<li>http://example.com/www.example.com/example.html<br />
-&gt; http://www.example.com/example.html</li>
<li>http://example.com/www.example/www.example2/example.html<br />
-&gt; http://www.example/www.example2/example.html</li>
<li>http://example.com/exaple.html?example=www.example.com/example2.html<br />
-&gt; http://www.example.com/example2.html</li>
<li>http://example.com/exaple.html?example=http://www.example.com/example3.html<br />
-&gt; http://www.example.com/example3.html</li>
</ul>
<p><strong>Adresy rozpoznane poprawnie:</strong></p>
<ul>
<li>http://example.com/example.com/example.html</li>
<li>http://www.example.com/www.example.com/example.html</li>
<li>http://www.example.com/exaple.html?example=www.example.com/example.html</li>
<li>http://example.com/exaple.html?example=http://example.com/example.html</li>
<li>http://www.example.com/exaple.html?example=http://www.example.com/example.html</li>
</ul>
<p><strong>Rozwiązanie?</strong></p>
<p>Jeżeli nie jest możliwe poprzedzenie całego adresu frazą &#8216;<em>www.</em>&#8216; można skorzystać z serwisów typu <a href="http://tinyurl.com/" target="_blank" onclick="pageTracker._trackPageview('/outgoing/tinyurl.com/?referer=');"><em><span style="text-decoration: underline;">TinyURL</span></em></a>.</p>
<div class="fullcircle-social-links" style="display: block;"></div><div style="clear: both;"></div>]]></content:encoded>
			<wfw:commentRss>http://technology.mediovski.pl/2010/06/11/facebook-linki/feed/lang/en/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IVONA TTS SaaS</title>
		<link>http://technology.mediovski.pl/2010/03/15/ivona-tts-saas/lang/en/</link>
		<comments>http://technology.mediovski.pl/2010/03/15/ivona-tts-saas/lang/en/#comments</comments>
		<pubDate>Mon, 15 Mar 2010 21:29:17 +0000</pubDate>
		<dc:creator>Michał Szkodziński</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Smarty]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[generator]]></category>
		<category><![CDATA[ivona]]></category>
		<category><![CDATA[mowa]]></category>
		<category><![CDATA[php 5.3]]></category>
		<category><![CDATA[saas]]></category>
		<category><![CDATA[tts]]></category>

		<guid isPermaLink="false">http://technology.mediovski.pl/?p=264&#038;lang=pl</guid>
		<description><![CDATA[IVONA TTS SaaS to usługa umożliwiająca automatyczne generowanie mowy. Poniżej krótki przykład demonstrujący podstawowe możliwości generatora . Przydatne adresy: dokumentacja API, opis usługi. Aplikacja zbudowana w modelu MVC umożliwia wprowadzenie tekstu oraz wybranie głosu, w którym ma zostać odczytany. Treść tekstu, wybrany głos oraz parametru dźwięku są wysyłane do Ivony z użyciem protokołu SOAP. Jako [...]]]></description>
			<content:encoded><![CDATA[<p><strong>IVONA TTS SaaS</strong> to usługa umożliwiająca automatyczne generowanie mowy. Poniżej krótki przykład demonstrujący podstawowe możliwości generatora .<br />
<span id="more-264"></span><br />
Przydatne adresy:</p>
<ul>
<li><a href="http://www.ivona.com/ivona_tts_saas_api.html" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.ivona.com/ivona_tts_saas_api.html?referer=');">dokumentacja API</a>,</li>
<li><a href="http://www.ivona.com/saas.php" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.ivona.com/saas.php?referer=');">opis usługi</a>.</li>
</ul>
<p>Aplikacja zbudowana w modelu MVC umożliwia wprowadzenie tekstu oraz wybranie głosu, w którym ma zostać odczytany.<br />
Treść tekstu, wybrany głos oraz parametru dźwięku są wysyłane do Ivony z użyciem protokołu SOAP. Jako rezultat funkcji tworzącej plik z odczytanym tekstem otrzymujemy kod embed flashowego komponentu odtwarzającego odczytany tekst oraz odnośnik do pliku mp3 z tym nagraniem:</p>
<p><img class="aligncenter size-full wp-image-282" title="ivona" src="http://technology.mediovski.pl/wp-content/uploads/2010/03/ivona.jpg" alt="ivona" width="385" height="56" /></p>
<p>Korzystanie z API wymaga założenia konta na stronie Ivony (<a href="https://secure.ivona.com/account/register.php" target="_blank" onclick="pageTracker._trackPageview('/outgoing/secure.ivona.com/account/register.php?referer=');">formularz rejestracji</a>), dostępne są dwa rodzaje kont &#8211; płatne oraz darmowa wersja testowa (<a href="http://www.ivona.com/saas.php" target="_blank" onclick="pageTracker._trackPageview('/outgoing/www.ivona.com/saas.php?referer=');">szczegóły</a>).</p>
<p>W testowej aplikacji wykorzystano Zend Framework 1.10.1, PHP 5.3 oraz Smarty 3 beta 8.<br />
Wywołanie dowolnej metody z API wymaga autoryzacji. W tym celu należy pobrać token przekazywany następnie jako parametr wywołania metody.<br />
W klasie modelu następuje automatyczne pobranie tokenu (wraz ze sprawdzeniem wyniku pobierania) oraz po wywołaniu metody SOAP sprawdzany jest jej rezultat. W przypadku wystąpienia błędu pobierany jest jego opis.</p>
<p><strong>Klasa kontrolera:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Ivona_IndexController <span style="color: #000000; font-weight: bold;">extends</span> Zend_Controller_Action
<span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> indexAction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">formText</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$formText</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_getParam<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'text'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">formVoice</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$formVoice</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_getParam<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'voice'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">errorMsg</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// Utworzenie obiektu Ivony</span>
		<span style="color: #000088;">$ivona</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Ivona<span style="color: #009900;">&#40;</span>IVONA_LOGIN<span style="color: #339933;">,</span> IVONA_PASSWORD<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// Jeżeli przesłano dane z formularza tworzymy plik z dźwiękiem</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$formText</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">''</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$formVoice</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$ivona</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">createSpeechFile</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$formText</span><span style="color: #339933;">,</span> <span style="color: #000088;">$formVoice</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">errorMsg</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$ivona</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getErrorMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">embedCode</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'embedCode'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">charactersPrice</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'charactersPrice'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">soundUrl</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$result</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'soundUrl'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">embedCode</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">charactersPrice</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">soundUrl</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// Pobieramy listę dostępnych głosów</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$ivona</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getListVoices</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">errorMsg</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$ivona</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getErrorMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">return</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">view</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">voices</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$result</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>Klasa modelu:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> Ivona
<span style="color: #009900;">&#123;</span>
	<span style="color: #009933; font-style: italic;">/**
	 * Adres pliku wsdl
	 *
	 * @var string
	 */</span>
	static <span style="color: #000088;">$wsdl</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'http://www.ivona.com/saasapiwsdl.php'</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Opcje wsdl
	 *
	 * @var array
	 */</span>
	static <span style="color: #000088;">$wsdlOptions</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
			<span style="color: #0000ff;">'exceptions'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Kodek dźwięku
	 *
	 * @var string
	 */</span>
	static <span style="color: #000088;">$speechCodecId</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'mp3/22050'</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Typ uploadowanego tekstu
	 *
	 * @var string
	 */</span>
	static <span style="color: #000088;">$speechContentType</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'text/plain'</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Klient Soap
	 *
	 * @var SoapClient|null
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$_soapClient</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Adres email
	 *
	 * @var string|null
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$_mail</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Hasło
	 *
	 * @var string|null
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$_password</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Treść błędu
	 *
	 * @var string
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000088;">$_errorMsg</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Konstruktor
	 *
	 * @param string $email email
	 * @param string $password hasło
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$email</span><span style="color: #339933;">,</span> <span style="color: #000088;">$password</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_soapClient <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SoapClient<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$wsdl</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$wsdlOptions</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_email <span style="color: #339933;">=</span> <span style="color: #000088;">$email</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_password <span style="color: #339933;">=</span> <span style="color: #000088;">$password</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Utworzenie pliku z mową
	 *
	 * @param string $text tekst do odczytania
	 * @param string $voice głos, w którym ma zostać odczytany tekst
	 * @return mixed wynik funkcji
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> createSpeechFile<span style="color: #009900;">&#40;</span><span style="color: #000088;">$text</span><span style="color: #339933;">,</span> <span style="color: #000088;">$voice</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$input</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
			<span style="color: #0000ff;">'text'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$text</span><span style="color: #339933;">,</span>
			<span style="color: #0000ff;">'contentType'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$speechContentType</span><span style="color: #339933;">,</span>
			<span style="color: #0000ff;">'voiceId'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$voice</span><span style="color: #339933;">,</span>
			<span style="color: #0000ff;">'codecId'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$speechCodecId</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_soapCall<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'createSpeechFile'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$input</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Pobranie listy dostępnych głosów
	 *
	 * @return mixed wynik funkcji
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getListVoices<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_soapCall<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'listVoices'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Pobranie tokena
	 *
	 * @return array|bool token lub false w przypadku błędu
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> _getToken<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$token</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_checkResult<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_soapClient<span style="color: #339933;">-&gt;</span>__soapCall<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'getToken'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'email'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_email<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
			<span style="color: #0000ff;">'token'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$token</span><span style="color: #339933;">,</span>
			<span style="color: #0000ff;">'md5'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_password<span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$token</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
		<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Sprawdzenie poprawności wyniku wywołania SOAP
	 *
	 * @param mixed $result wynik wywołania
	 * @return mixed
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> _checkResult<span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">is_soap_fault</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_errorMsg <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;SOAP Fault:<span style="color: #000099; font-weight: bold;">\n</span> faultcode:[<span style="color: #006699; font-weight: bold;">{$result-&gt;faultcode}</span>]<span style="color: #000099; font-weight: bold;">\n</span> faultstring:[<span style="color: #006699; font-weight: bold;">{$result-&gt;faultstring}</span>]<span style="color: #000099; font-weight: bold;">\n</span>
					faultactor:[<span style="color: #006699; font-weight: bold;">{$result-&gt;faultactor}</span>]<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$result</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Wywołanie SOAP
	 *
	 * @param string $name nazwa funkcji
	 * @param array $input parametry funkcji
	 * @return mixed wynik funkcji
	 */</span>
	<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> _soapCall<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #339933;">,</span> <span style="color: #000088;">$input</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$token</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_getToken<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_checkResult<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_soapClient<span style="color: #339933;">-&gt;</span>__soapCall<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #339933;">,</span> <span style="color: #990000;">array_merge</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$token</span><span style="color: #339933;">,</span> <span style="color: #000088;">$input</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #009933; font-style: italic;">/**
	 * Pobranie komunikatu o błędach
	 *
	 * @return string
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getErrorMsg<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_errorMsg<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><strong>Szablon widoku (Smarty 3):</strong></p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">{if $errorMsg != ''}
&lt;h3&gt;Wystapił błąd&lt;/h3&gt;
{$errorMsg|nl2br}
{else}
	{$embedCode}
	{if $soundUrl!=''}&lt;a href=&quot;{$soundUrl}&quot;&gt;pobierz plik&lt;/a&gt;{/if}
&lt;hr /&gt;
&lt;form method=&quot;post&quot;&gt;
		&lt;label for=&quot;text&quot;&gt;Tekst:&lt;/label&gt;
		&lt;textarea id=&quot;text&quot; style=&quot;width: 200px; height: 100px;&quot; name=&quot;text&quot;&gt;{$formText}&lt;/textarea&gt;
&nbsp;
		&lt;fieldset&gt;
		&lt;legend&gt;Głos&lt;/legend&gt;
		{foreach $voices as $voice}
&lt;input id=&quot;{$voice-&gt;voiceId}&quot; name=&quot;voice&quot; type=&quot;radio&quot; value=&quot;{$voice-&gt;voiceId}&quot; /&gt;voiceId} checked=&quot;checked&quot;{/if}/&gt;
		&lt;label for=&quot;{$voice-&gt;voiceId}&quot;&gt;{$voice-&gt;voiceName} ({$voice-&gt;langId})&lt;/label&gt;
&nbsp;
		{/foreach}
		&lt;/fieldset&gt;
&lt;input name=&quot;submit&quot; type=&quot;submit&quot; value=&quot;Test&quot; /&gt;
	&lt;/form&gt;
&nbsp;
{/if}</pre></div></div>

<div class="fullcircle-social-links" style="display: block;"></div><div style="clear: both;"></div>]]></content:encoded>
			<wfw:commentRss>http://technology.mediovski.pl/2010/03/15/ivona-tts-saas/feed/lang/en/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PureMVC w AS3</title>
		<link>http://technology.mediovski.pl/2010/02/16/puremvc-w-as3/lang/en/</link>
		<comments>http://technology.mediovski.pl/2010/02/16/puremvc-w-as3/lang/en/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 09:17:15 +0000</pubDate>
		<dc:creator>Tomek</dc:creator>
				<category><![CDATA[Bez kategorii]]></category>

		<guid isPermaLink="false">http://technology.mediovski.pl/?p=261&#038;lang=pl</guid>
		<description><![CDATA[Pure MVC &#8211; Mediovski View more presentations from toomeczek.]]></description>
			<content:encoded><![CDATA[<div id="__ss_3192730" style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="Pure MVC - Mediovski" href="http://www.slideshare.net/toomeczek/pure-mvc-mediovski-3192730" onclick="pageTracker._trackPageview('/outgoing/www.slideshare.net/toomeczek/pure-mvc-mediovski-3192730?referer=');">Pure MVC &#8211; Mediovski</a><object style="margin:0px" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=puremvc-100216031519-phpapp01&amp;stripped_title=pure-mvc-mediovski-3192730" /><param name="allowfullscreen" value="true" /><embed style="margin:0px" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=puremvc-100216031519-phpapp01&amp;stripped_title=pure-mvc-mediovski-3192730" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/" onclick="pageTracker._trackPageview('/outgoing/www.slideshare.net/?referer=');">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/toomeczek" onclick="pageTracker._trackPageview('/outgoing/www.slideshare.net/toomeczek?referer=');">toomeczek</a>.</div>
</div>
<div class="fullcircle-social-links" style="display: block;"></div><div style="clear: both;"></div>]]></content:encoded>
			<wfw:commentRss>http://technology.mediovski.pl/2010/02/16/puremvc-w-as3/feed/lang/en/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Chat &#8211; research</title>
		<link>http://technology.mediovski.pl/2010/01/18/chat-research/lang/en/</link>
		<comments>http://technology.mediovski.pl/2010/01/18/chat-research/lang/en/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 11:48:11 +0000</pubDate>
		<dc:creator>Łukasz Zmywaczyk</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Serwer]]></category>
		<category><![CDATA[chat]]></category>
		<category><![CDATA[fms]]></category>
		<category><![CDATA[jabber]]></category>
		<category><![CDATA[rtmp]]></category>
		<category><![CDATA[xmpp]]></category>

		<guid isPermaLink="false">http://technology.mediovski.pl/?p=253&#038;lang=pl</guid>
		<description><![CDATA[1       Przegląd technologii Extensible Messaging and Presence Protocol (XMPP) (dawniej Jabber) &#8211; otwarty, oparty na XML protokół komunikacji oraz powiadamiania o obecności w czasie rzeczywistym. Real Time Messaging Protocol (RTMP) to zastrzeżony protokół stworzony przez Adobe Systems dla streamingu audio, wideo i danych, pomiędzy playerem Flash a serwerem. 1.1     Backend 1.1.1     Jabberd2 Jest to druga [...]]]></description>
			<content:encoded><![CDATA[<p><strong><span style="color: #000000;">1       Przegląd technologii</span></strong></p>
<p><span style="color: #000000;"><strong>Extensible Messaging and Presence Protocol</strong> (<strong>XMPP</strong>) (dawniej <strong>Jabber</strong>) &#8211; otwarty, oparty na XML protokół komunikacji oraz powiadamiania o obecności w czasie rzeczywistym.</span></p>
<p><span style="color: #000000;"><strong>Real Time Messaging Protocol (RTMP)</strong> to zastrzeżony protokół stworzony przez Adobe Systems dla streamingu audio, wideo i danych, pomiędzy playerem Flash a serwerem.</span></p>
<p><span style="color: #000000;"><span id="more-253"></span><br />
</span></p>
<p><strong><span style="color: #000000;">1.1     Backend</span></strong></p>
<p><strong><span style="color: #000000;">1.1.1     Jabberd2</span></strong></p>
<p><span style="color: #000000;">Jest to druga wersja Jabberd’a. Usługa ta pozwala na wydajną komunikację danych (tekstowych) poprzez protokół XMPP. Server napisany jest w czystym C. Potwierdzone wycieki pamięci. Duże opóźnienia przy dużej ilości klientów online (setkach użytkowników).</span></p>
<p><strong><span style="color: #000000;">1.1.2     EJabberd2</span></strong></p>
<p><span style="color: #000000;">Implementacja Jabber’a oparta na technologii serwerowej Erlang. Erlang jest językiem o bardzo dużej skalowalności i bardzo wysokim stopniu zoptymalizowania. Facebook wybrał Erlang na obsługę swojego chata. EJabberd2 zdobywa ogromną popularność, o czym dodatkowo świadczy fakt, że największy serwis (jabber.org) do obsługi komunikacji wybrał EJabberd2. Mankamentem tej technologii jest wysokie zużycie pamięci w porównaniu do Jabberd2. Minimalne zużycie procesora.</span></p>
<p><strong><span style="color: #000000;">1.1.3     FMS</span></strong></p>
<p><span style="color: #000000;">Komercyjna technologia służąca do komunikacji poprzez protokół RTMP. Pozwala na wymianę danych w formie binarnej, zarówno tekstu jak i streamu audio/video.  Wysoce wydajne rozwiązanie o prostym modelu skalowania.</span></p>
<p><strong><span style="color: #000000;">1.2     Frontend (klient)</span></strong></p>
<p><strong><span style="color: #000000;">1.2.1     JavaScript / HTML</span></strong></p>
<p><span style="color: #000000;">Istnieją proste aplikacje umożliwiające czatowanie w technologii JS i HTML. Żadnego z nich nie udało mi się uruchomić z defaultowymi instalacjami Jabberd2 oraz EJabberd2. Przy wykorzystaniu dostępnych bibliotek JS możliwe jest napisanie własnej aplikacji do obsługi chatu.</span></p>
<p><strong><span style="color: #000000;">1.2.2     Flash</span></strong></p>
<p><span style="color: #000000;">Komunikacja Flash’a z Jabberd2 i EJabberd2 nie jest możliwa bez rekompilacji tych usług uwzględniając specjalne łatki do kodu. Na domyślnych instalacjach Jabberd2 i EJabberd2 nie udało mi się zestawić połączenia między Flashem, a serwerem wspierającym XMPP.</span></p>
<p><strong><span style="color: #000000;">1.2.3     Aplikacja desktopowa</span></strong></p>
<p><strong><span style="color: #000000;">1.2.3.1  Psi</span></strong></p>
<p><span style="color: #000000;">Zainstalowałem komunikator PSI. Współpracował on bez problemowo z domyślną konfiguracją EJabberd2. Przetestowałem rejestrację nowych użytkowników, rozmowy pomiędzy dwoma użytkownikami , konferencje (pokoje z wieloma uczestnikami). Możliwe jest połączenie modułu chat z desktopową aplikacją (choćby PSI) i chatem wbudowanym w aplikację internetową – w aspekcie prowadzenia rozmowy z aplikacji online na WWW i aplikacji desktopowej.</span></p>
<p><strong><span style="color: #000000;">2       Wtyczki</span></strong></p>
<p><span style="color: #000000;">Do każdej opisywanej technologii możemy dopisywać własne rozwiązania (skrypty, wtyczki) rozszerzające standardową funkcjonalność – na przykład zapis historii rozmowy po stronie serwera.</span></p>
<p><strong><span style="color: #000000;">4       Wydajność</span></strong></p>
<p><span style="color: #000000;">Na przeprowadzenie realnych i wiarygodnych testów wydajnościowych potrzebujemy przeznaczyć min. 24h. Ze źródeł dostępnych na różnych blogach, wydaję się iż każda technologia zapewnia nam obsługę wolumina użytkowników na poziomie setek userów online.<br />
</span></p>
<div class="fullcircle-social-links" style="display: block;"></div><div style="clear: both;"></div>]]></content:encoded>
			<wfw:commentRss>http://technology.mediovski.pl/2010/01/18/chat-research/feed/lang/en/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Zarządzanie projektami IT</title>
		<link>http://technology.mediovski.pl/2010/01/11/zarzadzanie-projektami-it/lang/en/</link>
		<comments>http://technology.mediovski.pl/2010/01/11/zarzadzanie-projektami-it/lang/en/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 11:45:33 +0000</pubDate>
		<dc:creator>Łukasz Zmywaczyk</dc:creator>
				<category><![CDATA[Zarządzanie]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[pm]]></category>

		<guid isPermaLink="false">http://technology.mediovski.pl/?p=249&#038;lang=pl</guid>
		<description><![CDATA[Zarządzanie projektami &#8211; Mediovski View more presentations from zmywak.]]></description>
			<content:encoded><![CDATA[<div style="width:425px;text-align:left" id="__ss_2883047"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/zmywak/zarzdzanie-projektami-mediovski" title="Zarządzanie projektami - Mediovski" onclick="pageTracker._trackPageview('/outgoing/www.slideshare.net/zmywak/zarzdzanie-projektami-mediovski?referer=');">Zarządzanie projektami &#8211; Mediovski</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=zarzdzanieprojektem3nablog-100111033858-phpapp01&#038;stripped_title=zarzdzanie-projektami-mediovski" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=zarzdzanieprojektem3nablog-100111033858-phpapp01&#038;stripped_title=zarzdzanie-projektami-mediovski" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/" onclick="pageTracker._trackPageview('/outgoing/www.slideshare.net/?referer=');">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/zmywak" onclick="pageTracker._trackPageview('/outgoing/www.slideshare.net/zmywak?referer=');">zmywak</a>.</div>
</div>
<div class="fullcircle-social-links" style="display: block;"></div><div style="clear: both;"></div>]]></content:encoded>
			<wfw:commentRss>http://technology.mediovski.pl/2010/01/11/zarzadzanie-projektami-it/feed/lang/en/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

