2013-06-05 7 views
8

Muszę dodać kwestionariusz z pytaniami wielokrotnego wyboru do mojego formularza rejestracyjnego. Pytania i opcje są dwa podmioty:Łączenie kwestionariusza z podmiotem użytkownika w formularzu - symfony2

<?php 

namespace Me\UserBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* Question 
* 
* @ORM\Table(name="question") 
* @ORM\Entity(repositoryClass="Me\UserBundle\Entity\QuestionRepository") 
*/ 
class Question 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @var string 
* 
* @ORM\Column(name="questionText", type="text") 
*/ 
private $questionText; 

/** 
* @var boolean $expanded 
* 
* @ORM\Column(name="expanded", type="boolean") 
*/ 
private $expanded; 

/** 
* @var boolean $multiple 
* 
* @ORM\Column(name="multiple", type="boolean") 
*/ 
private $multiple; 

/** 
* @var Questionnaire $questionnaire 
* 
* @ORM\ManyToOne(targetEntity="Questionnaire", inversedBy="questions") 
* @ORM\JoinColumn(name="questionnaire", referencedColumnName="id", onDelete="cascade") 
*/ 
private $questionnaire; 

/** 
* @var \Doctrine\Common\Collections\ArrayCollection $options 
* 
* @ORM\OneToMany(targetEntity="Option", mappedBy="question", cascade={"all"}) 
*/ 
private $options; 

public function __construct() 
{ 
    $this->expanded = false; 
    $this->multiple = false; 

    $this->options = new ArrayCollection(); 
} 


/** 
* Get id 
* 
* @return integer 
*/ 
public function getId() 
{ 
    return $this->id; 
} 

/** 
* Set questionText 
* 
* @param string $questionText 
* @return Question 
*/ 
public function setQuestionText($questionText) 
{ 
    $this->questionText = $questionText; 

    return $this; 
} 

/** 
* Get questionText 
* 
* @return string 
*/ 
public function getQuestionText() 
{ 
    return $this->questionText; 
} 

/** 
* @param mixed $options 
*/ 
public function setOptions($options) 
{ 
    $this->options[] = $options; 

    return $this; 

} 

/** 
* @return mixed 
*/ 
public function getOptions() 
{ 
    return $this->options; 
} 

function __toString() 
{ 
    return $this->getQuestionText(); 
} 

/** 
* @param boolean $expanded 
*/ 
public function setExpanded($expanded) 
{ 
    $this->expanded = $expanded; 
} 

/** 
* @return boolean 
*/ 
public function getExpanded() 
{ 
    return $this->expanded; 
} 

/** 
* @param boolean $multiple 
*/ 
public function setMultiple($multiple) 
{ 
    $this->multiple = $multiple; 
} 

/** 
* @return boolean 
*/ 
public function getMultiple() 
{ 
    return $this->multiple; 
} 

/** 
* @param \Me\UserBundle\Entity\Questionnaire $questionnaire 
*/ 
public function setQuestionnaire($questionnaire) 
{ 
    $this->questionnaire = $questionnaire; 
} 

/** 
* @return \Me\UserBundle\Entity\Questionnaire 
*/ 
public function getQuestionnaire() 
{ 
    return $this->questionnaire; 
} 


} 

i

<?php 

namespace Me\UserBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* QuestionOption 
* 
* @ORM\Table(name="option") 
* @ORM\Entity(repositoryClass="Me\UserBundle\Entity\OptionRepository") 
*/ 
class Option 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @var integer 
* 
* @ORM\Column(name="questionId", type="integer") 
*/ 
private $questionId; 

/** 
* @var string 
* 
* @ORM\Column(name="optionText", type="string", length=255) 
*/ 
private $optionText; 

/** 
* @ORM\ManyToOne(targetEntity="Question", inversedBy="options") 
* @ORM\JoinColumn(name="questionId", referencedColumnName="id", onDelete="cascade") 
**/ 
private $question; 

/** 
* Get id 
* 
* @return integer 
*/ 
public function getId() 
{ 
    return $this->id; 
} 

/** 
* Set optionText 
* 
* @param string $optionText 
* @return Option 
*/ 
public function setOptionText($optionText) 
{ 
    $this->optionText = $optionText; 

    return $this; 
} 

/** 
* Get optionText 
* 
* @return string 
*/ 
public function getOptionText() 
{ 
    return $this->optionText; 
} 

/** 
* @return mixed 
*/ 
public function getQuestion() 
{ 
    return $this->question; 
} 

/** 
* @param mixed $question 
*/ 
public function setQuestion($question) 
{ 
    $this->question = $question; 
} 

/** 
* @param int $id 
*/ 
public function setId($id) 
{ 
    $this->id = $id; 
} 

