Codeigniter 3.x + Smarty 快速安裝樣板引擎


CI Smarty 本文簡述

本文即將進行把 Smarty 樣板引擎集成到 Codeigniter 應用程序中,
也就是在 Codeigniter 框架中加裝 Smarty 樣板引擎。

將原生輸出樣板的語法:

// application\controllers\Welcome.php
<?php
...
public function index()
{
   $this->load->view('welcome_message'); //原先舊有引用樣板方式
}
改成使用以下方式:

// application\controllers\Welcome.php
<?php
...
public function index()
{
$this->ci_smarty->view('staff_view_all'); //改成新 smarty 引用樣板方式
}
 

支持的 Codeigniter、Smarty 版本

Codeigniter

你應該使用 Codeigniter 3.0 以上版本,目前可使用 CodeIgniter 3.1.6 (2017/11)。
可在這邊檢視及下載:https://codeigniter.com/download#webgolds

Smarty 

目前可使用 Smarty 3.1.32 (2017/11)
可在這邊檢視及下載:https://github.com/smarty-php/smarty#webgolds
 

開始整合


將 Smarty 3 庫複製到 CI 應用程序 application\third_party 中。

所以目錄結構如下:
application\third_party\
  • smarty
    • libs
      • plugins
      • sysplugins
      • Autoloader.php
      • debug.tpl
      • Smarty.class.php
      • SmartyBC.class.php

陸續新增及修改以下檔案:

\application\config\autoload.php
<?php
...
//找到這行
$autoload['libraries'] = array('database', 'ci_smarty' => 'smarty');
 

設定檔調整 #

\application\config\config.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
define('HTTP_HOST', $_SERVER['HTTP_HOST']);
define('PROTOCOL', isset($_SERVER['HTTP_X_FORWARDED_PROTO']) ? $_SERVER['HTTP_X_FORWARDED_PROTO'] : ((isset( $_SERVER["HTTPS"] ) && strtolower( $_SERVER["HTTPS"] ) == "on" ) ? 'https' : 'http')); 

// 允許多筆運作的網域
$allowed_domains = ['localhost', 'klein.test.com']; 

// 當偵測到非上述的例外狀況,會被導向到的網域
$mainDomain  = 'webgolds.test.com';

if (in_array(HTTP_HOST, $allowed_domains, TRUE)){
    if (HTTP_HOST == "localhost") {
        // 如果放在網域底下的路徑如 http://localhost/test/ci/ 
        // 填入 HTTP_HOST . "/test/ci/"
        $mainDomain = HTTP_HOST . "/test/ci/";
    }else {
        $mainDomain = HTTP_HOST;
    }
}

//$config['base_url'] = '';
$config['base_url'] = PROTOCOL . '://'. $mainDomain;


//------------
 
備註:增加以上語法的用意是當在控制器(Controller) 函數裡面使用分頁(Pagination)類別時,
$config['base_url'] 可以直接使用 
$config['base_url'] = base_url( $this->router->fetch_class() . '/' . $this->router->fetch_method());
便可以不做任何設定、自動抓取到相對應的 class 跟 method 名稱,而不用手動設置。



新增
\application\libraries\CI_Smarty.php
<?php
if(!defined('BASEPATH')) exit('No direct script access allowed');

require_once( APPPATH.'third_party/smarty/libs/Smarty.class.php' );

class CI_Smarty extends Smarty
{
    public function __construct()
    {
        parent::__construct();

        $this->setTemplateDir( APPPATH . 'views');
        $this->setCompileDir( APPPATH . 'cache/compiled');
        $this->setCacheDir( APPPATH . 'cache/cached');
        $this->left_delimiter = '{^';    // 注意這邊
        $this->right_delimiter = '^}';
        $this->assign( 'APPPATH', APPPATH );
        $this->assign( 'BASEPATH', BASEPATH );

        // Assign CodeIgniter object by reference to CI
        if( method_exists( $this, 'assignByRef') )
        {
            $ci =& get_instance();
            $this->assignByRef("ci", $ci);
        }

        //log_message('debug', "Smarty Class Initialized");
    }

    function view($template, $data = array(), $return = FALSE)
    {
        foreach($data as $key => $val) {
            $this->assign($key, $val);
        }

        if($return == FALSE) {
            $CI =& get_instance();
            if(method_exists( $CI->output, 'set_output' )) {
                $CI->output->set_output( $this->fetch($template . '.html') );
            } else {
                $CI->output->final_output = $this->fetch($template . 'html');
            }
            return;
        } else {
            return $this->fetch($template);
        }
    }
}
 
注意:
        $this->left_delimiter = '{^';
        $this->right_delimiter = '^}';
這邊有把原始 smarty 的變數區別括弧變更。
假設原始會在樣板中使用 "{$org}" 的方式更改成使用 "{^$org^}"。



新增 2 個目錄
application\cache
  • cached
  • compiled


Ok, 到此為止可以開始進行程式測試囉。

Smarty 樣板開發測試

controllers

\application\controllers\Welcome.php

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Welcome extends CI_Controller {
  public function index()
  {
      $this->smarty->assign("webgolds_title","webgolds");
      $this->smarty->view('test_page');
  }
}

views

\application\views\test_page.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Welcome to CodeIgniter {^$webgolds_title^}</title>

</head>
<body>
test
{^$webgolds_title^}
</body>
</html>



 

回上一頁

相關文章:

喜歡這篇文章嗎?立即分享

Posted : / Views: 435
Last updated :2017-12-05