2014-02-07 3 views
1

Я использую Symfony2 и twig в качестве механизма шаблонов.Как отобразить поле выбора в шаблоне

В моем контроллере я иметь следующий вид:

 $usr= $this->get('security.context')->getToken()->getUser();  
     $associatedmissions = array($usr->getMissions()); 

     $form = $this->createFormBuilder($product)   
     ->add('mission', 'choice', array(
      'choices' => $associatedmission, 
      'multiple' => false, 
      'expanded' => true,)) 

Но когда я называю эту страницу, появляется сообщение об ошибке:

Catchable Fatal Error: Object of class Doctrine\ORM\PersistentCollection could not be 
converted to string in 
C:\BitNami\wampstack-5.4.23- 
0\frameworks\symfony\vendor\symfony\symfony\src\Symfony\Component\Translation\ 
IdentityTranslator.php line 65 

В профилировщика я вижу ошибку:

CRITICAL - Uncaught PHP Exception Twig_Error_Runtime: "An exception has been thrown 
during the rendering of a template ("") in "form_div_layout.html.twig" at line 99." at 
C:\BitNami\wampstack-5.4.23-0\frameworks\symfony\app\cache\dev\classes.php line 4372 

Context: {"exception":"Object(Twig_Error_Runtime)"} 

Что случилось?

Это странно, потому что с ним работает правильно

->add('mission', 'entity') 

-UPDATE--

Вот мой контроллер:

public function createAction(Request $request) 
    {           
     $product = new Product(); 

     $usr= $this->get('security.context')->getToken()->getUser();  
     $associatedmissions = array($usr->getMissions()); 

      $form = $this->createFormBuilder($product)          
      ->add('name', 'text') 
      ->add('mission', 'choice', array(
       'choices' => $associatedmissions, 
       'multiple' => false, 
       'expanded' => false,)) 

      ->add('save', 'submit') 
      ->getForm();  


     $form->handleRequest($request); 
     if ($form->isValid()) { 

     $em = $this->getDoctrine()->getManager();  
     $em->persist($product); 
     $em->flush(); 

     return $this->render('AcmeGroundStationBundle:Product:tasksuccess.html.twig', array('product' => $product)); 
     }  

     return $this->render('AcmeGroundStationBundle:Product:formupload.html.twig', array(
     'form' => $form->createView() 
     )); 
} 
+0

И как вы отрисовываете это поле в 'twig'? –

+0

@Victor Теперь только с '{{form_start (form)}} {{form_end (form)}}' –

+0

Вы передаете переменную 'form', например' $ form-> createView() ', чтобы вешать' '' '' '' '' -> render() 'метод? –

ответ

1

ОВам есть это в вашем контроллере:

$usr= $this->get('security.context')->getToken()->getUser();  
$associatedmissions = array($usr->getMissions()); 

$usr->getMissions() является возвращение ArrayCollection (на основе отношений в вашей организации). Таким образом, $associatedmissions представляет собой массив с одним элементом - [1] = ArrayCollection связанных объектов миссии.

На мой взгляд, вы должны добавить в ваш метод объекта пользователя:

public function getMissionsArray() 
{ 
    $missionArray = array(); 

    foreach ($this->missions as $key => $val) 
    { 
     $missionArray[$key] = $val->__toString(); 
    } 
    return $missionArray; 
} 

И использовать массив как варианты парам в вашем createFormBuilder заявлении.

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

$this->getDoctrine() 
      ->getRepository('AcmeGroundStationBundle:Mission') 
      ->find($product->mission); 

EDIT

// User Entity 
// add this function - will return array of (id => mission.name,) 
public function getMissionsArray() 
{ 
    $missionArray = array(); 

    foreach ($this->missions as $key => $val) 
    { 
           // change this to whatever human readable getter 
     $missionArray[$key] = $val->__toString(); 
    } 
    return $missionArray; 
} 

// Controller  
public function createAction(Request $request) 
    {           
     $product = new Product(); 

     $usr= $this->get('security.context')->getToken()->getUser();  
     $associatedmissions = $usr->getMissionsArray(); 

      $form = $this->createFormBuilder($product)          
      ->add('name', 'text') 
      ->add('mission', 'choice', array(
       'choices' => $associatedmissions, 
       'multiple' => false, 
       'expanded' => false,)) 

      ->add('save', 'submit') 
      ->getForm();  


     $form->handleRequest($request); 
     if ($form->isValid()) { 

     // save selected array item as a Mission object related to Product 
     $product->setMission($this->getDoctrine() 
      // check if Mission Entity is placed in good bundle ;) 
      ->getRepository('AcmeGroundStationBundle:Mission') 
      ->find($form->get('mission')->getData())); 

     $em = $this->getDoctrine()->getManager();  
     $em->persist($product); 
     $em->flush(); 

     return $this->render('AcmeGroundStationBundle:Product:tasksuccess.html.twig', array('product' => $product)); 
     }  

     return $this->render('AcmeGroundStationBundle:Product:formupload.html.twig', array(
     'form' => $form->createView() 
     )); 
} 

Good Luck!

+0

благодарю вас как всегда за вашу готовность и доступность. Я не понял, как изменить мой контроллер. Я также получил ошибку: 'Не удается получить доступ к частной собственности Acme \ GroundStationBundle \ Entity \ Product :: $ mission' –

+0

Обновление. С: $ associatedmissions = $ this-> getDoctrine() -> getRepository ('AcmeManagementBundle: Mission') -> findAll ($ product-> mission); Снова я получаю все миссии, а не только связанные. –

+0

Проверьте мой ответ, я добавил полный код – WebHQ

0

Попробуйте использовать редирект. Это работает?

if ($form->isValid()) { 

     $em = $this->getDoctrine()->getManager();  
     $em->persist($product); 
     $em->flush(); 

     return $this->redirect($this->generatePath('current_route_name')); 
    } 

    return $this->render('AcmeGroundStationBundle:Product:formupload.html.twig', array(
     'form' => $form->createView() 
    )); 

Где current_route_name это заменить по имени маршрута текущей страницы.

+0

ничего не изменилось. На самом деле я также попытался заменить второй «рендер» на перенаправление, но я получаю «Ошибка: вызов неопределенного метода: generatePath» С 'generateURL' Я получаю' La pagina web ha generato un loop di reindirizzamento' (есть loop в перенаправлении) –

+0

Вы расширяете базу Symfony 'Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller' в классе контроллера? –

+0

Да, я знаю! используйте Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller; –

Смежные вопросы