function __toString() 
{ 
    return $this->getOptionText(); 
} 
} 

Mam też podmiot kwestionariusz, choć nie sądzę, ja naprawdę potrzebne, ponieważ użytkownicy nie będą tworzenia kwestionariuszy, wypełnianie tylko jednego kwestionariusza podczas rejestracji.

Moja jednostka użytkownika:

<?php 

namespace Me\UserBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

/** 
* User 
* 
* @ORM\Table(name="user") 
* @ORM\Entity(repositoryClass="Me\UserBundle\Entity\UserRepository") 
*/ 
class User 
{ 
/** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @var string 
* 
* @ORM\Column(name="firstName", type="string", length=50) 
*/ 
private $firstName; 

/** 
* @var string 
* 
* @ORM\Column(name="middleInitial", type="string", length=50) 
*/ 
private $middleInitial; 

/** 
* @var string 
* 
* @ORM\Column(name="lastName", type="string", length=50) 
*/ 
private $lastName; 

/** 
* @var string 
* 
* @ORM\Column(name="homePhoneArea", type="string", length=3) 
*/ 
private $homePhoneArea; 

/** 
* @var string 
* 
* @ORM\Column(name="homePhoneNumber", type="string", length=7) 
*/ 
private $homePhoneNumber; 

/** 
* @var string 
* 
* @ORM\Column(name="email", type="string", length=50) 
*/ 
private $email; 

/** 
* @var \Doctrine\Common\Collections\ArrayCollection 
*/ 
public $questions; 

public function __construct() 
{ 
    $this->questions = new ArrayCollection(); 
} 

/** 
* Get id 
* 
* @return integer 
*/ 
public function getId() 
{ 
    return $this->id; 
} 

/** 
* Set firstName 
* 
* @param string $firstName 
* @return User 
*/ 
public function setFirstName($firstName) 
{ 
    $this->firstName = $firstName; 

    return $this; 
} 

/** 
* Get firstName 
* 
* @return string 
*/ 
public function getFirstName() 
{ 
    return $this->firstName; 
} 

/** 
* Set middleInitial 
* 
* @param string $middleInitial 
* @return User 
*/ 
public function setMiddleInitial($middleInitial) 
{ 
    $this->middleInitial = $middleInitial; 

    return $this; 
} 

/** 
* Get middleInitial 
* 
* @return string 
*/ 
public function getMiddleInitial() 
{ 
    return $this->middleInitial; 
} 

/** 
* Set lastName 
* 
* @param string $lastName 
* @return User 
*/ 
public function setLastName($lastName) 
{ 
    $this->lastName = $lastName; 

    return $this; 
} 

/** 
* Get lastName 
* 
* @return string 
*/ 
public function getLastName() 
{ 
    return $this->lastName; 
} 

/** 
* Set homePhoneArea 
* 
* @param string $homePhoneArea 
* @return User 
*/ 
public function setHomePhoneArea($homePhoneArea) 
{ 
    $this->homePhoneArea = $homePhoneArea; 

    return $this; 
} 

/** 
* Get homePhoneArea 
* 
* @return string 
*/ 
public function getHomePhoneArea() 
{ 
    return $this->homePhoneArea; 
} 

/** 
* Set homePhoneNumber 
* 
* @param string $homePhoneNumber 
* @return User 
*/ 
public function setHomePhoneNumber($homePhoneNumber) 
{ 
    $this->homePhoneNumber = $homePhoneNumber; 

    return $this; 
} 

/** 
* Get homePhoneNumber 
* 
* @return string 
*/ 
public function getHomePhoneNumber() 
{ 
    return $this->homePhoneNumber; 
} 


/** 
* Set email 
* 
* @param string $email 
* @return User 
*/ 
public function setEmail($email) 
{ 
    $this->email = $email; 

    return $this; 
} 

/** 
* Get email 
* 
* @return string 
*/ 
public function getEmail() 
{ 
    return $this->email; 
} 



/** 
* @return \Doctrine\Common\Collections\ArrayCollection 
*/ 
public function getQuestions() 
{ 
    return $this->questions; 
} 


} 

Mój kontroler użytkownika:

