【问题标题】:What are your templating strategies? [closed]你的模板策略是什么? [关闭]
【发布时间】:2009-12-22 19:47:21
【问题描述】:

我尝试开发自己的小框架。为此,我想阅读一些模板技术。我知道模板是一个非常复杂的话题,但是了解一些策略可以帮助找到正确的策略。

如果你提到一个,请不要只写“smarty”。写一点它背后的概念。

让我从一个想法开始:为了简单起见,我的模板文件只是包含 HTML 的 PHP 文件。模板可能包括其他模板。数据通过 $data 变量插入到模板中,该变量是一个关联数组,包含模板的所有数据。

因此,在第一阶段,控制器执行一些操作并构建 $data 数组。接下来,将包含适当的模板。

问题:模板可能不仅要包含模板,还要包含控制器。即显示面包屑或菜单(背后有相当复杂的逻辑,太复杂而无法在模板中处理)。

【问题讨论】:

标签: php design-patterns templates


【解决方案1】:

查看Web Presentation Patterns 部分,尤其是Template ViewTransform ViewTwo-Step View。对于渲染面包屑或分页等内容,您可以使用View Helper pattern

【讨论】:

    【解决方案2】:

    我真的很喜欢 zend-framework 方法,并且我自己在我们的框架中使用了它。 您将拥有一个视图类,其中包含以下内容:

    $view = new View();
    $view->setTemplatesPath('.....');
    $view->assign('name','value');
    $view->render('index');
    

    render 方法将获取所有存储的变量并将它们设为属性并包含基于路径集的模板,因此在您的模板中您将拥有:

    <?php echo $this->foo; ?>
    ....
    <?php echo $this->load('header'); // this includes another template ?>
    

    【讨论】:

    • 他已经以类似的方式这样做了,他想要的与此无关。
    【解决方案3】:

    这正是我的做法,而不是在视图中调用控制器 (WHAT?!?) 我只是为调用视图的控制器中的视图计算所有必要的数据第一名。

    视图不应该调用控制器/模型!但是,如果你必须这样做,你可以这样做:

    function Controller($pathToControler) // instantiates and returns the Controller
    function Model($pathToModel) // instantiates and returns the Model
    

    这样,在您的视图中,您可以执行以下操作:

    $this->Controller('path/to/blog/tags.php')->List();
    

    同样,你不应该使用这种模式,我只是给你解决方案,而不是鼓励他们。

    同样,你也可以从一个视图中调用另一个视图,像这样:

    $this->View('path/to/views/header.php', array('title' => 'Hello World!'));
    

    【讨论】:

    • 没有理由,为什么不应该允许视图调用模型,只要它不改变模型的状态。出于同样的原因,您可以从视图中调用控制器,例如,聚合来自多个控制器操作的输出,从而促进代码的重用。
    • @Gordon:是的,当然。但这不是 MVC 模式应该运行的方式。
    • 嗯,声称 MVC 从来没有应该以这种方式运行有点奇怪,因为它根本没有考虑到 Web。该模式可以追溯到 1979 年。如果有的话,那么 supposed way 绝对不是今天每个人都使用 MVC 的方式。通过 HTTP 从 Browser 到 FrontController 到 Controller 到 Model 并返回到创建和设置全新 View 的 Controller 的整个过程(而不是 Model 通知 View 中的更改和 View 更新本身)不是原始的一部分MVC 概念。
    • 我不理解否决票,但这是 的想法:顾名思义,视图应该呈现模型的输出,而控制器是应该得到输入并在模型上使用它。您基本上是说 View 可以完成 Controller 工作,并且 View 直接调用 Model 也可以;所以我问,为什么是 MVCMV 似乎也能胜任,让我们放下一切,坚持使用 V
    • 没有。我没有说将请求处理放入 V 中,也没有说将 M 逻辑放入 V 中。我说可以从 V 中调用 M 和 C,如果需要渲染 M。这就是重点。这样做不会违反关注点分离,也不会产生额外的依赖关系。
    【解决方案4】:

    我的策略如下:

    1. 尝试在模板中使用最少的 PHP,如果可能的话,尽量不用。
    2. 我为网页中常见的各种组件创建了类,其中之一是 tpanel,我用它来演示 下面的概念
    3. 例如,tpanel 将处理创建菜单的所有逻辑,解析“navigation_menu”的小模板并将最终包含的结果发送到整个模板。

    实际上,我正在创建“块”,与 Drupal 所做的非常相似——如果您熟悉的话。

            $this->load->library('tpanel');
            $s=$this->tpanel->get('date',$data);
            $s.=$this->tpanel->get('navigation_menu',$data);
            $s.=$this->tpanel->get('ajax_menu',$data);
            $s.=$this->tpanel->get('spacer',$data);
            $data['title']='List of Databases';
            $post=$this->uri->segment(5);
            $blog=(file_get_contents('../'.$dir.'/'.$post.'.dat'));
            $s.=markdown($blog);
            $data['content']=$s;
            $view='/admin/admin_simple_view';
    

    系统比我上面展示的要灵活得多。例如,tpanel-&gt;get('ajax_menu, $data) 也使用 jQuery 处理脚本设置。

    我最近也在研究 Django,他们对模板有一些非常好的想法。即使您不是 Python 程序员,也可能值得一看,尤其是他们如何处理继承。

    【讨论】:

      【解决方案5】:

      这与您的问题没有直接关系,但您是否考虑过客户端模板? John Resig 在 Javascript 中有一个很好的micro-template,可以与 Web 服务和其他 Ajax 技术一起使用。为模板执行 get 或 post 非常简单,然后为您的数据执行另一个 get/post。这很方便。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-03
        • 2018-02-25
        • 1970-01-01
        • 2011-12-08
        • 2010-09-30
        • 2011-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多