zordius / lightncandy

An extremely fast PHP implementation of handlebars ( http://handlebarsjs.com/ ) and mustache ( http://mustache.github.io/ ),
https://zordius.github.io/HandlebarsCookbook/
MIT License
611 stars 76 forks source link

I need <?php incloude ''header.tpl" ?> #131

Closed nimoc closed 9 years ago

nimoc commented 9 years ago

Hi ~ I'm F2E,be unfamiliar with PHP。 How use lightncandy incloude template file ? I need you help, Thank you。

<!--{{incloude header.tpl}}-->
content
<!--{{incloude footer.tpl}}-->
zordius commented 9 years ago

A small question: where is your data? will it in something like $data ? or you want to pass all global variable into your .tpl file?

nimoc commented 9 years ago

Thank for your reply. I need incloude .tpl file,also use $data render .tpl file. Just like EJS <% include header.ejs %>

My colleague PHP code:

$this->data = array(
            'header'=>template('www/include/header',array('__APP__'=>__APP__,'STATIC_PATH'=>STATIC_PATH),true),
            'footer'=>template('www/include/footer',array('__APP__'=>__APP__,'STATIC_PATH'=>STATIC_PATH),true),
            '__APP__'=>__APP__,
            'STATIC_PATH'=>STATIC_PATH
        );

In the MVC,I want front-end developers to control the view。 I'm sorry for the Chinese style English (_^_^)

Are you in Taiwan?

zordius commented 9 years ago

Here is a small example to try lightncandy + include other .tpl file in PHP but without any MVC:

<?php
require('src/lightncandy.php');
function lightncandy_include($file) {
    $template = file_get_contents($file);
    $phpStr = LightnCandy::compile($template, array('flags' => LightnCandy::FLAG_HANDLEBARSJS));
    $renderer = LightnCandy::prepare($phpStr);
    echo $renderer($GLOBALS);
}                                                                                          
?>

Then you can do this:

This is a test ....
<?php lightncandy_include('test.tpl'); ?>
other lines
....
<?php lightncandy_include('another.tpl'); ?>
....
zordius commented 9 years ago

嗯我不確定你舉的例子是哪套MVC framework, 你可能要請同事把View 的plugin套好....我猜測應該是把 $this->template 這個function 作出來就可以了.

nimoc commented 9 years ago

非常感谢你的帮助和提供如此优秀的lightncandy,已经回复我的同事。

真的真的很需要lightncandy,最近我们在前后端联调时候遇到前端开发完成的HTML交付时逻辑复杂后端很难像前端一样了解设计需求导致 view 不是按照预期输出。

但我没有能力像阿里那样做到真正的前后端分离,所以我想在 node的前端开发环境中使用 handlebars 做模板引擎的解析,让后端用lightncandy。这样达到前端可以在node中开发完全兼容后端的 view 模板。后端只需要从 C 输出对象到 V。

遇到 lightncandy 真的很激动,很高兴遇到你和lightncandy。

nimoc commented 9 years ago

如上思路,我没有和同事一起实践过。我也有一些疑惑,耽误你一些时间希望你能指点我一下。

$.page({
    url:'/user/', // 浏览器 url
    tpl: '/view/user.tpl', // 模板服务器物理位置
    data: {
        user: {
            name: 'nimo',
            id: 2323,
            avatar: 'http://dummyimage.com/600x400/000/fff'
        }
    },
    helper:{
        checked: function (target, value){
            if (target === value) {
                return 'checked';
            }
        }
    }
}).doc(function () {/*
    // 给后端的 view 接口文档
    数据源:
    user: {
            name: 'nimo',
            id: 2323,
            avatar: 'http://dummyimage.com/600x400/000/fff'
        }
    }
    模板路径:
    /view/user.tpl
    注册函数
    {{helper}}
    checked: function (target, value){
        if (target === value) {
            return 'checked';
        }
    }
*/})

以上是前端开发环境的页面配置代码,模拟数据源和指定模板路径进行渲染,最终 www.domain.com/user/ 会根据模板内容渲染页面。

这是在 node 中实现的。我想前端实现完这个模拟后直接交付文档给后端。

/view/user.tpl 是前后公用的模板文件。前端用来做测试环境的数据模拟,后端用来做真实环境的view 模板。

后端根据前端约定的JSON数据源从C 输出数据到 V 即可。

_利用轻逻辑的 lightncandy _ 让后端只需要提供数据接口,mustache 语法又是前端非常熟悉的语法。前端也能实现任何HTML输出。

我的疑惑是,这中间会有哪些坑我并不知道。因为我对后端开发并不是完全了解。希望 zordius 能利用你的开发经验和后端知识指点一二。

nimoc commented 9 years ago

https://github.com/nodeajax/nodeajax/issues/1

目前模板引擎的前后端兼容和数据源模拟只支持轻逻辑的 lightncandy,先实践一段时间后再考虑如何兼容更多的模板引擎。模板引擎的兼容不像 AJAX 模拟 只需要约定基本规则就可以实现,需要后端开发框架对前端选定的模板引擎的支持。考虑好如何让各种后端框架无痛配合。2015-01-21 23:59:57

最近几天和后端同事的沟通和思考,我发现前端控制 view 的方式还是轻逻辑的lightncandy最适合。

之前准备也支持 smarty 。但 node 并没有合适的 smarty 语法支持,并听后端同事说 smarty 是会直接转换成PHP执行,担心模板有太多逻辑代码和交付给后端后因为实现差异导致出错。

zordius commented 9 years ago

上面的node代碼確實可以轉移到PHP中實現, 我在這邊只列一下在PHP當中可能要實作的部分與可能碰到的問題:

  1. 你的 .page() 當中有 url , 所以PHP中要先做出routing的功能
  2. 你的 .page() 當中有 tpl , 這邊的確可以使用lightncandy
  3. 你的 .page() 當中有 data , JSON格式在PHP中沒什麼問題
  4. 你的 .page() 當中有 helper , 這邊要注意一件事...你用的helper 越多, PHP端也就要實作出越多完全相容的helper .....這是跨javascript/PHP 使用 handlebars 的最大問題. 另外會碰的小問題會在語言天生的差異上, 例如 number 的極大值 , 不同value視為boolean時到底是true/false, 陣列與物件被轉成字串時的表達法等....
nimoc commented 9 years ago

太好了

  1. 后端有做route,后端不做route的话我也可以将路径抓换成 index.php 这种
  2. 非常感谢,这是之前我没考虑不到也想不到的。

关于helper:
我想约定一套常用的 helper 比如

Handlebars.registerHelper('equal', function (target, value, ok, fail) {
    if (target == value) {
        return ok;
    } else {
        return fail;
    }
})

利用 equal 完成类似如:

[1,2,3,4,5,6,7,8]
{{#list}}
<li {{equal . 5 "style=color:red;" "style=color:blue;"}} >{{.}}</li>
{{/list}}

的工作。

并让后端每次的 $data 都带上 url_pathname (/user/index/)这种常用属性,并约定数据源减少一些坑。