2016-01-18 1 views
0

У меня есть много разных связанных сущностей, и каждый раз, когда я создаю новый комментарий, который связан с Project, я хочу автоматически сохранить реальный project_id.Автоматически устанавливать связанный идентификатор объекта в отношениях друг к другу Symfony

comment 
    id 
    comment 
manyToOne 
    project: 
     targetEntity: Project 
     cascade: { } 
     mappedBy: null 
     inversedBy: comments 
     joinColumn: 
      name: project_id 
      referencedColumnName: id 
     orphanRemoval: false 

    project 
     id 
     projectName 
    oneToMany: 
    comments: 
     targetEntity: Comment 
     mappedBy: project 

При использовании аннотации, это можно легко сделать с помощью ParamConverter, но в данном случае я использую YAML format.I я использую команду хорошо Crud Symfony для автоматического создания форм и шаблонов, а также контроллеры.

Я попытался контроллер таким образом

public function createAction(Request $request, Project $project)//Project 
{ 
    $entity = new Comment(); 
    $form = $this->createCreateForm($entity); 
    $form->handleRequest($request); 


    if ($form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     // $entity->setProject($projectName->getProject()); 
     $entity->setProject($project); 
     $em->persist($entity); 
     $em->flush(); 

     return $this->redirect($this->generateUrl('comment_show', array('id' => $entity->getId()))); 
    } 

Затем в форме,

{{ form(form) }} 

Проблемы с этим он будет генерировать форму с раскрывающимся списком с сотнями PROJECT_ID в поле комментария PROJECT_ID

Затем, если они отправлены

Невозможно угадать, как получить экземпляр Doctrine из информации о запросе.

Я имею в виду написание Jquery автозаполнения для решения этой проблемы, но если есть более ярлык способ сделать это, как аннотацию Paramconverter, я рад использовать

Как бы вы это сделать так, чтобы связанный project_id будет автоматически сохранен?

Update

Это именно код при запуске Symfony2 хороший команду Crud в консоли

<?php 

namespace EdgeWeb\Project\EmployeeBundle\Controller; 

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

use EdgeWeb\Project\EmployeeBundle\Entity\Comment; 
use EdgeWeb\Project\EmployeeBundle\Form\CommentType; 

/** 
* Comment controller. 
* 
*/ 
class CommentController extends Controller 
{ 

/** 
* Lists all Comment entities. 
* 
*/ 
public function indexAction() 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $entities = $em->getRepository('EmployeeBundle:Comment')->findAll(); 

    return $this->render('EmployeeBundle:Comment:index.html.twig', array(
     'entities' => $entities, 
    )); 
} 
/** 
* Creates a new Comment entity. 
* 
*/ 
public function createAction(Request $request) 
{ 
    $entity = new Comment(); 
    $form = $this->createCreateForm($entity); 
    $form->handleRequest($request); 

    if ($form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($entity); 
     $em->flush(); 

     return $this->redirect($this->generateUrl('comment_show', array('id' => $entity->getId()))); 
    } 

    return $this->render('EmployeeBundle:Comment:new.html.twig', array(
     'entity' => $entity, 
     'form' => $form->createView(), 
    )); 
} 

/** 
* Creates a form to create a Comment entity. 
* 
* @param Comment $entity The entity 
* 
* @return \Symfony\Component\Form\Form The form 
*/ 
private function createCreateForm(Comment $entity) 
{ 
    $form = $this->createForm(new CommentType(), $entity, array(
     'action' => $this->generateUrl('comment_create'), 
     'method' => 'POST', 
    )); 

    $form->add('submit', 'submit', array('label' => 'Create')); 

    return $form; 
} 

/** 
* Displays a form to create a new Comment entity. 
* 
*/ 
public function newAction() 
{ 
    $entity = new Comment(); 
    $form = $this->createCreateForm($entity); 

    return $this->render('EmployeeBundle:Comment:new.html.twig', array(
     'entity' => $entity, 
     'form' => $form->createView(), 
    )); 
} 

/** 
* Finds and displays a Comment entity. 
* 
*/ 
public function showAction($id) 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $entity = $em->getRepository('EmployeeBundle:Comment')->find($id); 

    if (!$entity) { 
     throw $this->createNotFoundException('Unable to find Comment entity.'); 
    } 

    $deleteForm = $this->createDeleteForm($id); 

    return $this->render('EmployeeBundle:Comment:show.html.twig', array(
     'entity'  => $entity, 
     'delete_form' => $deleteForm->createView(), 
    )); 
} 

