我對奏鳴曲管理包非常新,我可以使用一些幫助。多個嵌套集合字段&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「沒有鏈接到管理員。請創建一個目標實體」 我已經看了這並嘗試過建議計算器上的一切,但我無法得到它的工作。 我非常在這個問題上欣賞任何意見。
這是如何爲測驗管理頁面現在看起來像問題和答案:
正如我以前運行composer.phar更新我可以添加這兩個問題和答案之前,一些前幾個版本中提到(我不記住版本,但是後來我遇到了一些獨特領域的問題,我很高興得到了解決,但是現在我有這個問題)。
如果您有任何建議,我會很樂意關注。
謝謝!
嗨,我正在做一些非常類似於嵌套'sonata_type_collection'的東西,但我遇到了問題,我正在使用答案中提到的要點。當我只有一個集合時,一切都顯示得很好,但是當我將它們嵌套在一起時,第一集合的孩子就會消失。你有什麼想法爲什麼(你的quizadmin類也有錯誤,你已經使用configureListFields方法,它應該是configureFormFields,並且編輯隊列已滿) – Tofandel 2017-06-12 09:00:37