将对象渲染到模板的渲染引擎

dev-master 2016-08-22 17:20 UTC

This package is not auto-updated.

Last update: 2024-09-24 23:26:20 UTC


README

##INDEX

范围

-实现

--模板

---占位符

---模板定义

--对象

--数组

--字符串

--方法

##范围

本项目的目标是创建一个符合以下标准的模板解决方案:

  1. 使用必须简单
  2. 实现不得需要额外的库、依赖于其他语言等
  3. 调用方法不得需要大量变量或配置数组
  4. 递归和循环必须以不依赖于对现有类进行黑客攻击的方式支持
  5. HTML标记的语法不得依赖于创建新语言!(轻轻推了推Twig...)
  6. 我们必须能够访问逻辑、条件语句等 - 我们还必须在不创建新模板语言的情况下完成这一点(与1.iv冲突)
  7. 代码不得与PHP框架冲突(即wordpress/joomla/concrete5等)
  8. 代码不得依赖于PHP常量进行配置
  9. 所有函数和逻辑都必须包含在命名空间类的方法中
  10. 代码不得依赖于全局变量

##实现

该解决方案结合了我最喜欢的Twig特性,即HTML中的值占位符,同时采用面向对象,并保留了您熟悉的PHP的逻辑力量。

  1. 如果您还没有这样做,请在您的代码中包含Render.php文件...
  2. 选择一个模板方法!
  3. 传递一个模板(s)(单个=字符串,全部=数组,控制器=对象)
  4. 传递"null"给$template变量,并预先定义(或设置默认值,可由选项1覆盖)一个模板,通过给您的对象一个属性"template" = 字符串来实现
  5. 通过命令\SWD\Render::render($yourObject, $allTemplates);渲染对象

###模板

当\SWD\Render::render()传递一个对象和模板变量时,它会按以下顺序查找模板字符串,并在找到后停止查找。

  1. 传递给$allTemplates的变量(假设您没有传递null,并且渲染的对象有一个类名)
  2. 如果$allTemplates变量是一个对象,它会在以下位置查找模板字符串(找到后会停止查找)
  3. $allTemplates->Your\Name\Spaced\ClassName属性,它是一个字符串
  4. $allTemplates->__get($YourObjectsClassName)的结果
  5. $allTemplates->__call($YourObjectsClassName, $YourObject)的结果
  6. $allTemplates->get_template_for_Your_Name_Spaced_ClassName($YourObject)的结果
  7. 如果$allTemplates变量是一个数组,它会查看$allTemplates['Your\Name\Spaced\ClassName'];
  8. 如果$allTemplates变量是一个字符串,我们使用它。
  9. 布尔值、整数等被忽略。
  10. 对象的'模板'属性本身。例如,$yourObject->template
  11. 如果没有找到模板,会向\SWD\Render::render()的调用者抛出一个用户提示级别错误,然后代码继续运行。

初学者 -- 建议初学者使用1.ii和1.iii,直到您了解控制器并想要进入该逻辑

MVC程序员 -- 您可以看到这是如何通过\SWD\Render::render($application, $yourController)风格清楚地访问MVC模型,特别是通过1 -在$allTemplates->__call($classname, $object)中实现控制器,结合能够嵌套对象以有条件地渲染它们自己的模板。(见下面的方法部分)

####占位符

模板由普通HTML字符串和占位符组成。唯一需要了解的语法是,占位符只能由字母、数字或下划线组成。这遵循了PHP属性/变量和方法/函数的模式。例如 - {{twitter_section}}{{my2ndObject}}

####模板定义

模板可以在类本身内部定义(作为默认值),通过将字符串赋值给'template'属性。无论是否分配了默认模板,我们都会在全局$swdTemplates对象中查找重写。关于此选项的详细信息,请参阅“对象”部分。

注意:全局$swdTemplates可以分配对象到模板区域。如果\SWD\Render::render()在$swdTemplate->MyClass找到对象,它将调用$swdTemplates->MyClass的get_template($object);方法(而不是MyClass->get_template($object);)。这允许轻松扩展到条件模板,但将逻辑保持在PHP中!

###对象

从模板部分...

\SWD\Render::render()传递一个对象时,它会在以下位置查找模板字符串,并在找到时停止进一步查找。

  1. 全局对象$swdTemplates,属性名为'Namespace_Slashes_Use_Underscores_MyClassName',类型为字符串
  2. 全局对象$swdTemplates,方法名为'Namespace_Slashes_Use_Underscores_MyClassName',返回类型为字符串
  3. 对象本身,'template'属性。
  4. 如果没有找到模板,则向\SWD\Render::render()的调用者抛出一个用户通知级别的错误。

一旦模板字符串被定义,\SWD\Render::render()会抓取模板字符串中的所有{{placeholder}}模式,并用以下列表中适用的第一个选项替换它。

  1. 具有该模式(去掉括号)的属性
  2. 具有该模式(作为名称)的对象中的方法。

然后启动渲染递归,\SWD\Render::render()再次被调用,并传递评估后的属性或方法。只要(它们被父对象的模板调用)并且(对象具有模板),嵌套的对象、数组和字符串就会被渲染。

注意:您可以在来自其他开发者的对象上调用\SWD\Render::render($object);。由于通过全局$swdTemplates分配的模板会覆盖(而不是替换)$object->template属性,因此不需要对类/对象进行破坏性访问,就可以非破坏性地访问对象的公共属性/方法;

###数组

如前所述,\SWD\Render将数组作为“foreach”循环处理,渲染每个值。如果您想对此循环进行条件化,则需要逻辑。您需要查看下面的“方法”部分。

###字符串

如果对\SWD\Render::render();调用字符串,它将返回原字符串。这允许我们调用\SWD\Render::render($arraysOfObjectsAndStrings);并接收适当的输出。

###方法

本节允许在不冲突于我们的设计范围内进行模板化逻辑!如果您需要在模板中函数的结果,只需在模板字符串内部调用该函数,如{{your_method_name}}。这将用函数的结果替换,无论它是一个字符串、另一个对象(在您的$allTemplates变量中定义一个模板!)还是字符串和对象数组的组合。这是一个非常强大的工具,它允许进行复杂的模板化,而永远不会让标记语言成为逻辑语言。

注意:该方法传递了$allTemplates对象/数组/原始传递的任何内容。您可以使用它来根据您的控制器需求翻转开关;

  1. 在模板中调用公共函数(例如,{{use_controller}})
  2. 接受传递的变量,如下所示 - public function use_controller($controller){} 在您的渲染对象中。
  3. 别忘了,您可以通过在函数声明中使用&符号将更改传播回引用链上的其他模板。