我尝试开发自己的小框架。为此,我想阅读一些模板技巧。我知道模板是一个非常复杂的主题,但了解一些策略可以帮助找到合适的策略。
如果你提到一个,请不要只写“聪明”。写一下它背后的概念。
让我先从一个想法开始:为简单起见,我的模板文件只是包含HTML的PHP文件。模板可能包含其他模板。数据通过$ data变量插入到模板中,$ data变量是一个包含模板所有数据的关联数组。
因此,在第一阶段,控制器执行一些操作并构建$ data数组。接下来,将包含适当的模板。
问题:模板可能不仅要包含模板,还要包含控制器。即显示面包屑或菜单(背后有相当复杂的逻辑,太复杂而无法在模板中处理)。
答案 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 View,Transform View,Two-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)
我的策略如下:
实际上我正在创建'块',非常类似于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。它非常方便。