CodeIgniter 模板解析類

2018-07-21 15:40 更新

模板解析類

模板解析類可以對(duì)你視圖文件中的偽變量進(jìn)行簡(jiǎn)單的替換,它可以解析簡(jiǎn)單的變量和變量標(biāo)簽對(duì)。

如果你從沒(méi)使用過(guò)模板引擎,下面是個(gè)例子,偽變量名稱使用大括號(hào)括起來(lái):

<html>
    <head>
        <title>{blog_title}</title>
    </head>
    <body>
        <h3>{blog_heading}</h3>

    {blog_entries}
        <h5>{title}</h5>
        <p>{body}</p>
    {/blog_entries}

    </body>
</html>

這些變量并不是真正的 PHP 變量,只是普通的文本,這樣能讓你的模板(視圖文件)中沒(méi)有任何 PHP 代碼。

注解

CodeIgniter 并沒(méi)有 讓你必須使用這個(gè)類,因?yàn)橹苯釉谝晥D中使用純 PHP 可能速度會(huì)更快點(diǎn)。 盡管如此,一些開(kāi)發(fā)者還是喜歡使用模板引擎,他們可能是和一些其他的不熟悉 PHP 的設(shè)計(jì)師共同工作。

重要

模板解析類 不是 一個(gè)全面的模板解析方案,我們讓它保持簡(jiǎn)潔,為了達(dá)到更高的性能。

使用模板解析類

初始化類

跟 CodeIgniter 中的其他類一樣,可以在你的控制器中使用 $this->load->library() 方法加載模板解析類:

$this->load->library('parser');

一旦加載,模板解析類就可以像下面這樣使用:

$this->parser

解析模板

你可以使用 parse() 方法來(lái)解析(或顯示)簡(jiǎn)單的模板,如下所示:

$data = array(
    'blog_title' => 'My Blog Title',
    'blog_heading' => 'My Blog Heading'
);

$this->parser->parse('blog_template', $data);

第一個(gè)參數(shù)為 視圖文件 的名稱(在這個(gè)例子里,文件名為 blog_template.php), 第二個(gè)參數(shù)為一個(gè)關(guān)聯(lián)數(shù)組,它包含了要對(duì)模板進(jìn)行替換的數(shù)據(jù)。上例中,模板將包含兩個(gè)變量: {blog_title} 和 {blog_heading} 。

沒(méi)有必要對(duì) $this->parser->parse() 方法返回的結(jié)果進(jìn)行 echo 或其他的處理,它會(huì)自動(dòng)的保存到輸出類, 以待發(fā)送給瀏覽器。但是,如果你希望它將數(shù)據(jù)返回而不是存到輸出類里去,你可以將第三個(gè)參數(shù)設(shè)置為 TRUE

$string = $this->parser->parse('blog_template', $data, TRUE);

變量對(duì)

上面的例子可以允許替換簡(jiǎn)單的變量,但是如果你想重復(fù)某一塊代碼,并且每次重復(fù)的值都不同又該怎么辦呢? 看下我們一開(kāi)始的時(shí)候展示那個(gè)模板例子:

<html>
    <head>
        <title>{blog_title}</title>
    </head>
    <body>
        <h3>{blog_heading}</h3>

    {blog_entries}
        <h5>{title}</h5>
        <p>{body}</p>
    {/blog_entries}

    </body>
</html>

在上面的代碼中,你會(huì)發(fā)現(xiàn)一對(duì)變量:{blog_entries} data... {/blog_entries} 。這個(gè)例子的意思是, 這個(gè)變量對(duì)之間的整個(gè)數(shù)據(jù)塊將重復(fù)多次,重復(fù)的次數(shù)取決于 "blog_entries" 參數(shù)中元素的個(gè)數(shù)。

解析變量對(duì)和上面的解析單個(gè)變量的代碼完全一樣,除了一點(diǎn),你需要根據(jù)變量對(duì)的數(shù)據(jù)使用一個(gè)多維的數(shù)組, 像下面這樣:

$this->load->library('parser');

$data = array(
    'blog_title'   => 'My Blog Title',
    'blog_heading' => 'My Blog Heading',
    'blog_entries' => array(
        array('title' => 'Title 1', 'body' => 'Body 1'),
        array('title' => 'Title 2', 'body' => 'Body 2'),
        array('title' => 'Title 3', 'body' => 'Body 3'),
        array('title' => 'Title 4', 'body' => 'Body 4'),
        array('title' => 'Title 5', 'body' => 'Body 5')
    )
);

$this->parser->parse('blog_template', $data);

如果你的變量對(duì)數(shù)據(jù)來(lái)自于數(shù)據(jù)庫(kù)查詢結(jié)果,那么它已經(jīng)是一個(gè)多維數(shù)組了,你可以簡(jiǎn)單的使用數(shù)據(jù)庫(kù)的 result_array() 方法:

$query = $this->db->query("SELECT * FROM blog");

