2015-08-30 51 views
1

我认为这应该有一个非常简单的解释,但我仍然在学习无脂框架(F3):如何仅渲染页眉和页脚一次并切换出内容代码为选定的路线?我有这样的代码:在无脂框架中加载布局

$f3->route('GET /', 
    function($f3) { 
    $f3->set('content','views/welcome.htm'); 
    $f3->set('page_head', 'Welcome'); 
    } 
); 

如果我加入这一行:

echo View::instance()->render('layouts/header+footer.htm'); 

无论是在路线或$f3->run();后index.php文件的末尾f3->set电话后,整个页面刷新路线变化。我不能在路由代码之前调用上面的echo行,而不会在内容框中引发错误。

有什么办法可以禁用页面刷新?它是否被刷新,因为我的链接被浏览器解释为单独的页面?谢谢你的帮助!

回答

2

你的问题有点朦胧。但我会尽力以我理解的方式回答。 首先你index.php

$f3->route('GET /', 
    function($f3) { 
    $f3->set('content','views/welcome.htm'); 
    $f3->set('page_head', 'Welcome'); 
    echo Template::instance()->render('layouts/header+footer.htm'); 
    } 
); 
$f3->run(); 

在你header+footer.htm

<!DOCTYPE html> 
<html> 
<head lang="en"> 
    <meta charset="UTF-8"> 
    <title>{{@page_head}}</title> 
</head> 
<body> 
<include href="{{@content}}"/> 
</body> 
</html> 

views/welcome.htm可以包含任何数据。

<h1>Welcome</h1> 
<p>You have arrived to the welcome page</p> 

请记住文件夹viewslayouts应在UI文件夹

$f3->set('UI','ui/'); 

您的评论: 您可以从$f3->get('PARAMS')访问请求params中,你可以做到这一点。

$f3->route('GET /@page', 
     function($f3,$params) { 
     $page = $params['page']; 
     $f3->set('content','views/'. $page .'.htm'); 
     $f3->set('page_head', 'Welcome'); 
     echo Template::instance()->render('layouts/header+footer.htm'); 
     } 
    ); 

这应该工作

+0

所以我曾经有。问题是,假设我有4条其他路线,并且它们在导航中链接,任何时候我点击不同的路线,比如说一个URL为“/ information”,整个页面刷新,包括导航。当'f3-> set('content','views/information.htm')'被切换出来时,导航是否只能加载一次?导航能否在路线上保持不变? – ArtlyticalMedia

+0

我的改进答案是否对此进行排序? 如果你想要一个单一的页面应用程序,你可能必须使用像AngularJs这样的javascript框架:这里有一个例子https://scotch.io/tutorials/single-page-apps-with-angularjs-routing-and-templating –

0

也许会不差地创建自己的视图的实例,并延长主用类似PHPTAL过滤器的功能。然后,您可以在postFilter中的preFilter和Footer中设置Header,并扩展render()函数。扩展的render()将为您呈现所有内容,包括页眉,页脚和正文内容。

我没有亲自反对FatFree View的任何内容,但会建议PHPTal作为模板引擎 - 这里简单的实现https://github.com/creoLIFE/FatFree-PHPTAL,包括从单独文件提供的Header/Footer。