<rmcreative>

RSS

MVC: View

25 января 2010

Многие обожествляют MVC и думают, что если не использовать какой-нибудь фреймворк, View реализовать очень сложно. А уж тем более с поддержкой layout-а и возможностью использовать вложенные шаблоны. На самом деле это совсем не так.

// Путь до папки с шаблонами
define('VIEWS_BASEDIR', dirname(__FILE__).'/views/');
 
class View {
    // получить отрендеренный шаблон с параметрами $params
    function fetchPartial($template, $params = array()){
        extract($params);
        ob_start();
        include VIEWS_BASEDIR.$template.'.php';
        return ob_get_clean();
    }
 
    // вывести отрендеренный шаблон с параметрами $params
    function renderPartial($template, $params = array()){
        echo $this->fetchPartial($template, $params);
    }
 
    // получить отрендеренный в переменную $content layout-а
    // шаблон с параметрами $params
    function fetch($template, $params = array()){
        $content = $this->fetchPartial($template, $params);
        return $this->fetchPartial('layout', array('content' => $content));
    }
 
    // вывести отрендеренный в переменную $content layout-а
    // шаблон с параметрами $params    
    function render($template, $params = array()){
        echo $this->fetch($template, $params);
    }
}

Даже с таким минимальным кодом работать уже довольно удобно:

$view = new View();
$posts = get_posts();
$view->render('postList', array('posts' => $posts));

layout.php

<!doctype html>
<html>
<head>
  <meta charset="utf-8" />
  <title>Мой суперпроект</title>
</head>
<body>
  <h1>Мой суперпроект</h1>
  <?=$content?>
</body>

postList.php

<ul>
<?foreach($posts as $post):?>
  <li><?=$post['title']?></li>
<?endforeach?>
</ul>

Комментарии RSS

  1. №2193
    Dr.Death
    Dr.Death 25 янв. 2010 г., 23:05:20

    отлично! уже применил :D

  2. №2194
    Neyronius
    Neyronius 25 янв. 2010 г., 23:09:14

    Как-то стиль Yii очень напоминает :-)

    Не спорю очень удобно. Сам часто так делаю.

    Вообще, достаточно функциональный шаблон MVC реализуется очень просто.

    Сложнее всего дела обстоят с Front Controller и определения соответствия между URL и парой action/controller.

  3. №2198
    Ekstazi
    Ekstazi 26 янв. 2010 г., 14:36:50

    Вот вот, еще бы статейку про создание контролеров!

  4. №2207
    Nayjest
    Nayjest 28 янв. 2010 г., 1:16:33

    Боян, аналогичный код 100 раз везде обсасывался

  5. №2234
    cooper
    cooper 08 февр. 2010 г., 10:58:41

    Действительно, очень уж на yiiпохоже. Мне кажется, интереснее было бы если вы описали свою реализацию url manager'а из того же yii. То есть как из

    array(
        'posts'=>'post/list',
        'post/<id:d+>'=>'post/read',
        'post/<year:d{4}>/&lt;title&gt;'=>'post/read',
    )

    собирать и разбирать урлы. Этот момент нигде в интернете не описан( А способ очень удобный. Заранее спасибо =)

  6. №2587
    vredniy
    vredniy 25 мая 2010 г., 23:09:25

    Очень интересно, недавно сам начал изучить только фреймворки, спасибо.

  7. №2781
    Papandopulos
    Papandopulos 26 июля 2010 г., 14:15:00

    Гут

  8. №6112
    nomn
    nomn 04 апр. 2012 г., 13:50:27

    Полезненько!

  9. №9728
    dasknix
    dasknix 30 марта 2015 г., 19:46:22

    Спасибо, наглядно, искал именно это) Опечатка через весь пост тащится - "отренедеренный", нужно "отрендеренный", иначе путает очень.

    Спасибо за статью.

  10. №9729
    Sam
    Sam 30 марта 2015 г., 23:08:14

    Поправил опечатку. Спасибо.

  11. №11094
    Олег
    Олег 08 окт. 2017 г., 15:39:03

    Непонятно пишете, как 80% авторов. Упускаете много нюансов, для понимания. Не понял ничего.

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.