템플릿파서(Template Parser Class)¶
템플릿파서 클래스를 이용하시면 뷰파일에 포함된 모조변수(pseudo-variables)를 파싱할 수 있습니다. 단순한 변수나 변수,태그 쌍 모두 파싱가능합니다.템플릿엔진을 사용해보신적이 없나요 ? 모조변수는 아래와 같은 형태랍니다:
<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 변수는 아닙니다. 오히려 일반 텍스트에 가까우며, 이변수들을 통해서 PHP 코드를 템플릿(뷰 파일)에서 제거할 수 있습니다.
Note
뷰파일에서 순수 PHP를 사용하시는 것이 약간 더 빨리 동작하므로, 본 클래스를 반드시 사용하실필요는 없습니다. 그러나, 어떤 개발자들은 PHP를 모르는 디자이너와 같이 일할 때 템플릿 엔진을 사용하는 것을 더 선호하는 경우도 있습니다.
Important
템플릿파서 클래스는 완전한 템플릿 파싱 솔루션이 아닙니다. 우리는 성능의 극대화 쪽으로 많이 신경썼습니다.
템플릿 파서 클래스 사용하기 Using the Template Parser Class¶
클래스 초기화 Initializing the Class¶
CodeIgniter에 있는 대부분의 다른 클래스들처럼, 파서클래스도 $this->load->library() 함수로 초기화 합니다:
$this->load->library('parser');
일단 로드되면,파서 라이브러리 객체는 $this->parser 를 통해 사용합니다.
템플릿 파싱하기 Parsing templates¶
간단한 템플릿을 파싱하기 위해 parse() 함수를 사용할 수 있습니다. 다음과 같이:
$data = array(
'blog_title' => 'My Blog Title',
'blog_heading' => 'My Blog Heading'
);
$this->parser->parse('blog_template', $data);
첫 번째 파라미터는 뷰파일(view file)의 이름 (예제에서는 blog_template.php)을 포함하며, 두 번째 파라미터는 템플릿에서 대체될 데이터의 연관배열 입니다. 위 예제에서, 템플릿은 두 개의 변수를 포함합니다: {blog_title} 와 {blog_heading}
“echo” 를 사용할 필요가 없으며 $this->parser->parse() 함수에서 리턴되는 데이터에대해서 뭔가 작업해줄 필요가 없습니다. 결과는 자동으로 출력클래스로 보내져 브라우저로 전송됩니다. 그러나, 출력클래스로 보내는대신 데이터를 리턴받으시려면 세 번째 파라미터를 TRUE 로 설정합니다:
$string = $this->parser->parse('blog_template', $data, TRUE);
변수 쌍 Variable Pairs¶
위의 예제에서는 단순 변수치환을 보여주었습니다. 만약 여러분이 각 반복마다 다른 데이터를 가지고 있는 변수블럭전체를 반복적으로 처리하고 싶다면, 본 페이지의 처음에 보여주었던 예제를 보세요:
<html>
<head>
<title>{blog_title}</title>
</head>
<body>
<h3>{blog_heading}</h3>
{blog_entries}
<h5>{title}</h5>
<p>{body}</p>
{/blog_entries}
</body>
</html>
위 예제를 보시면 변수 쌍이 있다는 것을 아실거예요: {blog_entries} 데이터들.. {/blog_entries}. 이런경우, 이 쌍들 사이에 있는 데이터덩어리들은 여러 번 반복되며, 결과셋의 열 수에 대응하여 작동됩니다.
변수쌍은 위의 단순변수치환예제와 동일한 코드로 파싱되나,변수쌍에 대응하는 다차원배열을 추가하셔야 합니다. 다음예제를 참고하시죠:
$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);
만약 “쌍”으로 구성된 데이터가 데이터베이스 결과셋이라면 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);
사용시 주의사항 Usage Notes¶
템플리에서 언급되지 않은 파라미터가 제출되면, 그냥 무시됩니다:
$template = 'Hello, {firstname} {lastname}';
$data = array(
'title' => 'Mr',
'firstname' => 'John',
'lastname' => 'Doe'
);
$this->parser->parse_string($template, $data);
// Result: Hello, John Doe
템플릿에 지원되지 않는 파라미터를 포함한 경우, 원래의 템플릿 변수가 그대로 결과에 나옵니다:
$template = 'Hello, {firstname} {initials} {lastname}';
$data = array(
'title' => 'Mr',
'firstname' => 'John',
'lastname' => 'Doe'
);
$this->parser->parse_string($template, $data);
// Result: Hello, John {initials} Doe
If you provide a string substitution parameter when an array is expected, i.e. for a variable pair, the substitution is done for the opening variable pair tag, but the closing variable pair tag is not rendered properly:
$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})
변수 쌍 안에서 사용하는 값고 똑같은 값을 제출하는 파라미터에 있다면, 그 결과는 예상과 다를 것입니다:
$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 )
조각 보기 View Fragments¶
뷰파일에서 반복문의 효과를 얻기 위해 변수 쌍을 사용할 필요가 없습니다. 변수 쌍 안에 뷰 프래그먼트를 사용하는 것이 가능합니다. 그리고 뷰파일 대신에 컨트롤러에서 반복문을 제어할 수 있습니다.
뷰 안에서의 반복문 예제:
$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);
결과:
<ul>
<li><a href="/first">First Link</a></li>
<li><a href="/second">Second Link</a></li>
</ul>
컨트롤러 안에서 반복문의 예제, 뷰 프레그먼트를 사용:
$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);
결과:
<ul>
<li><a href="/first">First Link</a></li>
<li><a href="/second">Second Link</a></li>
</ul>
클래스 레퍼런스 Class Reference¶
- class CI_Parser¶
- parse($template, $data[, $return = FALSE])¶
인수: - $template (string) – Path to view file
- $data (array) – Variable data
- $return (bool) – Whether to only return the parsed template
반환값: Parsed template string
반환형: 문자열
템플릿 이름과 데이터베열을 입력받으며, 파싱된 결과를 생성합니다.
- parse_string($template, $data[, $return = FALSE])¶
인수: - $template (string) – Path to view file
- $data (array) – Variable data
- $return (bool) – Whether to only return the parsed template
반환값: Parsed template string
반환형: 문자열
parse() 와 똑같이 작동합니다만, 뷰파일 대신에 문자열을 첫 번째 파라미터로 받을 수 있다는 것이 다릅니다.
- set_delimiters([$l = '{'[, $r = '}']])¶
인수: - $l (string) – Left delimiter
- $r (string) – Right delimiter
반환형: void
템플릿에서 “tag” 에 대한 열고 닫는 기호를 설정합니다.