Symfony 4 массовое редактирование записей

176
16 октября 2018, 01:30

подскажите пожалуйста, интегрировал функцию edit из документации по Form Collections из (http://symfony.com/doc/current/form/form_collections.html)

Есть Entity(Ability) с набором полей которые нужно редактировать массово, куча импутов и одна кнопка "сохранить", в сущности прописаны все геттеры и сеттеры В форме сущности EntityType(AbilityType) у меня выводятся поля choice type все сделанно как надо и работает по отдельности, с этим проблем нет, начал делать по примеру из документации, сделал в папке Entity

AbilityHolder.php

<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
 * @ORM\Entity
 * @ORM\Table(name="AbilityHolder")
 */
class AbilityHolder
{
    protected $abilitys;
    public function __construct()
    {
        $this->abilitys = new ArrayCollection();
    }
    public function getAbilitys()
    {
        return $this->abilitys;
    }
}

к нему сделал

AbilityHolderType.php

<?php
namespace App\Form;
use App\Entity\AbilityHolder;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
class AbilityHolderType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
        ->add('abilitys', CollectionType::class, array(
            'entry_type' => AbilityType::class,
            'entry_options' => array('label' => false),
            'allow_add'    => true,
        ))
        ;
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => AbilityHolder::class,
        ]);
    }
}

в твиговом файле прописал с примера шаблон(для новой записи все работает)

{# ... #}
{{ form_start(form) }}
    {# render the task's only field: description #}
    <ul class="abilitys">
        {# iterate over each existing tag and render its only field: name #}
        {% for ability in form.abilitys %}
            <li>{{ form_row(ability.idItem) }}</li>
            <li>{{ form_row(ability.code) }}</li>
            <li>{{ form_row(ability.reloadTime) }}</li>
            <li>{{ form_row(ability.durationTime) }}</li>
            <li>{{ form_row(ability.idAbilityType) }}</li>
        {% endfor %}
    </ul>
{{ form_end(form) }}
{# ... #}

и сам контроллер с функцией New и Edit

<?php
namespace App\Controller;
use App\Entity\AbilityHolder;
use App\Entity\Ability;
use App\Form\AbilityHolderType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\Common\Collections\ArrayCollection;
use App\Controller\EntityManagerInterface;

/**
 * @Route("/ability-holder")
 */
class AbilityHolderController extends Controller
{
    /**
     * @Route("/new", name="ability_new", methods="GET|POST")
     */
    public function new(Request $request)
    {
        $abilitys = new AbilityHolder();
        $ability1 = new Ability();
        $ability1->setIdItem('1');
        $ability1->setCode('code');
        $ability1->setReloadTime('1');
        $ability1->setDurationTime('1');
        $ability1->setIdAbilityType('1');
        // dummy code - this is here just so that the Ability has some tags
        // otherwise, this isn't an interesting example
        $abilitys->getAbilitys()->add($ability1);
        // end dummy code
        $form = $this->createForm(AbilityHolderType::class, $abilitys);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            // ... maybe do some form processing, like saving the Ability and Tag objects
        }
        return $this->render('ability/new-holder.html.twig', array(
            'form' => $form->createView(),
        ));
    }
    /**
     * @Route("/edit", name="ability_edit", methods="GET|POST")
     */
    public function edit($id, Request $request)
{
    $entityManager = $this->getDoctrine()->getManager();
    if (null === $abilityHolder = $entityManager->getRepository(AbilityHolder::class)->find($id)) {
        throw $this->createNotFoundException('No task found for id '.$id);
    }
    $originalAbilitys = new ArrayCollection();
    $abilityHolder = new AbilityHolder();
    // Create an ArrayCollection of the current Tag objects in the database
    foreach ($abilityHolder->getAbilitys() as $ability) {
        $originalAbilitys->add($ability);
    }
    $editForm = $this->createForm(AbilityHolderType::class, $abilityHolder);
    $editForm->handleRequest($request);
    if ($editForm->isSubmitted() && $editForm->isValid()) {
        // remove the relationship between the ability and the Task
        foreach ($originalAbilitys as $ability) {
            if (false === $abilityHolder->getAbilitys()->contains($ability)) {
                // remove the Task from the Tag
                $ability->getAbilitys()->removeElement($abilityHolder);
                // if it was a many-to-one relationship, remove the relationship like this
                // $ability->setTask(null);
                $entityManager->persist($ability);
                // if you wanted to delete the Tag entirely, you can also do that
                // $entityManager->remove($ability);
            }
        }
        $entityManager->persist($abilityHolder);
        $entityManager->flush();
        // redirect back to some edit page
        return $this->redirectToRoute('ability_edit', array('id' => $id));
    }
        return $this->render('ability/new-holder.html.twig', array(
            'form' => $editForm->createView(),
        ));
    // render some form template
}
}

уже совсем запутался, наверно я что-то упустил, намеренно не читал про функции добавления и удаления потому что там jquery

выводит сейчас просто <label class="required">Abilitys</label>

но если открыть веб-инспектора и посмотреть из чего состоит страница то там будет вроде нужные данные но их не видно, никакие стили их не блочат

Может я совсем не то ковыряю?

READ ALSO
вывод данных из нескольких таблиц сразу

вывод данных из нескольких таблиц сразу

Имеется несколько таблиц, с данными пользователяВ первой его основные данные, во второй его телефоны, в третьей его майлы, в четвёртой контактные...

169
проблема с удалением кук

проблема с удалением кук

Ситуация такая

157
Cron в Laravel 5 (Linux)

Cron в Laravel 5 (Linux)

Мне нужно сделать так, чтобы задача в Cron выполнялась каждые n минут, причем n может быть от 1 до бесконечностиЭто число указывается в переменной...

129
Как добавить динамическую таблицу в WordPress?

Как добавить динамическую таблицу в WordPress?

Я создал верстку сайта на обычном HTML\CSS\JS , и я посадил верстку на WP, а теперь вопрос

167