在页面中使用相同的视图

时间:2014-11-08 15:27:42

标签: php templates

我正在为我的项目用PHP创建一个微MVC框架。实际上它只是VC,我没有使用模型,而是在控制器中执行所有逻辑(包括从mongodb获取数据)。

我有一个带有函数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);

现在,我的问题是我想在很多页面上使用这些视图,但是例如headersidebar需要他们自己的逻辑(PHP代码)。如何在不将侧栏的php代码复制到呈现视图sidebar的每个控制器和方法的情况下实现此目的?

1 个答案:

答案 0 :(得分: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'
        ));
     }
}