Pierwszy z cyklu już bardziej konkretnych przemyśleń i wizji dotyczących poszczególnych komponentów “idealnego frameworka”. Tym razem chciałbym omówić moją wizję routingu gdyż jakby od niego wszystko się zaczyna.

Routing w praktyce

Routing – to dzięki temu rozwiązaniu gdy użytkownik wywołuje konkretne żądanie (adres i typ) router przekazuje polecenie do odpowiedniej części systemu. To on rozpoznaje i wykonuje pracę listonosza – dostaje konkretny adres i przekazuje tam dany list. We wczesnych rozwiązaniach routing istniał w bardzo uproszczonej formie. Requesty w postaci:

?action=kontakt

oznaczał tylko tyle, że jest gdzieś wielki “switch” albo zestaw “else if” w których w zależności od wartości parametru “action” wykonywany był konkretny blok kodu. Oczywiście później zostało to usprawnione o bardziej zamknięte funkcje, dodano inne parametry akcji. W zasadzie można by nazwać takie rozwiązanie bardzo prostym routingiem.

We współczesnych rozwiązaniach możemy spotkać routing w bardziej zaawansowanej formie, gdyż wiele frameworków stara się implementować wzorzec MVC – chociaż osobiście nie znam żadnego, który by w pełni ten wzorzec implementował. MVC narzuca istnienie komponentów takich jak Model, Widok i Kontroler. Za kontroler przyjęta została klasa PHP która posiada różnorakie metody (akcje). W związku z tym aby nieco ułatwić dostęp do wykonywania poszczególnych akcji utworzono podstawowy wzór:

/controller/action

gdzie controller jest nazwą klasy kontrolera a action nazwą metody, która się w tej klasie ma uruchomić. Rozwiązanie proste i przyjemne. Podobne rozwiązanie funkcjonuje np w Zend Framework albo w Ruby on Rails. To rozwiązanie jest dobre do momentu gdy chcemy jednak zrobić coś bardziej skomplikowanego, np gdy:

  • Specjalista SEO stwierdził, że adres ma jednak wyglądać w postaci /nazwa_uzytkownika albo /kontroler,akcja.html
  • Trzeba podzielić funkcjonalności na bardziej logiczne części (np moduły)
  • Konkretne adresy maja funkcjonować w ramach konkretnej domeny (subdomeny) w wielomodułowym lub wieloaplikacyjnym systemie

Jak sobie poradził z tym np Zend Framework? Ano jak to ZF, czyli “Zbuduj sobie sam”. Efekt jest taki, że robiąc bardzo prosty adres, potrzebuję kilku linijek (przykład dla pliku INI)

routes.forum_topic_add.route = "nowy-temat"
routes.forum_topic_add.type = "Zend_Controller_Router_Route"
routes.forum_topic_add.defaults.controller = topic
routes.forum_topic_add.defaults.action = new

Whaaaat? Chciałem tylko podać adres i wskazać go na konkretną akcję do wykonania. O co tu chodzi? Poza tym to jest przecież jeszcze prosty adres. Nie ma tu żadnych wyrażeń regularnych. Gdybym chciał tak zrobić musiałbym dostawić jeszcze kilka dodatkowych linijek na każdy parametr. Dodatkowo, żeby nie było za prosto musiałbym zmieć router Zend_Controller_Router_Route na Zend_Controller_Router_Route_Regex – bo tamten już wyrażeń nie rozumie. Jeszcze, żeby było ciekawie poszczególne adresy można łączyć w łańcuchy a te łańcuchy w kolejne łańcuchy już z routerami i innym typie – np Static (tak jest jeszcze jeden typ). Tylko po co? Czy naprawdę programista musi mieć aż tak dokładną kontrolę nad tym?

Wydaje mi się, że programista powinien po prostu pomyśleć sobie adres i wskazać którą metodę/funkcję ma on uruchomić. Wyobrażam to sobie tak:

nowy-temat = topic.new

