Symfony2 - Erstellung einer Vorlage für eine benutzerdefinierte form-Typ
Ich habe ein benutzerdefiniertes Formular-Typ mit dem Namen video_file
. Ich versuche zu zeigen, eine eigene Vorlage dafür, aber es ist noch mit der Standard Symfony Thema, obwohl ich folgte jedem Schritt, die Dokumentation.
Hier meine komplette Konfiguration:
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';
}
}
Hier, wo ich bin, welche die form as a service:
osc_media.form.type.video_file:
class: %osc_media.form.type.video_file.class%
arguments: [@service_container]
tags:
- { name: form.type, alias: video_file }
Einfach, was ich will, ist das überschreiben der Formular-Vorlage. Wie in der Dokumentation erwähnt, habe ich die Vorlage mit dem Namen OSCMediaBundle:Form:video_file.html.twig
(wie der Rückgabe-string der getName-Methode des Formulars):
Dies ist nicht meine Letzte Vorlage, einfach ein test:
{% block video_file_widget %}
{% spaceless %}
<tr> allo
<td>
{{ form_widget(videoPreset) }}
</td>
</tr>
{% endspaceless %}
{% endblock %}
Nun, in meinem controller habe ich folgende:
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()
));
}
In meinem template OSCMySportBundle:Video:create.html.twig
{{ form(form) }}
Schließlich, als ich erklärte, die form, in meine Konfiguration:
twig:
debug: %kernel.debug%
strict_variables: %kernel.debug%
globals:
locales: %locales%
form:
resources:
# ...
- 'SonataFormatterBundle:Form:formatter.html.twig'
- 'OSCMediaBundle:Form:video_file.html.twig'
Ich gelöscht, den cache und alles, aber ich kann nicht meine benutzerdefinierte Vorlage zu zeigen. Ich weiß nicht, was ich falsch mache hier.
Edit1: Nach @Zalex Kommentar, den ich umbenannt video_file zu video_file_widget in meinem template. Allerdings bin ich noch nicht zu sehen, und in der endgültigen html.
Edit2: Wenn ich einen text in die Vorlage ('allo'), 'allo' ist gezeigt, aber nicht die tags und die Kategorie, so dass im Grunde, das template ist geladen.
resources:
im config-Datei zu ändern versuchen, aufform_themes
- form_themes ist keine gültige Zweig config von dem, was ich lese.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie hinzufügen "widget" in Ihrem Formular Vorlage nach der Ihr benutzerdefiniertes Formular name (video_file in deinem Fall) :
{% block video_file_wdiget %}
.... Überprüfen Sie bitte noch einmal wdiget Sie schreiben, aber das widget ist richtig ofcause 🙂 Und ich denke{{ form_widget(form.videoPreset) }}
Sie Sie brauchen, um auf{{ form_widget(form) }}