2

I'm trying to get a smooth admin interface similar as if when two entities are associated by a many-to-many relationship. I need the join table to define additional information like rank. I don't want to display the jointable entity on the backend, it should be writeable in the edit-menu of at least one entity. My example:

class Question{
    /**
     * @Assert\NotBlank()
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Options2Questions", mappedBy="question", cascade={"persist"})
     */
    private $optionQuestion;

    public function __construct() {
        $this->optionQuestion = new \Doctrine\Common\Collections\ArrayCollection();
    }

    public function addOptionQuestion(\AppBundle\Entity\Options2Questions $optionQuestion){
        $this->optionQuestion[] = $optionQuestion;
        return $this;
    }

    public function removeOptionQuestion(\AppBundle\Entity\Options2Questions $optionQuestion){
        $this->optionQuestion->removeElement($optionQuestion);
    }

    public function getOptionQuestion(){
        return $this->optionQuestion;
    }
}

class Options{

    /**
     * @Assert\NotBlank()
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\Options2Questions", mappedBy="options")
     */
    private $optionQuestion;

    public function __construct(){
        $this->optionQuestion = new \Doctrine\Common\Collections\ArrayCollection();
    }

    public function addOptionQuestion(\AppBundle\Entity\Options2Questions $optionQuestion){
        $this->optionQuestion[] = $optionQuestion;
        return $this;
    }

    public function removeOptionQuestion(\AppBundle\Entity\Options2Questions $optionQuestion)
    {
        $this->optionQuestion->removeElement($optionQuestion);
    }

    public function getOptionQuestion(){
        return $this->optionQuestion;
    }
}

class Options2Questions
{    

    /**
     * @ORM\Id()
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Options", inversedBy="optionsQuestions")
     * @ORM\JoinColumn(name="options_id", referencedColumnName="id", nullable=false)
     */
    private $options;

    /**
     * @ORM\Id()
     * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Question", inversedBy="optionsQuestions")
     * @ORM\JoinColumn(name="question_id", referencedColumnName="id", nullable=false)
     */
    private $question;

    /**
     * @var int
     *
     * @ORM\Column(name="rank", type="integer", nullable=true)
     */
    private $rank;



    /**
     * Set rank
     *
     * @param integer $rank
     *
     * @return Options2Questions
     */
    public function setRank($rank)
    {
        $this->rank = $rank;

        return $this;
    }

    /**
     * Get rank
     *
     * @return int
     */
    public function getRank()
    {
        return $this->rank;
    }

    /**
     * Set options
     *
     * @param \AppBundle\Entity\Options $options
     *
     * @return Options2Questions
     */
    public function setOptions(\AppBundle\Entity\Options $options)
    {
        $this->options = $options;

        return $this;
    }

    /**
     * Get options
     *
     * @return \AppBundle\Entity\Options
     */
    public function getOptions()
    {
        return $this->options;
    }

    /**
     * Set question
     *
     * @param \AppBundle\Entity\Question $question
     *
     * @return Options2Questions
     */
    public function setQuestion(\AppBundle\Entity\Question $question)
    {
        $this->question = $question;

        return $this;
    }

    /**
     * Get question
     *
     * @return \AppBundle\Entity\Question
     */
    public function getQuestion()
    {
        return $this->question;
    }
}

I could not find any documentation on this. Where should I look specifically?

Jeff
  • 143
  • 2
  • 11

1 Answers1

-2
  1. First of all you have to create the admin class - service for the all of these three entities. Therefore you will have the next 3 classes:

    a) QuestionAdmin

    b) OptionAdmin

    c) Options2QuestionsAdmin

  2. If you want to remove from you admin services list the Options2QuestionsAdmin - you can add show_in_dashboard: false line to the services.yml:

    app.admin.options2questions:
                class: AppBundle\Options2questionsAdmin
                arguments: [~, AppBundle\EntityOptions2questions, SonataAdminBundle:CRUD]
                tags:
                    - { name: sonata.admin, manager_type: orm, group: 'your_group',  label: 'your_label', show_in_dashboard: false }
    
  3. In your QuestionAdmin class in formmapper method you can add this:

    class QuestionAdmin extends AbstractAdmin
    {
        // ... 
    
             protected function configureFormFields(FormMapper $formMapper)
             {
                 $formMapper
                      ->add('optionQuestion', 'sonata_type_collection', [
                            'required'      => true,
                            'label'         => 'option_question',
                            'by_reference'  => false,
                            'btn_add'       => 'add_button',
                            'type_options'  => [
                                'delete' => true,
                            ],
                        ], [
                            'edit'          => 'inline',
                            'inline'        => 'standard',
                            'sortable'      => 'id',
                            'allow_delete'  => true,
                        ])
                  ;
              }
    
staskrak
  • 873
  • 2
  • 10
  • 22