I co tu potrzeba więcej? Adres taki i taki, ma kierować na taką i taką funkcję. Po co mi takie dokładne pisanie gdzie jaki kontroler a jaka akcja a jaki to typ routingu. Tym powinien już się przejmować framework a nie programista.

No dobra dobra, ale przecież to jest taki prosty przykład. A co z parametrami? W zendzie można użyć kontrolera Route albo Static. Np tak:

routes.archive.route = "archive/:year/*"
routes.archive.defaults.controller = archive
routes.archive.defaults.action = show
routes.archive.defaults.year = 2000
routes.archive.reqs.year = "\d+"

Powyższe rozwiązanie mówi tyle, że: jest wzór archive/:year. Ma ono odpalić kontroler archive i metodę show. A parametr :year ma być liczbą a gdy a domyślnie ma przyjąć wartość 2000. W celach optymalizacji używa domyślnego routera, który uznaje za parametry wyrażenia po znaku “:” i separuje je po slashu. Tylko, że jest dodatkowa walidacja na to aby parametr year był liczbą. Moim zdaniem zupełnie niepotrzebna komplikacja. Przykład poniżej jest nieco inne podejście:

routes.archive.type = "Zend_Controller_Router_Route_Regex"
routes.archive.route = "archive/(\d+)"
routes.archive.defaults.controller = "archive"
routes.archive.defaults.action = "show"
routes.archive.map.1 = "year"

Wzór routingu już jest zapisany bezpośrednio w adresie ale z kolei teraz trzeba w osobnym miejscu ponazywać poszczególne parametry. Znowu jakimś nowym cudacznym sposobem, który wymaga uruchomienia jakiegoś specjalnie napisanego parsera, gdzie jedne robi tak, a inny tak. Moim zdaniem idealny framework powinien oferować kompleksowe. jednolite rozwiązanie problemu. Programiści Zend Framework chyba sami nie znają za bardzo możliwości języka w którym piszą, bo jak inaczej wytłumaczyć fakt nie skorzystania z podstawowej umiejętności wyrażeń regularnych jaką jest named subpattern. Widziałem multum przykładów z różnymi konfiguracjami routingu ale nigdy nie widziałem tego prostego zastosowania. Ze strony PHP

preg_match('/(?\w+): (?\d+)/', $str, $matches);

dzięki temu funkcja do wyrażeń regularnych automatycznie podstawia nam klucze sparsowanych parametrów jednocześnie dbając o poprawną walidację związaną z podanym typem wyrażenia. Sam nie jestem orłem jeśli chodzi o wyrażenia regularne ale to jest na tyle proste, że każdy to zrozumie. Dzięki temu można budować dowolnie skomplikowane adresy do routera. i bardzo proste i bardzo skomplikowane zachowując całkowitą spójność w sposobie ich tworzenia.


forum/(?\w+),(?<id>\d+).html = forum.show
forum/(?<title>\w+),(?<id>\d+),new-topic.html = forum.new_topic
user/(?<name>\w+)/profile.html = user.profile
kontakt.html = article.contact
show_teaser = entry.show_teaser
program,(?<channel>\d+),(?<date>\d{2,4}-\d{2}-\d{2}).html = tv.schedule
</pre>
<p>itd itd. Wystarczy tylko wskazywać te konkretne adresy na konkretne akcje. Dla mnie takie rozwiązanie jest o wiele bardziej sensowne, spójne i czytelne niż to które proponuje Zend Framework. To rozwiązanie i pomysł zaczerpnięte jest z Django – frameworka w jezyku Python.</p>
<p>No dobrze, ale ktoś powie: “W ten sposób wszystkie adresy z założenia przeszukuje się wyrażeniami regularnymi a w ZF można wskazać co jest proste a co nie, dzięki temu działa to szybciej.” Ja odpowiem tak: Co zadziała szybciej? Utworzenie 70 instancji klas typu routera i przetworzenie w nich adresu + sparsowanie parametrów i walidacji (każdy router jeszcze robi to inaczej) czy przeszukanie 70 wyrażeń regularnych? Poza tym funkcje do wyrażeń regularnych są dosyć dobrze zoptymalizowane i nie robią niepotrzebnej roboty z parsowaniem wyrażeń jeśli ich tam faktycznie nie ma.</p>
<p>Sposób realizacji routingu ma także odwzorowanie w nieco innym podejściu do wywoływania akcji ale to już w kolejnym poście traktującym o Akcji.</p>
            </div>

            
            
                        <div class="post-meta">

                <ul class="sub-menu share-this">
