php – Symfony2 – 为自定义表单类型创建模板
发布时间:2020-12-13 16:55:54 所属栏目:PHP教程 来源:网络整理
导读:我有一个名为video_file的自定义表单类型.我正在尝试为它显示一个自定义模板,但它仍然显示默认的Symfony主题,即使我按照文档中的每一步. 这是我的完整配置: VideoFileType.php ?php# src/Acme/PhotoBundle/Form/Type/ThumbnailType.phpnamespace OSCMediaB
我有一个名为video_file的自定义表单类型.我正在尝试为它显示一个自定义模板,但它仍然显示默认的Symfony主题,即使我按照文档中的每一步.
这是我的完整配置: VideoFileType.php <?php # src/Acme/PhotoBundle/Form/Type/ThumbnailType.php namespace OSCMediaBundleFormType; use OSCMediaBundleManagerVideoFileManager; use SymfonyComponentDependencyInjectionContainer; use SymfonyComponentFormAbstractType; use SymfonyComponentFormExtensionCoreChoiceListObjectChoiceList; use SymfonyComponentFormFormBuilderInterface; use SymfonyComponentFormFormEvent; use SymfonyComponentFormFormEvents; use SymfonyComponentOptionsResolverOptionsResolverInterface; 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' => 'OSCMediaBundleEntityVideoFile' )); } public function getDefaultOptions(array $options) { return array('data_class' => 'OSCMediaBundleEntityVideoFile'); } 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' 我清除了缓存和一切,但我无法显示自定义模板.我不知道我在这里做错了什么. Edit1:在@ Zalex的评论之后,我在我的模板中将video_file重命名为video_file_widget.但是,我仍然没有看到和最终的HTML. Edit2:如果我在模板中添加一个文本(‘allo’),则显示’allo’但不显示和标签,所以基本上,模板已加载. 解决方法
您必须在自定义表单名称后添加“窗口小部件”(在您的情况下为video_file):
{% block video_file_widget %} {% spaceless %} <tr> <td> {{ form_widget(form) }} </td> </tr> {% endspaceless %} {% endblock %} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |