2015-03-23 3 views
4

У меня есть собственный тип формы с именем video_file. Я пытаюсь показать собственный шаблон для него, но он по-прежнему показывает тему Symfony по умолчанию, хотя я следил за каждым шагом в документации.Symfony2 - Создание шаблона для пользовательского типа формы

Вот моя полная конфигурация:

VideoFileType.php

<?php 
# src/Acme/PhotoBundle/Form/Type/ThumbnailType.php 

namespace OSC\MediaBundle\Form\Type; 

use OSC\MediaBundle\Manager\VideoFileManager; 
use Symfony\Component\DependencyInjection\Container; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\Extension\Core\ChoiceList\ObjectChoiceList; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\Form\FormEvent; 
use Symfony\Component\Form\FormEvents; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class VideoFileType extends AbstractType 
{ 

    public $container; 

    public $videoPresets = []; 

    public function __construct(Container $container) { 
     $this->container = $container; 
     $videoPresets = $container->getParameter('osc_media.video.presets'); 
     foreach ($videoPresets as $key => $videoPreset) { 
      array_push($this->videoPresets, $key); 
     } 

    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('thumbnail', 'image'); 
     $builder->add('file', 'file'); 
     $builder->add('videoPreset', 'choice', array(
      'choices' => $this->videoPresets, 
      'multiple' => false, 
      'required' => true 
     )); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'OSC\MediaBundle\Entity\VideoFile' 
     )); 
    } 

    public function getDefaultOptions(array $options) { 
     return array('data_class' => 'OSC\MediaBundle\Entity\VideoFile'); 
    } 

    public function getName() 
    { 
     return 'video_file'; 
    } 
} 

Вот где я объявляю форму в качестве службы:

osc_media.form.type.video_file: 
    class: %osc_media.form.type.video_file.class% 
    arguments: [@service_container] 
    tags: 
     - { name: form.type, alias: video_file } 

Просто, что я хочу является переопределение шаблона формы. Как сказано в документации, я создал шаблон с именем OSCMediaBundle:Form:video_file.html.twig (например, возврата строки метода GetName формы):

Это не мой последний шаблон, просто тест:

{% block video_file_widget %} 
     {% spaceless %} 
      <tr> allo 
       <td> 
        {{ form_widget(videoPreset) }} 
       </td> 
      </tr> 
     {% endspaceless %} 
    {% endblock %} 

Теперь, в мой контроллер, я имею следующее:

public function createAction(Request $request) 
    { 
     $videoFile = new VideoFile(); 

     $form = $this->createForm('video_file', $videoFile); 

     if ($request->getMethod() == 'POST') { 
      $form->handleRequest($request); 

      if ($form->isValid()) { 
       $em = $this->get('doctrine.orm.entity_manager'); 
       $videoFile = $form->getData(); 

       $em->persist($videoFile); 
       $em->flush(); 
      } 
     } 

     return $this->render('OSCMySportBundle:Video:create.html.twig', array(
      'form' => $form->createView() 
     )); 
    } 

в моем шаблоне OSCMySportBundle:Video:create.html.twig

{{ form(form) }} 

Наконец, я объявил форму в моей конфигурации:

twig: 
    debug:   %kernel.debug% 
    strict_variables: %kernel.debug% 
    globals: 
     locales: %locales% 
    form: 
     resources: 
      # ... 
      - 'SonataFormatterBundle:Form:formatter.html.twig' 
      - 'OSCMediaBundle:Form:video_file.html.twig' 

я очистил кэш и все, но я не могу получить мой пользовательский шаблон, чтобы показать. Я не знаю, что я здесь делаю неправильно.

Редактировать 1: После комментария @ Zalex я переименовал video_file в video_file_widget в своем шаблоне. Тем не менее, я до сих пор не вижу и в последнем html.

Редактировать 2: Если я добавлю текст в шаблон ('allo'), отображается «allo», но не теги и тэги, так что в основном шаблон загружается.

+0

'ресурсы:' в файле конфигурации попытаться изменить на 'form_themes' – zalex

+0

form_themes является не действительная версия твига из того, что я читаю. – CoachNono

ответ

3

Вы должны добавить «виджетов» в шаблоне формы после пользовательского имени формы (video_file в вашем случае):

{% block video_file_widget %} 
     {% spaceless %} 
      <tr> 
       <td> 
        {{ form_widget(form) }} 
       </td> 
      </tr> 
     {% endspaceless %} 
    {% endblock %} 
+0

Ой, вау, это так просто, не могу поверить, что я пропустил это ... – CoachNono

+0

Обратите внимание на эту часть книги Symfony http://symfony.com/doc/current/book/forms.html артикулу Именование наименования формы – zalex

+0

К сожалению, я ошибся в использовании {{form_widget (videoPreset)}}, который должен был быть: {{form_widget (form.videoPreset)}}. Однако, исправив его так, как вы сказали мне, и эта коррекция, я все еще получаю тему по умолчанию. Я не Seing в и – CoachNono

Смежные вопросы