0

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

2 に答える 2

1

わかりました、同僚の助けを借りて解決策を見つけたようです。

問題は小枝構文内の「-」でした:

{%- for field in fields %}

そのマイナスは、1 行に配置する必要があることを意味します。マイナスを削除するとうまくいきました。


    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');
            }
于 2012-08-29T14:22:43.373 に答える
0

試してみませんか

 $builder->add('ip') .'<br/>'. $builder->add('timestamp'); 
于 2012-08-29T13:06:52.673 に答える