【小(xiǎo)編推薦】ThinkPHP3.2——标簽庫驅動

2014-06-26   §™↔↔|   發♦✔←↕布者:梁國(guó)芳   ‍≈>|   查看(kàn):3320次

Thinkphp

任何一(yī)個(gè)模闆引擎的(de)功能(néng)都(dōu)不(bù$×)可(kě)能(néng)是(shì)為(wèi)你(nǐ)量身(shēnπ¥)定制(zhì)的(de),具有(yǒu)一(yī)個(gè)良好(hǎo)的¥☆$♣(de)可(kě)擴展機(jī)制(zhì)也(yě)是(shì)模闆∞&引擎的(de)另外(wài)一(yī)個(gè)考量,Smar&γ€≥ty采用(yòng)的(de)是(shì)插件(jiàn)方法≥±γ→來(lái)實現(xiàn)擴 展,Think\Template由于采用(♣™₹‍yòng)了(le)标簽庫技(jì)術(s​λhù),比Smarty提供了(le)更為(wèi)強大(dà)的(de)定'©制(zhì)功能(néng),和(hé)Java的(de)Tag‍γβ Libs一(yī)樣可(kě)以支持自(zì)定義标簽庫 和(hé)≠φ≥标簽,每個(gè)标簽都(dōu)有(yǒu)獨ε✘★π立的(de)解析方法,所以可(kě)以根據标簽庫的(d€☆↑e)定義規則來(lái)增加和(hé)修改标簽解析規則。

在Think\Template中标簽庫的(de≈ ‍)體(tǐ)現(xiàn)是(shì)采用(yòng)XML命名空('↕↓ kōng)間(jiān)的(de)方式。每個(gè)标簽庫對(duì)應一↕λβ(yī)個(gè)标簽庫驅動類,每個(gè)驅動類負責對(d₹ ™∏uì)标簽庫中的(de)所有(yǒu)标簽的$₩(de)解析。

标簽庫驅動類的(de)作(zuò)用(yòng)其實就(jiù)是(shì)把βδ¶某個(gè)标簽定義解析成為(wèi)有©¶ &(yǒu)效的(de)模版文(wén)件(jiàn)(可βδφ←(kě)以包括PHP語句或者HTML标簽),标簽庫驅動的(de)命名‍ &↓空(kōng)間(jiān)位于 Think\Template\TagLib,标簽庫驅動必須繼承Think\Template\TagLib類,例如(rú):

  1. namespace Think\Template\Taglib;
  2. use Think\Template\TagLib;
  3. Class Test extends TagLib{
  4. }

首先需要(yào)定義标簽庫的(de)标簽定義,标簽定義包含了(≥×→le)所有(yǒu)标簽庫中支持的(de)所有(yǒu)标簽δ≥∞,定義方式如(rú)下(xià):

  1. protected $tags = array(
  2. // 定義标簽
  3. 'input' => array('attr'=>'type,name,id,value','close'=>0), // input标簽
  4. 'textarea' => array('attr'=>'name,id'),
  5. );

标簽庫的(de)所有(yǒu)支持标簽都(dōu)在tags屬性中進行(xφ☆↓íng)定義,tags屬性是(shì)一(yī)個(gè λβ$)二維數(shù)組,每個(gè)元素就(jiù)是(shì) ÷'一(yī)個(gè)标簽定義,索引名就(jiù)是(shì)标簽名,采用(y₩✘ òng)小(xiǎo)寫定義,調用(yòng)的(de)時(s✘φhí)候不(bù)區(qū)分(fēn)大(dà)小(xiǎo)寫。

每個(gè)标簽定義支持的(de)屬性包括:

屬性名 說(shuō)明(míng)
attr 标簽支持的(de)屬性列表,用(yòng)逗号分(fēn)隔
close 标簽是(shì)否為(wèi)閉合方式 (0閉合 1不γβ↔λ(bù)閉合),默認為(wèi)不(bù)閉合
level 标簽的(de)嵌套層次(隻有(yǒu)不(bù)閉合的(de)标簽才有¶×(yǒu)嵌套層次)
alias 标簽别名

定義了(le)标簽屬性後,就(jiù)需要(yào)定義每個(gè)标∞×簽的(de)解析方法了(le),每個(gè)标簽的(de)解析方法'α在定義的(de)時(shí)候需要(yào)添加&l♠©dquo;_”前綴,傳入兩個(gè)參數(shù),對(d€↔•&uì)應屬性數(shù)組和(hé)內(nèiε≤)容字符串(針對(duì)非閉合标簽)。必須返回标簽的(de)字符串§©↕解析輸出,在标簽解析類中可(kě)以調用(₽εyòng)模闆類的(de)實例。下(xià)面是(sα↕ ♦hì)一(yī)個(gè)input解析方法的(de)定義:

  1. // input标簽解析
  2. public function _input($tag,$content) {
  3. $name = $tag['name'];
  4. $id = $tag['id'];
  5. $type = $tag['type'];
  6. $value = $this->autoBuildVar($tag['value']);
  7. $str = "<input type='".$type."' id='".$id."' name='".$name."' value='".$value."' />";
  8. return $str;
  9. }
  10. // textarea标簽解析
  11. public function _textarea($tag,$content) {
  12. $name = $tag['name'];
  13. $id = $tag['id'];
  14. $str = '<textarea id="≤↓×'.$id.'" name="'.$name.'">'.$content.'</textarea>';
  15. return $str;
  16. }

定義好(hǎo)标簽庫擴展之後,我們就(jiù§>✘≠)可(kě)以在模闆中使用(yòng)了(le),首先我們必須要(yà∞"<εo)告訴模闆申明(míng)Test标簽庫,用(yòng)taglib标簽‍•∑♥,例如(rú):

  1. <taglib name='Test' />

name屬性支持申明(míng)多(du♠↓ō)個(gè)标簽庫,用(yòng)逗号分(β× fēn)隔即可(kě)。申明(míng)Test标α$≥簽庫之後,就(jiù)可(kě)以使用(yòng)T$ est标簽庫中的(de)所有(yǒu)标→α簽庫了(le),調用(yòng)方式如(∏÷β→rú)下(xià):

  1. <test:input type='radio' id='test' name='mail' value='value' />
  2. <test:textarea id="content" name="content">$value</test:textarea>

注意:調用(yòng)擴展标簽庫的(de)标簽的(de)時(shí)候,$ ♥"必須加上(shàng)标簽庫的(de)XML命名空(kōng)間(©♥&'jiān)前綴。

Input标簽定義value屬性可(kě)以支持變量傳入,所以value≈β≥•被認為(wèi)是(shì)一(yī)個(gè)變量名,如(rú✘>)果在控制(zhì)器(qì)中已經給val←&←ue模闆變量賦值,例如(rú):

  1. $this->assign('value','my test value');

最後标簽被模闆引擎編譯後,就(jiù)會(huì)輸出'♠§:

  1. <input type='radio' id='test' name='mail' value='my test value' />
  2. <textarea id="content" name="content">my test vale</textarea>