<li class="twitter"><a href="http://twitter.com/home?status=Framework+idealny%3F+Routing+-+http%3A%2F%2Ftinyurl.com%2F257qz9n" title="Share this post on Twitter"><span>Twitter</span></a></li>
<li class="digg"><a href="http://digg.com/submit?phase=2&url=http%3A%2F%2Fquadric.goblix.pl%2Fprogramowanie%2Fphp%2Fframework-idealny-routing%2F&title=Framework+idealny%3F+Routing" title="Share this post on Digg"><span>Digg</span></a></li>
<li class="facebook"><a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fquadric.goblix.pl%2Fprogramowanie%2Fphp%2Fframework-idealny-routing%2F&t=Framework+idealny%3F+Routing" title="Share this post on Facebook"><span>Facebook</span></a></li>
<li class="delicious"><a href="http://del.icio.us/post?url=http%3A%2F%2Fquadric.goblix.pl%2Fprogramowanie%2Fphp%2Fframework-idealny-routing%2F&title=Framework+idealny%3F+Routing" title="Share this post on Delicious"><span>Delicious</span></a></li>
<li class="stumbleupon"><a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fquadric.goblix.pl%2Fprogramowanie%2Fphp%2Fframework-idealny-routing%2F&title=Framework+idealny%3F+Routing" title="Share this post on StumbleUpon"><span>StumbleUpon</span></a></li>
</ul>
                                <div class="details">
                  <p>
                    This entry was posted by <a href="http://quadric.goblix.pl/author/admin/" title="Posts by Quadric ">Quadric</a> on February 13, 2012 at 12:04 am, and is filed under <a href="http://quadric.goblix.pl/category/programowanie/php/" rel="tag" title="PHP (24 topics)">PHP</a>. Follow any responses to this post through <a href="http://quadric.goblix.pl/programowanie/php/framework-idealny-routing/feed/" title="RSS 2.0">RSS 2.0</a>.Responses are currently closed, but you can <a href="http://quadric.goblix.pl/programowanie/php/framework-idealny-routing/trackback/" rel="trackback">trackback</a> from your own site.                  </p>
                </div>
                
            </div>
            
            
          </div>
          <!-- /post content -->

          
          
          
        </div>
      </div>
      <!-- /primary content -->

      

<!-- 1st sidebar -->
<div id="sidebar">
    <ul class="blocks count-4">
    <li class="block"><div class="block-content block-search clear-block" id="instance-atom-search-2">
<!-- search form -->
<div class="search-form" role="search">
  <form method="get" class="search-form clear-block" action="http://quadric.goblix.pl/">
    <input type="submit" class="submit" title="Search Website" value="" />
    <fieldset>
      <input type="text" name="s" data-default="Search Website" class="text alignleft clearField suggestTerms" value="" />
      <input type="hidden" value="submit" />
    </fieldset>
 </form>
