跳转到内容

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 页面的变量要快得多。

华夏公益教科书