2019年8月13日 星期二

使用 Smarty

3-1 使用 Smarty

一、Smarty基本操作

  1. 大原則:和外觀有關的東西都放到.html或.tpl中,所需要的資料全由.php提供,簡單範例,index.php內容:
    <?php
    require_once 'smarty/libs/Smarty.class.php';
    $smarty  new Smarty;
    $name    'Tad';
    $smarty->assign('name'$name);
    $smarty->display('index.tpl');
  2. 樣板檔一律放至 templates 目錄中
  3. PHP檔中最常用的就是利用 $smarty->assign('樣板標籤名稱', $變數值); 將變數送至樣板檔。
  4. templates/index.tpl 內容:
    <h2>Hello {$name}</h2>

 二、Smarty變數及陣列

傳送內容PHP檔(*.php)Smarty樣板檔(*.tpl)
一般變數
$name="tad";
$smarty->assign('name'$name);

{$name}

一維陣列
$user['name']="tad";
$user['birthday']="1973-06-16";
$smarty->assign('user', $user);

{$user.name} 的生日是 {$user.birthday}

二維陣列
$users[1]['name']="tad";
$users[1]['birthday']="1973-06-16";
$users[2]['name']="phebe";
$users[2]['birthday']="1973-03-10";
$smarty->assign('users'$users);

{foreach $users as $user}
  {$user.name} 的生日是{$user.birthday}
{/foreach}
 
 
{$user.1.name} 的生日是 {$user.1.birthday}
{$user.2.name} 的生日是 {$user.2.birthday}

三、 常用Smarty迴圈用法

  1. Smarty迴圈用來處理陣列,常用方法如下:
    {foreach $來源變數 as $別名}
      {$別名.索引}
    {foreachelse}
      該變數沒有值時要出現的內容
    {/foreach}
  2. 迴圈還有一些特別的用法:
    • {$別名@first} 迴圈第一圈
    • {$別名@last} 迴圈最後一圈
    • {$別名@index} 取得迴圈的索引值,依序輸出0、1、2......
    • {$別名@iteration} 取得迴圈的計數值,依序輸出1、2、3......
    • {$別名@total} 取得迴圈執行總數
  3. 詳情可見:http://www.smarty.net/docs/en/language.function.foreach.tpl

四、Smarty 其他常用用法

  1. 在樣板中,可以直接用 $samrty.get 來取得所有 $_GET 的變數陣列,同理若要在樣板中取得 $_SESSION,那就是用 $smarty.session
  2. 註解的寫法 {* 註解 *}
  3. 在樣板中,Smarty 也可以直接拿PHP的函數來用,我們稱之為「變數修飾器」,例如:
    {if $變數|in_array:$陣列}
  4. 變數後面要加上 |
  5. | 後面加上函數名稱,函數需要的參數用 : 格開
  6. 刪除快取:
    $smarty->clearAllCache();

Smarty 2 安裝

安裝Smarty發行版在/libs/目錄裡的庫文件(就是解壓了). 
這些php文件你可不能亂畫哦.這些文件被所有應用程序共享,也隻能在你升級到新版的smarty的時候得到更新。

