Я хочу создать код на основе шаблонов.
Предположим, что в /Templates
меня есть файлы, структурированные как:
/Templates
И скажем, что файлы имеют следующее содержимое (переменные, заключенные в {{ }}
должны быть проанализированы):
Производитель /Plugin/config.xml:
<?xml version="1.0"?>
<config>
<module>{{Vendor}}/{{Plugin}}</module>
<version>{{Version}}</version>
{{if $HasTable}}
<database>
<table>{{TableName}}</table>
<pk>{{PrimaryKey}}</pk>
<fields>
{{foreach $Fields}}
<field>
<name>{{Fields.Name}}</name>
<label>{{Fields.Label}}</label>
<type>{{Fields.Type}}</type>
</field>
{{/foreach}}
</fields>
</database>
{{/if}}
</config>
Производитель/Plugin/Модель/plugin.php:
<?php
/**
* @category {{Vendor}}_{{Plugin}}
* @author {{Author}}
*/
class {{Vendor}}_{{Plugin}}_Model_{{Plugin}} extends Core_Model_Abstract
{
public function __construct()
{
parent::__construct();
}
{{if $HasTable}}
public function setTable()
{
$this->_tableName = '{{TableName}}';
}
public function setPrimaryKey()
{
$this->_primaryKey = '{{PrimaryKey}}';
}
public function setFields()
{
$this->_fields = Core::Config('database/table/fields');
}
{{/if}}
}
Производитель /Plugin/View/plugin.phtml:
{{TableName}} Rows
<table>
<tr>
{{foreach $Fields}}
<th>{{$Fields.Label}}</th>
{{/foreach}}
</tr>
<?php foreach ($data as $_data) ?>
<tr>
{{foreach $Fields}}
<td><?php echo $_data['{{$Fields.Name}}'] ?></td>
{{/foreach}}
</tr>
<?php endforeach; ?>
</table>
Как генератор кода должен работать?
1> Форма GUI, которая позволит пользователям добавлять по крайней мере следующие поля
Поставщик: Плагин: Версия: Автор:
Имеет таблицы?: Если выбрано yes, это позволит пользователям добавлять больше полей, таких как имя таблицы, поля и т.д.
2> При отправке формы он генерирует код из папки /Templates в какой-то каталог. Логика может быть: Подготовка переменных для подачи в CoreGenerator (класс, который должен быть разработан), который будет считывать все файлы шаблонов и повторно генерировать их анализируя эти переменные.
Ожидаемый результат из /Template
будет: (Предположим, если у нас есть следующие валиды от ввода пользователя
Vendor: Foo
Plugin: Bar
Version: 1.0.0
Author: John Doe <[email protected]>
Has Tables?: Yes
Table Name: blog
Primary Key: blog_id
Fields:
+ Name: title, Label: Title, Type: Text
+ Name: status, Label: Status, Type:Int
...
)
/Generated
Сгенерированное содержимое:
Foo/бар/config.xml:
<?xml version="1.0"?>
<config>
<module>Foo/Bar</module>
<version>1.0.0</version>
<database>
<table>blog</table>
<pk>blog_id</pk>
<fields>
<field>
<name>title</name>
<label>Title</label>
<type>Text</type>
</field>
<field>
<name>status</name>
<label>Status</label>
<type>Int</type>
</field>
<!--... -->
</fields>
</database>
</config>
Foo/Бар/Модель/Bar.php:
<?php
/**
* @category Foo_Bar
* @author John Doe <[email protected]>
*/
class Foo_Bar_Model_Bar extends Core_Model_Abstract
{
public function __construct()
{
parent::__construct();
}
public function setTable()
{
$this->_tableName = 'blog';
}
public function setPrimaryKey()
{
$this->_primaryKey = 'blog_id';
}
public function setFields()
{
$this->_fields = Core::Config('database/table/fields');
}
}
Foo/Бар/View/bar.phtml:
blog Rows
<table>
<tr>
<th>Title</th>
<th>Status</th>
</tr>
<?php foreach ($data as $_data) ?>
<tr>
<td><?php echo $_data['title'] ?></td>
<td><?php echo $_data['status'] ?></td>
</tr>
<?php endforeach; ?>
</table>
Поэтому моя основная задача будет заключаться в классе/библиотеке Code Generator, который будет собирать значения заполнителя из пользовательского ввода, читать все эти файлы из папки /Templates
и регенерировать их после разбора этих переменных (простых, условных, циклов и т.д.) В /Generated
папка,
С какой информацией я могу начать, с чего начать? любая грубая идея, решения и ссылки заслуживают высокой оценки. Заранее спасибо.
Я бы предположил, что вместо этого вы используете интерфейс gui для интерфейса cli. Потому что таким образом легче настраивать.
В качестве справочной информации вы можете использовать Yeoman большой инструмент для строительных лесов, хорошо документированный, который может помочь вам построить генератор с меньшими усилиями. http://yeoman.io/
Для вдохновения ознакомьтесь с этой демо-версией генератора: https://github.com/DaftMonk/generator-angular-fullstack