</div>
<!-- /search form --></div></li><li class="block"><div class="block-content block-Advman_Widget clear-block" id="instance-advman-4"><div class="title"><h3>Reklama</h3><div class="bl"></div><div class="br"></div></div><div class="i"></div><script type="text/javascript"><!--
google_ad_client = "ca-pub-5440183811212122";
/* Quad - reklama BOX */
google_ad_slot = "6384812694";
google_ad_width = 250;
google_ad_height = 250;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></div></li><li class="block"><div class="block-content block-tabs clear-block" id="instance-atom-tabs-2">    <div class="tabs widgets" id="tabs-atom-tabs-2" data-fx="fade" >
      <ul class="navi clear-block">
                  <li class="nav-recent-comments active" id="nav-atom-recent-comments-2"><a href="#tab-atom-recent-comments-2" title="Recent Comments"><span>Recent Comments</span></a></li>                  <li class="nav-tag-cloud" id="nav-atom-tag-cloud-2"><a href="#tab-atom-tag-cloud-2" title="Tags"><span>Tags</span></a></li>                  <li class="nav-calendar" id="nav-atom-calendar-2"><a href="#tab-atom-calendar-2" title="Calendar"><span>Calendar</span></a></li>              </ul>
      <div class="sections">
                  <div class="section " id="tab-atom-recent-comments-2"><div class="block"><div class="block-content block-recent-comments clear-block" id="instance-atom-recent-comments-2"><ul class="menu fadeThis full recent-comments"><li><a class="clear-block" href="http://quadric.goblix.pl/programowanie/tworzenie-vhosta-w-apache/comment-page-1/#comment-7654" title="on Tworzenie VHost’a w Apache">
  <img alt='jtomaszewski' src='http://2.gravatar.com/avatar/260d6bc4f6b1548e3c4fed0f538b753a?s=48&d=mm&r=g' srcset='http://2.gravatar.com/avatar/260d6bc4f6b1548e3c4fed0f538b753a?s=96&d=mm&r=g 2x' class='avatar avatar-48 photo' height='48' width='48' />
  <span class="base">
  <span class="tt">jtomaszewski</span>
  <span class="c1">Ja musiałem vhosts ustawić troszeczkę inaczej, mianowicie:
<code>NameVirtualHost *:80


    ServerName localhost
    ServerAlias dev
    </code> […]</span>
  <span class="c2">5 years ago</span>
</span>
</a></li><li><a class="clear-block" href="http://quadric.goblix.pl/autor/comment-page-1/#comment-1426" title="on Autor">
  <img alt='Quadric' src='http://1.gravatar.com/avatar/a9a22249b03f36821cad7d27385a3659?s=48&d=mm&r=g' srcset='http://1.gravatar.com/avatar/a9a22249b03f36821cad7d27385a3659?s=96&d=mm&r=g 2x' class='avatar avatar-48 photo' height='48' width='48' />
  <span class="base">
  <span class="tt">Quadric</span>
  <span class="c1">Witam, niestety w chwili obecnej jestem mocno zajęty innymi projektami, ale mogę Panu polecić to co zrobiłem dla wersji  […]</span>
  <span class="c2">6 years ago</span>
</span>
</a></li><li><a class="clear-block" href="http://quadric.goblix.pl/autor/comment-page-1/#comment-1425" title="on Autor">
  <img alt='Artur' src='http://2.gravatar.com/avatar/e0a14faa4fa11b6826453a3a4d5c8872?s=48&d=mm&r=g' srcset='http://2.gravatar.com/avatar/e0a14faa4fa11b6826453a3a4d5c8872?s=96&d=mm&r=g 2x' class='avatar avatar-48 photo' height='48' width='48' />
  <span class="base">
  <span class="tt">Artur</span>
  <span class="c1">Witam,
poszukuję informatyka, który napisze dla mnie skrypt do reklam (docelowo adsense+własne) po pierwszym poście a następnie co 4 post.  […]</span>
  <span class="c2">6 years ago</span>
</span>
</a></li><li><a class="clear-block" href="http://quadric.goblix.pl/programowanie/tworzenie-vhosta-w-apache/comment-page-1/#comment-1420" title="on Tworzenie VHost’a w Apache">
  <img alt='Sten' src='http://0.gravatar.com/avatar/9e6ec18520fda195eac25c185579e7c1?s=48&d=mm&r=g' srcset='http://0.gravatar.com/avatar/9e6ec18520fda195eac25c185579e7c1?s=96&d=mm&r=g 2x' class='avatar avatar-48 photo' height='48' width='48' />
  <span class="base">
  <span class="tt">Sten</span>
  <span class="c1">Świetnie stary. Bardzo mi to pomogło. Dobra robota. Możesz być z siebie dumny!</span>
  <span class="c2">6 years ago</span>
