php解析模板
Ⅰ php模板是什麼
平常我們做一個互動式網站,一定會關注兩個主要的問題,就是美工和程序。這也是一個網站在建設中拋開其內容之後最關鍵的要素。
通常有兩種方式來協調美工和程序之間的關系:
1.先做好美工頁面,然後由程序員直接在美工頁面的Html文件中嵌入ASP、jsp、PHP等程序代碼。
2.美工和程序同時進行,但這時因為沒有頁面框架,程序只能做出一些關鍵代碼,雙方完成後再進行一次美工頁面和程序代碼的嵌入合成。
在實際的網站建設過程中,由於人員、進度等環境的限制,大家通常會混合地使用上面兩種協調方式。然而這兩種方法都有不足之處:
1. 效率不高。兩者協調不好可能產生等待、重復代碼調試步驟等現象;
2. 調試不暢。由於程序代碼最終需要嵌入在HTML頁面中,代碼的嵌入、調試、糾錯都比較繁瑣;
3. 維護不便。一旦美工設計需要修改,如網站改版,那麼所有程序和HTML代碼混合頁面都需要重寫;
如果你正在使用PHP程序建設網站,那麼PHP的模板技術會比較圓滿地解決上述問題。
那麼什麼是PHP的模板技術?PHP模板即PHPlib的Template技術,是PHPLIB程序庫中的一個主要模塊之一,發展自Perl的Template。而PHPLIB則是在PHP上的一個擴展,提供了很多類庫,能夠方便地實現一些基本功能如用戶認證,資料庫封裝等。
現在PHP模板技術很多,不過建議你學習smarty,畢竟是官方的東西!
smarty學習很簡單的,你去下載一個smarty手冊,對照著學,基本上二天就可以學會了!
Ⅱ php中smarty 模板結構
smarty模板的控制結構 if語句控制塊常見的if語句寫法:>> if語句在smarty中的應用
# {if $name == "Fred" || $name == "Wilma"}
{* 和上面的例子一樣,"or"和"||"沒有區別 *}
# ...
{* 如果條件成立則輸出這個區塊的代碼 *}
# {/if}
{* 是條件控制的關閉標記,if必須成對出現* foreach的遍歷: 主要是應用在一維數組中. {foreach}要與{/foreach}成對使用,它有四個參數,其中form和item兩個是必要的。foreach可以使用的全部參數如表16-4所示。 表16-4 foreach可以使用的選項參數參 數 名描 述類 型默 認 值form待循環數組的名稱,該屬性決定循環的次數,必要參數數組變數無item確定當前元素的變數名稱,必要參數字元串無key當前處理元素的鍵名,可選參數字元串無name該循環的名稱,用於訪問該循環,這個名是任意的,可選參數字元串無 foreach來遍歷一維數組 foreach來遍歷二維數組 也可以在模板中嵌套使用foreach遍歷二維數組,但必須保證嵌套中的foreach名稱唯一。此外,在使用foreach遍歷數組時與下標無關,所以在模板中關聯數組和索引數組都可以使用foreach遍歷。 二維數組的遍歷 1. <?php
2. require "libs/Smarty.class.php";
//包含Smarty類庫
3. $smarty = new Smarty();
//創建Smarty類的對象
4. $contact=array(
//聲明一個保存三個聯系人信息的二維數組
5. array('name'=>'高某','fax'=>'1234','email'=
>'[email protected]','phone'=>'4321'),
6. array('name'=>'洛某','fax'=>'4567','email'=
>'[email protected]','phone'=>'7654'),
7. array('name'=>'峰某','fax'=>'8910','email'=
>'[email protected]','phone'=>'0198')
8. );
9. $smarty->assign('contact', $contact);
//將關聯數組$contact分配到模板中使用
10. $smarty->display('index.tpl');
//查找模板替換並輸出
11. ?>
在進行輸出時:
進行遍歷的方案 # {foreach from=$contact item=row}
{* 外層foreach遍歷數組$contact *}
# <tr>
{* 輸出表格的行開始標記 *}
# {foreach from=$row item=col}
{* 內層foreach遍歷數組$row *}
# <td>{$col}</td>
{* 以表格形式輸出數組中的每個數據 *}
# {/foreach}
{* 內層foreach區塊結束標記 *}
# </tr>
{* 輸出表格的行結束標記 *}
# {/foreach}
{* 外層foreach區域的結束標記 *}
說明: 這里的遍歷是對整個二維數組來進行遍歷. foreachelse在進行遍歷數組時的應用:foreach標記提供了一個擴展標記foreachelse,這個語句在from變數沒有值的時候被執行,就是在數組為空時foreachelse標記可以生成某個候選結果。在模板中foreachelse標記不能獨自使用,一定要與foreach一起使用。而且foreachelse不需要結束標記,它嵌入在foreach中,與elseif嵌入在if語句中很類似。 foreach為二維數組 1. {foreach key=key item=value from=$array}
{* 使用foreach遍歷數組$array中的鍵和值 *}
2. {$key} => {$item} <br>
{* 在模板中輸出數組$array中元素的鍵和值對 *}
3. {foreachelse}
{* foreachelse在數組$array沒有值的時候被執行*}
4. <p>數組$array中沒有任何值</p>
{* 如果看到這條語句,說明數組中沒有任何數據*}
5. {/foreach}
{* foreach需要成對出現,是foreach的結束標記 *} section的循環遍歷section來循環遍歷二維數組二維數組的遍歷 說明:這是一個二維數組的定義
$contact=array( //聲明一個保存三個聯系人信息的二維數組
array('name'=>'高某','fax'=>'1234','email'=>'[email protected]','phone'=>'4321'),
array('name'=>'洛某','fax'=>'4567','email'=>'[email protected]','phone'=>'7654'),
array('name'=>'峰某','fax'=>'8910','email'=>'[email protected]','phone'=>'0198')
);
$smarty->assign('contact', $contact); //將關聯數組$contact分配到模板中使用
說明:使用section來進行遍歷,其中對於是關聯數組的數組訪問,使用"."號形式來訪問
{section name=line loop=$contact} {* 使用section遍歷數組$contact *}
<tr> {* 輸出表格的行開始標記 *}
<td>{$contact[line].name}</td> {* 輸出數組第二維中下標為name的元素值 *}
<td>{$contact[line].fax}</td> {* 輸出數組第二維中下標為fax的元素值*}
<td>{$contact[line].email}</td> {* 輸出數組第二維中下標為email的元素值*}
<td>{$contact[line].phone}</td> {* 輸出數組第二維中下標為phone的元素值*}
</tr> {* 輸出表格的行結束標記 *}
{/section} {* section區域的結束標記 *}
Ⅲ php 的框架與模板
樓主的認知不對哦,以下為樓主解惑:
框架:在php源碼的基礎上,開發者將常用的功能進行二次封裝形成的代碼集合,其本身往往不具備任何可用的功能,其目的僅僅是使開發人員可以基於框架更快的開發出符合要求的應用。例如,不使用框架開發一個用戶管理功能可能需要5天,使用框架可以將這個時間縮短到2天。實際上,對於任何一個項目,訪問控制、資料庫訪問、文件處理等功能都是必備的,框架就是將這些常用功能進行了更易用的封裝,避免開發人員在通用組件上重復開發,浪費時間。
模板:為了將PHP內容和html內容更好的分離為目的產生的一種應用,其主要目的是為了網頁製作人員可以不去學習PHP就能修改頁面的內容(可惜不學PHP還要學smarty,因此我個人並不覺得模板真的能帶來什麼實際的好處)
另外,如dede,DZ,PHPCMS等是基於PHP的產品,本身已經具備了大量的功能,安裝之後就能使用,當然,因為需求的不同可能需要在該產品的基礎上進行二次開發。
綜述,模板沒有太大的價值,完全可以在非用不可的時候再去學習,對於PHP開發人員來說,smarty可以立刻上手。它可以(也只能)被框架或PHP產品使用。框架是必須掌握的,定製性很強的項目必然都是基於框架開發的。PHP產品,如果你要開發的項目和某個PHP產品的功能達到80%以上的契合,那麼應該考慮基於該產品進行開發。
一些網站提供簡單的博客,留言板等的源碼,不基於框架的小項目實際上只能稱為練習,只有參考價值。
註:不是說不使用框架的項目就不算項目,事實上如果一個項目如果沒有使用某某框架,其項目的一部分代碼也必然的會具有框架的特徵,即自定義框架也是框架。
Ⅳ php技術生成靜態頁面的實現
我們先回顧一些基本的概念。
一、PHP腳本與動態頁面。
PHP腳本是一種伺服器端腳吵旅扒本程序,可通過嵌入等方法與HTML文件混合,也可以類,函數封裝等形式,以模板的方式對用戶請求進行處理。無論以何種方式,它的基本原理是這樣的。由客戶端提出請求,請求某一頁面-----Web伺服器引入指定相應腳本進行處理-----腳本被載入伺服器-----由伺服器指定的PHP解析器對腳本進行解析形成HTML語言形式----將解析後的HTML語句以包的方式傳回給瀏覽器。由此不難看出,在頁面發送到瀏覽器後, PHP就不存在了,已被轉化解析為HTML語句。客戶請求為一動態文件,事實上並沒有真正的文件存在在那裡,是PHP解析而成相升昌對應的頁面,然後發送回瀏覽器。這種頁面處理方式被稱為「動態頁面」。
二、靜態頁面。
靜態頁面是指在伺服器端確實存在的僅含HTML以及JS,CSS等客戶端運行腳本的頁面。它的處理方式是。由客戶端提出請求,請求某一頁面- ---
WEB伺服器確認並載入某一頁面----WEB伺服器將該頁面以包的形式傳遞回瀏覽器。由這一過程,我們對比一下動態頁面,即可方現。動態頁面需由Web伺服器的PHP解析器進行解析,而且通常還需連接資料庫,進行資料庫存取操作,然後才能形成HTML語言信息鎮知包;而靜態頁面,無須解析,無須連接資料庫,直接發送,可大大減輕伺服器壓力,提高伺服器負載能力,大幅提供頁面打開速度和網站整體打開速度。但其缺點是,不能動態地對請求進行處理,伺服器上必須確實存在該文件。
三、模板及模板解析。
模板即尚未填充內容html文件。例如:
temp.html
Code:
以下是引用片段:
HTML
TITLE{ title }/TITLE
BODY
this is a { file } file''''s templets
/BODY
/HTML
PHP處理:
以下是引用片段:
templetest.php
Code:
$title = "HP愛好者測試模板";
$file = "TwoMax Inter test templet,
author:Sheyi";
$fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$content .= str_replace ("{ file }",$file,$content);
$content .= str_replace ("{ title }",$title,$content);
echo $content;
?
模板解析處理,即將經PHP腳本解析處理後得出的結果填充(content)進模板的處理過程。通常藉助於模板類。目前較流行的模板解析類有 phplib,smarty,fastsmarty等等。模板解析處理的原理通常為替換。也有些程序員習慣將判斷,循環等處理放進模板文件中,用解析類處理,典型應用為block概念,簡單來說即為一個循環處理。由PHP腳本指定循環次數,如何循環代入等,再由模板解析類具體實施這些操作。
好了,對比過靜態頁面與動態頁面各自的優劣,現在我們就來說說,如何用PHP生成靜態文件。
PHP生成靜態頁面並不是指PHP的動態解析,輸出HTML頁面,而是指用PHP創建HTML頁面。同時因為HTML的不可寫性,我們創建的 HTML 若有修改,則需刪掉重新生成即可。(當然你也可以選擇用正則進行修改,但個人認為那樣做倒不如刪掉重新生成來得快捷,有些得不償失。)
言歸正傳。用過PHP文件操作函數的PHP FANS知道,PHP中有一個文件操作函數fopen,即打開文件。若文件不存在,則嘗試創建。這即是PHP可以用來創建HTML文件的理論基礎。只要用來存放HTML文件的文件夾有寫許可權(即許可權定義0777),即可創建文件。(針對UNIX系統而言,Win系統無須考慮。)仍以上例為例,若我們修改最後一句,並指定在test目錄下生成一個名為test.html的靜態文件:
Code:
以下是引用片段:
$title = "拓邁國際測試模板";
$file = "TwoMax Inter test templet,
author:_Max"Matrix@Two_Max";
$fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$content .= str_replace ("{ file }",$file,$content);
$content .= str_replace ("{ title }",$title,$content);
// echo $content;
$filename = "test/test.html";
$handle = fopen ($filename,"w"); //打開文件指針,創建文件
/*
檢查文件是否被創建且可寫
*/
if (!is_writable ($filename)){
die ("文件:".$filename."不可寫,請檢查其屬性後重試!");
}
if (!fwrite ($handle,$content)){ //將信息寫入文件
die ("生成文件".$filename."失敗!");
}
fclose ($handle); //關閉指針
die ("創建文件".$filename."成功!");
?
實際應用中常見問題解決方案參考:
一、文章列表問題:
在資料庫中創建欄位,記錄文件名,每生成一個文件,將自動生成的文件名存入資料庫,對於推薦文章,只需指向存放靜態文件的指定文件夾中的該頁面即可。利用PHP操作處理文章列表,存為字元串,生成頁面時替換此字元串即可。如,在頁面中放置文章列表的表格加入標記{ articletable },而在PHP處理文件中:
Code:
以下是引用片段:
$title = "拓邁國際測試模板";
$file = "TwoMax Inter test templet,
author:_Max"Matrix@Two_Max";
$fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$content .= str_replace ("{ file }",$file,$content);
$content .= str_replace ("{ title }",$title,$content);
// 生成列表開始
$list = ''''''''
$sql = "select id,title,filename from article";
$query = mysql_query ($sql);
while ($result = mysql_fetch_array ($query)){
$list .= ''''''''.$result[''''title''''].''''
''''
}
$content .= str_replace ("{ articletable }",$list,$content);
//生成列表結束
// echo $content;
$filename = "test/test.html";
$handle = fopen ($filename,"w"); //打開文件指針,創建文件
/*
檢查文件是否被創建且可寫
*/
if (!is_writable ($filename)){
die ("文件:".$filename."不可寫,請檢查其屬性後重試!");
}
if (!fwrite ($handle,$content)){ //將信息寫入文件
die ("生成文件".$filename."失敗!");
}
fclose ($handle); //關閉指針
die ("創建文件".$filename."成功!");
?
二、分頁問題。
如我們指定分頁時,每頁20篇。某子頻道列表內文章經資料庫查詢為45條,則,首先我們通過查詢得到如下參數:1,總頁數;2,每頁篇數。第二步, for ($i = 0; $i
allpages; $i++),頁面元素獲取,分析,文章生成,都在此循環中執行。不同的是,die ("創建文件".$filename."成功!";這句去掉,放到循環後的顯示,因為該語句將中止程序執行。例:
Code:
以下是引用片段:
$fp = fopen ("temp.html","r");
$content = fread ($fp,filesize ("temp.html"));
$onepage = '''ཐ''''
$sql = "select id from article where channel=''''$channelid''''";
$query = mysql_query ($sql);
$num = mysql_num_rows ($query);
$allpages = ceil ($num / $onepage);
for ($i = 0;$i$allpages; $i++){
if ($i == 0){
$indexpath = "index.html";
} else {
$indexpath = "index_".$i."html";
}
$start = $i * $onepage;
$list = ''''''''
$sql_for_page = "select name,filename,title from article where channel=''''$channelid'''' limit $start,$onepage";
$query_for_page = mysql_query ($sql_for_page);
while ($result = $query_for_page){
$list .= ''''''''.$title.''''
''''
}
$content = str_replace ("{ articletable }",$list,$content);
if (is_file ($indexpath)){
@unlink ($indexpath); //若文件已存在,則刪除
}
$handle = fopen ($indexpath,"w"); //打開文件指針,創建文件
/*
檢查文件是否被創建且可寫
*/
if (!is_writable ($indexpath)){
echo "文件:".$indexpath."不可寫,請檢查其屬性後重試!"; //修改為echo
}
if (!fwrite ($handle,$content)){ //將信息寫入文件
echo "生成文件".$indexpath."失敗!"; //修改為echo
}
fclose ($handle); //關閉指針
}
fclose ($fp);
die ("生成分頁文件完成,如生成不完全,請檢查文件許可權系統後重新生成!");
?
大致思路如此,其中如其它數據生成,數據輸入輸出檢查,分頁內容指向等可酌情在頁面中加入。
在實際文章系統處理過程當中,還有許多問題有待考慮,與動態頁面不同之處,需注意的地方還有很多。但大致思路即是如此,其它方面可舉一反三而得。