public function newAction() 
{ 
    $user = new User(); 

    $em = $this->getDoctrine()->getManager(); 

    $questions = $em->getRepository('MeUserBundle:Question')->findAll(); 



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

    $builder = $this->createFormBuilder(); 

    $optionEntities = array(); 
    foreach ($questions as $question) 
    { 
     $options = array(); 
     foreach ($question->getOptions() as $option) 
     { 
      $options[$option->getId()] = $option->getOptionText(); 
      $optionEntities[$option->getId()] = $option; 
     } 
     $builder->add('question_'. $question->getId(), 'choice', array(
      'label' => $question->getQuestionText(), 
      'expanded' => $question->getExpanded(), 
      'multiple' => $question->getMultiple(), 
      'choices' => $options 
     )); 
    } 

    $user->getQuestions()->add($questions); 

    $form = $this->createForm(new MyFormType(), array('User' => $user)); 

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

typu forma, gdyż stoi dzisiaj:

<?php 

namespace Me\UserBundle\Form; 

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

class MyFormType extends AbstractType 
{ 
protected $questions; 

public function __construct($questions) 
{ 
    $this->questions = $questions; 
} 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 

    $builder 
     ->add('questions', 'collection', array(
      'type' => new QuestionType() 
     )) 
     ->add('firstName') 
     ->add('middleInitial') 
     ->add('lastName') 
     ->add('homePhoneArea') 
     ->add('homePhoneNumber') 
     ->add('email') 
    ; 
} 

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(

    )); 
} 

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

To ustawienie nie działa, aby uzyskać pytania i związane z nimi opcje oraz wyświetlać je w tej samej formie tworzenia użytkownika. Widziałem instrukcje i dokumenty dotyczące łączenia formularzy, ale nie tworzenia formularzy z tego rodzaju konfiguracją. Wszelkie wskazówki będą mile widziane.

+0

tylko w celu wyjaśnienia, czy użytkownika oraz pytanie związane są z wszelkiego rodzaju relacji? i, czy możesz opublikować swój formularz MyFormType? –

+0

Gdzie chcesz przechowywać odpowiedzi? –

+0

Pokaż nam swoją jednostkę użytkownika i swój formularz MyFormType –

Odpowiedz

0

Nie jestem pewien, czy dobrze zrozumiałem twoje pytanie, ale może to pomogło.

Z tego, co widzę, budujesz formularz (na pytania), ale nigdzie go nie używasz! Najłatwiej jest przekazać pytania (w twoim przypadku $ user-> getQuestions()) do MyFormType i dodać wszystkie pytania wewnątrz typu.

Tak to będzie wyglądać coś takiego

$this->createForm(new MyFormType($user->getQuestions()), array('User' => $user)); 

i wewnątrz typu

protected $questions; 

public function __construct($questions) 
{ 
    $this->questions = $questions; 
} 

protected $questions; 

public function __construct($questions) 
{ 
    $this->questions = $questions; 
} 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    foreach ($this->questions as $question) 
    { 
     $options = array(); 
     foreach ($question->getOptions() as $option) 
     { 
      $options[$option->getId()] = $option->getOptionText(); 
      $optionEntities[$option->getId()] = $option; 
     } 
     $builder->add('question_'. $question->getId(), 'choice', array(
      'label' => $question->getQuestionText(), 
      'expanded' => $question->getExpanded(), 
      'multiple' => $question->getMultiple(), 
      'choices' => $options 
     )); 
    } 
} 

Edycja 1

Dlaczego nie spróbować wykonać następujące czynności?

Dodaj Metoda setQuestionnaire w Użytkownik i utworzyć typ zwany QuestionnaireType który jest odpowiedzialny, aby utworzyć cały kwestionariusz W UserType (przepraszam za niewłaściwych nazw) dodać QuestionnaireType jako postaci wbudowanego Gdy użytkownik przesyła dane i Wywołujesz wiązanie symfony przekaże cały obiekt kwestionariusza do utworzonej metody, aby można było iterować i zapisać odpowiedzi użytkownika!

+0

Co zrobić z tym błędem? Żadna właściwość "question_13" ani metoda "getQuestion13()" ani metoda "isQuestion13()" nie istnieje w klasie "Me \ UserBundle \ Entity \ User" Próbuje przechodzić przez pytania i nie może ich znaleźć w jednostce User, która jest poprawny, ponieważ są w jednostce Pytania –

+0

Niestety, źle zrozumiałem problem. Przeczytaj moją odpowiedź i zobacz, czy to pomaga :) –

+0

Wysłałem nagrodę za to, cieszę się, że mogę ci ją przyznać, jeśli opublikujesz działający kod, z którego mogę się uczyć. –

0

Twoja jednostka użytkowników potrzebuje relacji do jego $ odpowiedzi należy przechowywać w $ odpowiedziami-pole w jednostce użytkownika (look up „osadzanie zbiory”)

Następnie w kontroler, który trawi formularz sklepu wartości $ user-> setAnswers (value)), a następnie znajdziesz wartości odpowiedzi w polu $ answers jednostki użytkownika ($ user-> getAnswers()).

AND nie zapomnij dodać swoich pobierających i ustawiających.

$ php doktryna app/console: generowania: Podmioty BundleName: Entityname

Powiązane problemy