如何仅使用Zend Framework进行布局?

And*_*rew 4 php model-view-controller layout zend-framework

我最近接受了一个项目的帮助,该项目由个人HTML文件组成,但PHP联系表单除外.因此,甚至没有一丝面向对象的编程,MVC或布局(甚至是PHP).

该项目非常庞大,但我想慢慢将Zend Framework集成到这个项目中,主要是为了开始使用布局.有太多的冗余,以至于浪费时间来进行应该在一个文件中进行的小更新.

在PHP的早期阶段,您可以通过在每个页面中包含它们来分隔内容块(例如页眉和页脚).现在,使用像Zend Framework这样的MVC框架,您可以使用视图助手创建包含单个页面内容(视图)的布局文件.我真的很喜欢这个,因为这意味着我只需要在一个地方"包含"我的页眉或页脚.

但是,我不确定如果没有调度/引导应用程序(即使用Zend Framework MVC组件作为独立组件),这将如何工作.将网站切换为使用布局的最佳方法是什么?它会如何工作?这甚至是个好主意吗?

che*_*rtz 9

我最近开始转换mish-mash文件结构*以利用ZF的布局和视图.目标是将包含html的所有文件移动到布局和视图的推荐文件结构中.这是如何准备它:

  1. 从每个文件中提取所有标记,将变量保留在其中但没有逻辑.将此文件命名为/ application/views/scripts/page/view .phtml(例如/application/views/scripts/index/login.phtml)
  2. 创建一个适合大多数页面的框架作为/ application/layouts/scripts/layout .phtml,并让它包含如下内容:

    <?php echo $this->doctype('XHTML1_STRICT'); ?>
    <html>
    <head>
        <?php echo $this->headLink(); ?>
    </head>
    <body>
        <div id="wrapper">
        <?php echo $this->layout()->content; ?>
        </div>
    </body>
    </html>
    
    Run Code Online (Sandbox Code Playgroud)
  3. (将Zend添加到包含路径并注册其自动加载器.)创建一个将包含在所有文件中的文件(除非您有一个单独的入口点,在这种情况下 - 将其放在那里!)创建对布局的引用,相当于:

    $view = new Zend_View();
    $view->setScriptPath('/application/views/scripts');
    
    $layout = new Zend_Layout();
    $layout->setLayoutPath('/application/layouts/scripts');
    $layout->setView($view);
    
    Zend_Registry::getInstance()->set('layout', $layout);
    
    Run Code Online (Sandbox Code Playgroud)
  4. 你剩下的每个php文件(带有逻辑,而不是html)都需要访问布局并修改它:

    $layout = Zend_Registry::getInstance()->get('layout');
    
    $view = $layout->getView();
    $view->headLink()->appendStylesheet('/css/a_css_file.css');
    
    // most important step, done automatically when using MVC, but now you have to do it manually
    $layout->content = $view->render('index/login.phtml');
    
    echo $layout->render();
    
    Run Code Online (Sandbox Code Playgroud)
  5. 最重要的下一步是添加另一个布局:

    // /application/layouts/scripts/blank.phtml
    <?php echo $this->doctype('XHTML1_STRICT'); ?>
    <html>
        <head></head>
        <body>
            <?php echo $this->layout()->content; ?>
        </body>
    </html>
    
    Run Code Online (Sandbox Code Playgroud)

    在你的一个逻辑文件中

    $layout = Zend_Registry::getInstance()->get('layout');
    $layout->setLayout('blank');
    
    Run Code Online (Sandbox Code Playgroud)

理想情况下,在不久的将来,您可以通过查看像Front Controller这样的设计模式来开始适应类似MVC的结构.

*一个文件:模型,控制器,html,没有逻辑顺序.


Dav*_*unt 6

你当然可以单独使用Zend_Layout,它在手册中有详细说明:

28.2.3.使用Zend_Layout作为独立组件

我相信您需要通过输出缓冲捕获脚本的输出,并将其传递给要回显的布局.

这种情况并不理想,如果没有转向完整的MVC,我可能会建议使用不同的基本模板系统或遵循其他评论中的建议.