2014-11-04 65 views
1

我對奏鳴曲管理包非常新,我可以使用一些幫助。多個嵌套集合字段&sonata_type_collection

問題:

我有一個測驗實體,實體問題,答覆實體。

測驗和問題之間的關係:一對多。

測驗實體

/** 
* @ORM\OneToMany(targetEntity="Question", mappedBy="quiz", cascade={"persist", "remove"}) 
*/ 
protected $questions; 

問題實體

/** 
* @ORM\ManyToOne(targetEntity="Quiz", inversedBy="questions", cascade={"persist"}) 
* @ORM\JoinColumn(name="quiz_id", referencedColumnName="id", nullable = false) 
*/ 
protected $quiz; 

關係自問自答:一對多。

問題實體

/** 
* @ORM\OneToMany(targetEntity="Answer", mappedBy="question", cascade={"persist", "remove"}) 
*/ 
protected $answers; 

答實體

/** 
* @ORM\ManyToOne(targetEntity="Question", inversedBy="answers") 
* @ORM\JoinColumn(name="question_id", referencedColumnName="id") 
*/ 
protected $question; 

我需要一個形式,我可以添加多個問題的教訓,每一個問題可以有一個或多個答案,這些答案也應該有一個真或假的旗幟。

所以基本上我需要的是這樣的: mockup

到目前爲止,我設法讓工作只增加從管理多個問題。其實幾個版本之前(奏鳴曲管理員和教條)我有問題和答案的工作。但是現在我只能添加多個問題,而我無法添加任何答案。

這是我QuestionType類:

<?php 

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

class QuestionType extends AbstractType { 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('text', 'text', array('required' => false, 'label' => 'question')) 
      ->add('answers', 'collection', array(
        'type'    => new AnswerType(), 
        'allow_add'   => true, 
        'allow_delete'  => true, 
        'by_reference'  => false, 
        'delete_empty'  => true, 
        'cascade_validation' => false, 
        'label'    => 'Answers', 
        'options'   => array('label' => false), 
        'label_attr'   => array('class' => 'answers'), 
      )); 
    } 


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

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => MyBundle\CoreBundle\Entity\Question', 
     )); 
    } 

} 

這是我AnswerType類:

<?php 

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

class AnswerType extends AbstractType { 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('text', 'text', array('required' => true, 'label' => 'answer')) 
      ->add('correct', 'checkbox', array('required' => false)); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getName() 
    { 
     return 'answers'; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'MyBundle\CoreBundle\Entity\Answer', 
     )); 
    } 

} 

這是我QuizAdmin類:

<?php 

use MyBundle\CoreBundle\Form\QuestionType; 
use Sonata\AdminBundle\Admin\Admin; 
use Sonata\AdminBundle\Datagrid\ListMapper; 
use Sonata\AdminBundle\Datagrid\DatagridMapper; 
use Sonata\AdminBundle\Form\FormMapper; 
use Sonata\AdminBundle\Route\RouteCollection; 

class QuizAdmin extends Admin 
{ 

    // Fields to be shown on create/edit forms 
    protected function configureFormFields(FormMapper $formMapper) 
    { 
     $formMapper 
      ->add('title', 'text', array('label' => 'Quiz Title')) 
      ->add('description', 'textarea', array('label' => 'Quiz Description')) 
      ->add('private', 'checkbox', array('required' => false)) 
      ->add('questions', 'collection', array(
        'type'    => new QuestionType(), 
        'allow_add'   => true, 
        'allow_delete'  => true, 
        'cascade_validation' => false, 
        'by_reference'  => false, 
        'delete_empty'  => true, 
        'options'   => array('label' => false), 
      )); 
    } 

    // Fields to be shown on filter forms 
    protected function configureDatagridFilters(DatagridMapper $datagridMapper) 
    { 
     $datagridMapper 
      ->add('title'); 
    } 

    // Fields to be shown on lists 
    protected function configureListFields(ListMapper $listMapper) 
    { 
     $listMapper 
      ->addIdentifier('title'); 
    } 
} 

我一直在使用sonata_type_collection也試過,但它不起作用它返回這個錯誤: 「當前字段」questi ons「沒有鏈接到管理員。請創建一個目標實體」 我已經看了這並嘗試過建議計算器上的一切,但我無法得到它的工作。 我非常在這個問題上欣賞任何意見。

這是如何爲測驗管理頁面現在看起來像問題和答案:

sample

正如我以前運行composer.phar更新我可以添加這兩個問題和答案之前,一些前幾個版本中提到(我不記住版本,但是後來我遇到了一些獨特領域的問題,我很高興得到了解決,但是現在我有這個問題)。

如果您有任何建議,我會很樂意關注。

謝謝!

回答

1

我在我的項目中也有一個Quizz系統,我擁有和您一樣的實體。

你必須創建每個實體的控制和管理:

  • QUIZZ:QuizzAdmin/QuizzController
  • 問:QuestionAdmin/QuestionController
  • 答:AnswerAdmin/AnswerController

這將修復您的錯誤:當前字段「問題」未鏈接到管理員。請爲目標實體創建一個。

我使用sonata_type_collection作爲字段類型,您必須使用此要點:https://github.com/sonata-project/SonataAdminBundle/pull/1971/files,否則您將無法添加答案。

你只需要改變你的現場答案,以匹配我的班級。

QuizzAdmin:

class QuizzAdmin extends Admin 
{ 
    protected function configureListFields(ListMapper $listMapper) 
    { 
     $formMapper->add('questions', 'sonata_type_collection', 
      array(
       'by_reference' => false 
      ), 
      array(
       'edit' => 'inline', 
       'inline' => 'table' 
      ) 
     ); 
    } 
} 

QuestionAdmin:

class QuestionAdmin 
{ 
    protected function configureFormFields(FormMapper $formMapper) 
    { 
     $formMapper->add('answers', 'sonata_type_collection', 
      array(
       'by_reference' => false 
      ), 
      array(
       'edit' => 'inline', 
       'inline' => 'table' 
      ) 
     ); 
    } 
} 

你也應該考慮在您的管理類添加以下代碼,以便當您添加QUIZZ上的問題和回答您的斷言的驗證被觸發在管理員:

class QuizzAdmin extends Admin 
{ 
    protected $formOptions = array(
     'cascade_validation' => true 
    ); 
} 
+0

嗨,我正在做一些非常類似於嵌套'sonata_type_collection'的東西,但我遇到了問題,我正在使用答案中提到的要點。當我只有一個集合時,一切都顯示得很好,但是當我將它們嵌套在一起時,第一集合的孩子就會消失。你有什麼想法爲什麼(你的quizadmin類也有錯誤,你已經使用configureListFields方法,它應該是configureFormFields,並且編輯隊列已滿) – Tofandel 2017-06-12 09:00:37

0

嗨,我的朋友,我的第一個答案,我浩好好利用。
我該怎麼辦嵌套集合幾個lewel:
1)創建AnswerType
2)不`噸在QuestionAdmin使用收集AnswerType
4)QuizAdmin創建QuestionType
3)使用sonata_type_collection的問題實體