Kohana Framework: Layouty, widoki, szablony

W poprzednim wpisie poruszyliśmy kwestię instalacji oraz konfiguracji samego frameworka. Proces ten dla niektórych trudny dla innych prosty jest głównym korzeniem naszych lekcji. W dzisiejszym wpisie przedstawię Wam zwinny sposób na zarządzanie layoutami, widokami/szablonami. Tytuł może być trochę mylący ze względu na słowo „szablony” (nie, nie będziemy używać smarty). Jako, że seria wpisów poświęcona Kohanie będzie skierowana do osób bardzo początkujących pominiemy takie kwestie jak systemy szablonów i skupimy się na standardowych widokach PHP, które oferuje Kohana lecz z lekką modyfikacją.

Załóżmy, że nasza aplikacja będzie miała różne układy graficzne w różnych jej częściach. Przykładowo chcielibyśmy aby w aktualnościach był układ 2-kolumnowy, a w podstronie CMS 1-kolumnowy. Widoki views posłużą nam tylko do prezentacji przekazywanego obiektu i ich nazewnictwo będzie stricte powiązane ze ścieżką routingu, a raczej nazewnictwem akcji kontrolera.

Zanim zaczniemy zabawę z kontrolerami oraz widokami, stwórzmy najpierw plik konfiguracyjny dla bazy danych oraz „zepnijmy” framework ze wcześniej utworzoną bazą. W tym celu w katalogu /app/application/config/ (jeśli go nie ma, utwórzmy go), stwórzmy plik o nazwie database.php i umieśćmy w jego zawartości następujący kod, zamieniając opisane elementy własnymi parametrami logowania do bazy.

Od tej pory nasza aplikacja będzie miała dostęp do tabel bazy danych, które stworzymy w przyszłości oraz tych stworzonych w poprzednim wpisie (pages).

Przygotowanie

Musimy ustalić pewien standard widoków by łatwo nam było w przyszłości ingerować w kod, by łatwiej nam było odnaleźć poszczególne elementy widoków itp. Dlatego, napiszemy główny kontroler po którym będziemy dziedziczyć pozostałe kontrolery naszej aplikacji. Umieśćmy go w nieco innej lokalizacji, w tym celu utwórzmy katalog /app/application/classes/Application, w tym katalogu stwórzmy nowy plik o nazwie Controller.php /app/application/classes/Application/Controller.php. Jego zawartość jest następująca:

Dla krótkiego wyjaśnienia: w funkcji before, która wykonuje się przed wszelkimi akcjami kontrolera następuje ustanowienie obiektu widoku. Do jednej zmiennej publicznej przypisywany jest widok, a do drugiej layout, który de-facto jest również widokiem opakowującym całość. Ścieżką widoku dla akcji każdego kontrolera jest jej ścieżka względem nazewnictwa klas.

Musimy stworzyć pierwszy layout w katalogu: /app/application/views/layouts (utwórz katalogi jeśli ich nie ma), o nazwie default.php /app/application/views/layouts/default.php o zawartości przypominającej standardowy szkielet HTML z dołączonymi stylami Twitter Bootstrap.

Jak możecie zauważyć w domyślnym pliku layoutu jest wywołanie zmiennej $content do której nasz kontroler rodzic Application/Controller przypisał obiekt klasy View generującej widok. Ścieżki widoków view będą się uzupełniały analogicznie do struktury kontrolera.
Przykładowo dla kontrolera Cms /app/application/classes/Controller/Cms.php ścieżką widoków będzie /app/application/views/cms/ – w tym właśnie katalogu musimy utworzyć pliki odpowiadające nazwom akcji kontrolera Cms: index.php oraz read.php.

Do widoku akcji index kontrolera Cms index.php wklejamy kod/treść, która przywita użytkownika po wejściu w główny adres naszej strony.

Do pliku read.php wklejamy zaś listing odpowiadający za wyświetlenie strony z bazy danych. Zmienne którymi się posłużymy nie zostały użyte tam bez powodu, wzorzec MVC jasno określa, że w widoku operujemy na zmiennych i obiektach przekazanych przez kontroler.

Kontroler

Jeśli mamy przygotowany już routing, widoki oraz layout czas na kontroler odpowiadający za wyświetlanie naszych stron. Zgodnie z tym co zadeklarowaliśmy w routingu kontrolerem będzie Cms /app/application/classes/Controller/Cms.php. Oto jego zawartość:

Akcja index jest celowo pusta ponieważ nic się nie dzieje w części serwisu odpowiadającej za powitanie użytkownika więc wyświetlamy tylko widok views/cms/index.php.

Z racji, że czas na panel administracyjny do dodawania edycji oraz dodawania treści napiszemy później dodajmy teraz pierwszą podstronę bezpośrednio do bazy danych.

Po dodaniu strony i wybraniu z nawigacji „Kim jesteśmy” powinniśmy zobaczyć na ekranie naszą stronę:

Podsumowanie

