跳转到内容

Mojavi 3 手册/教程/装饰器分析

来自维基教科书,开放世界中的开放书籍

先决条件

[编辑 | 编辑源代码]

在阅读本教程之前,应该先了解 ((全局模板 - 装饰器模式教程)(教程)). 在阅读本教程之前,应该先了解 ((http://wiki.mojavi.org:81/159.html)(全局 模板教程)).


++ 分析

++ 分析


装饰器分析是一个简单的概念:将装饰器模板和填充器的不同排列分离到可以自动执行这些调用的脚本中。装饰器分析是一个简单的概念:将装饰器模板和填充器的不同排列分离到可以自动执行这些调用的脚本中。首先,让我们从演变的角度看看如何将不同的显示模式或配置文件与实际视图分离。

++ 阶段 1:硬编码

在这个示例中,一个简单直接装饰模板的示例完成了它的工作。但它没有提供一种简单的方法来在其他视图中复制这种装饰器/插槽填充模式,而无需复制粘贴。 // 1 ka ans kya h?

示例 1:硬编码装饰器信息

[编辑 | 编辑源代码]
class IndexSuccessView extends PHPView
{

public function execute ()
{

// set our template
$this->setTemplate('IndexSuccess.php');

//setup our decorator template
$this->setDecoratorDirectory(MO_TEMPLATE_DIR);
$this->setDecoratorTemplate('myGlobalTemplate.php');

//setup our slots
//(SlotName, Module, Action)
$this->setSlot('menu', 'Content', 'PopulateMenu');
$this->setSlot('css', 'Content', 'PopulateCss');

// set the title
$this->setAttribute('title', 'Default Action');

}

}

++ 阶段 2:包含

抽象的第二个阶段是创建一个单独的脚本(一个单独的 php 文件)并将其直接包含到视图中,从而消除复制的代码。

示例 2:包含装饰器信息

[编辑 | 编辑源代码]
class IndexSuccessView extends PHPView
{

public function execute ()
{

// set our template
$this->setTemplate('IndexSuccess.php');

// set the title
$this->setAttribute('title', 'Default Action');

//get our profile
require(MO_TEMPLATE_DIR . '/profiles/Default.profile.php');

}

}

正如您所见,所有装饰器调用都已删除,取而代之的是一个包含位置。包含文件如下所示

示例配置文件:Default.profile.php

[编辑 | 编辑源代码]
<?php

//setup our decorator template
$this->setDecoratorDirectory(MO_TEMPLATE_DIR);
$this->setDecoratorTemplate('myGlobalTemplate.php');

//setup our slots
$this->setSlot('menu', 'Content', 'PopulateMenu');
$this->setSlot('css', 'Content', 'PopulateCss');

?>

++ 阶段 3:=setProfile()=

最后一个阶段,或者我建议的阶段,是创建一个简单的方法来为我们加载配置文件,并可能提供一些其他实用程序函数,例如

hasProfile()
loadProfile() or setProfile()

示例 3:包含装饰器信息

[编辑 | 编辑源代码]
class IndexSuccessView extends PHPView
{

public function execute ()
{

// set our template
$this->setTemplate('IndexSuccess.php');

// set the title
$this->setAttribute('title', 'Default Action');

//get our profile
$this->setProfile('Default');

}

}

++ =setProfile()= 方法

不要被欺骗,=setProfile()= 方法和包含方法最终是等效的。一种方法比另一种方法需要多调用一个函数,但我认为 =setProfile()= 的简单性使其更胜一筹,此外它还提供自动配置文件检测,以及在适当目录中的自动搜索(我猜想存储配置文件的目录可能是 MO_TEMPLATE_DIR/templates/profiles/)。

示例 4:setProfile() 方法

[编辑 | 编辑源代码]
Note: This function is untested and may contain errors.


public function setProfile($name, $module = null)
{

//is the module null?
if($module === null)
{

//set the directory to the global profile directory
$dir = MO_TEMPLATE_DIR . '/profiles';

}
else
{

//set the directory to the module profile directory
$dir = MO_MODULE_DIR . '/' . $module . '/templates/profiles';

}

//setup the profile path
$profile = $dir . '/' . $name . '.profile.php';

//can we read it?
if(is_readable($profile))
{

//get the file
require($profile);

//set the profile up
$this->profile = $name;
return true;

}
else
{

//profile failed, set null
$this->profile = null;
return false;

}

}

成员变量 =$profile= 允许在视图的 preRenderCheck() 期间运行检查。

华夏公益教科书