3

我正在用 PHP 开发一个网站,我想使用一个 mvc 框架来做到这一点,因为我想获得 PHP 框架的经验。

我查看了 Zend、CakePHP 和 CodeIgniter,但我还没有找到一种直观的方法来实现这一点。

我需要做的是创建一个布局,例如:

<html>
<head>
<!--scripts go here-->
</head>
<body>
<div id='banner'></div>
<div id='menu'><?php $this->layout()->menu ?></div>
<div id='container'><?php $this->layout()->content ?></div>
<div id='ads'><?php $this->layout()->ads ?>
<div id='footer'>blah</div>
</body>
</html>

我正在寻找一个框架,可以简单地做到这一点而没有很多黑客,因为从我的角度来看,这应该很容易完成。

这将从单独的控制器和视图中提取菜单、内容和广告,当然是动态内容。我不想将菜单代码放入每个视图中......

也许这很简单,我只是以错误的方式去做?

任何帮助表示赞赏。

谢谢你,
-本

4

10 回答 10

2

Symfony 可以使用混合概念来完成您正在寻找的事情。

  • 布局 - 这是用于装饰页面的主要结构。
  • 模板 - 这是控制器附加到 URL 的主视图。
  • 片段 - 轻量级并使用您传递给它的数据。
  • 组件 - 如果您需要访问模型,则使用它,代码分为表示和逻辑。
  • 插槽 - 用于替换布局的定义部分。

在您的情况下,布局将使用模板逻辑包含主要内容,这是视图层的核心,其他项目将是片段或组件,具体取决于它们需要访问多少模型。

Symfony 文档对此有完整的解释。

于 2009-07-25T09:43:47.360 回答
2

实际上,使用 Zend 框架,您可以在与您已经实现的目标几乎没有偏差的情况下完成您想要在这里实现的目标。

对于菜单,您可以使用Zend_Navigation,它允许您定义站点导航树,并创建简单的菜单。我发现Zend_Navigation在 Front Controller 插件中填充容器可以让您轻松缓存对象,因此您无需担心遍历站点树的性能问题,

对于广告,您只需使用占位符视图助手,您可以再次使用前端控制器插件来填充它。使用插件的优势在于,计算展示次数和轮播广告的逻辑与您的操作是分开的,并且可以轻松地在每个操作中执行其任务。

dustin.cassiday 使用动作堆栈的方法是有风险的,并且可能导致调试您的应用程序时非常头疼。Itay Moav 的方法现在真的是多余的,因为Zend_Navigation

于 2009-07-28T12:18:20.810 回答
1

您提到的每个 PHP 库都有模板,可以完成您需要的工作。

选择一个图书馆并掌握它。随着时间的推移,它会得到回报。像 Smarty 这样的模板引擎很好,但一个完整的框架提供了更多。

于 2009-07-24T21:32:09.657 回答
1

在控制器中使用 actionStack 是可能的:

$this->_helper->actionStack('menu','index');
$this->_helper->actionStack('ads','index');
于 2010-10-14T09:49:00.670 回答
0

您可能不是在寻找一个框架,而是一个模板引擎。试试Smarty

于 2009-07-24T21:14:00.490 回答
0

Smarty 或Tempalte lite

于 2009-07-24T21:15:33.607 回答
0

在 Cake 中,您可以将其放入您只需通过以下方式包含的元素中

echo $this->element('menu');

您可以根据需要使此元素变得复杂或简单。如果您需要它自动突出显示您所在页面的哪个部分,有几种方法。例如,在元素可以选择的每个控制器/动作中设置一个变量。

// Controller
$this->set('currentNode', 'homepage');

// Menu Element
if ($currentNode == 'homepage') {
    // add class 'selected' to menu item, or something like this
}

根据您的应用程序的复杂程度,您还可以使其完全独立。

// Menu Element
if ($this->controller == 'home') {
    // highlight this menu item, add extra sub-items, re-calibrate flux capacitor
}

关键是,当然有办法做到这一点,但这取决于你使用的框架以及你需要完成什么。在任何框架中都应该是微不足道的,并且您对框架/模板引擎的选择不应该依赖于这个小特性。

于 2009-07-25T02:17:50.737 回答
0

在 Zend Framework 中(我知道你提到的那些框架中唯一的一个),有几种方法可以实现这一点。我更喜欢 Helper 方式。
您的布局将如下所示:

<html>
<head>
<!--scripts go here-->
</head>
<body>
<div id='banner'></div>
<div id='menu'><?php $this->menu() ?></div>
<div id='container'><?php $this->layout()->content ?></div>
<div id='ads'><?php $this->ads() ?>
<div id='footer'>blah</div>
</body>
</html>

您将有两个视图助手:

class Zend_View_Helper_Menu{
   public function menu(){
       echo "<html.........>";
   }
}

class Zend_View_Helper_Ads{
   public function ads(){
       echo "<html.........>";
   }
}

还有一种方法可以产生您给出的语法。不熟悉这种方式,试试这个链接

于 2009-07-25T02:17:59.860 回答
0

在 Zend Framework 中,您可以通过设置 ViewRenderer 助手的 responseSegment 属性为布局的每个部分创建单独的操作和视图,如下所示:

class IndexController extends Zend_Controller_Action {

    public function menuAction() {

        //menu code goes here

        $this->_helper->viewRenderer->setResponseSegment('menu');
    }

    public function adsAction() {

        //ads code goes here

        $this->_helper->viewRenderer->setResponseSegment('ads');
    }
}

ETC...

然后,您可以完全按照您指定的方式在布局文件中调用它们:

<?= $this->layout()->menu; ?>
<?= $this->layout()->ads; ?>
于 2009-07-26T03:08:08.370 回答
0

在 DooPHP 框架中很容易,只需 <!-- include 'templatefilename' --> 在您的视图模板中使用。框架的视图部分非常灵活。网站 http://doophp.com/demos上有一个模板引擎演示

于 2009-07-26T10:22:35.403 回答