PHP框架 - 布局动态菜单

时间:2009-07-24 21:11:54

标签: php zend-framework cakephp codeigniter symfony1

我正在使用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>

我正在寻找一个可以在没有大量黑客的情况下做到这一点的框架,因为从我的角度来看这应该很容易实现。

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

也许这很简单,我只是走错路?

感谢任何帮助。

谢谢你,
-ben

10 个答案:

答案 0 :(得分:2)

Symfony可以使用各种概念来实现您的目标。

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

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

Symfony documentation对此有完整的解释。

答案 1 :(得分:2)

实际上,使用Zend Framework,你想要在这里实现的目标与你已经完全没有什么偏差。

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

对于广告,您只需使用占位符视图助手,您就可以再次使用Front Controller插件来填充它。使用插件的优势在于,计算展示次数和轮播广告的逻辑与您的操作保持独立,并且可以轻松地在每个操作中执行其任务。

dustin.cassiday使用动作堆栈的方法存在风险,并且可能导致大量的头痛调试您的应用程序。由于Zend_Navigation

,Itay Moav的方法现在非常多余

答案 2 :(得分:1)

您提到的每个PHP库都具有模板功能,可以完成您的需求。

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

答案 3 :(得分:1)

控制器中的actionStack可以实现:

$this->_helper->actionStack('menu','index');
$this->_helper->actionStack('ads','index');

答案 4 :(得分:0)

你可能不像模板引擎那样寻找框架。试试Smarty

答案 5 :(得分:0)

Smarty或Tempalte lite

答案 6 :(得分:0)

在Cake中你可以把它放在你刚刚通过

包含的元素中
echo $this->element('menu');

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

// 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
}

关键是,有一些方法可以做到这一点,但这取决于您使用的框架以及您需要完成的内容。在任何框架中都应该做得相当简单,你选择的框架/模板引擎不应该依赖于这个小功能。

答案 7 :(得分: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.........>";
   }
}

还有一种方法可以产生您给出的语法。不熟悉这种方式,try this link

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

等...

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

<?= $this->layout()->menu; ?>
<?= $this->layout()->ads; ?>

答案 9 :(得分:0)

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