Smarty手冊範例 2-1.Smarty庫文件
Smarty.class.php
Smarty_Compiler.class.php
Config_File.class.php
debug.tpl
/core/*.php (all of them)
/plugins/*.php (all of them)
Smarty使用一個叫做'SMARTY_DIR'的php常量作為它的係統庫目錄。
基本上,如果你的應用程序可以找到 Smarty.class.php文件,你不需要設置SMARTY_DIR,Smarty將會自己運作。
但是,如果 Smarty.class.php冇有在你的include_path(php.ini裡的一項設置)裡,或者冇有在你的應用程序裡設置它的絕對路徑的時候,你就必須手動配置SMARTY_DIR 了(大多數程序都如此)SMARTY_DIR必須包含結尾斜杠。
這裡是你在你的php腳本裡創建一個smarty的應用實例的例子:
require('Smarty.class.php');
$smarty = new Smarty;
試著運行一下以上腳本,如果你發現"未找到Smarty.class.php 文件"的錯誤時,你應該這樣做:
Smarty手冊範例 2-3.加入庫文件目錄的絕對路徑
require('/usr/local/lib/php/Smarty/Smarty.class.php');
$smarty = new Smarty;
Smarty手冊範例 2-4.在include_path加入庫文件目錄
// Edit your php.ini file, add the Smarty library
// directory to the include_path and restart web server.
// Then the following should work:
require('Smarty.class.php');
$smarty = new Smarty;
Smarty手冊範例 2-5.手工設置SMARTY_DIR常量
define('SMARTY_DIR','/usr/local/lib/php/Smarty/');
require(SMARTY_DIR.'Smarty.class.php');
$smarty = new Smarty;

現在庫文件已經搞定,該是設置為你的應用程序配置其他有關Smarty的目錄的時候了。Smarty要求4個目錄,默認下命名為:tempalatestemplates_cconfigs and cache。每個都是可以自定義的,可以修改Smarty類屬性: $template_dir$compile_dir$config_dir, and $cache_dir respectively。強烈推薦你為每個用到smarty的應用程序設置單一的目錄!
確定你已經知道了你的web服務器文件根目錄。在我們的例子裡,文件根目錄是:"/web/www.mydomain.com/docs/"Smarty的4個目錄 隻可以被那些庫文件訪問,不可以被網絡上的瀏覽器訪問的目錄。因此為避免任何安全問題,要求將那4個目錄和網頁文件目錄(就是瀏覽器看的)分開來。

在我們的安裝例子裡,我們將為一個留言板程序配置smarty環境。我們挑選應用程序隻為了實現目錄命名約定。你可以對任何程序使用相同的環境,隻要將"guestbook"改成你要的名字就可以了。我們將把Smarty目錄放在 "/web/www.mydomain.com/smarty/guestbook/"下。
在你的文檔目錄下至少得有一個文件,這個文件可以被瀏覽器訪問.我們叫它 "index.php"好了.把它放到"/guestbook/"目錄下.
技術提示:建立web服務器很方便,這個文件可以被web服務器自動識彆。如果你訪問"http://www.mydomain.com/guestbook/",你不需要在URL上輸入"index.php",index.php腳本就可以被執行。在Apache服務器中,可以通過在DirectoryIndex的後麵添加"index.php" 文件(用反斜杠分開每個入口)來完成設置。

現在我們看看這些文件結構:
Smarty手冊範例 2-6.例子的文件結構
/usr/local/lib/php/Smarty/Smarty.class.php
/usr/local/lib/php/Smarty/Smarty_Compiler.class.php
/usr/local/lib/php/Smarty/Config_File.class.php
/usr/local/lib/php/Smarty/debug.tpl
/usr/local/lib/php/Smarty/core/*.php
/usr/local/lib/php/Smarty/plugins/*.php

/web/www.mydomain.com/smarty/guestbook/templates/
/web/www.mydomain.com/smarty/guestbook/templates_c/
/web/www.mydomain.com/smarty/guestbook/configs/
/web/www.mydomain.com/smarty/guestbook/cache/

/web/www.mydomain.com/docs/guestbook/index.php
Smarty的 $compile_dir 和$cache_dir必須可寫。通常是user "nobody" 和 group "nobody"。如果是 OSX用戶,默認為user "web" 和 group "web"。如果你在使用Apache,你可以看看httpd.conf 文件 (通常在"/usr/local/apache/conf/"目錄下)哪些user和group正在被使用。
Smarty手冊範例 2-7 文件權限設置
chown nobody:nobody /web/www.mydomain.com/smarty/guestbook/templates_c/
chmod 770 /web/www.mydomain.com/smarty/guestbook/templates_c/

chown nobody:nobody /web/www.mydomain.com/smarty/guestbook/cache/
chmod 770 /web/www.mydomain.com/smarty/guestbook/cache/
技術提示: 
chmod 770相當安全了,它隻讓user "nobody" 和 group "nobody" 讀/寫 訪問。如果你要對任何人開放讀取訪問權限(大多是為了你自己查看文件),你可以使用 775。
我們需要創建index.tpl文件讓smarty載入.這個文件放在 $template_dir目錄裡。
Smarty手冊範例 2-8 編輯/web/www.mydomain.com/smarty/templates/index.tpl
{* Smarty *}

Hello, {$name}!
技術提示:
{* Smarty *} 是一個模板注釋。雖然並不是必須的,但是這可以很好的鍛煉你在模板文件裡加入注釋的習慣。它可以使文件便於識彆。例如,一些文本編輯器可以識彆這個文件,並加以語法高亮顯示。
現在來編輯index.php。我們將創建一個Smarty的實例,指派模板變量,顯示 index.tpl文件。在我們的例子的環境裡, "/usr/local/lib/php/Smarty"已經包括在了 include_path裡了。
Smarty手冊範例 2-9.編輯/web/www.mydomain.com/docs/guestbook/index.php
// load Smarty library
require('Smarty.class.php');

$smarty = new Smarty;

$smarty->template_dir = '/web/www.mydomain.com/smarty/guestbook/templates/';
$smarty->compile_dir = '/web/www.mydomain.com/smarty/guestbook/templates_c/';
$smarty->config_dir = '/web/www.mydomain.com/smarty/guestbook/configs/';
$smarty->cache_dir = '/web/www.mydomain.com/smarty/guestbook/cache/';

$smarty->assign('name','Ned');

$smarty->display('index.tpl');
技術提示:
在我們的例子裡,已經設置了所有Smarty目錄的絕對目錄。如果 '/web/www.mydomain.com/smarty/guestbook/' 已經包括在 include_path裡了,那麼這些設置則冇有必要。但是,從經驗和通用性看來,為避免發生錯誤,還是配置一下為好。
現在在瀏覽器打開 index.php,你應該看到"Hello, Porky!"
你現在已經完成了Smarty的基本設置,恭喜!!

Smarty 1 基礎教程

Smarty是一個php模板引擎。
更準確的說,它分開了邏輯程序和外在的內容,提供了一種易於管理的方法。
可以描述為應用程序員和美工扮演了不同的角色,
因為在大多數情況下 ,他們不可能是同一個人。
例如,你正在創建一個用於瀏覽新聞的網頁,新聞標題,標簽欄,作者和內容等都是內容要素,他們並不包含應該怎樣去呈現。
Smarty的程序裡,這些被忽略了。
模板設計者們編輯模板,組合使用html標簽和模板標簽去格式化這些要素的輸出(html表格,背景色,字體大小,樣式表,等等)。
有一天程序員想要改變文章檢索的方式(也就是程序邏輯的改變)。
這個改變不影響模板設計者,內容仍將準確的輸出到模板。
同樣的,哪天美工吃多了想要完全重做界麵,也不會影響到程序邏輯。
因此,程序員可以改變邏輯而不需要重新構建模板,模板設計者可以改變模板而不影響到邏輯。

    現在簡短的說一下什麼是smarty不做的。
smarty不嘗試將邏輯完全和模板分開。
如果邏輯程序嚴格的用於頁麵表現,那麼它在模板裡不會出現問題。
有個建議:讓應用程序邏輯遠離模板, 頁麵表現邏輯遠離應用程序邏輯。
這將在以後使內容更容易管理,程序更容易升級。

   Smarty的特點之一是"模板編譯"。意思是Smarty讀取模板文件然後用他們創建php腳本。
這些腳本創建以後將被執行。
因此並冇有花費模板文件的語法解析,同時每個模板可以享受到諸如Zend加速器(http://www.zend.com) 或者PHP加速器(http://www.php-accelerator.co.uk)。
這樣的php編譯器高速緩存解決方案。

Smaty的一些特點:
  • 非常非常的快!
  • 用php分析器乾這個苦差事是有效的
  • 不需要多餘的模板語法解析,僅僅是編譯一次
  • 僅對修改過的模板文件進行重新編譯
  • 可以編輯'自定義函數'和自定義'變量',因此這種模板語言完全可以擴展
  • 可以自行設置模板定界符,所以你可以使用{}, {{}}, <!--{}-->, 等等
  • 諸如 if/elseif/else/endif 語句可以被傳遞到php語法解析器,所以 {if ...} 表達式是簡單的或者是複合的,隨你喜歡啦
  • 如果允許的話,section之間可以無限嵌套
  • 引擎是可以定製的.可以內嵌php代碼到你的模板文件中,雖然這可能並不需要(不推薦)
  • 內建緩存支持
  • 獨立模板文件
  • 可自定義緩存處理函數
  • 插件體係結構





如何判斷現在FORM是在 insert mode? 還是 update mode?

只要用  if (empty({primary_key})) 就可以知道是否為新增模式了。 如果 {promary_key} 是空白的,那麼就是在新增模式;反之,就是更新模式。 以上。