</span>
</a></li><li><a class="clear-block" href="http://quadric.goblix.pl/projekty/aktualizacja-punbb-i-polskie-tlumaczenie/comment-page-1/#comment-1408" title="on Aktualizacja PunBB i polskie tłumaczenie">
  <img alt='Cobra' src='http://0.gravatar.com/avatar/3dcc50e46e90e84661ccca2ee2ee0481?s=48&d=mm&r=g' srcset='http://0.gravatar.com/avatar/3dcc50e46e90e84661ccca2ee2ee0481?s=96&d=mm&r=g 2x' class='avatar avatar-48 photo' height='48' width='48' />
  <span class="base">
  <span class="tt">Cobra</span>
  <span class="c1">Dzięki, przydało się - wersja ze strony oficjalnej rozkraczała forum 😉</span>
  <span class="c2">6 years ago</span>
</span>
</a></li></ul><div class="fadeThis clear-block">
<a class="more" href="#" title="Show next 5 entries" data-instance="2" data-cmd="get_recent_comments" data-offset="5">Show More</a>
</div></div></div></div>                  <div class="section hidden" id="tab-atom-tag-cloud-2"><div class="block"><div class="block-content block-tag-cloud clear-block" id="instance-atom-tag-cloud-2"><div class="box tagcloud"><a href="http://quadric.goblix.pl/tag/ajax/" class="tag-ajax" title="1" style="font-size:10.0pt;color:#cacaca;">Ajax</a>
<a href="http://quadric.goblix.pl/tag/apache/" class="tag-apache" title="3" style="font-size:15.1pt;color:#8a8a8a;"><strong>Apache</strong></a>
<a href="http://quadric.goblix.pl/tag/c/" class="tag-c" title="1" style="font-size:10.0pt;color:#cacaca;">C</a>
<a href="http://quadric.goblix.pl/tag/code-igniter/" class="tag-code-igniter" title="1" style="font-size:10.0pt;color:#cacaca;">Code Igniter</a>
<a href="http://quadric.goblix.pl/tag/emotors/" class="tag-emotors" title="1" style="font-size:10.0pt;color:#cacaca;">Emotors</a>
<a href="http://quadric.goblix.pl/tag/framework/" class="tag-framework" title="7" style="font-size:20.3pt;color:#484848;"><strong>Framework</strong></a>
<a href="http://quadric.goblix.pl/tag/grad/" class="tag-grad" title="9" style="font-size:22.0pt;color:#333333;"><strong>GRAD</strong></a>
<a href="http://quadric.goblix.pl/tag/gry/" class="tag-gry" title="1" style="font-size:10.0pt;color:#cacaca;">Gry</a>
<a href="http://quadric.goblix.pl/tag/hack/" class="tag-hack" title="2" style="font-size:13.1pt;color:#a4a4a4;">Hack</a>
<a href="http://quadric.goblix.pl/tag/html/" class="tag-html" title="2" style="font-size:13.1pt;color:#a4a4a4;">HTML</a>
<a href="http://quadric.goblix.pl/tag/ie/" class="tag-ie" title="2" style="font-size:13.1pt;color:#a4a4a4;">IE</a>
<a href="http://quadric.goblix.pl/tag/internet/" class="tag-internet" title="2" style="font-size:13.1pt;color:#a4a4a4;">Internet</a>
<a href="http://quadric.goblix.pl/tag/jquery/" class="tag-jquery" title="2" style="font-size:13.1pt;color:#a4a4a4;">jQuery</a>
<a href="http://quadric.goblix.pl/tag/kohana/" class="tag-kohana" title="1" style="font-size:10.0pt;color:#cacaca;">Kohana</a>
<a href="http://quadric.goblix.pl/tag/luna/" class="tag-luna" title="1" style="font-size:10.0pt;color:#cacaca;">Luna</a>
<a href="http://quadric.goblix.pl/tag/model/" class="tag-model" title="1" style="font-size:10.0pt;color:#cacaca;">Model</a>
<a href="http://quadric.goblix.pl/tag/monitor/" class="tag-monitor" title="1" style="font-size:10.0pt;color:#cacaca;">Monitor</a>
<a href="http://quadric.goblix.pl/tag/pdo/" class="tag-pdo" title="1" style="font-size:10.0pt;color:#cacaca;">PDO</a>
<a href="http://quadric.goblix.pl/tag/php/" class="tag-php" title="5" style="font-size:18.2pt;color:#626262;"><strong>PHP</strong></a>
<a href="http://quadric.goblix.pl/tag/prado/" class="tag-prado" title="1" style="font-size:10.0pt;color:#cacaca;">Prado</a>
<a href="http://quadric.goblix.pl/tag/prime/" class="tag-prime" title="5" style="font-size:18.2pt;color:#626262;"><strong>Prime</strong></a>
<a href="http://quadric.goblix.pl/tag/programowanie/" class="tag-programowanie" title="4" style="font-size:16.9pt;color:#737373;"><strong>Programowanie</strong></a>
<a href="http://quadric.goblix.pl/tag/punbb/" class="tag-punbb" title="5" style="font-size:18.2pt;color:#626262;"><strong>PunBB</strong></a>
<a href="http://quadric.goblix.pl/tag/request/" class="tag-request" title="1" style="font-size:10.0pt;color:#cacaca;">Request</a>
<a href="http://quadric.goblix.pl/tag/router/" class="tag-router" title="5" style="font-size:18.2pt;color:#626262;"><strong>Router</strong></a>
<a href="http://quadric.goblix.pl/tag/rozrywka/" class="tag-rozrywka" title="1" style="font-size:10.0pt;color:#cacaca;">Rozrywka</a>
<a href="http://quadric.goblix.pl/tag/serwer/" class="tag-serwer" title="2" style="font-size:13.1pt;color:#a4a4a4;">Serwer</a>
<a href="http://quadric.goblix.pl/tag/symfony/" class="tag-symfony" title="1" style="font-size:10.0pt;color:#cacaca;">Symfony</a>
<a href="http://quadric.goblix.pl/tag/technologia/" class="tag-technologia" title="3" style="font-size:15.1pt;color:#8a8a8a;"><strong>technologia</strong></a>
<a href="http://quadric.goblix.pl/tag/vhost/" class="tag-vhost" title="2" style="font-size:13.1pt;color:#a4a4a4;">Vhost</a>
<a href="http://quadric.goblix.pl/tag/wzorce-projektowe/" class="tag-wzorce-projektowe" title="5" style="font-size:18.2pt;color:#626262;"><strong>Wzorce projektowe</strong></a>
<a href="http://quadric.goblix.pl/tag/xampp/" class="tag-xampp" title="1" style="font-size:10.0pt;color:#cacaca;">XAMPP</a>
<a href="http://quadric.goblix.pl/tag/xbox-360/" class="tag-xbox-360" title="1" style="font-size:10.0pt;color:#cacaca;">Xbox 360</a>
<a href="http://quadric.goblix.pl/tag/zend/" class="tag-zend" title="2" style="font-size:13.1pt;color:#a4a4a4;">Zend</a></div>
</div></div></div>                  <div class="section hidden" id="tab-atom-calendar-2"><div class="block"><div class="block-content block-calendar clear-block" id="instance-atom-calendar-2">    <div class="calendar-block">
      <div class="top clear-block">
		<a class="prev control" rel="9-2012" href="http://quadric.goblix.pl/2012/09/" title="View posts for September 2012">« Sep</a><h4>September 2018</h4></div><table class="calendar" summary="Calendar"><thead><tr>
		<th scope="col" title="Monday">Mon</th>
		<th scope="col" title="Tuesday">Tue</th>
		<th scope="col" title="Wednesday">Wed</th>
		<th scope="col" title="Thursday">Thu</th>
		<th scope="col" title="Friday">Fri</th>
		<th scope="col" title="Saturday">Sat</th>
		<th scope="col" title="Sunday">Sun</th></tr></thead> <tbody><tr><td colspan="5" class="pad"> </td><td><span>1</span></td><td><span>2</span></td>
	</tr>
	<tr>
		<td><span>3</span></td><td><span>4</span></td><td><span>5</span></td><td><span>6</span></td><td><span>7</span></td><td><span>8</span></td><td><span>9</span></td>
	</tr>
	<tr>
		<td><span>10</span></td><td><span>11</span></td><td><span>12</span></td><td><span>13</span></td><td><span>14</span></td><td><span>15</span></td><td><span>16</span></td>
	</tr>
	<tr>
		<td><span>17</span></td><td><span>18</span></td><td><span>19</span></td><td><span>20</span></td><td><span>21</span></td><td class="today"><span>22</span></td><td><span>23</span></td>
	</tr>
	<tr>
		<td><span>24</span></td><td><span>25</span></td><td><span>26</span></td><td><span>27</span></td><td><span>28</span></td><td><span>29</span></td><td><span>30</span></td>
	</tr>
	</tbody>
	</table>    </div>

        <script>
      /* <![CDATA[ */
      jQuery(document).ready(function($){
        $('#instance-atom-calendar-2').delegate('a.control', 'click', function(){
          var reqdate = $(this).attr('rel').split(/-/g);
          $.ajax({
            type: 'GET',
            url: $(this).attr('href'),
            context: this,
            data: { id: 'instance-atom-calendar-2',
                    initial: 0,
                    reqmonth: reqdate[0],
                    reqyear: reqdate[1],
                    atom: 'get_calendar' },
            dataType: 'json',
            beforeSend: function() { $(this).addClass('loading'); },
            complete: function() { $(this).removeClass('loading'); },
            success: function(response){
              if(response.output != '') $('#instance-atom-calendar-2 .calendar-block').html(response.output);
            }
          });
          return false;

        });
      });
      /* ]]> */
    </script>
    
    </div></div></div>              </div>
    </div>
    </div></li><li class="block"><div class="block-content block-links clear-block" id="instance-atom-links-2"><div class="title"><h3>Blogroll</h3><div class="bl"></div><div class="br"></div></div><div class="i"></div><ul class="menu fadeThis blogroll"><li><a href="http://www.goblix.pl" rel="me"><span class="base">Goblix Services Host<span class="c1">goblixite yourself</span></span></a></li><li><a href="http://www.yourheaven.pl" target="_blank" rel="spouse sweetheart"><span class="base">Instytut urody Your Heaven<span class="c1">Salon kosmetyczny - Gdynia Wielki Kack</span></span></a></li><li><a href="http://rct.goblix.pl" target="_blank" rel="me"><span class="base">Radiocontrol Tuning<span class="c1">Hobbystyczne forum modeli składanych i pojazdów zdalnie sterowanych z gazetek</span></span></a></li><li><a href="http://vipserv.org/p.php?goblix" rel="contact"><span class="base">Rewelacyjny hosting!<span class="c1">Rewelacyjny hosting zawierający wszystko czego programista. Tanio, dostęp do mysql, postgres, svn, poczty, crontab, kopie bezpieczeńtwa, prosta obsługa</span></span></a></li><li><a href="http://www.gajcom.cba.pl" target="_blank" rel="acquaintance met"><span class="base">Serwis komputerowy G@JCOM<span class="c1">Serwis komputerowy</span></span></a></li><li><a href="http://www.you-ebook.pl" target="_blank"><span class="base">You-ebook - wydawnictwo internetowe<span class="c1">Wydawnictwo internetowe pdf</span></span></a></li></ul></div></li>  </ul>
  </div>
