2013-06-05 19 views
8

Tôi cần thêm câu hỏi về các câu hỏi trắc nghiệm vào mẫu đăng ký của mình. Các câu hỏi và tùy chọn là trong hai thực thể:Kết hợp bảng câu hỏi với thực thể người dùng theo mẫu - 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; 
} 


} 

<?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(); 
} 
} 

Tôi cũng có một thực thể câu hỏi, mặc dù tôi không nghĩ rằng tôi thực sự cần nó bởi vì người dùng sẽ không được tạo ra câu hỏi, chỉ điền vào bảng câu hỏi duy nhất trong quá trình đăng ký.

tượng người dùng của tôi:

<?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; 
} 


} 

điều khiển người dùng của tôi:

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(), 
    )); 
} 

Các loại hình như nó đứng ngày hôm nay:

<?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'; 
} 
} 

Thiết lập này không hoạt động để có được các câu hỏi và các tùy chọn liên quan của chúng và hiển thị chúng trong cùng một biểu mẫu tạo người dùng. Tôi đã thấy hướng dẫn và tài liệu để kết hợp các biểu mẫu, nhưng không tạo biểu mẫu với loại cấu hình này. Mọi hướng dẫn sẽ được đánh giá cao.

+0

chỉ để làm rõ, Người dùng và Câu hỏi có được kết nối với bất kỳ loại quan hệ nào không? và, bạn có thể đăng biểu mẫu MyFormType của mình không? –

+0

Nơi bạn muốn lưu trữ câu trả lời? –

+0

Hiển thị cho chúng tôi Thực thể người dùng của bạn và Biểu mẫu MyFormType –

Trả lời

0

Tôi không chắc liệu tôi có hiểu chính xác câu hỏi của bạn hay không nhưng có thể điều này có thể hữu ích.

Từ những gì tôi thấy bạn đang xây dựng biểu mẫu (cho câu hỏi) nhưng bạn không sử dụng nó ở bất cứ đâu! Cách dễ nhất là chuyển các câu hỏi (trong trường hợp của bạn $ user-> getQuestions()) vào MyFormType và thêm tất cả các câu hỏi bên trong loại đó.

Vì vậy, nó sẽ trông giống như một cái gì đó như thế này

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

Và bên trong loại hình

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 
     )); 
    } 
} 

Sửa 1

Tại sao bạn không thử những điều sau đây?

Thêm phương pháp setQuestionnaire trong tài khoản và tạo một loại gọi là QuestionnaireType có trách nhiệm để tạo ra toàn bộ câu hỏi Trong loại người dùng (xin lỗi vì những cái tên sai) thêm QuestionnaireType như một hình thức nhúng Khi người dùng gửi dữ liệu và bạn gọi symfony bind sẽ chuyển toàn bộ đối tượng câu hỏi tới phương thức đã tạo để bạn có thể lặp lại nó và lưu các aswers của người dùng!

+0

Phải làm gì với lỗi này? Không có thuộc tính "question_13" hoặc phương thức "getQuestion13()" cũng không phải phương thức "isQuestion13()" tồn tại trong lớp "Me \ UserBundle \ Entity \ User" Nó cố gắng lặp qua các câu hỏi và không thể tìm thấy chúng trong thực thể User, là chính xác vì chúng nằm trong thực thể Câu hỏi –

+0

Xin lỗi tôi đã hiểu nhầm vấn đề. Đọc câu trả lời của tôi và xem liệu nó có giúp được không :) –

+0

Tôi đã đăng một khoản tiền thưởng cho điều này, tôi rất vui khi trao giải thưởng đó cho bạn nếu bạn đăng mã làm việc mà tôi có thể học hỏi. –

0

tượng người dùng của bạn cần một mối quan hệ đến $ mình câu trả lời bạn nên lưu trữ trong một $ câu trả lời trường trong đối tượng người dùng của bạn, (nhìn lên "nhúng bộ sưu tập")

Sau đó, trong điều khiển của bạn mà tiêu hóa dưới hình thức cửa hàng của bạn các giá trị của $ user-> setAnswers (value)) và sau đó bạn sẽ tìm thấy các giá trị câu trả lời trong trường $ answer của thực thể người dùng ($ user-> getAnswers()).

ANd không quên thêm getters và setters của bạn.

$ php ứng dụng/giao diện điều khiển học thuyết: tạo: thực thể BundleName: Entityname