[精讚] [會員登入]
134

[PHP+ci4] codeignitor4+ smarty5

這篇整合 php 的framework codeignitor4 + smarty5。

分享此文連結 //n.sfs.tw/16401

分享連結 [PHP+ci4] codeignitor4+ smarty5@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2024-04-21 23:43:25 最後編修
2024-04-12 03:15:57 By 張○○
 

自動目錄

因為升級成 Codeignitor4(以下全稱為ci4) 加上習慣使用 smarty,因此在 view表上決定使用 smarty5(以下皆稱smarty)。

先決條件,你已經安裝完畢 ci4,我是使用git來安裝(可以參考這裡),當然你也可以使用composer來安裝,因為smarty5預計使用composer來安裝。

ci4 要整合和 smarty5 一起用,需要異動的檔案有一些多,你可以視需要調整。如果你只想用smarty4 的話,可以參考ci4+smarty4這篇

系統

Rocky Linux release 9.0 (Blue Onyx)

Docker  20.10.21

  └─ PHP 8.2.17

          └─ Codeignitor 4.5.0

 

安裝smarty5

第5版的smarty安裝,官網似乎停運了?採用 github 來安裝 [2]

(github上[1]說明用composer來裝,但在docker中這樣要重建container,我覺得很麻煩,所以採用git來安裝)

進到 ci4 的目錄 app/ThirdParty 中

$ cd path/to/app/ThirdParty

$ git clone https://github.com/smarty-php/smarty.git

在ThirdParty目錄下看到以下的檔案:

app/ThirdParty
└── smarty
    ├── changelog
    ├── CHANGELOG.md
    ├── composer.json
    ├── CONTRIBUTING.md
    ├── demo
    ├── docker-compose.yml
    ├── docs
    ├── LICENSE
    ├── Makefile
    ├── make-release.sh
    ├── mkdocs.yml
    ├── phpunit.xml
    ├── README.md
    ├── run-tests-for-all-php-versions.sh
    ├── run-tests.sh
    ├── SECURITY.md
    ├── src   <== 邏輯上只需要保留這個,其它可以刪掉
    ├── tests
    ├── TODO.txt
    └── utilities

上面的目錄只有src/的目錄有用,所以搬移 src/ 目錄並改名

$ mv smarty/src/  ./smarty5/
$ rm -rf smarty

到 app/Config 建立 smarty5_conf 的目錄
$ cd /path/to/app/Config/
$ mkdir smarty5_conf

建立這目錄是考慮過後最適合放 smarty的config檔的位置,這個目錄並非必要,如果你沒有smarty 的config的話。

完工後在ThirdParty目錄下看到以下的目錄:

app/ThirdParty
└── smarty5

 

 

設定SMARTY服務

這次要異動的檔案如下:

app
├── Config
│   ├── smarty5_conf  <== smarty的config檔放置位置
│   ├── Services.php  <== 註記服務
│   └── Autoload.php  <== 註記Smarty的命名空間
├── Libraries
│   └── Smarty5.php  <== 建立Smarty5 物件
├── ThirdParty
│   └── smarty5 <== 上面已將 smarty5 裝在這裡
│       └── Smarty.php <== 讀取此檔即可
└── Views
    └── <樣版放這裡>

並在在writable/目錄下建立兩個可寫入的目錄

ci4
└── writable
    ├── cache
    └── templates_c

 

修改Config

註記Smarty的命名空間 App/Config/Autoload.php

修改 $psr4

    public $psr4 = [
        APP_NAMESPACE => APPPATH,
        'Smarty' => APPPATH . 'ThirdParty/smarty5/',
    ];

新增第4行。

 

註記服務 App/Config/Services.php

<?php
namespace Config;

use CodeIgniter\Config\BaseService;
use \App\Libraries\Smarty5;

class Services extends BaseService
{
    public static function Smarty5($getShared = true){
      if($getShared) {
        return static::getSharedInstance('Smarty5');
      }
      return new Smarty5;
    }
   ...
}

新增 5,9-14行。

 

建立 Smarty5 服務

如果不想要每次設定參數來使用smarty的話,建立一個 library 類別是必要的,新增以下檔案:

App/Libraries/Smarty5.php

<?php

namespace App\Libraries;
use Smarty;

class Smarty5 extends Smarty\Smarty {

    public function __construct()
    {
        parent::__construct();
        parent::setTemplateDir(APPPATH . 'Views/');
        parent::setConfigDir(APPPATH . 'Config/smarty5_conf/');
        parent::setCompileDir(WRITEPATH . 'templates_c/')->setCacheDir(WRITEPATH . 'cache/');
        parent::setLeftDelimiter('{{');
        parent::setRightDelimiter('}}');
    }

    public function view($tpl_name) {
        parent::display($tpl_name);
    }
}

設定寫入暫存檔目錄及cache,同時設定smart標記左右符號。view函式是display的別名。

 

Controller 中叫用

service('Smarty5')->assign('ip','123.46.79.66')->assign('isipv6',  true);
service('SmartyEngine')->view('test_template.tpl');

test_template.tpl 是樣版檔,會到 App/Views/ 中尋找。

Smarty5 預設採用靜態方式載入,共用一個變數。

如果想用動態載入的話,可寫成:

$s = service('Smarty5',false);
$s->assign('ip', '1.2.3.4')->assign('isipv6',  true);
$s->view('test_template.tpl');

結論是透過網友的幫忙,smarty5+ci4 整合的不錯,也不難,祝大家使用愉快。

 

參考資料

[1] smarty5 的說明文件 https://smarty-php.github.io/smarty/stable/designers/language-basic-syntax/

[2] ci4官網說明 https://codeigniter.tw/user_guide/index.html

[3] smarty5 文件 https://smarty-php.github.io/smarty/5.x/

 

END

你可能感興趣的文章

PHP程式經驗 #2 -- print和echo的差異 常在寫php的人一定會想知道echo和print這兩個函數有什麼不一樣 驗證 1. 比較print 和echo 函式的執

[PHP8] 使用autoload autoload+ namespace +use 到了php7之後,namespace和use越來越重要,此篇整理autoload和namespace、use的結合使用。

[CodeIgniter 3] COOKIE的使用 PHP CodeIgniter 3 中COOKIE的使用超簡單

[PHP] 命名空間 namespace及 use PHP >=5.3 開始支援命名空間:namespace

[PHP] 字串編碼及解碼函式 為何要將字串編碼?理由很簡單,就是不要讓人家輕易的知道字串內容是什麼。例如點選分頁時,我們常會用這樣的連結: index

[CodeIgniter 3] 資料庫的使用方法整理1/2 --Select的使用 [CodeIgniter 3] 資料庫的使用方法整理:Select的使用

我有話要說

>>

限制:留言最高字數1000字。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

PHP for sphinx 函式庫安裝 PECL/sphinx PHP>= 5.2.2 已經能原生支援 sphinx,可是預設的沒有裝,我們得自己裝才能用

[Windows7] 移除IE10及移除IE11 Windows7 不得已的情況要移除IE11或IE10怎麼做?

Linux shell 的date表示法 linux下SHELL中的date表示法

「許功蓋」的字以及源由 有玩過電腦一段時間的人,都聽過這個人(有一天我才發現7年級的竟然都不認識這個

在Centos7 下安裝 Wildfly10 wildfly以前叫JBoss,2014.11.20改名叫Wildfly,起始版本是Wildfly8,現在已經出到Wil