<!-- /1st sidebar -->



    </div>
  </div>
</div>
<!-- /main content -->


         </div>
       </div>
       <!-- /main -->

       
       
       <!-- footer -->
       <div class="shadow-left page-content">
         <div class="shadow-right">

           <div id="footer">

             
             <div id="copyright">
               <span id="site-generator">Powered by <a class="wp" href="http://wordpress.org/">WordPress</a> and Mystique theme by <a class="digitalnature" href="http://digitalnature.eu/">digitalnature</a></span> <br /> [rss]  [top]               		<!-- Advertising Manager v3.5.3 (0.272 seconds.) -->
<script type='text/javascript' src='http://quadric.goblix.pl/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/scripts/shCore.js?ver=3.0.9b'></script>
<script type='text/javascript' src='http://quadric.goblix.pl/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/scripts/shBrushPhp.js?ver=3.0.9b'></script>
<script type='text/javascript'>
	(function(){
		var corecss = document.createElement('link');
		var themecss = document.createElement('link');
		var corecssurl = "http://quadric.goblix.pl/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shCore.css?ver=3.0.9b";
		if ( corecss.setAttribute ) {
				corecss.setAttribute( "rel", "stylesheet" );
				corecss.setAttribute( "type", "text/css" );
				corecss.setAttribute( "href", corecssurl );
		} else {
				corecss.rel = "stylesheet";
				corecss.href = corecssurl;
		}
		document.getElementsByTagName("head")[0].insertBefore( corecss, document.getElementById("syntaxhighlighteranchor") );
		var themecssurl = "http://quadric.goblix.pl/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shThemeDefault.css?ver=3.0.9b";
		if ( themecss.setAttribute ) {
				themecss.setAttribute( "rel", "stylesheet" );
				themecss.setAttribute( "type", "text/css" );
				themecss.setAttribute( "href", themecssurl );
		} else {
				themecss.rel = "stylesheet";
				themecss.href = themecssurl;
		}
		//document.getElementById("syntaxhighlighteranchor").appendChild(themecss);
		document.getElementsByTagName("head")[0].insertBefore( themecss, document.getElementById("syntaxhighlighteranchor") );
	})();
	SyntaxHighlighter.config.strings.expandSource = '+ expand source';
	SyntaxHighlighter.config.strings.help = '?';
	SyntaxHighlighter.config.strings.alert = 'SyntaxHighlighter\n\n';
	SyntaxHighlighter.config.strings.noBrush = 'Can\'t find brush for: ';
	SyntaxHighlighter.config.strings.brushNotHtmlScript = 'Brush wasn\'t configured for html-script option: ';
	SyntaxHighlighter.defaults['pad-line-numbers'] = false;
	SyntaxHighlighter.all();
</script>
<script type='text/javascript'>
/* <![CDATA[ */
var atom_config = {"id":"mystique","blog_url":"http:\/\/quadric.goblix.pl\/","theme_url":"http:\/\/quadric.goblix.pl\/wp-content\/themes\/mystique","context":"single","preview_mode":"","search_query":"","options":"effects|lightbox|generate_thumbs"};
/* ]]> */
</script>
<script type='text/javascript' src='http://quadric.goblix.pl/wp-content/themes/mystique/js/jquery.atom.min.js?ver=3.3.2'></script>
<script type='text/javascript' src='http://quadric.goblix.pl/wp-includes/js/wp-embed.min.js?ver=4.7.11'></script>
             </div>
           </div>

         </div>
       </div>
       <!-- /footer -->

       <a class="go-top" href="#page">Go to Top</a>

     </div>
    <!-- /page-ext -->


    <!-- 68 queries in 0.27 seconds (39.70M) -->

  </div>
  <!-- page -->

  
</body>
</html>