你的模板策略是什么?

时间:2009-12-22 19:47:21

标签: php design-patterns templates

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

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

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

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

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

5 个答案:

答案 0 :(得分:3)

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

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

render方法将获取存储的所有变量并使其成为属性,并根据Path集包含模板,因此在模板中您将拥有:

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

我正是这样做的,而不是在视图中调用Controller( WHAT?!?)我只是在Controller中调用视图的所有必要数据来调用View in第一名。

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

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!'));

答案 3 :(得分:0)

我的策略如下:

  1. 在模板中尝试使用最少的PHP,如果可能的话,尽量少用。
  2. 我为网页中常见的各种组件创建了类,其中一个是 tpanel ,我用它来演示
  3. 的概念 例如,
  4. tpanel将处理创建菜单的所有逻辑,为“navigation_menu”解析一个小模板,并将结果发送给整个模板。
  5. 实际上我正在创建'块',非常类似于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->get('ajax_menu, $data)也使用jQuery处理脚本设置。

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

答案 4 :(得分:0)

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