エンティティに基づいて FormType クラス ファイルを作成するために、(SensioGeneratorBundle に基づいて) 独自の GeneratorBundle を作成しました。本来のようにファイルを生成しますが、エンティティのフィールドを生成するための for ループ内で、すべてのコードを同じ行に配置するという問題があります。生成されたコードを for ループ内でフィールドごとに新しい行に配置したいと考えています。\n
orを追加しようとしまし< 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 \Sensio\Bundle\GeneratorBundle\Generator\Generator
{
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');
}