Прєдісловіє

Дарагой друг! В цих статтях я розкажу тобі як зробить чоткій блог на чотком язику PHP. Розказувать буду просто, шоб всьо було понятно. Ну шо, паєхалі?

Сістємні трєбованія

Нехай у нас є який-небудь самий стандартний, простий, перший блог на PHP. Така собі кучка файлів для созданія постов, списка постов, перегляду оддєльного поста, реєстрації, логіна і логаута, камєнтіруванія… Просто купа файлів. В цих файлах у нас і HTML, і PHP код.

Приблизно це виглядить отак:

нечотка файлова структура.

І дуже-дуже нада знать CSS, HTML, ООП в PHP і потом, може, JavaScript і jQuery.

Перед началом роботи краще привести в порядок HTML і CSS - розбити всьо красіво по папочкам (CSS - оддєльно, рісунки - оддєльно, PHP-файли - оддєльно); убрать з HTML всі атрібути style="...", всюди пороздававши класи елементам; пообертать атрібути в кавички (height="15px", а не height=15px) і так далєє. Шоб ще прощє було потом читать код.

Чистим HTML код

Першим ділом ми будем умєньшать кількість кода, шо є в нашом блогє. В народі це називається принцип DRY, Don’t Repeat Yourself. Розшифровується воно як пацани не повторяють. В RubyOnRails і других крутих штуках шось подобне реалізовано так, шоб весь HTML-код і PHP-код (ну або там Ruby-код, Python-код, будь-який-язик-программіруванія-код) були оддєльно, ну або хотя би по мінімуму PHP і по максімуму HTML.

Тоість, єсть такі штуки, які називаються View і єсть такі штуки які називаються Controller. Так от, в View - у нас чисто виводиться інформація, форматірується з помощю HTML, а чучуть кода все ще є для всяких циклов, іфов або визовов методов Helper‘ов (якшо нада хітро вивести шось - ссилку, напрімєр, на пост або на удалєніє поста - шоб самому не писати весь адрєс ссилки - можна воспользоватись допоміжним мєтодом; од того і Helper). А в Controller - весь PHP код, який получає дані з бази даних, методи-Helpers, і вобщє нема HTML кода.

Виглядить це якось отако: якшо у нас було

нечоткий код index.php

то має стати

чоткий код index.php

Так шо першим ділом ми будем убирать з нашого HTML весь лишній PHP код. Да, і желатєльно заранєє договоритись шо до цього момєнта HTML має бути подчищений от лишнього CSS - як мінімум всі style="css-code" замінить на class="class-name". Шоб простіше було орієнтіруватись в коді.

Перший кантроллєр

Давай попробуєм зробить сначала контроллєр для странічки index.php, в якій отображаються всі пости. По старой, доброй традіції, ми зробим оддєльний файл з классом і подключим його зверху index.php через require_once().

Якшо ти помниш ООП, то у классов є такій магічний мєтод як конструктор. Так вот, в ньому ми будем робити круту таку штуку як загрузку даних (із бази, із сесії, із куков) в пєрємєнні, які потом будем іспользовать.

Напрімєр, якшо ми перероблюємо список постінгов, то нам нада масив всіх наших постів з бази взять. Якшо нам там же треба пользоватєль, який залогінений - нам із сесії треба його взять. Або рішить, шо його нема.

Виглядить це буде отако:

require('connect.php');

class PostingsController {
    var $postings, $user;

    function __construct() {
        // получаєм з бази пости
        $res = mysql_query("SELECT * FROM postings");

        $this->postings = array();

        while ($row = mysql_fetch_assoc($res)) {
            $this->postings[] = $row;
        }

        // берем із сесії пользоватєля
        if (isset($_SESSION['user'])) {
            $this->user = $_SESSION['user'];
        } else {
            $this->user = null;
        }
    }
};

Давай зразу робить чотку структуру файлов. Зробим папку controllers і туди будем сохранять контроллєри в файлах ***_controller.php. Тоість, наш оцей клас ми положим в файл controllers/PostingsController.php.

Тепер в файлі index.php в самом верху, де у нас раньше подключалась база даних і прочі штуки, у нас буде тільки require() цього контроллєра. Но поки у нас архітєктура не дуже крута, то ще одну строчку прийдеться добавить:

require_once('controllers/PostingsController.php');

$controller = new PostingsController();

І тепер всі оці while ($posting = mysql_fetch_assoc($res)) { ... } можна замінить на foreach ($controller->postings as $posting) { ... }, а $_SESSION['user'] - на $controller->user. І це кручє, бо ми можем юзера і в базі тримать, і ще невідомо де. Ну а постінги - так вроді прощє іспользувать.

Перший хелпєр

А тепер давай ще додамо перший метод, який упростить жизнь і покаже мощь архітєктури. Він нам помогатиме формірувать URL до постінга. Це шось тіпа:

<a href="view.php?id=<?php echo $posting['id'] ?>">...</a>

буде замінений на

<a href="<?php echo $controller->viewPostingUrl($posting) ?>">...</a>

Согласись, якшо внезапно поміняється путь до файла, який буде отвічать за просмотр поста, то в першому случаї прийдеться багато де мінять цю строчку, а в другому случаї - тільки в кантроллєрі.

Отак, у нас цей метод буде принімать масів і вертать строчку… Зробим його пока шо простим:

public function viewPostingUrl($posting) {
    $id = $posting['id'];
    return "view.php?id=$id";
}

Домашнєє заданіє

Попробуй зробити всякі другі хелпери - для ссилок на удалєніє постов, на редактіруваніє, і прочі.