自定义动态Twig模板,扩展了Twig_Template

时间:2018-01-28 15:12:59

标签: php angularjs templates twig phalcon

TL; DR:我目前正在努力解决如何使用Twig优雅地生成CRUD / GRID的想法。

长篇故事:

我有一个使用AngularJs的Phalcon应用程序,模板系统是Twig。 PHP假设为CRUD准备一个包含以下内容的模板:

  • 列出od实体,包含正确标题的表格,列,行项目,操作按钮
  • 简单高级搜索
  • 群众行动阻止
  • 主要按钮 - 添加/导入/导出等

AngularJs负责:

  • Paginating导致2种模式:Ajax Loaded实体,所有实体一次
  • 每页更改实体数
  • 在模态中显示各种表格 - 添加/编辑/导入
  • 过滤实体 - 简单和高级搜索

现在一切正常,但我并不特别喜欢它是如何运作的。

例如,一个包含少量字段的简单实体需要以下模板:

{% 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仍然可以使用吗?

0 个答案:

没有答案