| 제목 | Template 엔진 | ||
|---|---|---|---|
| 글쓴이 | letsgolee | 작성시각 | 2014/10/23 14:00:42 |
|
|
|||
간단한 템플릿 엔진을 만들었습니다. 누군가에게는 도움이 될 것같아 공개합니다. 근데 테스트는 안해보았네요...
load->library('template');
* $this->template->set_default_path(FCPATH.'templates/'); // default is APPPATH.'templates/'
* $data = array('title'=>'My Title', 'name'=>'My Name');
* $this->template->set($data);
* $this->template->buffer('content', 'page/contents_html'); // it will parse 'page/contents_html.php' in the $_default_path;
* // and then add to the variable 'content'.
* $this->template->render('layout'); // finally layout.php will be output.
*
* or you can use the chain style
* $this->template->set_default_path(FCPATH.'templates/')->set($data)->buffer('content', 'contents_html')->render('layout');
*
*/
if (!defined('PHP_EXT')) {
define('PHP_EXT', '.php');
}
class Template
{
protected $CI = NULL;
protected $_default_path = '';
protected $_view_data = array();
protected $_error_messages = array();
function __construct($path='')
{
if (function_exists('get_instance') && defined('APPPATH')) {
// this is CI...
$this->CI =& get_instance();
if (strlen($path)) {
$this->set_default_path($path);
} else {
$this->_default_path = APPPATH.'templates/';
}
}
log_message('debug', 'Template Class Initialized');
}
public function set_default_path($path)
{
if (is_dir($path)) {
$this->_default_path = rtrim($path, '/').'/';
} else {
$this->_error_messages[] = 'The given path is not a real directory.';
log_message('debug', 'Template Error: The given path is not a real directory.');
}
return $this;
}
public function set($key, $value=NULL)
{
if (is_array($key)) {
foreach ($key as $k => $v) {
$this->_view_data[$k] = $v;
}
} else {
$this->_view_data[$key] =$value;
}
return $this;
}
public function assign($key, $value=NULL)
{
return $this->set($key, $value);
}
public function buffer($key, $view)
{
if ($buffer = $this->_load_view($view, TRUE)) {
$this->_view_data[$key] = $buffer;
}
return $this;
}
public function render($view, $data=NULL)
{
if (is_array($data)) {
foreach ($data as $key => $value) {
$this->_view_data[$key] = $value;
}
}
return $this->_load_view($view);
}
protected function _load_view($view, $return_result=FALSE)
{
// If the PHP installation does not support short tags we'll
// do a little string replacement, changing the short tags
// to standard PHP echo statements.
$view_file = $this->_default_path.$view.PHP_EXT;
if (is_file($view_file)) {
ob_start();
extract($this->_view_data);
if ( ! is_php('5.4') && ! ini_get('short_open_tag') && config_item('rewrite_short_tags') === TRUE) {
echo eval('?>'.preg_replace('/;*\s*\?>/', '; ?>', str_replace('CI) {
$this->CI->output->append_output($buffer);
} else {
// display it
echo $buffer;
}
@ob_end_clean();
} else {
$this->_error_messages[] = $view_file.' is not a file or does not exist';
log_message('DEBUG', $$view_file.' is not a file or does not exist');
}
}
function error_message()
{
if (count($this->_error_messages)) {
$message = array_pop($this->_error_messages);
return $message;
} else {
return FALSE;
}
}
}
사용법은 다음과 같습니다: // 라이브러이 로드 $this->load->library('template'); // 디폴트 템플릿 위치설정 // 기본값은 APPPATH.'templates/'입닏다. $this->template->set_default_path(FCPATH.'templates/myskin/'); // 데이터 $data = array('title'=>'My Title', 'name'=>'My Name'); // 데이터 assign // set()을 써도 되고 assign()을 써도 됩니다. 편한대로... // array가 온 경우 $this->template->set($data); // 단일 assign $this->template->assign('message', '만나서 반가움...'); // 페이지를 포함하고 싶을 때는 buffer()를 사용하여 변수로 등록합니다. // 디폴트 폴더로 지정한 곳에 있는 page/contents_html.php를 불러와서 // content라는 변수로 할당 $this->template->buffer('content', 'page/contents_html'); // 최종 렌더링 // 디폴트 폴더에 있는 layout.php 파일을 불러와 화면에 디스플레이 $this->template->render('layout'); // 체인방법도 가능합니다. $this->template->set_default_path(FCPATH.'templates/')->set($data)->buffer('content', 'contents_html')->render('layout'); |
|||
| 다음글 | 컨트롤러에서 컨트롤러 사용 (10) | ||
| 이전글 | 로그를 개발자 도구 콘솔창에서 보자 (2) | ||
|
한대승(불의회상)
/
2014/10/23 14:57:43 /
추천
0
|
|
letsgolee
/
2014/10/23 17:05:16 /
추천
0
@한대승
감사합니다^^ |
|
방문넷
/
2022/12/24 23:52:27 /
추천
0
5년동안 잘 사용하였습니다 ㅎ
|
코드가 군더더기 없이 깔끔하네요