设为首页 收藏本站
查看: 789|回复: 0

[经验分享] 【PHP web 2.0 开发实践】2.9 Smarty 模板引擎

[复制链接]

尚未签到

发表于 2017-4-13 06:03:55 | 显示全部楼层 |阅读模式
  


事先声明一下,我几乎是跟着书上做的,不过书上的是phpweb20,我的目录是pyyweb,其他都一样。

在学到 的时候,出现了这种错误:
Zend_View_Exception: script 'news/index.phtml' not found in path (/xampp/htdocs/pyyweb/include/views\scripts/) in M:\xampp\htdocs\pyyweb\include\Zend\View\Abstract.php on line 980
路径:pyyweb/include/Controllers/NewsController.php 的内容为:
 

<?PHP
class NewsController extends Zend_Controller_Action//CustomControllerAction
{
public function indexAction()
{
require_once('Smarty/Smarty.class.php');
$articles = array('News Article 1',
'Another News Article',
'Even More News');
$smarty = new Smarty();
$smarty->template_dir = $config->paths->templates;
$smarty->compile_dir = $config->paths->data . '/tmp/templates_c';
$smarty->assign('news', 'hhhhh');
$smarty->display('news\index.tpl');
}
}
?>


这里的代码暂时找不出什么问题,于是只好按照它的错误提示,既然它说在 /xampp/htdocs/pyyweb/include/views\scripts/ 中没有news/index.phtml ,那就新建给它好了,暂时是这样吧:
路径:pyyweb/include/views/scripts/news/index.phtml 的内容为:
 

<h1>index.phtml in: pyyweb/include/views/scripts/news/</h1>

结果一刷新,又有新的错误了:



SmartyException: Unable to load template file 'news\index.tpl' in M:\xampp\htdocs\pyyweb\include\Smarty\sysplugins\smarty_internal_templatebase.php on line 127

又说没有文件?那好,再建一个不就行了!
路径:/pyyweb/templates/news/index.tpl 的内容为:
 

<h1>index.tpl in file: /pyyweb/templates/news/index.tpl</h1>


再刷新,惊喜地发现 ---- 还是那个错误!?于是接下来就是漫长的高试过程,echo 和 Xdebug 双管齐下,终于在悠悠暗无天日的调试岁月中发现了一丝曙光……
突然发现,这个文件中的 pyyweb/include/Controllers/NewsController.php 某个变量有点奇怪:$config。于是对比了一下 index.php 中的用法,果然是因为 $config 没有被预定义,只要在使用 $config 之前加一句 $config = Zend_Registry::get('config'); 就行了,修改之后的 index.php 内容如下。
路径:pyyweb/include/Controllers/NewsController.php 的内容为:
 

<?PHP
class NewsController extends CustomControllerAction
{
public function indexAction()
{
require_once('Smarty/Smarty.class.php');
$articles = array('News Article 1',
'Another News Article',
'Even More News');
$smarty = new Smarty();
$config = Zend_Registry::get('config');
$smarty->template_dir = $config->paths->templates;
$smarty->compile_dir = $config->paths->data . '/tmp/templates_c';
$smarty->assign('news', 'hhhhhhh');
$smarty->display('news\index.tpl');
}
}
?>

这样一下,再次刷新之后,终于正确显示了: 

index.phtml in: pyyweb/include/views/scripts/news/
index.tpl in file: /pyyweb/templates/news/index.tpl

问题一,为什么显示了 index.phtml 和 index.tpl 两个文件的内容呢?
Zend_Controller_Front 在收到 http://pyyweb/news 的要求时,会先按照内部预定义的方式显示 "某个目录" 下的 “某个文件”。暂时我还不知道 “某个目录” 和 “某个文件” 是在何时、何地定义的,但很显然访问 news 动作时的默认目录是: pyyweb/include/views/scripts/news/  而默认文件为:index.phtml 。
只有当上面的步骤完成之后,页面显示了 index.phtml 中的内容之后,才会运行到 NewsController 中的 indexAction() 方法。而 indexAction() 又要求显示 index.tpl 的内容,所以页面上才会显示两个文件的内容。
 

问题二,为什么要用 Templater 类?

很显然,一个 news 控制器不只有 index 动作,还可能会有 photos 动作、views 动作等等,假如有几百个动作,那岂不是要将 NewsController 中 indexAction() 方法里的内容重复几百遍?而且每个动作都要有不同的 $smarty->display('news\index.tpl')。这显然是不合适的。而且如果用默认的视图显示类,如上所述,会默认显示 index.phtml 的内容,不成功则报错。用 Templater 类可以重写这种默认的规则。
 

问题三,用了Templater类之后Smarty元语言报错?

在如书上所示增加了 Templater 类之后,为了验证 Smarty 元语言的作用,模板文件更新如下:路径:/pyyweb/templates/news/index.tpl 的内容为:
 

<h1>index.tpl in file: /pyyweb/templates/news/index.tpl</h1>
{$news}
刷新,结果index.tpl 的内容显示了两遍,第一遍的 {$news} 内容没有显示出来,而且报错了。第二遍的显示正确。其中错误如下:



Notice: Undefined index: news in M:\xampp\htdocs\pyyweb\data\tmp\templates_c\7875d1e9dddb74e56a7cb6b41ba870b80dea5f2a.file.index.tpl.php on line 27


由于$news 是在 NewsController 的 indexAction() 中被赋值的。而 Templater 在默认的显示index.tpl的内容时,并未对 $news 赋值,所以报错。当执行完indexAction() 之后,$news已经被赋值了,所以正确显示。这个问题现在我还没有解决办法,接着看书,希望有解吧……

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-364095-1-1.html 上篇帖子: 在开启 magic_quotes_gpc 的 PHP 环境下使用 Smarty 模板引擎 下篇帖子: 关于PHP与Java AES加解密互通的Padding问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表