CCAPS
外观
CCAPS,或Carefully-Controlled Alternative PHP Syntax,是 网页模板系统,作为 Smarty 和 CakePHP 等模板引擎的替代方案。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 页面的变量要快得多。