日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

PHP smarty

發(fā)布時間:2023/12/18 php 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP smarty 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
<?php /* 一、什么是smarty?smarty是一個使用PHP寫出來的模板PHP模板引擎,它提供了邏輯與外在內(nèi)容的分離,簡單的講, 目的就是要使用PHP程序員同美工分離,使用的程序員改變程序的邏輯內(nèi)容不會影響到美工的頁面設(shè)計,美工重新修改頁面不會影響到程序的程序邏輯,這在多人合作的項目中顯的尤為重要。二、smarty優(yōu)點:1. 速度:采用smarty編寫的程序可以獲得最大速度的提高,這一點是相對于其它的模板引擎技術(shù)而言的。2. 編譯型:采用smarty編寫的程序在運行時要編譯成一個非模板技術(shù)的PHP文件,這個文件采用了PHP與HTML混合的方式,在下一次訪問模板時將WEB請求直接轉(zhuǎn)換到這個文件中,而不再進行模板重新編譯(在源程序沒有改動的情況下)3. 緩存技術(shù):smarty選用的一種緩存技術(shù),它可以將用戶最終看到的HTML文件緩存成一個靜態(tài)的HTML頁,當(dāng)設(shè)定smarty的cache屬性為true時,在smarty設(shè)定的cachetime期內(nèi)將用戶的WEB請求直接轉(zhuǎn)換到這個靜態(tài)的HTML文件中來,這相當(dāng)于調(diào)用一個靜態(tài)的HTML文件。4. 插件技術(shù):smarty可以自定義插件。插件實際就是一些自定義的函數(shù)。5. 模板中可以使用if/elseif/else/endif。在模板文件使用判斷語句可以非常方便的對模板進行格式重排。三、不適合使用smarty的地方:1. 需要實時更新的內(nèi)容。例如像股票顯示,它需要經(jīng)常對數(shù)據(jù)進行更新,這類型的程序使用smarty會使模板處理速度變慢。2. 小項目。小項目因為項目簡單而美工與程序員兼于一人的項目,使用smarty會喪失php開發(fā)迅速的優(yōu)點。四、smarty目錄結(jié)構(gòu)及版本 打開smarty的官方網(wǎng)站,www.smarty.net/download.php。下載Smarty 3.1.12。有tar.gz和zip分別適用于linux和windows版本。下載好后Smarty-stable-3.1.12解壓縮會得到一個 Smarty-3.1.12 文件夾,里面有兩個主要文件夾demo和libsdemo文件夾為示例文件夾,里面包含默認(rèn)文件夾結(jié)構(gòu),是我們要進行編寫程序代碼的主要文件夾。demo里文件夾的名稱都是smarty默認(rèn)的目錄結(jié)構(gòu)名稱,可以通過改smarty對應(yīng)屬性值,再把文件夾名改成我們想要的名稱。 libs為smarty代碼源文件夾,一般不動。/libs/Smarty.class.php #主文件/libs/sysplugins/ #內(nèi)部plugin/libs /plugins/ #外部plugin,可自由擴充/demo/cahce/ #放置緩存文件/demo/configs / #放置可以載入的配置文件/demo/templates/ #放置模板文件/demo/templates_c/ #放置對模板編譯后的文件可以把解壓得到的 Smarty-3.1.12 文件夾名改成我們想要的項目名,demo也可以改成我們想要的具體存放編碼的文件夾的名稱2、調(diào)試Smarty-3.1.12創(chuàng)建自己的文件,在demo文件夾下創(chuàng)建index.php。 在templates目錄中創(chuàng)建模板index.tpl (幾乎可以是任何文本文件的擴展名,常用的是tpl,php,html,不建議使用后兩者,因為可以從瀏覽器直接訪問而不安全。可以對apache的httpd.conf進行設(shè)置,禁止直接訪問.tpl文件。或者將templats目錄放在網(wǎng)站文檔樹之外。)*///index.php代碼 require('../libs/Smarty.class.php'); $smarty = new Smarty; //在調(diào)用的模板里可以通過{$name}來輸出name的值zhang,{}為這里的smarty分界符 $smarty->assign('name','zhang'); //調(diào)用模板tpl文件里不能執(zhí)行PHP語句塊 $smarty->display('templates/index.tpl');/* index.tpl頁面內(nèi)容<html> <body><span>你好, {$name}</span></body> </html> *//* Smarty編譯時的處理過程是源php文件->模板文件(可能調(diào)用多個或多次)->源php文件。。。 也就是說不影響原php文件的其他處理和輸出。所以smarty模板文件可以是完整的html,也可以是其中一部分。smarty處理過程 smarty將php源文件,首先編譯成中間文件(也是php),如果啟用緩存,再根據(jù)編譯文件生成緩存文件(也是php),需要緩存的部分全部是硬編碼。 之后的每次訪問都會訪問編譯文件(如果編譯文件已經(jīng)存在),一次編譯多次調(diào)用(可以是單文件的多次,也可以是多文件的多次),如果啟用緩存且有緩存文件而且沒有過期,則直接訪問緩存文件,跳過編譯文件。 編譯文件一經(jīng)生成,就不會被自動更新,除非模板文件或者配置文件更改。源php文件修改是不會引發(fā)重新編譯的。一旦編譯文件重新生成,緩存文件也必然重新生成。 *///Smarty允許有兩種特殊的編譯設(shè)置存在: //1、 任何時候都不自動重新編譯(上線階段):只有沒有該文件的編譯文件時才生成,模板文件或者配置文件的更改,不會引發(fā)重新編譯。 $smarty->setCompile_check(false);//默認(rèn)為true,false表示任何時候都不在文件發(fā)生變更的情況下生成編譯文件,除了無編譯文件。 $smarty->getCompile_check();//獲得當(dāng)前編譯檢查的設(shè)置 //2、任何時候都重新編譯(調(diào)試階段):任何時候都重新編譯。 $smarty->setForce_compile(true);//默認(rèn)為false,true表示每次都重新編譯(啟用緩存的話,每次都重新緩存) $smarty->getForce_compile();//獲得當(dāng)前強制編譯的設(shè)置//開啟緩存 $smarty->setCaching(true); $smarty->getCaching();//獲取當(dāng)前緩存狀態(tài),默認(rèn)是false關(guān)閉的 $smarty->setcache_lifetime(60);//設(shè)置緩存時間單位秒 //{*模版文件*} //{nocache} //{$name} //{/nocache} //{*如果開啟緩存的話放在nocache標(biāo)簽內(nèi)的變量不會緩存,每次讀取PHP源文件的值*}/* smarty分界符 在模板文件中,區(qū)分普通html代碼和smarty代碼靠的是分界符。默認(rèn)是 {} ,但可能會與js和css相沖突。可以進行變更。 在3.0中模板標(biāo)簽將不支持空格,如{ $abc }在Smarty2中可以識別的,但是3.0里頭就不行了,必須這樣{$abc},這樣是為了能夠更好的支持javascript和css。 */ $smarty->left_delimiter = "{"; //左分界符,2.0屬性,3.0沿用 $smarty->right_delimiter = "}"; /* 分界符就相當(dāng)于PHP的echo,分界符中的值都將輸出,除非賦值等操作 smarty tpl文件中分界符中兩個**之間的內(nèi)容為注釋內(nèi)容如 tpl文件: {*這是模板注釋內(nèi)容*} *///設(shè)置緩存目錄路徑,不設(shè)默認(rèn)"cache" $smarty->setCacheDir("cache"); //獲取緩存目錄路徑 $smarty->getCacheDir();//設(shè)置配置目錄路徑,不設(shè)默認(rèn)"configs" $smarty->setConfigDir("configs"); //添加配置目錄路徑,所有路徑將會以數(shù)組形式保存,調(diào)用文件時將在所有路徑中查找 $smarty->addConfigDir("configs/test"); //獲取配置目錄路徑的數(shù)組 $smarty->getConfigDir();//設(shè)置插件目錄路徑,不設(shè)默認(rèn)"plugins" $smarty->setPluginsDir("plugins"); //添加插件目錄路徑,所有路徑將會以數(shù)組形式保存,調(diào)用文件時將在所有路徑中查找,plugins文件夾里放的就是可以在前臺或后臺按不同規(guī)則調(diào)用的函數(shù)的存儲文件,文件名及函數(shù)名的命名按不同調(diào)用規(guī)則有不同寫法要求 $smarty->addPluginsDir("plugins/test"); //獲取插件目錄路徑的數(shù)組 $smarty->getPluginsDir();//設(shè)置模板目錄路徑,不設(shè)默認(rèn)"templates" $smarty->setTemplateDir("templates"); //添加模板目錄路徑,所有路徑將會以數(shù)組形式保存,調(diào)用文件時將在所有路徑中查找 $smarty->addTemplateDir("templates/test"); //獲取模板目錄路徑的數(shù)組 $smarty->getTemplateDir();//設(shè)置編譯目錄路徑,不設(shè)默認(rèn)"templates_c" $smarty->setCompileDir("templates_c"); //獲取編譯目錄路徑 $smarty->getCompileDir(); /* 我們可以建不同的php源文件文件夾,把編寫的php文件按一定的分類放在不同的文件夾中。 然后在每個文件夾中都創(chuàng)建一個自定義的config文件,在config文件中創(chuàng)建一個新的$smarty = new Smarty 對象 然后把所有不同的文件夾的php文件的緩存,配置文件,插件,模版,編譯目錄都設(shè)置到同一個緩存,配置文件,插件,模版,編譯目錄 讓該文件夾下所有PHP源文件都引用該配置文件即可獲取相同配置 *///模版變量 $arr = array(array("zhang","li"),'a'=>array("liu","wang"),array("ming","yi")); $smarty->assign("testArr", $arr); //設(shè)置模版變量,為將要調(diào)用的模版提供變量,在接下來調(diào)用的模版中可以通過{$testArr}或者{$testArr['a'][0]}或者{$testArr.a.0}來訪問具體某數(shù)組元素 //在模版中可以直接通過 {$testArr = "testValue" scope="global"} 來更改傳過來的模板變量的值(如果不存在則在模板中創(chuàng)建并設(shè)置該模版變量),scope屬性是標(biāo)注模板變量使用范圍的可不寫 //在模版中更改或創(chuàng)建成其他數(shù)組 {$testArr = [1,2,3]}也可以{$testArr = [1,'a'=>2,2=>3]}也可以{$testArr[] = 4}或其他類似PHP中創(chuàng)建數(shù)組方式 //php源文件可通過 $smarty->getTemplateVars("testArr") 獲取指定模版變量,如要獲取模板中改變或創(chuàng)建的模版變量,在模板中創(chuàng)建或更改其值時必須加上scope屬性并把值設(shè)置為scope="global"或scope="parent"class A{function aa($nam){echo $nam;} } $smarty->assign("obj", new A); //設(shè)置的模版變量是對象時在模版頁可以如下這樣調(diào)用,給模版?zhèn)黝悓ο髸r也是傳址 //{$obj->aa('my name is y')}//Smarty可以識別嵌入在雙引號中的模版變量,只要此變量只包含數(shù)字、字母、下劃線。但貌似只支持能直接轉(zhuǎn)換成字符串的模版變量 $smarty->assign("testStr", "this is testStr"); //模板中可通過{"$testStr OK !"}來訪問/* tpl模板包含模板 模板文件: {include file="header.tpl"} header.tpl內(nèi)容: <span>這是頂部內(nèi)容!!,歡迎你,{$name}</span>模板包含模板也可以是這樣格式 {include file="header.tpl" testVar="這是頂部內(nèi)容!!!"} header.tpl則可以通過{$testVar}使用調(diào)用頁包含時傳來的模板變量 header.tpl內(nèi)容: <span>{$testVar},歡迎你,{$name}</span><hr /> *//* 可以預(yù)先規(guī)定一系列的變量與值的對應(yīng),并放在配置文件中,在使用時載入。 配置文件默認(rèn)放在configs文件夾中,可以自定義修改文件夾名。 *//* #模板test.conf文件: #鍵對應(yīng)的值可以不用引號括起來 title = Welcome to Smarty!! cutoff_size = 40[china] language = chinese[england] language = english#[china],[england]為標(biāo)簽,未設(shè)置標(biāo)簽的鍵值為全局的只要調(diào)用該配置文件就可以在模版中使用,設(shè)置了標(biāo)簽的鍵值只有在調(diào)用配置文件時指定了對應(yīng)標(biāo)簽才可以使用 #在PHP源文件調(diào)用配置文件語句$smarty->configLoad('test.conf', $sections = 'england');該語句下面調(diào)用的模版才可以使用該配置文件,通過$sections屬性指定使用哪個標(biāo)簽下的鍵和值 #$sections參數(shù)可以不寫,默認(rèn)值為null,$smarty->configLoad('test.conf')則只使用全局的鍵值,而不能使用標(biāo)簽下的鍵值 #在模版下通過{config_load file="test.conf" section="china" scope="global"}語句調(diào)用配置文件 #section屬性可以不寫,默認(rèn)是null,scope屬性必須寫{config_load file="test.conf" scope="global"} #section屬性可賦三種值 #local 只有當(dāng)前模版可以使用該配置文件 #parent 只有當(dāng)前模版引入該配置文件語句后包含的模版中,或在php源文件中smarty對象調(diào)用該配置文件后調(diào)用的模版中可以使用該配置文件中的鍵值 #global 測試效果和parent相同 #在模版中通過{#language#}來使用鍵值,也可以通過{$smarty.config.language}來訪問配置文件鍵值 #PHP源文件中可以使用$smarty->getConfigVars('language')或$smarty->getConfigVariable('language')來獲取鍵值,$smarty->getConfigVars('language')獲取的還可能是數(shù)組 *//* tpl文件中常用函數(shù) tpl文件: <!--將capture標(biāo)簽括起的頁面顯示內(nèi)容存在capture指定的testCapture中 --> <!--當(dāng)達(dá)到指定條件時可通過 {$smarty.capture.testCapture} 將內(nèi)容輸出出來 --> {capture name="testCapture"} {include file="f1.tpl"} {/capture}{if true} {$smarty.capture.testCapture} {/if}{if $name == "wang"}Welcome wang.{elseif $name == "zhang"}Welcome zhang.{else}Welcome, whatever you are.{/if} {*操作符可以是 ==,>= 等也可以是 eq,ne等*}{for $x=0; $x<count($testArr); $x++} {$x} {/for} {*for循環(huán),類似PHP代碼*}{$x=0} {while $x<count($testArr)} {$x++} {/while} {*While循環(huán),也類似PHP代碼。*}<!--name和key屬性可不寫--> {foreach name="testForeach" from=$testArr key=arId item=arVal} {$arId}對應(yīng)的值為:{$arVal} <br> {$smarty.foreach.testForeach.index} <!--(循環(huán)內(nèi)部使用)顯示當(dāng)前循環(huán)的索引,如果數(shù)組為空,返回-1-->{$smarty.foreach.testForeach.iteration} <!--(循環(huán)內(nèi)部使用)顯示當(dāng)前的循環(huán)次數(shù)-->{$smarty.foreach.testForeach.first} <!--(循環(huán)內(nèi)部使用)如果為第一次循環(huán),返回true-->{$smarty.foreach.testForeach.last} <!--(循環(huán)內(nèi)部使用)如果為最后一次循環(huán),返回true-->{$smarty.foreach.testForeach.total} <!-(循環(huán)內(nèi)外部使用)顯示循環(huán)的總次數(shù)--> <br> {foreachelse} <!--$testArr數(shù)組變量沒有值時(0個元素)執(zhí)行。--> $testArr is null {/foreach}{*也可以如下兩種類PHP格式*} {foreach $testArr as $n} {$n} {/foreach}{foreach $testArr as $key=>$n} {$key} {/foreach}{$sectionArr = [0=>"a",4=>"b","c","d","e",6,7,8,9,10,11,12,13,14,15,16]} {section name="testSection" loop=$sectionArr start=0 step=4 max=6 show=true}{$smarty.section.testSection.index}- <!--當(dāng)前循環(huán)到的數(shù)組的鍵值--> {$sectionArr[testSection]}- <!--當(dāng)前循環(huán)到的數(shù)組的元素值--> {$smarty.section.testSection.iteration}-<!--當(dāng)前section循環(huán)的次數(shù),從1計起--> <br/>{sectionelse} $sectionArr is null {/section} <!--section循環(huán)適用于純int型鍵值的數(shù)組--> <!--給loop賦一個要循環(huán)的數(shù)組,start指定從數(shù)組指定鍵值開始循環(huán),step指定數(shù)組下次循環(huán)的鍵值與本次循環(huán)鍵值之差,max指定循環(huán)最大次數(shù),show指定是否循環(huán)false的話直接跳到執(zhí)行sectionelse--> <!--Section的內(nèi)置變量與foreach 相同-->*//* tpl模板文件: {literal}<script type="text/javascript"> function a(){alert("this is script"); } a(); </script>{/literal} {* literal 標(biāo)簽區(qū)域內(nèi)的數(shù)據(jù)將被當(dāng)作網(wǎng)頁html文本處理,此時模板將忽略且不分析其內(nèi)部的所有字符信息。 該特性用于顯示有可能包含大括號等字符信息的 js、css 。當(dāng)這些信息處于 {literal}{/literal} 標(biāo)簽中時,模板引擎將不分析它們,而直接顯示。 *}*///PHP文件: //$smarty->setDebugging(true);//對后續(xù)調(diào)用的模板進行調(diào)試。 //$smarty->getDebugging();//得到當(dāng)前是否進行調(diào)試,默認(rèn)false //或在需要調(diào)試的模版中寫入{debug}/* 模板文件:smarty3.0支持了模版繼承系統(tǒng),例如 f1.tpl: <html> <body>{block name='top'} f1.header<br />{/block} {block name='middle'} f1.middle<br />{/block} {block name='buttom'} f1.buttom<br />{/block}</body> </html>f2.tpl: {extends file="f1.tpl"} {block name='top'} f2.header<br />{/block} {block name='other'} it can`t be show <br />{/block} {* 如果f2.tpl中沒有block標(biāo)簽,或f2.tpl中沒有和f1.tpl中相同命名的block標(biāo)簽,則f2.tpl完整引入顯示f1.tpl中所有內(nèi)容包括block標(biāo)簽的內(nèi)容,而f2.tpl中所有內(nèi)容將忽略 如果f2.tpl中有和f1.tpl中同名block標(biāo)簽,則在f2.tpl顯示時f2.tpl中block標(biāo)簽內(nèi)容將覆蓋f1.tpl中同名block標(biāo)簽的內(nèi)容,在f2.tpl頁面顯示時,內(nèi)容仍將按f1.tpl設(shè)置的格式位置顯示,f2.tpl其他所有文本包括未同名的block標(biāo)簽及其內(nèi)容都將被忽略,不顯示。 block標(biāo)簽的內(nèi)容只會覆蓋父模版中同名block標(biāo)簽的內(nèi)容,或在子模版中顯示,在本頁面中如果沒有調(diào)用父模版或父模版中沒有要覆蓋的同名block標(biāo)簽,block標(biāo)簽內(nèi)容在本頁面中不顯示 這種繼承支持多文件,多重繼承,意味著可以無限的繼承下去 *}{fetch file="http://www.126.com" assign="testAssign"} {$testAssign} {fetch file="http://www.126.com"} {*fetch可以引用外部http,ftp的頁面,如指定assign的值則把引用的內(nèi)容存在指定名的變量中,否則在哪有fetch在哪顯示*} *///php頁面: //調(diào)用模版也可以使用此方法,在輸出前做一些處理 //$output = $smarty->fetch("index.tpl"); //do something with $output here對將要輸出的內(nèi)容進行處理 //echo $output;//然后將模板輸出/* 模板中提交表單 <form name="input" action="file.php" method="post"> action屬性可以直接寫要提交到的php文件名,或者不寫空action=""則提交到調(diào)用該模板的php文件中 *///連接數(shù)據(jù)庫 mysql_connect("localhost","root","root"); mysql_select_db("test"); $smarty->assign('webDir',$_SERVER['DOCUMENT_ROOT']);//$_SERVER['DOCUMENT_ROOT']為當(dāng)前項目文件夾的絕對路徑 //配置JQuery的src路徑最好寫絕對路徑或?qū)懸\行文件能找到該JQuery的相對路徑因為要編譯成編譯文件,而編譯后的文件和原路徑環(huán)境不一樣 ?> <script type="text/javascript" src="http://localhost/Smarty/demo/JS/jquery-1.7.2.min.js"></script>

總結(jié)

以上是生活随笔為你收集整理的PHP smarty的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。