Тип зависит от страницы, соответственно там где указано условие, там показываем обычные поля формы, а в админке показываю коллекции форм, они имеют прототипы и с помощью скрипта можно добавлять формы вида Message[name][0],Message[email][0],Message[message][0] ... Message[fields][i]
namespace Home\MailBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\HttpFoundation\Request;
class MessageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$request = Request::createFromGlobals();
$builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) use ($request) {
$message = $event->getData();
$form = $event->getForm();
if($request->getPathInfo() == '/' || $request->getPathInfo() == '/subscribes/sendform/public_mail')
{
$form->add('name','text');
$form->add('email','email');
$form->add('message','textarea');
}
else {
$form->add('name',
'collection',
array('allow_add' => true,
'type' => 'text',
'label' => array('class' => 'dsdsa'),
'options' => array(
'attr' => array(
'class' => 'form-control',
'placeholder' => 'Name...',
)
)
));
$form->add('email',
'collection',
array('allow_add' => true,
'type' => 'email',
'options' => array(
'attr' => array('class' => 'form-control',
'placeholder' => 'Email...')
)
));
$form->add('message',
'collection',
array('type' => 'textarea',
'allow_add' => true,
'options' => array(
'attr' => array('class' => 'form-control',
'placeholder' => 'Message...')
)
));
}
});
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
//'data_class' => 'Home\MailBundle\Entity\Message',
));
}
/**
*
* Returns form name lke Message[name]...
*
**/
public function getName()
{
return 'Message';
}
}
В шаблоне поля выводятся так {{ form_widget(form.name) }} , на их прототипе добавляются доп поля. В целом один ключ равен одной сущности т.е name[0],email[0],message[0] - это одна запись
В контроллере получаю
$message = $this->getDoctrine()->getRepository('MailBundle:Message')->findAll();
$form = $this->createForm(new MessageType(), $message);
...
return $this->render('MailBundle:Subscribe:index.html.twig',array(
'title' => 'Add email form',
'form' => $form->createView()
));
Шаблон выглядит так (добавление и вывод, по выводу прошу помощи)
{% block content %}
<div class="contact-form" >
{{ form_errors(form) }}
<form action="{{ path('mail_send_mail_form_multiple') }}" id="mail_send_mail_form" method="post" {{ form_enctype(form) }} novalidate >
<h1>{{ title }}</h1>
<div class="emailfields">{{ form_widget(form.name) }}
{{ form_widget(form.email) }}
{{ form_widget(form.message) }}
</div>
<div id="insert-blocks" class="row">
{% for key,field in form %}
{# <b>здесь по идее надо выводить формы</b> {{ form_widget(field) }} #}
{% endfor %}
</div>
<div class="row ">
<a href="" class="btn" id="add_more">Add mail form...</a>
</div>
</br>
<div class="row">
<input type="submit" value="Save all forms" class="btn">
</div>
</form>
</div>
<script type="text/javascript">
// keep track of how many email fields have been rendered
var formsCount = $('.form-block').size() || 0 ;//'{{ form.name | length }}';
$(document).ready(function() {
$('#add_more').click(function() {
var fieldsList = $('.emailfields div');
var protoHtml = '';
fieldsList.each(function(k,v){
var newWidget = $(v).attr('data-prototype').replace(/label__/g, "");
newWidget = newWidget.replace(/__name__/g, formsCount);
protoHtml = protoHtml + newWidget
});
// grab the prototype template
// replace the "__name__" used in the id and name of the prototype
// with a number that's unique to your emails
// end name attribute looks like name="contact[emails][2]"
// newWidget = newWidget.replace(/__name__/g, emailCount);
formsCount++;
// create a new list element and add it to the list
var newLi = $('<div class="col-xs-6 col-md-4 form-block "></div>').html(protoHtml);
newLi.appendTo($('#insert-blocks'));
$('.form-block div label').replaceWith('<br>');
return false;
});
})
</script>
{% endblock %}
Вопрос: как делать преобразование данных в форму, чтобы в цикле перебрать и вывести как - то так (что бы получить поля вида Message[name][0] ,Message[name][1] ):
{% for key,field in form %}
{{ form_widget(field.name) }}
{% endfor %}