템플릿 파서 클래스¶
템플릿 파서 클래스는 뷰 파일에 포함된 의사 변수에 대한 간단한 텍스트 대체를 수행할 수 있습니다. 단순 변수 또는 변수 태그 쌍을 파싱할 수 있습니다.
템플릿 엔진을 사용해 본 적이 없다면 의사 변수 이름은 다음과 같이 중괄호로 둘러싸입니다:
<html lang="en">
<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를 제거할 수 있도록 하는 일반 텍스트 표현입니다.
참고
CodeIgniter는 뷰 페이지에서 순수 PHP를 사용하면 약간 더 빠르게 실행되므로 이 클래스를 사용할 것을 요구하지 않습니다. 그러나 일부 개발자는 PHP를 다루는 데 혼란을 느낄 수 있는 디자이너와 함께 작업하는 경우 템플릿 엔진을 선호합니다.
중요
템플릿 파서 클래스는 완전한 템플릿 파싱 솔루션이 아닙니다. 최대 성능을 유지하기 위해 의도적으로 매우 간결하게 유지했습니다.
템플릿 파서 클래스 사용¶
클래스 초기화¶
CodeIgniter의 대부분의 클래스와 마찬가지로 Parser 클래스는 컨트롤러에서
$this->load->library() 메소드를 사용하여 초기화합니다:
$this->load->library('parser');
로드되면 $this->parser를 사용하여 Parser 라이브러리 객체에 접근할 수 있습니다.
템플릿 파싱¶
parse() 메소드를 사용하여 다음과 같이 간단한 템플릿을 파싱(또는 렌더링)할
수 있습니다:
$data = array(
'blog_title' => 'My Blog Title',
'blog_heading' => 'My Blog Heading'
);
$this->parser->parse('blog_template', $data);
첫 번째 매개변수에는 뷰 파일의 이름(이 예시에서는 파일 이름이 blog_template.php)이 포함되고, 두 번째 매개변수에는 템플릿에서 교체될 데이터의 연관 배열이 포함됩니다. 위 예시에서 템플릿에는 두 변수 {blog_title}과 {blog_heading}이 포함됩니다.
$this->parser->parse()가 반환하는 데이터를 “echo”하거나 다른 작업을 할 필요가 없습니다. 브라우저로 전송되기 위해 출력 클래스로 자동 전달됩니다. 그러나 데이터를 출력 클래스로 전송하는 대신 반환받으려면 세 번째 매개변수로 TRUE(boolean)를 전달할 수 있습니다:
$string = $this->parser->parse('blog_template', $data, TRUE);
변수 쌍¶
위의 예시 코드는 단순 변수를 교체할 수 있습니다. 반복마다 새로운 값을 포함하여 변수 블록 전체를 반복하고 싶다면 어떻게 해야 할까요? 페이지 상단에 표시한 템플릿 예시를 고려하세요:
<html lang="en">
<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}를 볼 수 있습니다. 이 경우 이 쌍 사이의 전체 데이터 청크는 매개변수 배열의 “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);
사용 참고¶
템플릿에서 참조되지 않는 대체 매개변수를 포함하면 무시됩니다:
$template = 'Hello, {firstname} {lastname}';
$data = array(
'title' => 'Mr',
'firstname' => 'John',
'lastname' => 'Doe'
);
$this->parser->parse_string($template, $data);
// 결과: Hello, John Doe
템플릿에서 참조되는 대체 매개변수를 포함하지 않으면 결과에 원본 의사 변수가 표시됩니다:
$template = 'Hello, {firstname} {initials} {lastname}';
$data = array(
'title' => 'Mr',
'firstname' => 'John',
'lastname' => 'Doe'
);
$this->parser->parse_string($template, $data);
// 결과: Hello, John {initials} Doe
배열이 예상되는 변수 쌍에 문자열 대체 매개변수를 제공하면 여는 변수 쌍 태그에 대한 대체가 수행되지만 닫는 변수 쌍 태그는 올바르게 렌더링되지 않습니다:
$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);
// 결과: 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);
// 결과: Hello, John Doe (Mr Mr )
뷰 프래그먼트¶
뷰에서 반복 효과를 얻기 위해 반드시 변수 쌍을 사용할 필요는 없습니다. 변수 쌍 내부에 있을 내용에 뷰 프래그먼트를 사용하고 뷰 대신 컨트롤러에서 반복을 제어할 수 있습니다.
뷰에서 반복을 제어하는 예시:
$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 CI_Parser¶
- parse($template, $data[, $return = FALSE])¶
- 매개변수:
$template (
string) – 뷰 파일 경로$data (
array) – 변수 데이터$return (
bool) – 파싱된 템플릿만 반환할지 여부
- 반환:
파싱된 템플릿 문자열
- 반환 형식:
string
제공된 경로와 변수로 템플릿을 파싱합니다.
- parse_string($template, $data[, $return = FALSE])¶
- 매개변수:
$template (
string) – 파싱할 내용$data (
array) – 변수 데이터$return (
bool) – 파싱된 템플릿만 반환할지 여부
- 반환:
파싱된 템플릿 문자열
- 반환 형식:
string
이 메소드는
parse()와 완전히 동일하게 작동하지만 뷰 파일을 로드하는 대신 템플릿을 문자열로 받습니다.
- set_delimiters([$l = '{'[, $r = '}']])¶
- 매개변수:
$l (
string) – 왼쪽 구분자$r (
string) – 오른쪽 구분자
- 반환 형식:
void
템플릿의 의사 변수 “태그”에 대한 구분자(여는 것과 닫는 것)를 설정합니다.