Как создать форму с несколькими строками одной сущности в Symfony2

Сначала я прочитал документы для обоихТип поля коллекции а такжеКак встроить коллекцию форм ... Пример касается одной сущности (Задачи), которая имеет отношение один ко многим с другой сущностью (Тэгом), и я понимаю это, но я не могу адаптировать ее к тому, что я хочу!

Чтобы упростить задачу, скажем, у меня есть объект «Задача», этот объект задачи имеет некоторые отношения с другими объектами, такими как пользователь и проект (каждая задача может иметь одного пользователя и один проект).

Я хочу сделать одну форму, внутри этой формы список задач, каждая задача в одной строке таблицы, которая показывает информацию, какtask.title, task.startdate, task.user.name, task.user.company.name, task.project.nameИ у него есть 2 поля для редактирования,текстовое поле "Описание" а такжефлажок "активный", Вы можете редактировать несколько задач и отправить форму, используя одну кнопку в нижней части таблицы в главной форме, поэтому в основном вы должны иметь возможность обновлять несколько записей за одну транзакцию (вместо создания одной формы и одной кнопки отправки на строку и для этого). одно обновление записи за отправку).

У меня много проблем с этим сложным дизайном:

Сначала я хотел последовать примеру, чтобы встроить коллекцию форм в основную форму, поэтому я создал тип формы для своей задачи, который должен быть как одна форма на строку. Я сделал эти файлы:

Тип формы для задачи:

// src/Acme/TaskBundle/Form/Type/TaskType.php
namespace Acme\TaskBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class TaskType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
         $builder->add('description', 'text', ['label' => false, 'required' => false, 'attr' => ['placeholder' => 'description']]);
         $builder->add('active', 'checkbox', ['label' => false, 'required' => false, 'data' => true]);
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\TaskBundle\Entity\Task',
        ));
    }

    public function getName()
    {
        return 'taskType';
    }
}

Тип формы для основной формы:

// src/Acme/TaskBundle/Form/Type/SaveTasksType.php
namespace Acme\TaskBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Acme\TaskBundle\Form\Type\TaskType.php;

class SaveTasksType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('tasksCollection', 'collection', ['type' => new TaskType()]);
        $builder->add('tasksSubmit', 'submit', ['label' => 'Save']);
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults([
            'attr' => ['class' => 'form-horizontal'],
            'method' => 'POST'
        ]);
    }

    public function getName()
    {
        return 'saveTasksType';
    }
}

Контроллер форм задач:

// src/Acme/TaskBundle/Controller/ManageTasksController.php
namespace Acme\TaskBundle\Controller;

use Acme\TaskBundle\Entity\Task;
use Acme\TaskBundle\Form\Type\SaveTaskType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class ManageTasksController extends Controller
{
    public function showListAction(Request $request)
    {
        $repository = $this->getDoctrine()->getRepository('ExampleBundle:Task');
        $tasks = $repository->findAll();

        $taskSaveForm = $this->createForm(new SaveTasksType(['tasks' => $tasks]));

        return $this->render('AcmeTaskBundle:Task:list.html.twig', array(
            'taskSaveForm' => $taskSaveForm->createView(),
        ));
    }
}

Шаблон формы ветки задачи (просто связанная часть):

<div class="innerAll">
    {{ form_start(taskSaveForm) }}
    {{ form_errors(taskSaveForm) }}

    <table class="table table-bordered table-striped table-primary list-table">
        <thead>
            <tr>
                <th>Task ID</th>
                <th>Title</th>
                <th>Start Date</th>
                <th>User</th>
                <th>Company</th>
                <th>Project</th>
                <th>Description</th>
                <th>Active</th>
            </tr>
        </thead>
        <tbody>
            {% for task in taskSaveForm.tasksCollection %}

                <tr>
                    <td>{{ task.id }}</td>
                    <td><a href="https://localhost/taskid={{ task.id }}">{{ task.title }}</a></td>
                    <td>{{ task.startDate }}</td>
                    <td>{{ task.userName }}</td>
                    <td>{{ task.companyName }}</td>
                    <td>{{ task.projectName }}</td>
                    <td>{{ form_widget(task.description) }}</td>
                    <td>{{ form_widget(task.active) }}</td>
                    <td></td>
                </tr>
            {% endfor %}
        </tbody>
    </table>
    <div>{{ form_row(taskSaveForm.tasksSubmit) }}</div>
    {{ form_end(taskSaveForm) }}
</div>

НО здесь есть проблема, когда я получаю результат от построителя запросов, это беспорядок массивов, содержащих объекты в них, я получаю сообщение об ошибке

Предполагается, что данные представления формы являются экземпляром класса Acme \ TaskBundle \ Entity \ Task, но представляют собой массив (n). Вы можете избежать этой ошибки, установив для параметра data_class значение null или добавив преобразователь представления, который преобразует массив (n) в экземпляр Acme \ TaskBundle \ Entity \ Task.

Это запрос:

createQueryBuilder()
    ->select(
            "
            task.id,
            task.title,
            task.startDate,
            task.description,
            user.name as userName,
            company.name as companyName,
            project.name as projectName,
            "
    )
        ->from('Acme\TaskBundle\Entity\Task', 'task')
        ->innerJoin('task.project', 'project')
        ->innerJoin('task.user', 'user')
        ->innerJoin('Acme\TaskBundle\Entity\Company', 'company', 'with', 'store.company = company')
        ->where('task.active = :isActive')->setParameter('isActive', true);

Тааак, я использовалЧастичные объекты Руководство, чтобы увидеть, если это может помочь, это помогает сделать объект задачи в результате запроса, и я мог бы извлечь его и отправить его в форму, но все же кажется, что остальная часть формы не знает об остальных объектах ...

Хорошо, возможно, я выбрал неправильный подход, я не уверен! пожалуйста, если у вас есть какие-либо предложения о том, что мне делать, поместите записку здесь ... Я борюсь с этим больше недели! Спасибо заранее за ваше время! Даже если вы не ставите заметки, я ценю, что вы тратите время на чтение моего очень длинного вопроса! Спасибо! :)

Ответы на вопрос(2)

Ваш ответ на вопрос