我创建了自己的GeneratorBundle(基于SensioGeneratorBundle),以基于实体创建FormType类文件。它按照应该的方式生成文件,但问题是在for循环中生成实体的字段时,它将所有代码放在同一行。我希望在for循环中生成的代码在每个字段的新行上。我尝试添加n
或< br/>
,但没有成功。
命令:
php app/console kuma:generate:adminlist Bundle:Entity
命令类:
class GenerateAdminListCommand extends GenerateDoctrineCommand
{
protected function execute(InputInterface $input, OutputInterface $output)
{
$entity = $input->getOption('entity');
list($bundle, $entity) = $this->parseShortcutNotation($entity);
$entityClass = $this->getContainer()->get('doctrine')->getEntityNamespace($bundle) . '\' . $entity;
$metadata = $this->getEntityMetadata($entityClass);
$admintypeGenerator = $this->getAdminListTypeGenerator();
$admintypeGenerator->generate($bundle, $entity, $metadata[0]);
我的生成器类:
class AdminListTypeGenerator extends SensioBundleGeneratorBundleGeneratorGenerator
{
public function generate($bundle, $entity, $metadata)
{
$parameters = array('namespace' => $bundle->getNamespace(), 'bundle' => $bundle, 'entity_class' => $entityClass, 'fields' => $this->getFieldsFromMetadata($metadata));
$this->renderFile($this->skeletonDir, 'EntityAdminListType.php', $dirPath . '/' . $entity . 'AdminListType.php', $parameters);
}
扩展了以下类别:
class Generator
{
protected function render($skeletonDir, $template, $parameters)
{
$twig = new Twig_Environment(new Twig_Loader_Filesystem($skeletonDir), array(
'debug' => true,
'cache' => false,
'strict_variables' => true,
'autoescape' => false,
));
return $twig->render($template, $parameters);
}
protected function renderFile($skeletonDir, $template, $target, $parameters)
{
if (!is_dir(dirname($target))) {
mkdir(dirname($target), 0777, true);
}
return file_put_contents($target, $this->render($skeletonDir, $template, $parameters));
}
}
字段从元数据中提取:
public static function getFieldsFromMetadata(ClassMetadata $metadata)
{
$fields = (array) $metadata->fieldNames;
// Remove the primary key field if it's not managed manually
if (!$metadata->isIdentifierNatural()) {
$fields = array_diff($fields, $metadata->identifier);
}
foreach ($metadata->associationMappings as $fieldName => $relation) {
if ($relation['type'] !== ClassMetadata::ONE_TO_MANY) {
$fields[] = $fieldName;
}
}
return $fields;
}
在我的骨架文件中:
public function buildForm(FormBuilder $builder, array $options)
{
{%- for field in fields %}
$builder->add('{{ field }}');
{%- endfor %}
}
这就是buildForm()方法在基于上面的骨架生成时的样子:
public function buildForm(FormBuilder $builder, array $options)
{ $builder->add('ip'); $builder->add('timestamp'); $builder->add('firstname'); $builder->add('lastname'); }
所以我希望$builder->add('{{ field }}');
在每个新的迭代中创建一条新行。结果应该是这样的:
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('ip');
$builder->add('timestamp');
$builder->add('firstname');
$builder->add('lastname');
}
好吧,我似乎在同事的帮助下找到了解决方案。
问题是树枝语法中的"-":
{%- for field in fields %}
这个减号意味着它必须放在一行。去掉减号就成功了。
public function buildForm(FormBuilder $builder, array $options)
{
{% for field in fields %}
$builder->add('{{ field }}');
{% endfor %}
}
现在它呈现:
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('ip');
$builder->add('timestamp');
$builder->add('firstname');
$builder->add('lastname');
}
你能试试吗
$builder->add('ip') .'<br/>'. $builder->add('timestamp');