Mamy już napisaną solidną podstawę naszej aplikacji. W kolejnych wpisach rozbudujemy nasz kontroler „rodzic”, dodając do niego kilka elementów, parametry SEO (tytuł, opis, słowa kluczowe) do layoutu, stworzymy strukturę bazy danych do aktualności oraz napiszemy podstawowe klasy. Poniżej załączam link do repozytorium Github, na którym będę zamieszczał zmiany w naszej aplikacji analogicznie do nowych wpisów.

 

Programista, administrator - miłośnik nowych technologii. Jak każdy fachowiec w branży nie oprę się porannej kawie w towarzystwie świeżej prasy. Hobbystycznie fotografuję, psuję, naprawiam, lutuję. Czego nie lubię? Nieskromnych ludzi i brzydkiego kodu.

  • Filip

    Dzięki temu poradnikowi w końcu zrozumiałem ideę obiektowego programowania. Dziękuję.

    Nie mogę się doczekać kolejnego wpisu! 🙂

    • sbl

      Cieszy mnie to bardzo. W najbliższym artykule zagadnienia związane z aktualnościami ale zanim to napiszemy najpierw Railsy 🙂

    • Potfur

      To jeszcze nie jest obiektowe.

      • Filip

        jak to nie? może powiesz, że to jest strukturalnie? class,pub. func? ftw?

        • Potfur

          Używanie obiektów != programowanie obiektowe.

          • sbl

            No już nie przesadzaj 🙂 To ma być HOW-TO dla początkujących, którzy chcą zrozumieć zasadę działania frameworka i MVC. Nie będziemy przecież pisać nowego frameworka by pokazać pełne oblicze OOP. Swoją drogą, sam możesz coś napisać dla innych 🙂

          • Potfur

            Przecież ja how-to nie krytykuję, odniosłem się jedynie do „zrozumiałem ideę obiektowego programowania” i tyle.
            Przecież pisuję 🙂

          • sbl

            Ale napisz coś z OOP 😛
            Opisz swój potfurowy framework 🙂

          • Potfur

            Od ponad roku się zbieram do napisania czegoś z OOP, zebrać się nie mogę – tyle ciekawszych tematów się przewinęło 🙂

            Możliwe że opiszę, jak opiszę inne rzeczy 🙂

  • Zamiast programować samemu Application_Controller, można po prostu rozszerzyć klasę o Controller_Template, który wykonuje identyczną pracę. Wtedy trzeba w zmiennej $template ustalić ścieżkę do widoku a następne w akcjach pisać $this->template->content = View::factory(‚blahblahblah’);

    • sbl

      Celowo zbudowałem Application_Controller ponieważ będzie on zawierał o wiele więcej elementów z biegiem nowych artykułów. Standardowy Controller_Template nic tutaj nie da bo on mi co najwyżej pozwoli na ustalenie layoutu globalnego ale już nie zmapuje plików widoków analogicznie do ścieżki nazw.

  • Daniel
  • QQ

    Przydało by mi się coś o walidacji formularzy z wysyłaniem plików. Mogę się spodziewać czegoś na ten temat w najbliższej przyszłości?

    • sbl

      Tak, niebawem będzie chociażby formularz rejestracji konta użytkownika wraz z uploadem avataru. Więc tam wyjaśnię jak do tego podchodzić, jak walidować i jak składować dane.

  • martin

    Jak myślicie, w czym może być problem? Pobrałem pliki z githuba więc nic nie pominałem, nic nie zmieniłem, a jednak mimo to przy pobieraniu danych z bazy, gubi mi polskie znaki 🙁

    Działają polskie fonty w menu, ale w tytule strony już nie.
    W bazie ustawione utf8, w configu db utf8, w bootstrap utf8.

    • sbl

      Jaki masz system operacyjny? Wstaw też screen z phpmyadmina na widok tabeli. Odezwij się na mail i wyślij screen w załączniku: sbl(małpa)webmastah.pl

  • Łukasz

    Ciągle wyskakuje mi błąd 404, nie mam pojęcia co mogłem zrobić nie tak skoro leciałem dokładnie z tutka…

    • unbreak

      Jest błąd. url ma kim-jestem a w bazie page ma sluga == kim-jestesmy.

  • przeqpiciel

    ktoś mógłby dopisać w jaki sposób w kontrolerze ustawić zmienną, która by była dostępna w widoku ?

    • er

      powinno być na odwrót. jak tak robisz to robisz to źle.

  • Kuba

    Pytanie może głupie ale dopiero zaczynam zabawę z framework…

    Jak mogę osadzić kod PHP na podstronie dodawanej w bazie danych?

Send this to friend

webmastah.weekly
Cotygodniowa porcja linków ze świata WEBDEV BEZ spamu, TYLKO samo mięcho!
Zobacz poprzednie wydania. Dołącz do 2 tysięcy webdeveloperów!
HTML5, CSS3, JS (React, Angular, Ember, Vue), PHP, SQL