shermanwebdesign / render
将对象渲染到模板的渲染引擎
Requires
- php: >=5.3.0
This package is not auto-updated.
Last update: 2024-09-24 23:26:20 UTC
README
##INDEX
范围
-实现
--模板
---占位符
---模板定义
--对象
--数组
--字符串
--方法
##范围
本项目的目标是创建一个符合以下标准的模板解决方案:
- 使用必须简单
- 实现不得需要额外的库、依赖于其他语言等
- 调用方法不得需要大量变量或配置数组
- 递归和循环必须以不依赖于对现有类进行黑客攻击的方式支持
- HTML标记的语法不得依赖于创建新语言!(轻轻推了推Twig...)
- 我们必须能够访问逻辑、条件语句等 - 我们还必须在不创建新模板语言的情况下完成这一点(与1.iv冲突)
- 代码不得与PHP框架冲突(即wordpress/joomla/concrete5等)
- 代码不得依赖于PHP常量进行配置
- 所有函数和逻辑都必须包含在命名空间类的方法中
代码不得依赖于全局变量
##实现
该解决方案结合了我最喜欢的Twig特性,即HTML中的值占位符,同时采用面向对象,并保留了您熟悉的PHP的逻辑力量。
- 如果您还没有这样做,请在您的代码中包含Render.php文件...
- 选择一个模板方法!
- 传递一个模板(s)(单个=字符串,全部=数组,控制器=对象)
- 传递"null"给$template变量,并预先定义(或设置默认值,可由选项1覆盖)一个模板,通过给您的对象一个属性"template" = 字符串来实现
- 通过命令\SWD\Render::render($yourObject, $allTemplates);渲染对象
###模板
当\SWD\Render::render()传递一个对象和模板变量时,它会按以下顺序查找模板字符串,并在找到后停止查找。
- 传递给$allTemplates的变量(假设您没有传递null,并且渲染的对象有一个类名)
- 如果$allTemplates变量是一个对象,它会在以下位置查找模板字符串(找到后会停止查找)
- $allTemplates->Your\Name\Spaced\ClassName属性,它是一个字符串
- $allTemplates->__get($YourObjectsClassName)的结果
- $allTemplates->__call($YourObjectsClassName, $YourObject)的结果
- $allTemplates->get_template_for_Your_Name_Spaced_ClassName($YourObject)的结果
- 如果$allTemplates变量是一个数组,它会查看$allTemplates['Your\Name\Spaced\ClassName'];
- 如果$allTemplates变量是一个字符串,我们使用它。
- 布尔值、整数等被忽略。
- 对象的'模板'属性本身。例如,
$yourObject->template
- 如果没有找到模板,会向\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()
传递一个对象时,它会在以下位置查找模板字符串,并在找到时停止进一步查找。
- 全局对象$swdTemplates,属性名为'Namespace_Slashes_Use_Underscores_MyClassName',类型为字符串
- 全局对象$swdTemplates,方法名为'Namespace_Slashes_Use_Underscores_MyClassName',返回类型为字符串
- 对象本身,'template'属性。
- 如果没有找到模板,则向
\SWD\Render::render()
的调用者抛出一个用户通知级别的错误。
一旦模板字符串被定义,\SWD\Render::render()
会抓取模板字符串中的所有{{placeholder}}模式,并用以下列表中适用的第一个选项替换它。
- 具有该模式(去掉括号)的属性
- 具有该模式(作为名称)的对象中的方法。
然后启动渲染递归,\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对象/数组/原始传递的任何内容。您可以使用它来根据您的控制器需求翻转开关;
- 在模板中调用公共函数(例如,{{use_controller}})
- 接受传递的变量,如下所示 -
public function use_controller($controller){}
在您的渲染对象中。- 别忘了,您可以通过在函数声明中使用&符号将更改传播回引用链上的其他模板。