【问题标题】:PHP Frameworks - Layout Dynamic Menu [closed]PHP 框架 - 布局动态菜单 [关闭]
【发布时间】:2009-07-24 21:11:54
【问题描述】:

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

我正在寻找一个可以简单地做到这一点而无需大量黑客攻击的框架,因为从我的角度来看,这应该很容易实现。

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

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

感谢任何帮助。

谢谢你,
-本

【问题讨论】:

    标签: php zend-framework cakephp codeigniter symfony1


    【解决方案1】:

    Symfony 可以使用各种概念来满足您的需求。

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

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

    Symfony documentation 对此有完整的解释。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        【解决方案4】:

        可以在控制器中使用 actionStack:

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            Smarty 或Tempalte lite

            【讨论】:

              【解决方案7】:

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

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

              【讨论】:

              • 这将如何适应 mvc 模式,所以我不会将它放在每个视图中?在布局中?感谢您的回复。
              • 是的,布局是放置它的最佳位置。
              • 谢谢,这正是我需要知道的!
              • 你知道如何在 CodeIgniter 中做到这一点吗?
              • 抱歉,从未使用过 CodeIgniter。正如我所说,在每个框架中都有一种方法可以做到这一点,所以不要担心。根据您肯定拥有的所有其他要求,首先选择您最喜欢的框架,然后找出在您选择的框架中执行此操作的最佳方法。
              【解决方案8】:

              在 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

              【讨论】:

              • 这几乎正是我正在寻找的!我唯一的问题是因为我需要与模型交互(从数据库中提取菜单)并且我会输出 HTML 这不违反 MVC 吗?有没有办法在 MVC 之后做到这一点?谢谢!
              • 我倾向于将这样的“孤岛”视为一个包,但我想你可以使用 partials 来完成这一点,并使用 helpers 仅从模型中加载数据。
              • 您可以使用 BaseController 类扩展 Zend_Controller 并在 predispatch() 中填充模型查询,如 $this->view->layoutMenu = array(...);在助手中,您可以获得 $menu = $this->_view->layoutMenu 或通过调用参数 $this->menu($this->layoutMenu); 推送它
              • 如果不是 KISS 我不会这样做,即使它“强制”了某种设计模式。
              【解决方案9】:

              在 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; ?>
              

              【讨论】:

              • 感谢您的回复。我的问题是如何做到这一点并将其设置为使用菜单控制器和菜单视图,并且与广告相同?我读过这个,但我不完全理解,因为我是 Zend 的新手。你能用例子解释吗?谢谢!
              • 我发布的解决方案实际上是不完整的。我忘记了我必须创建一个控制器插件来实际调用每个请求的各个操作。有关一个很好的示例和解释,请查看 Rob Allen 的 Zend Framework in Action,地址为manning.com/allen。获取源代码并查看第 4 章,它涵盖了您正在尝试做的事情以及我最初学习该技术的地方。
              【解决方案10】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-12-28
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-07-16
                • 1970-01-01
                • 2013-04-03
                • 2010-10-31
                相关资源
                最近更新 更多