используя один и тот же вид на страницах

0

Я создаю структуру микро MVC в PHP для моего проекта. На самом деле это только VC, я не использую модели, вместо этого я выполняю всю логику контроллера (включая получение данных от mongodb).

У меня есть основной класс Controller с функцией renderView(...) (которая выполняет некоторые проверки, извлекает массив данных в переменные и просто вызывает include() для каждого представления), и все контроллеры расширяют этот класс.

Также я написал свой собственный URL-маршрутизатор, где я могу указать, какой URL-адрес будет вызывать тот метод, с какого контроллера. Например:

/          -> Home::index()
/users/:id -> Users::showProfilePage($id)
/settings  -> Users::showSettings()

и т.п.

Почти во всех методах я загружаю те же взгляды:

$this->renderView("header", "sidebar", <main view for the current page>, "footer", $data);

Теперь моя проблема в том, что я хочу использовать эти представления на большом количестве страниц, но, например, для header и sidebar нужна их собственная логика (PHP-код). Как я могу достичь этого, не копируя php-код для боковой панели для каждого контроллера и метода, который отображает sidebar вида?

Теги:
templates

1 ответ

0
Лучший ответ

То, что вы действительно ищете, - это управление повторяющимися блоками шаблонов. Идея управления блоками довольно проста: вы определяете $blockName => $blockPath а затем juse используете ее внутри других шаблонов.

Например, вы можете определить массив, подобный этому:

$blocks = array(
  'footer' => __THEME_DIR__ . '/blocks/footer.phtml',
  'head'   => __THEME_DIR__ . '/block/header.phtnk'
);

И затем используйте внутри других шаблонов, так же, как:

<!DOCTYPE HTML>
<html>

<?php $this->loadBlock('head'); ?>

<body>
  <main>
    ...
  </main>
  <?php $this->loadBlock('footer'); ?>
</body>

</html>

Это подход. Но прежде чем вы даже начнете, вам нужно настроить эти блоки для всех так называемых c Прежде всего, вам нужно избегать определения этого массива $blocks в каждом контроллере. Чтобы решить эту проблему, вы можете просто написать abstract контроллер, где вы определяете $blocks только один раз, а потом все потомки наследуют его.

Например,

<?php

abstract class AppPresenter extends FrameworkPresenter
{
     public function __construct()
     {
         $this->view->registerBlocks(array(
              'header' => '....'
         ));
     }
}

class UserPresenter extends AppPresenter
{
     public function indexAction()
     {
        return $this->view->render('/index.phtml', array(
           'var' => 'val'
        ));
     }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню