TL; DR:我目前正在努力解决如何使用Twig优雅地生成CRUD / GRID的想法。
长篇故事:
我有一个使用AngularJs的Phalcon应用程序,模板系统是Twig。 PHP假设为CRUD准备一个包含以下内容的模板:
AngularJs负责:
现在一切正常,但我并不特别喜欢它是如何运作的。
例如,一个包含少量字段的简单实体需要以下模板:
{% extends 'index.twig' %}
{% block containerAttr %}ng-controller="InventoryController as ctrl"{% endblock %}
{% set ctrlName = 'ctrl' %}
{% set columnWidth = 'col-xs-12' %}
{% set tableClass = 'table table-bordered table-striped table-hover' %}
{% block header %}
{% include '@crud/crud/header.twig' %}
{% endblock %}
{% block content %}
{% embed '@crud/crud/main-box.twig' %}
{% block tableHeader %}
{% autoescape false %}
{{ crud.tableHeader('Id', 'id') }}
{{ crud.tableHeader('Nazwa', 'name') }}
<th class="col-xs-1">Actions</th>
{% endautoescape %}
{% endblock %}
{% block tableRow %}
<td ng-bind="e.id"></td>
<td ng-bind="e.name"></td>
{% endblock %}
{% endembed %}
{% embed '@crud/crud/form.twig' %}
{% block modalBody %}
{% autoescape false %}
<div class="row">
{{ crud.input('ctrl.entity.name', 'Name', 12) }}
</div>
{% endautoescape %}
{% endblock %}
{% endembed %}
{% embed '@crud/crud/upload.twig' %}{% endembed %}
{% embed '@crud/crud/advancedSearch.twig' %}{% endembed %}
<script>
window.xdata = {{ xdata | json_encode | raw }};
</script>
{% endblock %}
此模板中的 crud
负责生成与AngularJs兼容的表单字段。
理念是:以最少的工作量创建新的CRUD /网格。虽然仍有一定的灵活性。
现在在我的应用程序中创建一个CRUD / Grid,只需要很少的工作: PHP控制器只需要包含一行:
class SubCategoryController extends CrudBase
{
protected $entityClass = InventoryCategory::class;
}
感谢扩展它很容易定制它的每个部分。
模型只需要几个字段:
class InventoryCategory extends ModelBase
{
/** @var integer */
public $id;
/** @var string */
public $name;
public function initialize()
{
$this->setSource('inventory_subcategory');
$this::setup(['castOnHydrate' => true]);
}
}
即使AngularJs控制器只包含URL和一行:
class InventoryCategoryController extends CrudBase {
constructor($injector, $scope) {
super($injector, $scope);
this.urlSave = '/inventory/category/save';
this.urlImport = '/inventory/category/import';
this.urlExport = '/inventory/category/export';
this.urlDelete = '/inventory/category/delete';
this.init({
advancedSearch: false
});
}
}
angular.module('App').controller('InventoryCategoryController', InventoryCategoryController);
是的我使用ES6,应用程序与旧浏览器不兼容,而且它是管理面板,所以我不关心旧浏览器。
但是现在只有模板仍然是一项繁琐的工作,可以将其复制并进行更改。更不用说它们看起来很难看。
所以我的想法是使用Annotation Reader
(Phalcon有一个)从Model
读取字段,然后将其转换为基础配置,检查是否有自定义配置在json并合并它。然后根据配置,动态生成整个模板。
所以最重要的问题是:
我想知道我是否可以创建一些扩展Twig_Template
的类来动态生成此模板?
我见过Twig缓存,它应该很简单但是我怎么能用呢?我该如何呈现它? extend
仍然可以使用吗?