/** 
* Displays a form to edit an existing Comment entity. 
* 
*/ 
public function editAction($id) 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $entity = $em->getRepository('EmployeeBundle:Comment')->find($id); 

    if (!$entity) { 
     throw $this->createNotFoundException('Unable to find Comment entity.'); 
    } 

    $editForm = $this->createEditForm($entity); 
    $deleteForm = $this->createDeleteForm($id); 

    return $this->render('EmployeeBundle:Comment:edit.html.twig', array(
     'entity'  => $entity, 
     'edit_form' => $editForm->createView(), 
     'delete_form' => $deleteForm->createView(), 
    )); 
} 

/** 
* Creates a form to edit a Comment entity. 
* 
* @param Comment $entity The entity 
* 
* @return \Symfony\Component\Form\Form The form 
*/ 
private function createEditForm(Comment $entity) 
{ 
    $form = $this->createForm(new CommentType(), $entity, array(
     'action' => $this->generateUrl('comment_update', array('id' => $entity->getId())), 
     'method' => 'PUT', 
    )); 

    $form->add('submit', 'submit', array('label' => 'Update')); 

    return $form; 
} 
/** 
* Edits an existing Comment entity. 
* 
*/ 
public function updateAction(Request $request, $id) 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $entity = $em->getRepository('EmployeeBundle:Comment')->find($id); 

    if (!$entity) { 
     throw $this->createNotFoundException('Unable to find Comment entity.'); 
    } 

    $deleteForm = $this->createDeleteForm($id); 
    $editForm = $this->createEditForm($entity); 
    $editForm->handleRequest($request); 

    if ($editForm->isValid()) { 
     $em->flush(); 

     return $this->redirect($this->generateUrl('comment_edit', array('id' => $id))); 
    } 

    return $this->render('EmployeeBundle:Comment:edit.html.twig', array(
     'entity'  => $entity, 
     'edit_form' => $editForm->createView(), 
     'delete_form' => $deleteForm->createView(), 
    )); 
} 
/** 
* Deletes a Comment entity. 
* 
*/ 
public function deleteAction(Request $request, $id) 
{ 
    $form = $this->createDeleteForm($id); 
    $form->handleRequest($request); 

    if ($form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     $entity = $em->getRepository('EmployeeBundle:Comment')->find($id); 

     if (!$entity) { 
      throw $this->createNotFoundException('Unable to find Comment entity.'); 
     } 

     $em->remove($entity); 
     $em->flush(); 
    } 

    return $this->redirect($this->generateUrl('comment')); 
} 

/** 
* Creates a form to delete a Comment entity by id. 
* 
* @param mixed $id The entity id 
* 
* @return \Symfony\Component\Form\Form The form 
*/ 
private function createDeleteForm($id) 
{ 
    return $this->createFormBuilder() 
     ->setAction($this->generateUrl('comment_delete', array('id' => $id))) 
     ->setMethod('DELETE') 
     ->add('submit', 'submit', array('label' => 'Delete')) 
     ->getForm() 
    ; 
    } 
} 

Тогда в FormType

$builder 
     ->add('comment') 
     ->add('createdby') 
     ->add('updatedby') 
     ->add('datecreated') 
     ->add('dateupdated') 
     ->add('project')//related entity 
    ; 
+0

Просьба указать код, который создает форму? – scandel

+0

@scandel Мой вопрос обновлен –

ответ

0

Я вижу, по крайней мере, 3 вопроса, в вашем вопросе ...

Для ошибки:

Невозможно угадать, как получить экземпляр Doctrine из информации запроса ,

Я не знаю, почему это происходит, но это, кажется, не связан непосредственно с вопрос отношения ... Может быть, попытайтесь подавить поля 'createdby', 'updatedby', 'datecreated', 'dateupdated' от создателя формы, поскольку они не находятся в вашем файле yaml отображения (или, может быть, вы их просто не показывали) - независимо от того, вы, вероятно, не должны отображать их в форме, но заполните эти поля в контроллере или с помощью действий prePersist, так как пользователь не должен знать о них.

Тогда для задачи, что поле проекта формы отображает выпадающий список с идентификаторами проекта: вы можете указать в виде строителя какой собственностью comment объекта вы хотите отобразить, с помощью опции choice_label, как это:

$builder 
    ->add('comment') 
    ->add('project', 'entity', array(
     'class' => 'YourBundle:Project', 
     'choice_label' => 'projectName', 
)); 

Таким образом, у вас все равно будет выпадающее меню, но с именами проектов отображаются вместо идентификаторов. Тип поля «entity» имеет много других опций, см. the documentation.

Для вашего последнего вопроса, который вы хотели бы иметь текстовое поле с автозаполнением вместо выпадающего списка, вы можете управлять им с помощью преобразователя данных + автозапуск JS. См. this answer для получения дополнительной информации.