• <em id="6vhwh"><rt id="6vhwh"></rt></em>

    <style id="6vhwh"></style>

    <style id="6vhwh"></style>
    1. <style id="6vhwh"></style>
        <sub id="6vhwh"><p id="6vhwh"></p></sub>
        <p id="6vhwh"></p>
          1. 国产亚洲欧洲av综合一区二区三区 ,色爱综合另类图片av,亚洲av免费成人在线,久久热在线视频精品视频,成在人线av无码免费,国产精品一区二区久久毛片,亚洲精品成人片在线观看精品字幕 ,久久亚洲精品成人av秋霞

            芭樂是什么

            更新時(shí)間:2023-03-13 15:17:53 閱讀: 評(píng)論:0

            藍(lán)牙耳機(jī)品牌-自制蘋果派

            芭樂是什么
            2023年3月13日發(fā)(作者:四年級(jí)家長評(píng)語)什么是模版引擎 不知道從什么時(shí)候開始, 有人開始對(duì)?HTML?內(nèi)嵌入?Server?Script?覺得不太滿意。 然而不論 是微軟的?ASP?或是開放源碼的?PHP,都是屬于內(nèi)嵌?Server?Script?的網(wǎng)頁伺服端語言。因 此也就有人想到,如果能把程序應(yīng)用邏輯?(或稱商業(yè)應(yīng)用邏輯)?與網(wǎng)頁呈現(xiàn)?(Layout)?邏輯 分離的話,是不是會(huì)比較好呢? 其實(shí)這個(gè)問題早就存在已久,從交互式網(wǎng)頁開始風(fēng)行時(shí),不論是?ASP?或是?PHP?的使用者都 是身兼程序開發(fā)者與視覺設(shè)計(jì)師兩種身份。可是通常這些使用者不是程序強(qiáng)就是美工強(qiáng),如 果要兩者同時(shí)兼顧,那可得死掉不少腦細(xì)胞... 所以模版引擎就應(yīng)運(yùn)而生啦!模版引擎的目的,就是要達(dá)到上述提到的邏輯分離的功能。它 能讓程序開發(fā)者專注于資料的控制或是功能的達(dá)成;而視覺設(shè)計(jì)師則可專注于網(wǎng)頁排版,讓 網(wǎng)頁看起來更具有專業(yè)感!因此模版引擎很適合公司的網(wǎng)站開發(fā)團(tuán)隊(duì)使用,使每個(gè)人都能發(fā) 揮其專長! 就筆者接觸過的模版引擎來說,依資料呈現(xiàn)方式大概分成:需搭配程序處理的模版引擎和完 全由模版本身自行決定的模版引擎兩種形式。 在需搭配程序處理的模版引擎中,程序開發(fā)者必須要負(fù)責(zé)變量的呈現(xiàn)邏輯,也就是說他必須 把變量的內(nèi)容在輸出到模版前先處理好,才能做?assign?的工作。換句話說,程序開發(fā)者還 是得多寫一些程序來決定變量呈現(xiàn)的風(fēng)貌。而完全由模版本身自行決定的模版引擎,它允許 變量直接?assign?到模版中,讓視覺設(shè)計(jì)師在設(shè)計(jì)模版時(shí)再?zèng)Q定變量要如何呈現(xiàn)。因此它就 可能會(huì)有另一套屬于自己的模版程序語法?(如?Smarty)?, 以方便控制變量的呈現(xiàn)。 但這樣一 來,視覺設(shè)計(jì)師也得學(xué)習(xí)如何使用模版語言。 模版引擎的運(yùn)作原理,首先我們先看看以下的運(yùn)行圖: 一般的模版引擎?(如?PHPLib)?都是在建立模版對(duì)象時(shí)取得要解析的模版,然后把變量套入 后,透過?par()?這個(gè)方法來解析模版,最后再將網(wǎng)頁輸出。 對(duì)?Smarty?的使用者來說, 程序里也不需要做任何?par?的動(dòng)作了, 這些?Smarty?自動(dòng)會(huì)幫 我們做。而且已經(jīng)編譯過的網(wǎng)頁,如果模版沒有變動(dòng)的話,?Smarty?就自動(dòng)跳過編譯的動(dòng)作, 直接執(zhí)行編譯過的網(wǎng)頁,以節(jié)省編譯的時(shí)間。 使用 Smarty 的一些概念 在一般模版引擎中,我們常看到區(qū)域的觀念,所謂區(qū)塊大概都會(huì)長成這樣: 區(qū)域內(nèi)容 這些區(qū)塊大部份都會(huì)在?PHP?程序中以?if?或?for,?while?來控制它們的顯示狀態(tài), 雖然模版 看起來簡潔多了,但只要一換了顯示方式不同的模版,?PHP?程序勢(shì)必要再改一次!

            x0c在?Smarty?中,一切以變量為主,所有的呈現(xiàn)邏輯都讓模版自行控制。因?yàn)?Smarty?

            會(huì)有自 己 的 模 版 語 言 , 所 以 不 管 是 區(qū) 塊 是 否 要 顯 示 還 是 要 重 復(fù) , 都 是 用 ?Smarty? 的 模 版 語 法?(if,?foreach,?ction)?搭配變量內(nèi)容作呈現(xiàn)。 這樣一來感覺上好象模版變得有點(diǎn)復(fù)雜, 但好處是只要規(guī)劃得當(dāng),?PHP?程序一行都不必改。 由上面的說明,我們可以知道使用 Smarty?要掌握一個(gè)原則:將程序應(yīng)用邏輯與網(wǎng)頁呈現(xiàn)邏 輯明確地分離。 就是說?PHP?程序里不要有太多的?HTML?碼。 程序中只要決定好那些變量要塞 到模版里,讓模版自己決定該如何呈現(xiàn)這些變量?(甚至不出現(xiàn)也行)?。 Smarty 的基礎(chǔ) 安裝 Smarty 首先,我們先決定程序放置的位置。 Windows 下可能會(huì)類似這樣的位置: 「?d:apprvwebdemo?」 。 Linux 下可能會(huì)類似這樣的位置: 「?/home/jaceju/public_html/?」 。 到 Smarty 的官方網(wǎng)站下載最新的 Smarty 套件:。 解開?Smarty?2.6.0?后,會(huì)看到很多檔案,其中有個(gè)?libs?資料夾。在?libs?中應(yīng)該會(huì)有?3? 個(gè)??檔?+?1?個(gè)??+?1?個(gè)?plugin?資料夾?+?1?個(gè)?core?資料夾。然后直 接將?libs?復(fù)制到您的程序主資料夾下,再更名為?class?就可以了。就這樣?沒錯(cuò)!這種安 裝法比較簡單,適合一般沒有自己主機(jī)的使用者。 至于?Smarty?官方手冊(cè)中為什么要介紹一些比較復(fù)雜的安裝方式呢?基本上依照官方的方式 安裝,可以只在主機(jī)安裝一次,然后提供給該主機(jī)下所有設(shè)計(jì)者開發(fā)不同程序時(shí)直接引用, 而不會(huì)重復(fù)安裝太多的?Smarty?復(fù)本。而筆者所提供的方式則是適合要把程序帶過來移過去 的程序開發(fā)者使用,這樣不用煩惱主機(jī)有沒有安裝?Smarty?。 程序的資料夾設(shè)定 以筆者在 Windows 安裝 Apprv 為例,程序的主資料夾是「d:apprvwebdemo」 。安裝好 Smarty 后,我們?cè)谥髻Y料夾下再建立這樣的資料夾: 在?Linux?底下,請(qǐng)記得將?templates_c?的權(quán)限變更為?777?。Windows?下則將其只讀取消。 第一個(gè)用 Smarty 寫的小程序 我們先設(shè)定?Smarty?的路徑,請(qǐng)將以下這個(gè)檔案命名為??,并放置到主資料夾下: :

            x0c<?php? include?"class/";? define(@#__SITE_ROOT@#,?@#d:/apprv/web/demo@#);?//?最后沒有斜線? $tpl?=?new?Smarty();? $tpl->template_dir?=?__SITE_ROOT?.?"/templates/";? $tpl->compile_dir?=?__SITE_ROOT?.?"/templates_c/";? $tpl->config_dir?=?__SITE_ROOT?.?"/configs/";? $tpl->cache_dir?=?__SITE_ROOT?.?"/cache/";? $tpl->left_delimiter?=?@#<{@#;? $tpl->right_delimiter?=?@#}>@#;? ?>?

            照上面方式設(shè)定的用意在于,程序如果要移植到其它地方,只要改?__SITE_ROOT?就可以 啦。?(這里是參考?XOOPS?的?) Smarty?的模版路徑設(shè)定好后,程序會(huì)依照這個(gè)路徑來抓所有模版的相對(duì)位置 ?(范例中 是?@#d:/apprv/web/demo/templates/@#?)?。 然后我們用?display()?這個(gè)?S

            marty?方法來 顯示我們的模版。 接下來我們?cè)?templates?資料夾下放置一個(gè)?: (擴(kuò)展名叫什么都無所謂, 但便于視 覺設(shè)計(jì)師開發(fā),筆者都還是以?.htm?為主。) templates/:

            ? ? ? <{$title}>? ? ? <{$content}>? ? ?

            x0c現(xiàn)在我們要將上面的模版顯示出來,并將網(wǎng)頁標(biāo)題?($title)?與內(nèi)容?($content)?更換,請(qǐng) 將以下檔案內(nèi)容命名為??,并放置在主資料夾下: :

            <?php? require?"";? $tpl->assign("title",?"測(cè)試用的網(wǎng)頁標(biāo)題");? $tpl->assign("content",?"測(cè)試用的網(wǎng)頁內(nèi)容");? //?上面兩行也可以用這行代替? //?$tpl->assign(array("title"?=>?"測(cè)試用的網(wǎng)頁標(biāo)題",?"content"?=>?"測(cè)試用的網(wǎng)頁 內(nèi)容"));? $tpl->display(@#@#);? ?>?

            請(qǐng)打開瀏覽器,輸入?http://localhost/demo/?試試看(依您的環(huán)境決定網(wǎng)址),應(yīng) 該會(huì)看到以下的畫面:

            再到?templates_c?底下,我們會(huì)看到一個(gè)奇怪的資料夾?(%%179)?,再點(diǎn)選下去也是一個(gè)奇 怪的資料夾?(%%1798044067)?,而其中有一個(gè)檔案: templates_c/%%179/%%1798044067/:

            <?php?/*?Smarty?version?2.6.0,?created?on?2003-12-15?22:19:45?compiled?from?test .htm?*/??>? ? ? ? <?php?echo?$this->_tpl_vars[@#title@#];??>? ? ? <?php?echo?$this->_tpl_vars[@#content@#];??>?

            x0c? ?

            沒錯(cuò), 這就是?Smarty?編譯過的檔案。 它將我們?cè)谀0嬷械淖兞哭D(zhuǎn)換成了?PHP?的語法來執(zhí)行, 下次再讀取同樣的內(nèi)容時(shí),?Smarty?就會(huì)直接抓取這個(gè)檔案來執(zhí)行了。 最后我們整理一下整個(gè)?Smarty?程序撰寫步驟: Step?1.?加載?Smarty?模版引擎。 Step?2.?建立?Smarty?對(duì)象。 Step?3.?設(shè)定?Smarty?對(duì)象的參數(shù)。 Step?4.?在程序中處理變量后,再用?Smarty?的?assign?方法將變量置入模版里。 Step?5.?利用?Smarty?的?display?方法將網(wǎng)頁秀出。 如何安排你的程序架構(gòu) 上 面 我 們 看 到 除 了 ?Smarty? 所 需 要 的 資 料 夾 外 ?(class? 、 ?configs? 、 ?templates? 、 ?templates_c)? , 還 有 兩 個(gè) 資 料 夾:?includes?、?modules?。其實(shí)這是筆者模仿?XOOPS?的架構(gòu)所建立出來的,因?yàn)?XOOPS? 是筆者所接觸到的程序中,少數(shù)使用?Smarty?模版引擎的架站程序。所謂西瓜偎大邊,筆者 這樣的程序架構(gòu)雖沒有?XOOPS?的百分之一強(qiáng),但至少給人看時(shí)還有?XOOPS?撐腰。 includes?這個(gè)資料夾主要是用來放置一些?function?、?sql?檔,這樣在??就可以 將它們引入了,如下: :

            <?php? include?"class/";? define(@#__SITE_ROOT@#,?@#d:/apprv/web/demo@#);?//?最后沒有斜線? //?以??的位置為基準(zhǔn)?

            x0crequire_once?"includes/";? require_once?"includes/incl

            ";? $tpl?=?new?Smarty();? $tpl->template_dir?=?__SITE_ROOT?.?"/templates/";? $tpl->compile_dir?=?__SITE_ROOT?.?"/templates_c/";? $tpl->config_dir?=?__SITE_ROOT?.?"/configs/";? $tpl->cache_dir?=?__SITE_ROOT?.?"/cache/";? $tpl->left_delimiter?=?@#<{@#;? $tpl->right_delimiter?=?@#}>@#;? ?>?

            modules?這個(gè)資料夾則是用來放置程序模塊的,如此一來便不會(huì)把程序丟得到處都是,整體 架構(gòu)一目了然。 上面我們也提到??,這是整個(gè)程序的主要核心,不論是常數(shù)定義、外部程序加載、 共享變量建立等, 都是在這里開始的。 所以之后的模塊都只要將這個(gè)檔案包含進(jìn)來就可以啦。 因此在程序流程規(guī)劃期間,就必須好好構(gòu)思 ??中應(yīng)該要放那些東西;當(dāng)然利 用?include?或?require?指令,把每個(gè)環(huán)節(jié)清楚分離是再好不過了。

            在上節(jié)提到的?Smarty?程序?5?步驟,??就會(huì)幫我們先將前?3?個(gè)步驟做好,后面的 模塊程序只要做后面兩個(gè)步驟就可以了。 從變量開始 如何使用變量 從上一章范例中,我們可以清楚地看到我們利用?<{?及?}>?這兩個(gè)標(biāo)示符號(hào)將變量包起來。 預(yù)設(shè)的標(biāo)示符號(hào)為?{?及?}?,但為了中文沖碼及?javascript?的關(guān)系,因此筆者還是模 仿?XOOPS?,將標(biāo)示符號(hào)換掉。變量的命名方式和?PHP?的變量命名方式是一模一樣的,前面 也有個(gè)?$?字號(hào)?(這和一般的模版引擎不同)。標(biāo)示符號(hào)就有點(diǎn)像是?PHP?中的 (事實(shí)上它們的確會(huì)被替換成這個(gè))?,所以以下的模版變量寫法都是可行的: 1.?<{$var}> 2.?<{?$var?}>? 3.?<{$var }>? 在?Smarty?里,變量預(yù)設(shè)是全域的,也就是說你只要指定一次就好了。指定兩次以上的話,

            x0c變量內(nèi)容會(huì)以最后指定的為主。就算我們?cè)谥髂0嬷屑虞d了外部的子模版,子模版中同樣的 變量一樣也會(huì)被替代,這樣我們就不用再針對(duì)子模版再做一次解析的動(dòng)作。 而在?PHP?程序中, 我們用?Smarty?的?assign?來將變量置放到模版中。 ?assign?的用法官方 手冊(cè)中已經(jīng)寫得很多了,用法就如同上一節(jié)的范例所示。不過在重復(fù)區(qū)塊時(shí),我們就必須將 變量做一些手腳后,才能將變量?assign?到模版中,這在下一章再提。 修飾你的變量 上面我們提到?Smarty?變量呈現(xiàn)的風(fēng)貌是由模版自行決定的,所以?Smarty?提供了許多修飾 變量的函式。使用的方法如下: <{變量|修飾函式}>? <{變量|修飾函式:"參數(shù)(非必要,視函式而定)"}>? 范例如下: <{$var|nl2br}>? <{$var|string_format:"%02d"}>? 好,那為什么要讓模版自行決定變量呈現(xiàn)的風(fēng)貌?先看看底下的?HTML?,這是某個(gè)購物車結(jié)

            帳的部份畫面。 總金額:21,000?元 一般模版引擎的模版可能會(huì)這樣寫: 總金額:{format_total}?元 它們的?PHP?程序中要這樣寫:

            <?php? $total?=?21000;? $tpl->assign("total",?$total);? $tpl->assign("format_total",?number_format($total));? ?>?

            x0c而?Smarty?的模版就可以這樣寫:?(number_format?修飾函式請(qǐng)到 Smarty?官方網(wǎng)頁下載) "?/> 總金額:<{$total|number_format:""}>?元 Smarty?的?PHP?程序中只要這樣寫:

            <?php? $total?=?21000;? $tpl->assign("total",?$total);? ?>?

            所以在?Smarty?中我們只要指定一次變量,剩下的交給模版自行決定即可。這樣了解了嗎? 這就是讓模版自行決定變量呈現(xiàn)風(fēng)貌的好處! 控制模版的內(nèi)容 重復(fù)的區(qū)塊 在?Smarty?樣板中,我們要重復(fù)一個(gè)區(qū)塊有兩種方式:?foreach?及?ction?。而在程序中 我們則要?assign?一個(gè)數(shù)組,這個(gè)數(shù)組中可以包含數(shù)組數(shù)組。就像下面這個(gè)例子: 首先我們來看?PHP?程序是如何寫的: :

            <?php? require?"";? $array1?=?array(1?=>?"蘋果",?2?=>?"菠蘿",?3?=>?"香蕉",?4?=>?"芭樂");? $tpl->assign("array1",?$array1);? $array2?=?array(? array("index1"?=>?"data1-1",?"index2"?=>?"data1-2",?"index3"?=>?"data1-3"),?

            x0carray("index1"?=>?"data2-1",?"index2"?=>?"data2-2",?"index3"?=>?"data2-3"),? array("index1"?=>?"data3-1",?"index2"?=>?"data3-2",?"index3"?=>?"data3-3"),? array("index1"?=>?"data4-1",?"index2"?=>?"data4-2",?"index3"?=>?"data4-3"),? array("index1"?=>?"data5-1",?"index2"?=>?"data5-2",?"index3"?=>?"data5-3"));? $tpl->assign("array2",?$array2);? $tpl->display("");? ?>?

            而模版的寫法如下: templates/:

            ? ? ? 測(cè)試重復(fù)區(qū)塊? ? ?
            ? 利用?foreach?來呈現(xiàn)?array1? <{foreach?item=item1?from=$array1}>? <{$item1}>? <{/foreach}>? 利用?ction?來呈現(xiàn)?array1? <{ction?name=c1?loop=$array1}>? <{$array1[c1]}>? <{/ction}>? 利用?foreach?來呈現(xiàn)?array2? <{foreach?item=index2?from=$array2}>? <{foreach?key=key2?item=item2?from=$index2}>? <{$key2}>:?<{$item2}>? <{/foreach}>? <{/foreach}>? 利用?ction?來呈現(xiàn)?array1? <{ction?name=c2?loop=$array2}>? index1:?<{$array2[c2].index1}>? index2:?<{$array2[c2].index2}>? index3:?<{$array2[c2].index3}>?

            x0c<{/ction}>?
            ? ? ?

            執(zhí)行上例后,我們發(fā)現(xiàn)不管是?foreach?或?ction?兩個(gè)執(zhí)行結(jié)果是一樣的。那么兩者到底 有何不同呢? 第一個(gè)差別很明顯, 就是 foreach?要以巢狀處理的方式來呈現(xiàn)我們所?assign?的兩層數(shù)組變 量,而?ction?則以「主數(shù)組[循環(huán)名稱].子數(shù)組索引」即可將整個(gè)數(shù)組呈現(xiàn)出來。由此可 知 , ?Smarty? 在 模 版 中 的 ?foreach? 和 ?PHP? 中 的 ?for

            each? 是 一 樣 的 ; 而 ?ction? 則 是?Smarty?為了處理如上列的數(shù)組變量所發(fā)展出來的敘述。當(dāng)然?ction?的功能還不只如 此, 除了下一節(jié)所談到的巢狀資料呈現(xiàn)外, 官方手冊(cè)中也提供了好幾個(gè)?ction?的應(yīng)用范例。 不 過 要 注 意 的 是 , 丟 給 ?ction? 的 數(shù) 組 索 引 必 須 是 從 ?0? 開 始 的 正 整 數(shù) , 即?0,?1,?2,?3,?...。如果您的數(shù)組索引不是從?0?開始的正整數(shù),那么就得改用?foreach? 來呈現(xiàn)您的資料。您可以參考官方討論區(qū)中的此篇討論,其中探討了?ction?和?foreach? 的用法。 巢狀資料的呈現(xiàn) 模版引擎里最令人傷腦筋的大概就是巢狀資料的呈現(xiàn)吧,許多著名的模版引擎都會(huì)特意強(qiáng)調(diào) 這點(diǎn),不過這對(duì)?Smarty?來說卻是小兒科。 最常見到的巢狀資料,就算論譠程序中的討論主題區(qū)吧。假設(shè)要呈現(xiàn)的結(jié)果如下: 公告區(qū) 站務(wù)公告 文學(xué)專區(qū) 好書介紹 奇文共賞 計(jì)算機(jī)專區(qū) 硬件外圍 軟件討論

            x0c程序中我們先以靜態(tài)資料為例: :

            <?php? require?"";? $forum?=?array(? array("category_id"?=>?1,?"category_name"?=>?"公告區(qū)",? "topic"?=>?array(? array("topic_id"?=>?1,?"topic_name"?=>?"站務(wù)公告")? )? ),? array("category_id"?=>?2,?"category_name"?=>?"文學(xué)專區(qū)",? "topic"?=>?array(? array("topic_id"?=>?2,?"topic_name"?=>?"好書介紹"),? array("topic_id"?=>?3,?"topic_name"?=>?"奇文共賞")? )? ),? array("category_id"?=>?3,?"category_name"?=>?"計(jì)算機(jī)專區(qū)",? "topic"?=>?array(? array("topic_id"?=>?4,?"topic_name"?=>?"硬件外圍"),? array("topic_id"?=>?5,?"topic_name"?=>?"軟件討論")? )? )? );? $tpl->assign("forum",?$forum);? $tpl->display("");? ?>?

            模版的寫法如下: templates/:

            ?

            x0c? 巢狀循環(huán)測(cè)試? ? ? ? <{ction?name=c1?loop=$forum}>? ? <{$forum[c1].category_name}>? ? <{ction?name=c2?loop=$forum[c1].topic}>? ? ?? <{$forum[c1].topic[c2].topic_name}>? ? <{/ction}>? <{/ction}>? ? ? ?

            執(zhí)行的結(jié)果就像筆者舉的例子一樣。 因此呢, 在程序中我們只要想辦法把所要重復(fù)值一層一層的塞到數(shù)組中, 再利用?<{第一層數(shù) 組[循環(huán) 1].第二層數(shù)組[循環(huán) 2].第三層數(shù)組[循環(huán) 3].?...?.數(shù)組索引}>?這樣的方式來顯示 每一個(gè)巢狀循環(huán)中的值。至于用什么方法呢?下一節(jié)使用數(shù)據(jù)庫時(shí)我們?cè)偬帷?轉(zhuǎn)換數(shù)據(jù)庫中的資料 上面提到如何顯示巢狀循環(huán),而實(shí)際上應(yīng)用時(shí)我們的資料可能是從數(shù)據(jù)庫中抓取出來的,所 以我們就得想辦法把數(shù)據(jù)庫的資料變成上述的多重?cái)?shù)組的形式。這里筆者用一個(gè)?DB?類別來 抓取數(shù)據(jù)庫中的資料,您可以自行用您喜歡的方法。 我們只修改?PHP?

            程序,模版還是上面那個(gè)?(這就是模版引擎的好處~),其中?$db?這個(gè)對(duì)象 假設(shè)已經(jīng)在??中建立好了,而且抓出來的資料就是上面的例子。 :

            x0c<?php? require?"";? //?先建立第一層數(shù)組? $category?=?array();? $db->tSQL($SQL1,?@#CATEGORY@#);? if?(!$db->query(@#CATEGORY@#))?die($db->error());? //?抓取第一層循環(huán)的資料? while?($item_category?=?$db->fetchAssoc(@#CATEGORY@#))? {? //?建立第二層數(shù)組? $topic?=?array();? $db->tSQL(sprintf($SQL2,?$item_category[@#category_id@#]),?@#TOPIC@#);? if?(!$db->query(@#TOPIC@#))?die($db->error());? //?抓取第二層循環(huán)的資料? while?($item_topic?=?$db->fetchAssoc(@#TOPIC@#))? {? //?把抓取的數(shù)據(jù)推入第二層數(shù)組中? array_push($topic,?$item_topic);? }? //?把第二層數(shù)組指定為第一層數(shù)組所抓取的數(shù)據(jù)中的一個(gè)成員? $item_category[@#topic@#]?=?$topic;? //?把第一層數(shù)據(jù)推入第一層數(shù)組中? array_push($category,?$item_category);? }? $tpl->assign("forum",?$category);? $tpl->display("");? ?>?

            在數(shù)據(jù)庫抓取一筆資料后,我們得到的是一個(gè)包含該筆數(shù)據(jù)的數(shù)組。透過?while?敘述 及?array_push?函式, 我們將數(shù)據(jù)庫中的資料一筆一筆塞到數(shù)組里。 如果您只用到單層循環(huán), 就把第二層循環(huán)?(紅色的部份)?去掉即可。 決定內(nèi)容是否顯示 要決定是否顯示內(nèi)容, 我們可以使用?if?這個(gè)語法來做選擇。 例如如果使用者已經(jīng)登入的話, 我們的模版就可以這樣寫: <{if?$is_login?==?true}> 顯示使用者操作選單 <{el}> 顯示輸入帳號(hào)和密碼的窗體 <{/if}>

            x0c要注意的是, 「==」號(hào)兩邊一定要各留至少一個(gè)空格符,否則?Smarty?會(huì)無法解析。 if?語法一般的應(yīng)用可以參照官方使用說明, 所以筆者在這里就不詳加介紹了。 不過筆者發(fā)現(xiàn) 了一個(gè)有趣的應(yīng)用:常常會(huì)看到程序里要產(chǎn)生這樣的一個(gè)表格:?(數(shù)字代表的是資料集的順 序) 1?2 3?4 5?6 7?8 這個(gè)筆者稱之為「橫向重復(fù)表格」 。它的特色和傳統(tǒng)的縱向重復(fù)不同,前幾節(jié)我們看到的重復(fù) 表格都是從上而下, 一列只有一筆資料。 而橫向重復(fù)表格則可以橫向地在一列中產(chǎn)生?n?筆資 料后,再換下一列,直到整個(gè)循環(huán)結(jié)束。要達(dá)到這樣的功能,最簡單的方式只需要?ction? 和?if?搭配即可。 我們來看看下面這個(gè)例子: :

            <?php? require?"";? $my_array?=?array(? array("value"?=>?"0"),? array("value"?=>?"1"),? array("value"?=>?"2"),? array("value"?=>?"3"),? array("value"?=>?"4"),? array("value"?=>?"5"),? array("value"?=>?"6"),? array("value"?=>?"7"),? array("value"?=>?"8"),? array("value"?=>?"9"));? $tpl->assign("my_array",?$my_array);? $tpl->display(@#@#);? ?>?

            x0c模版的寫法如下: templates/:

            ? ? 橫向重復(fù)表格測(cè)試? ? ?
            lpadding="3">? ? <{ction?name=c1?loop=$my_array}>? <{$my_array[c1].value}>? <{if?$?is?div?by?2}>? ? ? <{/if}>? <{/ction}>? ? ? ? ?

            重點(diǎn)在于?$?這個(gè)?Smarty?變量,在?ction?循環(huán)中這個(gè)變量 會(huì)取得從?1?開始的索引值,所以當(dāng)?rownum?能被?2?除盡時(shí),就輸出??使表格換 列?(注意! 是??在前面?在后面)?。 因此數(shù)字?2?就是我們?cè)谝涣兄邢胍尸F(xiàn)的資料 筆數(shù)。各位可以由此去變化其它不同的呈現(xiàn)方式。 加載外部內(nèi)容 我 們 可以 在模 版內(nèi) 加 載 ?PHP? 程序 代碼 或是 另 一個(gè) 子 模版 ,分 別是 使 用 ?include_php? 及?include?這兩個(gè)?Smarty?模版語法;?include_php?筆者較少用,使用方式可以查詢官方 手冊(cè),這里不再敘述。

            x0c在使用?include?時(shí),我們可以預(yù)先加載子模版,或是動(dòng)態(tài)加載子模版。預(yù)先加載通常使用在 有共同的文件標(biāo)頭及版權(quán)宣告;而動(dòng)態(tài)加載則可以用在統(tǒng)一的框架頁,而進(jìn)一步達(dá)到 如?Winamp?般可換?Skin?。當(dāng)然這兩種我們也可以混用,視狀況而定。 我們來看看下面這個(gè)例子: :

            <?php? require?"";? $tpl->assign("title",?"Include?測(cè)試");? $tpl->assign("content",?"這是模版?2?中的變量");? $tpl->assign("dyn_page",?"test5_");? $tpl->display(@#test5_@#);? ?>?

            模版?1?的寫法如下: templates/test5_:

            ? ? ? <{$title}>? ? ? <{include?file="test5_"}>? <{include?file=$dyn_page}>? <{include?file="test5_"?custom_var="自訂變量的內(nèi)容"}>? ? ?

            模版?2?的寫法如下:

            x0ctemplates/test5_: <{$content}> 模版?3?的寫法如下: templates/test5_: 這是模版?3?的內(nèi)容 模版?4?的寫法如下: templates/test5_: <{$custom_var}> 這 里 注意 幾個(gè) 重點(diǎn) : 1.?模 版 的位 置都 是以 先 前定 義 的 ?template_dir? 為基 準(zhǔn) ;2.?所 有?include?進(jìn)來的子模版中,其變量也會(huì)被解譯。 ;3.?include?中可以用「變量名稱=變量 內(nèi)容」來指定引含進(jìn)來的模版中所包含的變量,如同上面模版?4?的做法。 用 PHP 實(shí)現(xiàn) MVC 開發(fā)模式的邏輯層和表示層有多種模板引擎可供選擇, 但是官方引擎 SMARTY 誕生后,選擇就有了變化。它的理念和實(shí)現(xiàn)都是相當(dāng)"前衛(wèi)"的。本文主要討論 SMARTY 之于其 他模板引擎的不同特點(diǎn),簡要介紹了該引擎的安裝及使用,并用一個(gè)小的測(cè)試案例對(duì)比了 SMARTY 和 PHPLIB?template 的速度和易用性。 一、MVC 需要模板 MVC 最早是在 SmallTalk 語言的開發(fā)過程中總結(jié)出的一種設(shè)計(jì)模式,MVC 分別代表了"模型"、 "視圖"和"控制",目的就是讓不同的開發(fā)角色在大中型項(xiàng)目中各司其職。在網(wǎng)絡(luò)應(yīng)用程序的 開發(fā)中

            ,可以用下圖來表示各概念之間的關(guān)系。?

            該圖展示了一個(gè)簡單的 WEB 應(yīng)用程序,用戶在瀏覽器上看到信息是數(shù)據(jù)庫服務(wù)器上的內(nèi)容, 但在這之前經(jīng)過了應(yīng)用服務(wù)器加工。開發(fā)人員負(fù)責(zé)的就是建立數(shù)據(jù)結(jié)構(gòu)、處理數(shù)據(jù)的邏輯以 及表示數(shù)據(jù)的方法。? 96 年 CGI 在中國開始流行的時(shí)候,早期的 WEB 程序員都是從 HTML 開始自學(xué)成材的,在 PERL 中 print 一行行的 HTML 并不是一件難事, 但是隨著網(wǎng)絡(luò)的一步步提速, 頁面大小也從當(dāng)初的 二、三十 K 暴漲了十倍。寫 CGI 程序就產(chǎn)生了一個(gè)迫切的要求:分開 PERL 和 HTML 源碼。于 是,社會(huì)進(jìn)步體現(xiàn)在開發(fā)小組內(nèi)部的分工上。由于美工和程序員對(duì)互相的工作并不是十分熟 悉,在進(jìn)行合作的過程中需要用一種約定的"語言"進(jìn)行交流。?

            x0c這種語言并不是我們的母語或者英語,術(shù)語叫做"模板",邏輯和表示依靠它聯(lián)系。它是結(jié)合 了 HTML 和腳本語言特征的一種表達(dá)方式。 通過這種方式, 表示層可以按照用戶所希望的格式 來顯示經(jīng)過邏輯層處理過的數(shù)據(jù)。 如果你有 Windows 平臺(tái)下 MFC 的開發(fā)經(jīng)驗(yàn),那么一定會(huì)很熟 悉 Document/Document?Template/View 的封裝,這就是一個(gè)很典型的 MVC 例子。對(duì)于 Web 應(yīng) 用來說,個(gè)人認(rèn)為 J2EE 中的 EJB/rvlets/JSP 是最強(qiáng)大的,當(dāng)然還有簡潔優(yōu)美的 Structs。 另一個(gè)很有名的實(shí)現(xiàn)就是 COM/DCOM+ASP,這個(gè)組合在我國是最多人使用的。? 通過幾種 MVC 實(shí)現(xiàn)在 WEB 應(yīng)用程序里的對(duì)比, 可以得到一個(gè)關(guān)于模板的概念: 一組插入了 HTML 的腳本或者說是插入了腳本 HTML,通過這種插入的內(nèi)容來表示變化的數(shù)據(jù)。下面給出一個(gè)模 板文件的例子,這個(gè)模板經(jīng)過處理后在瀏覽器里顯示"Hello,?world!"

            $greetings $greetings

            這里暫且省略處理方式,在后面做專門對(duì)比討論。

            二、為什么選 SMARTY?? 對(duì) PHP 來 說 , 有 很 多 模 板 引 擎 可 供 選 擇 , 比 如 最 早 的 PHPLIB?template 和 后 起 之 秀 Fast?template,經(jīng)過數(shù)次升級(jí),已經(jīng)相當(dāng)成熟穩(wěn)定。如果你對(duì)目前手中的模板引擎很滿意, 那么......也請(qǐng)往下看,相信你作為一個(gè)自由軟件愛好者或者追求效率和優(yōu)雅的開發(fā)者,下 面的 SMARTY 介紹多少會(huì)有點(diǎn)意思。? 除了個(gè)人偏好的影響,我一直傾向于使用官方標(biāo)準(zhǔn)的實(shí)現(xiàn),比如 APACHE 的 XML 引擎 Axis。 好處就是可以獲得盡可能好的兼容性(比如早期 MFC 對(duì)于 Win3x 的兼容性就比其它的應(yīng)用程序 框架好,當(dāng)然現(xiàn)在各種版本都很完善了)。SMARTY 發(fā)布之前我一直使用的是?PEAR?中的 Integrated?Template?eXtension。這個(gè)引擎和 PHPLIB?template、Fast?template 幾乎是兼 容的,從模板的語法到對(duì)模板的處理同出一轍:都是將模板讀入內(nèi)存然后

            調(diào)用 par()函數(shù), 用數(shù)據(jù)對(duì)預(yù)置的標(biāo)記進(jìn)行替換。

            x0c下面看看 SMARTY 是怎么做的。接到 request 后,先判斷是否第一次請(qǐng)求該 url,如果是,將 該 url 所需的模板文件"編譯"成 php 腳本,然后 redirect;如果不是,就是說該 url 的模板 已經(jīng)被"編譯"過了,檢查不需要重編譯后可以馬上 redirect,重編譯條件可以自己設(shè)定為固 定時(shí)限,默認(rèn)的是模板文件被修改。?

            怎么樣,看起來是不是有點(diǎn)眼熟?想起來了──這不就是 JSP 的原理嘛!的確,這種"編譯" 用在 PHP 這樣的解釋性腳本引擎上顯得匪夷所思,但是仔細(xì)想想,JAVA 不也是由 JVM 解釋執(zhí) 行的嗎?這就叫"沒有做不到,只有想不到"。? 既然談到了 JAVA, 就再對(duì) PHP 的未來發(fā)表一點(diǎn)看法。 官方網(wǎng)站上宣布了要在 2003 年年底 PHP 發(fā)布 PHP5.0 版。這個(gè)版本擁有很多嶄新的特性:比如異常處理,命名空間,更加面向?qū)ο蟮?等。可以說越來越向 JAVA 靠攏,SMARTY 也是新特性之一,使得 PHP 更適用于大中型項(xiàng)目的 開發(fā)。但是似乎離我當(dāng)初選擇它的原因──靈巧易用──越來越遠(yuǎn)了。但就一個(gè)軟件的生存 周期來看,PHP 正處在成長期,開發(fā)者賦予它更多的功能,以期能勝任商業(yè)應(yīng)用是利大于弊 的。作為 PHP 的忠實(shí)用戶,肯定不希望 PHP 總是被人指責(zé)"能力不足"吧? 為什么選擇 SMARTY,僅僅因?yàn)樗芟?JSP?當(dāng)然有更為充分的理由。首先,除了第一次編譯 的成本比較高之外,只要不修改模板文件,編譯好的 cache 腳本就隨時(shí)可用,省去了大量的 par()時(shí)間;其次 SMARTY 像 PHP 一樣有豐富的函數(shù)庫,從統(tǒng)計(jì)字?jǐn)?shù)到自動(dòng)縮進(jìn)、文字環(huán)繞 以及正則表達(dá)式都可以直接使用;如果覺得不夠,比如需要數(shù)據(jù)結(jié)果集分頁顯示的功能, SMARTY 還有很強(qiáng)的擴(kuò)展能力,可以通過插件的形式進(jìn)行擴(kuò)充。? 事實(shí)勝于雄辯。我設(shè)計(jì)了一個(gè)測(cè)試程序,通過速度和開發(fā)難度這兩個(gè)因素對(duì)比了一下 SMARTY 和 PHPLIB?template,選 PHPLIB?template 的原因是在 patrick 的文章?《在 PHP 世界中選擇 最合適的模板》 中有一個(gè) PHPLIB?template 對(duì) Fast?template 的競(jìng)賽, 結(jié)果 PHPLIB?template 大獲全勝,這使得 SMARTY 有了一個(gè)很好的對(duì)手。在測(cè)試之前,先談一下在安裝過程中需要注 意的問題。

            三、可能遇到的問題? 在 SMARTY 的?官方網(wǎng)站上,有詳盡的用戶手冊(cè),可以選擇在線 HTML 和 PDF 格式的版本。這里 就不再涉及手冊(cè)上已有的內(nèi)容,只是把初次使用可能遇到的問題做個(gè)解釋。? 第一個(gè)問題就很要命: 提示說找不到所需文件?并不是每一個(gè)人都按照 SMARTY 默認(rèn)目錄結(jié)構(gòu) 來寫應(yīng)用的。這里需要手工指定,假設(shè)目錄結(jié)構(gòu)如下:

            x0c就需要在 里指定目錄結(jié)構(gòu):

            $smart->template_dir?=?"smarty/templates/";

            $smart->compile_dir?=?"smarty/templates_c/"; $smart->config_dir?=?"smarty/configs/"; $smart->cache_dir?=?"smarty/cache/";

            第一個(gè)問題解決了,緊接著就是第二個(gè):我剛用 Dreamweaver 生成的漂亮模板怎么不能用? 并不是模板文件有什么問題, 而是因?yàn)?SMARTY 默認(rèn)的標(biāo)記分隔符是{}, 不巧的是 Javascript 肯定包含這個(gè)標(biāo)記。好在我們可以用任意字符當(dāng)作分隔符,再加上這兩句:

            $smart->left_delimiter?=?"{/"; $smart->right_delimiter?=?"/}";

            這下安裝就基本完成,沒問題了。

            四、反襯和類比? 先構(gòu)思一下對(duì)測(cè)試的設(shè)計(jì)。主要的評(píng)比因素當(dāng)然是速度了。為了進(jìn)行速度測(cè)試,采取了算術(shù) 平均數(shù)的作法。在測(cè)試頁面中重復(fù)將頁面生成 N 遍,再對(duì)比總頁面生成時(shí)間。另一個(gè)重要因 素是易用性(至于擴(kuò)展性不用比較已經(jīng)有結(jié)果了),所以使用的模板不能太小。我用的是我個(gè) 人主頁的的頁面,一個(gè)用 Firework+Dreamweaver 生成的 HTML 文件,大小約 7K。其中的變量 設(shè)置也采取最常用的區(qū)塊, PHPLIB?template 里叫 block,而 SMARTY 則稱 ction。 在 別小看 這稱呼的不同,易用性標(biāo)準(zhǔn)分兩塊:模板文件和腳本文件的語法是否簡明易用。

            下面就深入到測(cè)試中來。 先看看兩種模板文件的語法: 藍(lán)條左邊是 PHPLIB?template 的模板,

            x0c右邊屬于 SMARTY。個(gè)人偏好是不一樣的,所以這里不作評(píng)論。著重對(duì)比一下腳本里的處理語 句,先看 PHPLIB?template 的:

            $tpl->t_file(‘phplib‘,?‘‘); $tpl->t_block(‘phplib‘,?‘row‘,?‘rows‘); for?($j?=?0;?$j?<?10;?$j++){ $tpl->t_var(‘tag‘?,"$j"); $tpl->par(‘rows‘,?‘row‘,?true); } $tpl->par(‘out‘,?‘phplib‘); $tpl->p(‘out‘);

            下面是 SMARTY 的:

            $smart->assign(‘row‘,$row); $smart->display(‘‘);

            SMARTY 只用了 tags 和 row 兩個(gè)變量, PHPLIB?template 則多了模板文件的 handler, 而 還有 一個(gè)莫名其妙的 out。說實(shí)在的這個(gè) out 我當(dāng)初學(xué)的時(shí)候就不知道為什么要存在,現(xiàn)在看起 來,還是別扭。為什么 SMARTY 少那么多處理語句呢?答案是工作由引擎完成了。如果你喜歡 鉆研源程序, 可以發(fā)現(xiàn)在 Smarty_ 里有一個(gè)名叫_compile_tag()的函數(shù), 由它負(fù)責(zé)把 ction 這個(gè)標(biāo)簽轉(zhuǎn)換成 php 語句。 這不是一個(gè)普通的標(biāo)簽, 它帶有參數(shù)和數(shù)據(jù), 節(jié)省了腳本編程的工作量,而模板標(biāo)簽上的工作量相差又不大,可以判定在易用性上 SMARTY 高出一疇。? 下面該輪到我們最關(guān)注的速度了,畢竟對(duì)于一個(gè)熟練的 web 開發(fā)者來說,掌握再困難的工具 不過是時(shí)間問題, 何況模板引擎這種學(xué)習(xí)曲線平緩的技術(shù)。 而速度則是 web 應(yīng)用程序的生命, 尤其是模板引擎使用在并發(fā)訪問量很大的站點(diǎn)上,這點(diǎn)就更重要了。測(cè)試開始前,我覺得 PHPLIB?temp

            late 會(huì)在這一環(huán)節(jié)上勝出,因?yàn)樗?jīng)歷了很多次升級(jí),已經(jīng)基本沒有什么 bug, 而且 SMARTY 的引擎?zhèn)€頭太大,不像它的對(duì)手只有兩個(gè)文件。? 果然,測(cè)試結(jié)果如下圖,PHPLIB?template 有 25%的速度優(yōu)勢(shì):?

            x0c但不會(huì)一直這樣,我又按了一次刷新,這次得到了不一樣的結(jié)果:

            PHPLIB 基本沒變化,但是 SMARTY 提高了 25%的速度。繼續(xù)刷新,得到的都是類似于第二次的 結(jié)果:SMARTY 比 PHPLIB?template?快上近 10%。我想這就是編譯型比解釋型快的原理了。 SMARTY 引擎本身就很大,加上還要把模板編譯成 php 文件,速度當(dāng)然比不上小巧的 PHPLIB?template。但這只是第一次的情況。第二次接到請(qǐng)求的時(shí)候,SMARTY 發(fā)現(xiàn)該模板已 經(jīng)被編譯過了,于是最耗時(shí)的一步被跳過了,而對(duì)手還要按部就班地進(jìn)行查找和替換工作。 這是編譯原理里講到的很經(jīng)典的"用空間換時(shí)間"例子

            x0c

            本文發(fā)布于:2023-03-13 15:17:52,感謝您對(duì)本站的認(rèn)可!

            本文鏈接:http://m.newhan.cn/zhishi/a/1678691873140850.html

            版權(quán)聲明:本站內(nèi)容均來自互聯(lián)網(wǎng),僅供演示用,請(qǐng)勿用于商業(yè)和其他非法用途。如果侵犯了您的權(quán)益請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)刪除。

            本文word下載地址:芭樂是什么.doc

            本文 PDF 下載地址:芭樂是什么.pdf

            上一篇:帝都泱泱
            下一篇:返回列表
            標(biāo)簽:芭樂是什么
            相關(guān)文章
            留言與評(píng)論(共有 0 條評(píng)論)
               
            驗(yàn)證碼:
            推薦文章
            排行榜
            Copyright ?2019-2022 Comsenz Inc.Powered by ? 實(shí)用文體寫作網(wǎng)旗下知識(shí)大全大全欄目是一個(gè)全百科類寶庫! 優(yōu)秀范文|法律文書|專利查詢|
            主站蜘蛛池模板: 日韩黄色大片在线播放| 丁香婷婷综合激情五月色| 亚洲免费成人av一区| 中文乱码字幕无线观看2019| 国产人妻高清国产拍精品| 国产极品尤物免费在线| 久久国产亚洲一区二区三区| 国产片AV国语在线观看手机版| 亚欧洲乱码视频一二三区| 国产一区二区黄色激情片| 亚洲av本道一区二区| 99久久99视频只有精品| 日韩av中文字幕有码| 亚洲国产精品久久久久久无码| 国产熟女av一区二区三区| 亚洲成a人无码av波多野| 午夜AAAAA级岛国福利在线| 亚洲日韩久热中文字幕| 国产一区二区三区色区| 日本欧美一区二区三区在线播放| 亚洲综合憿情五月丁香五月网| 亚洲精品亚洲人成人网| 亚洲精品国产福利一区二区| 91中文字幕在线一区| 狠狠色狠狠色综合久久蜜芽| 人妻少妇太爽了嫩草影院| 亚洲一区二区三区自拍高清| 国产激情无码一区二区三区| 中文国产日韩欧美二视频| 欧美在线精品一区二区三区| 99在线国内在线视频22| 日韩AV无码精品一二三区| av天堂亚洲区无码先锋影音| 中文字幕结果国产精品| 久久亚洲精品11p| 日韩av天堂综合网久久| 成人永久免费A∨一级在线播放| 精品午夜福利短视频一区| 熟妇人妻av中文字幕老熟妇| 四虎网址| 日韩在线观看中文字幕|