Я работаю над проектом Symfony (4.2) с опцией CMS.Поэтому я решил использовать комплекты Sonata для создания CMS, подобной WP.В настоящее время я установил и использую SonataAdminBundle, SonataMediaBundle, SonataBlockBundle ... и т. Д.Также я создал пользовательский сервис с базовыми полями формы для блоков страниц, и он отлично работает для меня.Теперь я хочу создать форму с полем повторителя, например clone system
. Я создал новый тип формы с именем CloneType и настроил шаблон формы.Также добавлено поле CloneType в файле блочных сервисов, и теперь форма выглядит следующим образом:1010 * src / Form / Type / CloneType.php
<?php
namespace App\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Symfony\Component\OptionsResolver\OptionsResolver;
class CloneType extends AbstractType
{
public function getParent()
{
return FormType::class;
}
}
шаблоны / sonataadmin / forms / clone.twig.html
{% block clone_widget %}
{% spaceless %}
<div class="clone-wrapper">
<div id="clonedInput1" class="clonedInput">
{{- form_widget(form) -}}
{{- form_errors(form) -}}
<div class="actions">
<a class="btn btn-info clone">Clone</a>
<a class="btn btn-warning remove">Remove</a>
</div>
</div>
</div>
{% endspaceless %}
{% block javascripts %}
<script type="text/javascript">
var regex = /^(.+?)(\d+)$/i;
var cloneIndex = $(".clonedInput").length;
function clone(){
$(this).parents(".clonedInput").clone()
.appendTo("clone-wrapper")
.attr("id", "clonedInput" + cloneIndex)
.find("*")
.each(function() {
var id = this.id || "";
var match = id.match(regex) || [];
if (match.length == 3) {
this.id = match[1] + (cloneIndex);
}
})
.on('click', 'a.clone', clone)
.on('click', 'a.remove', remove);
cloneIndex++;
}
function remove(){
$(this).parents(".clonedInput").remove();
}
$("a.clone").on("click", clone);
$("a.remove").on("click", remove);
</script>
{% endblock %}
{% endblock %}
src / Приложение / Sonata / BlockBundle / Block /CxiDifferentBlockService.php
<?php
namespace App\Application\Sonata\BlockBundle\Block;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\FormType;
use Sonata\Form\Type\ImmutableArrayType;
use Sonata\Form\Validator\ErrorElement;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\BlockBundle\Meta\Metadata;
use Sonata\BlockBundle\Block\BlockContextInterface;
use Sonata\BlockBundle\Model\BlockInterface;
use Sonata\BlockBundle\Block\Service\AbstractBlockService;
use App\Application\Sonata\PageBundle\Entity\Block;
use App\Form\Type\CloneType;
use Sonata\AdminBundle\Admin\AdminInterface;
class CxiDifferentBlockService extends AbstractBlockService
{
public function buildEditForm(FormMapper $formMapper, BlockInterface $block)
{
$formMapper
->add('settings', ImmutableArrayType::class, [
'keys' => [
['title', TextType::class, [
'label' => 'Title (H2)',
'required' => false,
]],
[$this->getCloneBuilder($formMapper), null, []],
],
])
;
}
protected function getCloneBuilder(FormMapper $formMapper)
{
return $formMapper->create('cxi_different', CloneType::class, ['required' => false,'by_reference' => false,'allow_extra_fields'=>true])
->add('title', TextType::class,['required' => false, 'allow_extra_fields'=>true, 'by_reference' => false])
;
}
}
Я хочу обновить клонированные значения полей в БД.Но это не работает.Я проверил данные при отправке формы.В форму сонаты не добавляются клонированные поля в массив постов.Массив записей выглядит следующим образом: фактический результат
фактический результат:
Array(
[title] => test
[cxi_different] => Array
(
[title_1] => test
)
)
ожидаемый результат:
Array(
[title] => test
[cxi_different] => Array
(
[title_1] => test
[title_2] => test
)
)