<?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>Nasza Kohana</title>
	<atom:link href="http://nasza.kohanaphp.pl/feed/" rel="self" type="application/rss+xml" />
	<link>http://nasza.kohanaphp.pl</link>
	<description></description>
	<lastBuildDate>Sun, 12 Jun 2011 20:42:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
		<item>
		<title>Struktura i nazewnictwo</title>
		<link>http://nasza.kohanaphp.pl/struktura-kohany/</link>
		<comments>http://nasza.kohanaphp.pl/struktura-kohany/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 19:51:04 +0000</pubDate>
		<dc:creator>Zepco</dc:creator>
				<category><![CDATA[Kurs]]></category>
		<category><![CDATA[struktura]]></category>

		<guid isPermaLink="false">http://nasza.kohanaphp.pl/?p=36</guid>
		<description><![CDATA[Struktura katalogów Zanim przejdziemy do utworzenia pierwszego kontrolera, zapoznaj się ze strukturą katalogów i elementami jakie posiada Kohana. Całość dzieli się na 3 katalogi: system &#8211; tu znajduje się „serce” naszego frameworka, w tym główny rdzeń (core) oraz inne elementy, których krótki opis znajduje się poniżej; modules &#8211; zawiera kod (biblioteki, modele, widoki itp.), który [...]]]></description>
			<content:encoded><![CDATA[<h3>Struktura katalogów</h3>
<p>Zanim przejdziemy do utworzenia pierwszego kontrolera, zapoznaj się ze strukturą katalogów i elementami jakie posiada Kohana.</p>
<p><span id="more-36"></span></p>
<p>Całość dzieli się na 3 katalogi:</p>
<ul>
<li>
		<strong>system</strong> &#8211; tu znajduje się „serce” naszego frameworka, w tym główny rdzeń (core) oraz inne elementy, których krótki opis znajduje się poniżej;
	</li>
<li>
		<strong>modules</strong> &#8211; zawiera kod (biblioteki, modele, widoki itp.), który jest na tyle uniwersalny, że może być wykorzystywany w innych projektach (np. obsługa użytkowników);
	</li>
<li>
		<strong>application</strong> – ten katalog będzie nas interesował najbardziej. To w nim przechowywane są wszystkie pliki związane z naszą aplikacją.
	</li>
</ul>
<div class="illustration">
	<img class="size-full wp-image-87" title="Rys. 2.1. Struktura katalogów" src="http://nasza.kohanaphp.pl/wp-content/uploads/2011/06/Rys.2.1.Struktura-Kohany.png" alt="Rys. 2.1. Struktura katalogów" width="380" height="760" />
</div>
<p>Skrypty uruchamiane są poprzez plik index.php. To on ładuje podstawowe klasy Kohany, które później decydują który z elementów naszej aplikacji ma być odpalony.</p>
<h3>Elementy Kohany</h3>
<p>Jak zapewne zauważyłeś, we wszystkich 3 katalogach jest podobna struktura podkatalogów:</p>
<ul>
<li>
		<strong>classes</strong> – folder ten zawiera kontrolery, modele oraz klasy pomocnicze, dzięki którym nasza aplikacja działa tak jak tego sobie życzymy;
	</li>
<li>
		<strong>config</strong> – jak sama nazwa wskazuje zawiera pliki z konfiguracją aplikacji, bibliotek czy też poszczególnych modułów;
	</li>
<li>
		<strong>i18n</strong> (skrót od internationalization) – katalog ten zawiera pliki językowe z komunikatami i tekstami, które chcemy aby były przetłumaczone na naszej stronie. Poza zdefiniowanymi standardowo można utworzyć własne. Pliki  językowe zawierają w sobie tablice, gdzie kluczem jest wyrażenie do przetłumaczenia, a wartością przetłumaczony tekst. Pliki językowe nie są poddawane nadpisywaniu (patrz kaskadowy system plików), lecz są ze sobą łączone w kolejności od najstarszego do najnowszego wpisu (system->modules->application);
	</li>
<li>
		<strong>messages</strong> – wiadomości w przeciwieństwie do plików językowych nie są tłumaczone, za to pozwalają na ujednolicenie komunikatów w aplikacji (np. dla walidacji formularzy). Podobnie jak pliki językowe komunikaty są łączone;
	</li>
<li>
		<strong>vendor</strong> – znalazłeś w internecie jakąś bibliotekę, której chciałbyś użyć w Kohanie? To miejsce jest właśnie dla niej. W tym katalogu przechowywane są klasy zewnętrznych bibliotek, do zaadoptowania by współpracowały z naszym frameworkiem;
	</li>
<li>
		<strong>views</strong> – widoki były opisane w poprzednim rozdziale, więc nie ma sensu się nad nimi rozwodzić. W następnych wpisach zajmę się dokładniej ich tworzeniem i zastosowaniem w aplikacji.
	</li>
</ul>
<h3>Kaskadowy system plików</h3>
<p>Charakterystyczną rzeczą, wartą uwagi w Kohanie jest kaskadowy system plików. Takie rozwiązanie pozwala na nadpisanie plików bez konieczności ich modyfikacji czy usuwania. Jeśli chcemy otworzyć jakiś plik będzie on przeszukiwany w katalogach w kolejności <code>application -&gt; modules -&gt; system</code>. Jeśli plik nie znajdzie się w żadnym z nich, to zostanie wyświetlony komunikat błędu (w przypadku braku kontrolera błąd 404). Podkatalogi w modules są przeglądane w kolejności ich dodania w pliku konfiguracyjnym bootstrap.php <a href="http://nasza.kohanaphp.pl/instalacja-i-konfiguracja/">następnym artykule</a>). Spójrz na poniższy rysunek.</p>
<div class="illustration">
	<img class="size-full wp-image-77" title="Rys. 2.2. Kaskadowy system plików (autor Geert De Deckere)" src="http://nasza.kohanaphp.pl/wp-content/uploads/2011/06/Rys.2.2.Kaskadowy-system-plik%C3%B3w.png" alt="Rys. 2.2. Kaskadowy system plików (autor Geert De Deckere)" width="520" height="600" />
</div>
<p>W katalogu <code>system/views</code> mamy widok <code>error.php</code>,który posiada stronę błędu. Ale my chcemy mieć swoją stronę błędu z własnym wyglądem. Dlatego też tworzymy plik o tej samej nazwie w katalogu naszej aplikacji (<code>application/views</code>). Dzięki temu Kohana otrzymując polecenie odnalezienia widoku, szuka go najpierw w naszym katalogu. W tym przypadku znalazł go od razu, więc pomija pozostałe lokalizacje. Dla pliku <code>classes/database.php</code> szuka w application. Ponieważ tam go nie ma, kontynuuje w katalogu modules. Moduł common również nie posiada szukanego pliku, kohana przeszukuje kolejny moduł database gdzie jest nasz plik, kończąc tym samym dalsze poszukiwania (katalog system nie będzie już brany pod uwagę).</p>
<p>Rozwiązanie to jest bardzo użyteczne w przypadku konfiguracji. W zasadzie nie powinieneś nic zmieniać w katalogu system, ponieważ w przypadku aktualizacji Kohany stracisz wszystkie zmiany, a po pewnym czasie raczej nie będziesz pamiętać co i gdzie zmieniłeś. Zatem jeśli brakuje jakiegoś pliku, który istnieje w katalogu system/config, bądź w którymś z modułów, a który chcesz zmodyfikować, to skopiuj go do <code>application/config</code> i tam dopiero modyfikuj.</p>
<h3>Standardy nazewnictwa</h3>
<p>Aby Kohana wiedziała gdzie znaleźć elementy naszej aplikacji musimy zachować pewne standardy.</p>
<ul>
<li>
		<strong>Klasy (classes)</strong>:</p>
<ul>
<li>wszystkie klasy znajdują się w podkatalogu classes;</li>
<li>nazwa pliku musi być zapisana małymi literami, np. artykuly.php;</li>
<li>nazwa klasy musi pokrywać się z nazwą pliku, wyjątkiem są klasy, które w swojej nazwie posiadają podkreślenia, np. Controller_Home, wtedy dla członów poprzedzających ostatni należy utworzyć strukturę katalogów zamieniając podkreślenie „_” na slashe „/”. W podanym przypadku będzie to controller/home.php;</li>
<li>wielkość liter w nazwie klasy nie ma znaczenia.</li>
</ul>
<p>Przykładowe nazwy klas i ścieżki dla nich:<br />
<code>Game – classes/game.php<br />
Model_Users – classes/model/users.php<br />
Moja_Klasa – classes/moja/klasa.php<br />
Klasa_Nazwa_Dluzsza_Niz_Zwykle – classes/klasa/nazwa/dluzsza/niz/zwykle.php</code>
	</li>
<li>
		<strong>Widoki (views)</strong>:</p>
<ul>
<li>w przypadku widoków nazwy plików mogą być dowolne, wielkość liter nie ma znaczenia, byleby przy wywołaniu widoku ją zachować. Musi być jedynie zakończona rozszerzeniem .php;</li>
<li>
				Dopuszczalne (a nawet zalecane dla większego porządku) jest umieszczanie plików w podkatalogach.
			</li>
</ul>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://nasza.kohanaphp.pl/struktura-kohany/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wprowadzenie</title>
		<link>http://nasza.kohanaphp.pl/wprowadzenie/</link>
		<comments>http://nasza.kohanaphp.pl/wprowadzenie/#comments</comments>
		<pubDate>Thu, 19 Feb 2009 19:47:05 +0000</pubDate>
		<dc:creator>Zepco</dc:creator>
				<category><![CDATA[Kurs]]></category>
		<category><![CDATA[mvc]]></category>

		<guid isPermaLink="false">http://nasza.kohanaphp.pl/2008/12/25/14/</guid>
		<description><![CDATA[Kohana jest jednym z wielu frameworków stworzonych w języku PHP. Jej korzenie sięgają innego frameworka o nazwie Code Igniter (CI). Ponieważ deweloperzy CI zapowiedzieli, że ich produkt nie będzie wspierał PHP w wersji 5, grupa programistów korzystających dotychczas z CI postanowiła utworzyć nowy projekt, idący z duchem czasu i wspierający coraz bardziej rozwijającą się obiektowość [...]]]></description>
			<content:encoded><![CDATA[<p><em>Kohana</em> jest jednym z wielu <a title="Framework" href="http://pl.wikipedia.org/wiki/Framework" target="_blank">frameworków</a> stworzonych w języku PHP.</p>
<p>Jej korzenie sięgają innego frameworka o nazwie <a title="Code Igniter" href="http://pl.wikipedia.org/wiki/CodeIgniter" target="_blank">Code Igniter</a> (CI). Ponieważ deweloperzy CI zapowiedzieli, że ich produkt nie będzie wspierał PHP w wersji 5, grupa programistów korzystających dotychczas z CI postanowiła utworzyć nowy projekt,  idący z duchem czasu i wspierający coraz bardziej rozwijającą się obiektowość dla PHP. Tak powstała <em>Kohana</em>, początkowo bardzo podobna do CI, lecz w tej chwili utożsamia się tylko z jego ogólnymi ideami działania, ponieważ sam projekt jest w pełni samodzielny i jego rozwój biegnie własnym torem.
</p>
<p><span id="more-14"></span></p>
<h3>Co cechuje Kohanę?</h3>
<ul>
<li>
		Oparta o wzorzec MVC (o tym za chwilę);
	</li>
<li>
		Napisana w PHP 5, także jeśli jesteś osobą znającą ten język, to być może Kohana przypadnie ci do gustu;
	</li>
<li>
		W porównaniu z niektórymi kolosami typu Symfony, Mojavi itp. jest dość szybka;
	</li>
<li>
		Poza samym wzorcem MVC i ogólnymi zasadami konstrukcji <em>Kohana</em> daje dość ogromną swobodę w tworzeniu aplikacji.
	</li>
</ul>
<h3>Czym jest MVC?</h3>
<p>Jak możemy wyczytać w <a title="MVC Wikipedia" href="http://pl.wikipedia.org/wiki/MVC" target="_blank">Wikipedii</a>, MVC jest wzorcem projektowym dzielącym aplikację na 3 części:</p>
<ul>
<li>
		Model – jego zadaniem są operacje na danych. Najczęściej modele korzystają z baz danych, ale równie dobrze mogą odwoływać się 	do dokumentów będących na dysku czy też innych stron;
	</li>
<li>
		Widok – w wielu serwisach rolę widoku określa się jako oddzielenie kodu PHP od HTML, co jest oczywiście nieprawdą. Jednym słowem 	widok tworzy to, co użytkownik otrzymuje na wyjściu, w zależności od założeń działania aplikacji. Może to być reprezentacja danych pobranych z modelu &#8211; w formie tabeli &#8211; połączonych z interfejsem 	zapisanym jako kod HTML, czy też inny rodzaj pliku (PDF, XML);
	</li>
<li>
		Kontroler –  jest łącznikiem między modelem i widokiem. Jego 	zadaniem jest odbieranie żądań użytkownika, wysyłanie zapytania do modelu o konkretne dane, a po ich otrzymaniu odesłanie ich do 	widoku. Jednym słowem kontroluje on przebieg aplikacji.
	</li>
</ul>
<h3>Co nam daje taki podział?</h3>
<p>Przede wszystkim model stanowi pewnego rodzaju czarną skrzynkę, o której wiemy tylko to, co z nią zrobić, żeby zwróciła interesujące nas dane. A to, w jaki sposób to zrobi i z jakiego źródła danych skorzysta (plik, baza MySQL, PostgreSQL, XML itp.) nie będzie już nas interesować. Jego zadaniem będą tylko operacje na danych (odczytywanie, zapisywanie itp.) i nic poza tym.</p>
<p>Dajmy na to, że mamy dostawcę, którego prosimy o dostarczenie danego produktu (np. soku). Nie interesuje nas, czy weźmie go z hurtowni A czy z hurtowni B. Ważne, że otrzymamy to o co prosimy. Może być taka sytuacja, że dotychczas dostawca brał towar z hurtowni A, która z nieznanych przyczyn ogłosiła upadłość. Żeby wywiązać się z umowy, dostawca szuka innego źródła i znajduje hurtownię B, skąd dostarczy nam towar. My jako kupujący nie dostrzegamy różnicy, bo wszystko, o co poprosiliśmy zostało dostarczone, a kwestia &#8222;skąd&#8221; to już zmartwienie dostawcy.</p>
<p>Podobnie jest z modelem. Załóżmy, że do tej pory model pobierał dane z bazy MySQL, ale cały serwis musi być przeniesiony na PostgreSQL. Z zewnątrz nic się nie zmienia, nadal jest ten sam model i te same metody odwołujące się do niego, zmianie ulega tylko wnętrze modelu. Dzięki temu oszczędzamy wiele czasu i nerwów, bo nie musimy zmieniać wpisów odwołujących się, być może w kilkudziesięciu (czy nawet więcej) plikach do naszego modelu.</p>
<p>Podobnie sprawa może mieć się w przypadku widoku. Wyobraźmy sobie sytuację, że wszystkie dane pobrane z modelu były wyświetlane w formacie HTML, ale stworzyliśmy sobie program, który odwołuje się do naszej strony. Operuje on zaś na plikach XML. Co robimy? Przepisujemy naszą stronę na nowo? Nic podobnego &#8211; zmieniamy tylko widok tak, aby wyświetlał to co chcemy, czyli w tym przypadku XML. Pozostała część aplikacji (kontroler i modele) nie ulega zmianie.</p>
<p>Choć nic nie stoi na przeszkodzie, żeby tak dostosować kontroler, aby w zależności od tego czy żądanie wywodzi się od przeglądarki internetowej czy też z naszego programu, wybierał odpowiedni widok i wyświetlał go.</p>
<p>Jak widać rozwiązanie takie pozwala na zaoszczędzenie mnóstwa czasu. Ponadto możemy podzielić prace nad projektem na kilka osób, gdzie jedna np. może tworzyć model, inna widok, a jeszcze inna scalać oba te elementy tworząc kontroler.</p>
<p>To tyle tytułem wstępu. Kolejne części opisują budowę i zasadę tworzenia aplikacji z wykorzystaniem Kohany. A to wszystko na przykładzie tworzenia prostego blogu internetowego.</p>
]]></content:encoded>
			<wfw:commentRss>http://nasza.kohanaphp.pl/wprowadzenie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

