[PHP] tinybutstrong 物件的使用方式

tinybutstrong (以下簡稱小強) 簡單易用、支援 WYSIWYG 的強大功能,對於一般小型網站實在是不可多得的好幫手。

但是小強對於複雜的樣板處理就不如 Smarty 那麼方便了,雖然小強支援物件 (Object)存取,但是使用的方式連官方說明都只是簡單帶過去而已。


先來看基本的用法,在 HTML 直接用 var 就可以直接存取 object:

$obj->param //PHP variable


[var.obj.param] //小強 tag

這裡的 param 是指 PHP object 的 property 或 method,但是 method 無法指定參數執行。

如果指定物件 Object 的 method 參數來執行 ,就要花點功夫了:

[foo.php]

include_once('tbs_class.php') ;
$TBS = new clsTinyButStrong ;
$f = new foo();
$TBS->ObjectRef['foo'] = &$f;       //指定參照物件
$TBS->LoadTemplate('foo.html');

//指定可執行的 Object method 給樣板
$TBS->MergeField("foo1", "~foo.run1" ,true);
$TBS->MergeField("foo2", "~foo.run2" ,true);
$TBS->Show() ;

class foo {
function run1 ($x='x'){
return "foo::run1 - ".$x;
}
function run2 ($x='x', $y='y', $z='z'){
return "foo::run2 - ".$x.$y.$z;
}
}

[foo.html]

[foo1.123] //顯示結果為 foo::run1 – 123
<br>
[foo2.3.2.1] //顯示結果為 foo::run2 – 3.2.1Arrayz

看到問題了吧! foo2 使用多個參數,結果就不是我們要的了。

官方提供的方式最多只能傳遞一個參數而已,那要怎麼辦呢?

這時就要借用小強內部傳遞傳數用的 $PrmLst 了。
(也就是在 foo2 結果中看到 Array 的地方)

由於小強的物件使用是特殊狀況,並不須要特地為小強改寫物件,直接產生一個新的Object 繼承後再 Override 就可以了。

[foo.php]

include_once('tbs_class.php') ;
$TBS = new clsTinyButStrong ;
$f1 = new foo();
$f2 = new foo2();
$TBS->ObjectRef['foo1'] = &$f1;
$TBS->ObjectRef['foo2'] = &$f2;       //指定參照物件
$TBS->LoadTemplate('foo.html') ;

//指定可執行的 Object method 給樣板
$TBS->MergeField("foo1", "~foo1.run1" ,true);
$TBS->MergeField("foo2", "~foo2.run2" ,true);
$TBS->Show() ;

class foo {
function run1 ($x){
return "foo::run1 - ".$c;
}
function run2 ($x, $y, $z){
return "foo::run2 - ".$x.$y.$z;
}
}

class foo2 extends foo{
function run2 ($firstPara="", $PrmLst){
if ($firstPara!="") {
return "[firstPara]".parent::run2($firstPara, $PrmLst["y"], $PrmLst["z"]);
} else {
return "[nofirstPara]".parent::run2($PrmLst["x"], $PrmLst["y"], $PrmLst["z"]);
//考慮 HTML 樣板語法的可讀性,第一個參數可以省略不用。
}
}
}

[foo.html]

[foo2.3;y=2;z=1] //結果 [firstPara]foo::run2 – 321
<br>
[foo2;x=3;y=2;z=1] //結果 [nofirstPara]foo::run2 – 321

小強在物件的使用無法像 Smarty 直接引用那麼方便,雖然這種方式不是正規的使用方法,但至少也補足了物件執行的完整性。至少到目前為止還沒有看到任何一個跟小強一樣支援 WYSIWYG 的 PHP Template,雖然小強的作者對於物件的使用有新的構想,但是看起來對於多個參數的使用還有很大的改進空間,也希望在不久的將來會有更簡單的方式可以自由自在的使用物件。

本站相關文章:
tinybutstrong 樣版引擎介紹

7 comments On [PHP] tinybutstrong 物件的使用方式

  • 我個人在使用上偏好把每個單一的變數集合在一個Block中,
    範圍是html。
    然後把每個變數的值放在一個關聯陣列裡面,一個MergeBlock就解析完畢。

  • 上面提到WYSIWYG的樣板系統,我個人認為除了小強外,我之前用的PEAR::Sigma(標準差?)也算是一個。

  • tokimeki:

    多謝您提供心得,但是物件的使用有時候還是有其必要性存在。^^
    (也多謝Sigma的補充,感恩~)

  • 最近在做一個案子,是有關統計分析的,客戶很重視表單上的選項位置呈現。

    我使用了serial,selected,magnet三者配合才做出客戶要的樣子,但是小強對於Field中的selected參數處裡的很慢,尤其是配合magnet來處理時更是明顯…

    不得已只好換回Sigma來用,重構了一下原先為Sigma寫的一些函數,意外的發現,其實移植上不太困難耶…
    當然,重點是速度有明顯的提升(跟小強比的話)

    不過我要說的是,如果沒有上面提到的selected等等因素在影響的話,小強的速度還是比Sigma快…

  • 如果確定是 selected 的關係,有沒有考慮過搭配 javascript 使用?

    至於小強官網的討論,看起來別人也有類似的問題:
    http://www.tinybutstrong.com/forum.php?msg_id=1206

    作者提供解決的方式也是先用 javascript 處理,但是照他的說法似乎這個問題沒那麼容易解決:

    So the time problem mostly comes from parameter ‘selected’ on checkboxes.

    I’m not very suprised. To found checkboxes to browse inside a tag itself embeded in a template, is not a simple task.

    作者在這一篇也有提到:
    http://www.tinybutstrong.com/forum.php?msg_id=2559

    Some TBS features that make the Html side easier to build can slow down performances when used with big data (especially ‘selected’ and conditional blocks into merged blocks), but you can do the same from the Php side with better performances.

  • 目前不考慮用JS來解決,因為這樣前面的標籤必須設定ID屬性來獲取該物件的參照,如此一來將勢必大量增加HTML碼的大小。

    目前這張表單上的選項數目有將近150項,假設為了ID讓每個選項增加10個Bytes來說,目前頁面將增大1.5K。

    而讓小強速度變慢最重要的關鍵是serial,selected,magnet三者的加成效應。

    個人認為,小強對於HTML的操弄過了頭,我依賴小強提供的強大功能也過了頭,所以雖然效果做的出來,卻讓整體的速度變慢,這是我個人的錯誤。

    相對於Sigma來說,Sigma的功能沒有小強強大,常常需要多寫一些函式以及在撰寫樣板檔案時多做不少假設。
    但是由於程式和樣板都是我個人一手包辦,配合上並不會出問題,也很容易根據不同的狀況添加新的功能。

    舉例來說:我就寫了一組函式,可以一次把年月日時分秒這幾個項目作成下拉選單顯示出來,只要兩道命令就行。
    一道是準備一組陣列,指定年月日時分秒預設被選擇的項目;另一道就是呼叫函式來顯示。

  • tokimeki:

    您太客氣了,小強為了提供簡單易用的特性一定會有缺點存在,作者也承認 selected 的效能問題很難解決,能把小強用到這種程度,真是麻淋漓盡致呀!^^

    Sigma 我沒用過,不過技術這種的東西只有最適合的,沒有最好的,手邊多準備點工具一定派的上用場的啦。^^

Leave a reply:

Your email address will not be published.

Site Footer

Sliding Sidebar