$this->load->library('parser');

$data = array(
    'blog_title'   => 'My Blog Title',
    'blog_heading' => 'My Blog Heading',
    'blog_entries' => $query->result_array()
);

$this->parser->parse('blog_template', $data);

使用說(shuō)明

如果你傳入的某些參數(shù)在模板中沒(méi)用到,它們將被忽略:

$template = 'Hello, {firstname} {lastname}';
$data = array(
    'title' => 'Mr',
    'firstname' => 'John',
    'lastname' => 'Doe'
);
$this->parser->parse_string($template, $data);

// Result: Hello, John Doe

如果你的模板中用到了某個(gè)變量,但是你傳入的參數(shù)中沒(méi)有,將直接顯示出原始的偽變量:

$template = 'Hello, {firstname} {initials} {lastname}';
$data = array(
    'title' => 'Mr',
    'firstname' => 'John',
    'lastname' => 'Doe'
);
$this->parser->parse_string($template, $data);

// Result: Hello, John {initials} Doe

如果你的模板中需要使用某個(gè)數(shù)組變量,但是你傳入的參數(shù)是個(gè)字符串類型,那么變量對(duì)的起始標(biāo)簽將會(huì)被替換, 但是結(jié)束標(biāo)簽不會(huì)被正確顯示:

$template = 'Hello, {firstname} {lastname} ({degrees}{degree} {/degrees})';
$data = array(
    'degrees' => 'Mr',
    'firstname' => 'John',
    'lastname' => 'Doe',
    'titles' => array(
        array('degree' => 'BSc'),
        array('degree' => 'PhD')
    )
);
$this->parser->parse_string($template, $data);

// Result: Hello, John Doe (Mr{degree} {/degrees})

如果你的某個(gè)單一變量的名稱和變量對(duì)中的某個(gè)變量名稱一樣,顯示結(jié)果可能會(huì)不對(duì):

$template = 'Hello, {firstname} {lastname} ({degrees}{degree} {/degrees})';
$data = array(
    'degree' => 'Mr',
    'firstname' => 'John',
    'lastname' => 'Doe',
    'degrees' => array(
        array('degree' => 'BSc'),
        array('degree' => 'PhD')
    )
);
$this->parser->parse_string($template, $data);

// Result: Hello, John Doe (Mr Mr )

視圖片段

你沒(méi)必要在你的視圖文件中使用變量對(duì)來(lái)實(shí)現(xiàn)重復(fù),你也可以在變量對(duì)之間使用一個(gè)視圖片段, 在控制器,而不是視圖文件中,來(lái)控制重復(fù)。

下面是一個(gè)在視圖中實(shí)現(xiàn)重復(fù)的例子:

$template = '<ul>{menuitems}
    <li><a href="{link}">{title}</a></li>
{/menuitems}</ul>';

$data = array(
    'menuitems' => array(
        array('title' => 'First Link', 'link' => '/first'),
        array('title' => 'Second Link', 'link' => '/second'),
    )
);
$this->parser->parse_string($template, $data);

結(jié)果:

<ul>
    <li><a href="/first">First Link</a></li>
    <li><a href="/second">Second Link</a></li>
</ul>

下面是一個(gè)在控制器中利用視圖片段來(lái)實(shí)現(xiàn)重復(fù)的例子:

$temp = '';
$template1 = '<li><a href="{link}">{title}</a></li>';
$data1 = array(
    array('title' => 'First Link', 'link' => '/first'),
    array('title' => 'Second Link', 'link' => '/second'),
);

foreach ($data1 as $menuitem)
{
    $temp .= $this->parser->parse_string($template1, $menuitem, TRUE);
}

$template = '<ul>{menuitems}</ul>';
$data = array(
    'menuitems' => $temp
);
$this->parser->parse_string($template, $data);

結(jié)果:

<ul>
    <li><a href="/first">First Link</a></li>
    <li><a href="/second">Second Link</a></li>
</ul>

類參考

classCI_Parser

parse($template, $data[, $return = FALSE])

參數(shù):

  • $template (string) -- Path to view file
  • $data (array) -- Variable data
  • $return (bool) -- Whether to only return the parsed template

返回: Parsed template string

返回類型: string

根據(jù)提供的路徑和變量解析一個(gè)模板。

parse_string($template, $data[, $return = FALSE])

參數(shù):

  • $template (string) -- Path to view file
  • $data (array) -- Variable data
  • $return (bool) -- Whether to only return the parsed template

返回: Parsed template string

返回類型: string

該方法和 parse() 方法一樣,只是它接受一個(gè)字符串作為模板,而不是去加載視圖文件。

set_delimiters([$l = '{'[, $r = '}']])

參數(shù):

  • $l (string) -- Left delimiter
  • $r (string) -- Right delimiter

返回類型: void

設(shè)置模板中偽變量的分割符(起始標(biāo)簽和結(jié)束標(biāo)簽)。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)