У меня есть форма, которая загружает файл, и я пытаюсь "прикрепить" к нему правильный идентификатор/объект задания, но, похоже, я не совсем понимаю концепцию табличных отношений:
Мой класс файлов
/**
* @ORM\ManyToOne(targetEntity="Job", inversedBy="file")
*/
protected $job;
Мой класс работы:
/**
* @ORM\OneToMany(targetEntity="File", mappedBy="job")
*/
protected $file;
public function __construct()
{
$this->file = new ArrayCollection();
}
Я представляю форму и вводя все в базу данных:
$em = $this->getDoctrine()->getManager();
$file = new File();
$form = $this->createFormBuilder($file)
->add('file')
->add('job','text')
->add('save', 'submit', array('label' => 'Create Task'))
->getForm();
$form->handleRequest($request);
if ($form->isValid()) {
$job = $em->getRepository("AppBundle:Job")->find($form->getData()->getJob());
$file->setFile($form->getData()->getFile());
$file->setPath($form->getData()->getPath());
$file->setJob($job);
$em->persist($file);
$em->flush();
return $this->redirectToRoute("pendingJobs");
}
Отправка формы заканчивается фатальной ошибкой:
Catchable Fatal Error: аргумент 1, переданный в AppBundle\Entity\File :: setJob() должен быть экземпляром AppBundle\Entity\Job, заданной строкой, вызываемой в /var/www/html/web2gdv/vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php в строке 410 и определяется
Я пробовал отлаживать то, что было отправлено с помощью
if ($form->isValid()) {
dump($form->getData());
die();
}
но он даже доходит до точки?!
Что я делаю не так?
Любой намек оценили!
ОБНОВИТЬ
Благодаря @julien-bourdic я обновил свою форму следующим образом:
/**
* @Route("/job/pending", name="pendingJobs")
*/
public function jobAction(Request $request)
{
$this->denyAccessUnlessGranted('ROLE_ADMIN', null, 'Unable to access this page!');
$em = $this->getDoctrine()->getManager();
$file = new File();
$form = $this->createFormBuilder($file)
->add('file')
->add('job','entity',array(
'class' => 'AppBundle:Job',
'choice_label' => 'id',
))
->add('save', 'submit', array('label' => 'Create Task'))
->getForm();
$form->handleRequest($request);
if ($form->isValid()) {
$job = $em->getRepository("AppBundle:Job")->find($form->getData()->getJob());
$file->setFile($form->getData()->getFile());
$file->setPath($form->getData()->getPath());
$file->setJob($job);
$em->persist($file);
$em->flush();
return $this->redirectToRoute("pendingJobs");
}
$jobs = $em->getRepository("AppBundle:Job")->findBy(array(
'receipt' => true,
'receiptStatus' => true,
));
return $this->render(
'default/pending.html.twig',
array(
'jobs' => $jobs,
'form' => $form->createView(),
)
);
}
Вся цель этого класса состоит в том, чтобы иметь таблицу, где последняя кнопка каждая строка является формой загрузки. Как я могу заполнить несколько форм из одного класса, возможно ли это? Что вы должны отправить в функцию render
?
Попытайтесь четко определить свою полевую job
в своей форме:
->add('job','entity',array(
'class'=>'AppBundle:Job',
'property'=>'id',
)
property
на choice_label
поскольку оно устарело, но оно работает. Дополнительный вопрос: как мне заполнить несколько форм? Я обновлю свой вопрос!
Вы добавляете ("задание", "текст") и должны иметь тип сущности, а не текст
Сначала вам нужно иметь "рабочие места" в БД. Затем вы можете перейти на
$form = $this->createFormBuilder($file)
->add('file')
->add('job','entity', array('class' => 'YourBundle:Job'))
->add('save', 'submit', array('label' => 'Create Task'))
->getForm();
или короткий
$form = $this->createFormBuilder($file)
->add('file')
->add('job')
->add('save', 'submit', array('label' => 'Create Task'))
->getForm();
вы получите поле выбора в поле задания
Проблема в том, что find()
возвращает массив, а не Job
. Используйте findOne()
.
$job = $em->getRepository("AppBundle:Job")->find($form->getData()->getJob());
// $job is and Array
делать вместо этого
$job = $em->getRepository("AppBundle:Job")->findOne($form->getData()->getJob());
// $job is Job
$form->handleRequest($request);