跳轉到內容

CCAPS

25% developed
來自華夏公益教科書

如何開始使用 PHP CCAPS

[編輯 | 編輯原始碼]

CCAPS,或Carefully-Controlled Alternative PHP Syntax,是 網頁模板系統,作為 SmartyCakePHP 等模板引擎的替代方案。CCAPS 的發音為Cee-Caps,是 PHP 網頁開發者可以用來將 XHTML 原始碼與程式設計邏輯分離,同時將兩者很好地結合在一起,而不會引入 義大利麵條程式碼

許多開發者更喜歡它,而不是像 Smarty 這樣的引擎,因為

  • 它的架構更輕薄,因此執行速度更快
  • 使用大多數 PHP 開發者已經瞭解的概念
  • PHP 本身就是一個很棒的模板引擎
  • PHP 已經提供了條件和控制流功能
  • 不需要額外的安裝步驟
  • 保證它不會在你的伺服器上崩潰,因為它不包含任何額外的庫 - 沒有額外的功能新增來確保你已經安裝了
  • 它更具適應性

PHP 已經有了 Alternative PHP Syntax,但 CCAPS 所做的就是以下指南

  • 模板頁面以副檔名 ".php" 結尾,除非其他安排允許將它們載入到一個人的編輯器中,並對原始碼進行適當的彩色格式化,並且除非 Apache 指令允許某些其他副檔名像 PHP 頁面一樣被處理。
  • 模板放在名為 "views" 的資料夾中,並且有 Apache 訪問控制,以便這些頁面可以被包含,但不能被終端使用者直接檢視。
  • 所有模板檔名必須以小寫字母 "v" 開頭,代表 "View"。在 MVC 框架 中,模板是一個檢視。例如,一個檔案可以命名為 vLogin.php。這個 "v" 有助於在一個文字編輯器中更容易地區分檢視和頁面控制器,頁面控制器可能被稱為,例如,Login.php。
  • 為了將 PHP 值放入 XHTML 中,使用 PHP 常量變數。PHP 常量變數僅以大寫字母形式包含在 XHTML 中,以便在通常為小寫字母的 XHTML 原始碼中更容易識別。
  • PHP 常量變數被包含為 <?= MYVAR ?>,以便使用盡可能少的按鍵,而不是 <?php echo MYVAR; ?>。如果這需要在 Apache 設定中進行更改,或者在 PHP 的編譯或配置方式中進行更改,則會進行相應調整。
  • 作為一項基本規則,在一個給定的 XHTML 頁面中,只允許使用三個 (3) if/then 條件。如果需要更多,則強烈建議將它們移動到單獨的更小的檢視檔案中,或者透過函式或物件方法在呼叫頁面的程式設計邏輯中編寫 XHTML,然後作為單個變數傳遞到 XHTML 模板中。這可以使原始碼保持乾淨,並使其更容易編輯。
  • 強烈建議不要使用巢狀的 if/then 條件,如果有必要,應該在呼叫 PHP 頁面(頁面控制器)中編寫 XHTML,並傳遞給檢視進行插入。
  • if/then 條件只允許使用不帶花括號的備用語法樣式,例如
 <? if (TAB == 'main'): ?>
 <xhtml goes here>
 <? else: ?>
 <xhtml goes here>
 <? endif; ?>
  • 不允許使用任何迴圈。相反,這種功能必須在呼叫頁面的程式設計邏輯中建立,通常透過一個包含的函式或物件方法,然後作為單個大寫變數插入此頁面模板的 XHTML 原始碼中。
  • 除了 if/then 之外,不允許使用其他條件邏輯,例如 select/case 邏輯。相反,這種邏輯必須在呼叫頁面中實現。
  • 模板應該在一個單獨的檔案中包含頁首或頁尾。此檔案通常以大寫字母命名,例如 vHEADER1.php,vFOOTER2.php,以便在模板資料夾中更容易找到。
  • 對於需要側邊欄的頁面,這可能更適合作為更小的檢視檔案編寫,並以這種方式包含。
  • 通常,在一個 PHP 類中編寫一組靜態方法來處理此模板是合適的,例如...
 View::Assign('MYVAR','This is my test');
 View::Display('vMain.php');

...而 Display 方法自動假設 vMain.php 位於名為 "views" 的子資料夾中。

  • 另一個指南是需要提醒一下。由於我們使用常量,你需要注意 PHP 的一個鮮為人知的特性,即如果你試圖顯示一個未定義的常量,它會顯示變數名稱,這可能是完全出乎意料和不穩定的。因此,如果你只對一個帶有 if/then 條件的變數執行 View::Assign(),而沒有提供相同的 View::Assign() 來建立一個預定義的空值常量,那麼 PHP 將自動顯示該常量作為它自己的變數名稱。因此,要注意...
 <?php
 require_once('classes/View.php');
 if (empty($_POST['name'])) {
     View::Assign('ERRORMSG','No name was provided');
 }
 View::Display('vTest.php');
 <?php ?>
 <?= ERRORMSG ?>

...這將導致單詞 'ERRORMSG' 出現在頁面上。解決方法是

 <?php
 require_once('classes/View.php');
 $sErr = '';
 if (empty($_POST['name'])) {
     $sErr = 'No name was provided';
 }
 View::Assign('ERRORMSG',$sErr);
 View::Display('vTest.php');
 <?php ?>
 <?= ERRORMSG ?>

大多數 PHP 安裝已經支援 CCAPS,不需要安裝額外的庫。

示例檢視類

[編輯 | 編輯原始碼]

一個示例檢視類可能如下所示。

 <?php
 
 class View {
 
 const ENCODE_DEFAULT = 0;
 const ENCODE_HTML = 1;
 const ENCODE_URL = 2;
 
 function Assign($sVarName, $sVal, $nType = self::ENCODE_DEFAULT) {
     switch ($nType) {
         case self::ENCODE_HTML: // show the html
             $sVal = htmlentities($sVal);
             break;
         case self::ENCODE_URL: // prepare for urls
             $sVal = urlencode($sVal);
             break;
         default: // 0, default, as is, unaltered
             break;
         
     }
     $sVarName = strtoupper($sVarName);
     define($sVarName, $sVal);
 }
 
 function Display($sTemplateFile) {
     $sScriptName = $_SERVER['SCRIPT_NAME'];
     $sBaseName = basename($sScriptName);
     define('U',str_replace($sBaseName,'',$sScriptName));
 
    $sPath = dirname(__FILE__);
    $sPath = str_replace('classes','',$sPath);
    require_once($sPath . 'views/' . $sTemplateFile);
 }
 
 }

因此,作為示例,你可以有一個 test.php,它看起來像

 <?php
 require_once('classes/View.php');
 View::Assign('TEST','This is my test.');
 View::Display('vTest.php');

然後,你的 vTest.php 可能看起來像

 <?php ?>
 <html>
 <head><title>Test</title></head>
 <body>
 <?= TEST ?>
 </body>
 </html>

請注意我們使用 TEST 而不是 $TEST。這是因為它是一個常量。這不僅可以阻止可能導致義大利麵條程式碼的濫用,而且比在我們的 View 類中使用全域性變數陣列技術來載入和解除安裝從一個 PHP 頁面傳遞到另一個 PHP 頁面的變數要快得多。

華夏公益教科書