RT,如果尽量不使用模板引擎的时候,有什么办法可以实现PHP代码和HTML 代码100%分离?
下面是我的想法,但是有很多缺点
将一个完整的HTML文件根据需要分割成几部分,入头部,脚部,还有一些需要通过循环来获得结果的内容(像论坛里的回复之类的),然后在PHP中引入文件,通过循环、判断等语句来决定怎么替换变量,最后输出。
但是这样有个问题,就是可能会把很多div标签分开的不同的文件,日后维护修改不方便
不知道你们平时都是怎么做的?

解决方案 »

  1.   

    虽然"尽量不使用模板引擎", 但是你也必须使用某种方式把内容输出到html里,那么你是否是指用<?=$xxx ?>这样的方式?光靠这个是无法完全满足需要的,
    至少应该结合 if/else/endif (条件)
    foreach (循环)
    include/require (包含),
    这样的话,你就大致可以完全分离了.
      

  2.   

    你可以把你所有的逻辑都写在处理页面,但是在模版里是一定会出现类似<?=$xxx ?>这样的变量输出的(不论是如何改变)
      

  3.   

    不是这样的,我的意思是在酱紫滴:这是一个HTML文件,我们要的样式也在里面<html>
      <head>
        <title>总文件</title>
      </head>  <body>
         <!--这个文件将被分成3个.tpl后缀的文件,上面是第一部分,记为part1.tpl-->
        <div>{$var1}</div>
        <div>{$var2}</div>
     <!--part1.tpl到这里的内容为part2.tpl,下面的为part3.tpl-->
      </body>
    </html>
    这里是PHP文件:<?php     
        while(true)
        {
         ....   //这里通过打开读取part2.tpl并赋给一个变量,而非包含文件!
                //part2.tpl有这么两个特殊字符串{var1} {var2}
             if(true)
             {
                .... //使用str_replace等把字符串{var1}和{var2}替换成我们要的,这里事实上跟模板引擎
                     //有点相似
              }     } 
     
    ?>
    大概就是这样了,详细的说出来要另开贴才行了
      

  4.   

    9楼PHP代码循环前后还要把part1.tpl和part3.tpl包含进去
      

  5.   

    这样做当然也可以,一些初期的模板引擎也的确是这样做的,
    但是这样有很多缺点,如你所见到的,
    需要分割文件(因为模板没有include功能)
    需要将显示逻辑放入php文件,一个是繁琐,另一个导致页面的改变需要修改php文件,
    这些完全可以通过增加{if}/{foreach}等控制标签来实现这个其实就是模板的设计问题,不知道你用的是什么引擎,
    你可以看看smarty,
    另一个个人推荐的是phptal,我没实际用过,不知道究竟如何,但是其设计值得一看
    (它的设计实际来自python的Zope)
      

  6.   


    你这不就是网页静态化嘛 不知道楼主实际运用没 {$var1}不可能都是数据吧 肯定有列表 表格之类的 这样的话你认为分离了吗?我看是更复杂了
      

  7.   

    网页无非是形成一个统一格式的文件,能让浏览器阅读并按照相应的规则显示样式之类的!也就是说你在浏览器端点击查看源码后看到的其实都是统一格式的东西。现在要设计或者优化的无非是这个文件怎么生成而已!诚然你用最基本的php等等的语法,不论是include_once还是require_once都可以实现php文件和其他文件的整合显示。当然你要是自己在php程序中自己写流,自己用php文件生成静态的.htm文件不也一样!?分离不分离的区别可能在代码的整洁上,代码的安全性上有些区别。但只要能实现最终的目的,达到要求的程度不就可以了吗?而且我始终认为最基本的才是最重要的,一切高级的东西都是在最基本的规则上建立起来的。(话说多了!O(∩_∩)O哈哈~)
      

  8.   

    楼主的那个就是smarttemplate
    <!-- INCLUDE head.html -->
    <script src="{WEB_URL}cache/departure.js" ></script>
    <script src="{WEB_URL}cache/destination_cat.js" ></script>
    <script src="{WEB_URL}cache/destination_cat_parent.js" ></script>
    <script src="{this->settings.res_url}script/manage_dest/manage_dest.js" ></script>  
    </head>
    <body>
    <form name="search_form" id="search_form" method="POST" action="{manage_url}">
    <div>
    出发城市<select name="begin_city_code" id="begin_city_code" onchange="change_begin_city(this.value,{'is_abroad_field':'is_abroad','p_cat_field':'p_dest_cat_id','cat_field':'dest_cat_id'});">
    <option value = "0" >请选择</option>
    {this->input.begin_city_code_option}
    </select>
    <select name="is_abroad" id="is_abroad" onchange="change_is_abroad(this.value,{'begin_city_field':'begin_city_code','is_abroad_field':'is_abroad','p_cat_field':'p_dest_cat_id','cat_field':'dest_cat_id'});" >
    <option value = "">不限</option>
    <option value = "0" {this->input.is_abroad_select0}>国内</option>
    <option value = "1" {this->input.is_abroad_select1}>出境</option> 
    </select>
    大方向<select name="p_dest_cat_id" id="p_dest_cat_id" onchange="change_p_dest(this.value,{'cat_field':'dest_cat_id'});" >
    <option value = "">请选择</option>
    {this->input.p_dest_cat_id_option} 
    </select>
    小方向<select name="dest_cat_id" id="dest_cat_id" >
    <option value = "">请选择</option>
    {this->input.dest_cat_id_option }
    </select>部门ID<select name="dep_id" id="dep_id" >
    <option value = "">请选择</option>
    {this->input.dep_id_option }
    </select> </div>
    <div><input type="submit" name="search_submit" id="search_submit" value="搜索" /></div>
    </form>
    <table class="list" border="1">
    <thead>
    <th>出发城市</th>
    <th>大方向</th>
    <th>小方向</th>  
    <th>客服组</th> 
    <th>产品组</th>  
    </thead>
    <tbody>

    <!-- BEGIN this->input.departure_list_loop begin_city_code=>r -->
    <!-- BEGIN this->input.destination_cat_parent_list_loop.$begin_city_code p_cat_id=>pc_r -->
    <!-- BEGIN this->input.destination_cat_list_loop.$p_cat_id cat_id=>c_r --> 
    <tr>
    <!-- IF begin_city_code != pre_city_code -->
    {begin_city_code > pre_city_code}   
    <td rowspan="{r.rowspan}">{r.name}</td>   
    <!-- ENDIF -->
    <!-- IF p_cat_id != pre_p_cat_id --> 
    {p_cat_id > pre_p_cat_id}  
    <td rowspan="{pc_r.rowspan}">{pc_r.name}</td>
    <!-- ENDIF -->
    <td>{c_r.name}</td>
    <td>{data_lists.$p_id}</td>
    <td>{update_time}</td>
    </tr>
    <!-- END  destination_list_cat_loop -->
    <!-- END  destination_cat_parent_list_loop -->
    <!-- END departure_list_loop  ELSE -->
    <tr>
    <td colspan="10">暂无记录</td>
    </tr>
    <!-- ENDIF -->
    </tbody>
    </table>
    {page_html}
    <!-- INCLUDE foot.html --> 
      

  9.   

    LZ可以去研究下国外的joomla cms是如何设计模板文件的,一个文件,影响全局,不算100%分离,不过有这么个概念,这世上就没有100%的东西,joomla某个模版代码片断.<div class="center" align="center">
    <div id="wrapper">
    <div id="wrapper_r">
    <div id="header">
    <div id="header_l">
    <div id="header_r">
    <div id="logo"></div>
                                                     <!--引入设置了位置为top的所有模块,模块由php编写-->
    <jdoc:include type="modules" name="top" />
    </div>
    </div>
    </div> <div id="tabarea">
    <div id="tabarea_l">
    <div id="tabarea_r">
    <div id="tabmenu">
    <table cellpadding="0" cellspacing="0" class="pill">
    <tr>
    <td class="pill_l">&nbsp;</td>
    <td class="pill_m">
    <div id="pillmenu">
    <jdoc:include type="modules" name="user3" />
    </div>
    </td>
    <td class="pill_r">&nbsp;</td>
    </tr>
    </table>
    </div>
    </div>
    </div>
    </div> <div id="search">
    <jdoc:include type="modules" name="user4" />
    </div> <div id="pathway">
    <jdoc:include type="modules" name="breadcrumb" />
    </div>