Я хочу иметь возможность отправить форму, которая изменяет несколько объектов.Допустим, у меня есть BulkeditFormType
для изменения полей 'active' (Boolean) или 'organization' (EntityType with App \ Entity \ Organization) для нескольких пользователей одновременно.
Это мое текущее решение (полупсевдокод):
public function bulkedit(Request $request)
{
$form = $this->createForm(BulkeditFormType::class, null, [
//..options
]);
if ($request->isXmlHttpRequest()) {
// fields '_token' and empty values are unset, not shown in this example
$formData = $request->request->get($form->getName());
$entityManager = $this->getDoctrine()->getManager();
$repo = $entityManager->getRepository(App\Entity\User::class);
$entities = $repo->findBy([
'id' => [1,2,3,4,5]
]);
foreach ($entities as $entity) {
$form = $this->createForm(BulkeditFormType::class, $entity, [
//..options
]);
$clearMissing = false;
$form->submit($formData, $clearMissing);
$entityManager->persist($entity);
}
$entityManager->flush();
}
return $this->render('@User/User/bulkedit.html.twig', [
'form' => $form->createView()
]);
}
Обратите внимание, что я пытался включить только соответствующие части моего кода, поэтому, пожалуйста, рассматривайте это как псевдокодкод, просто чтобы получить представление о моей текущей реализации.
Пока это решение работает, оно создает объект Form
для каждой сущности.Редактирование 100 пользователей приведет к большому объему использования памяти и большому количеству бесполезных запросов к базе данных.
Как я могу изменить свой код таким образом, что будет сгенерирована только одна форма, которая может быть повторно использована всеми объектами?Я пытался использовать $form->setData()
, но я чувствую, что должен быть лучший способ.CollectionType
создаст несколько подчиненных форм вместо нескольких форм, поэтому в этом случае это не имеет большого значения.