簡體   English   中英

如何在一種形式中組合兩個實體?

[英]How to combine two entities within one form?

我想以一種形式使用兩個實體,盡管使用了先前問題中類似的提示,但它不起作用。 我有以下控制器:

<?php

namespace AppBundle\Controller;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use AppBundle\Entity\User;
use AppBundle\Form\UserType;
use AppBundle\Entity\School;
use AppBundle\Form\SchoolType;

class RegistrationController extends Controller
{

  /**
   * @Route("/register", name="user_register")
   */
  public function registerAction(Request $request)
  {
      $user = new User();
      $form = $this->createForm(new UserType(), $user);
      $form->add('status','hidden', array('attr' => array('value' => '0') ))
           ->add('school', new SchoolType());

      return $this->render('AppBundle:Main:register.html.twig', array('form' => $form->createView()));
  }

}

用戶類型.php

<?php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceList;

class UserType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
      $builder
          ->add('login', 'text', array('attr' => array(
            'id' => 'login', 'name' => 'login', 'label' => 'Login:',
            'class' => 'form-control', 'required' => true
          )))
          ->add('password', 'password', array('attr' => array(
            'id' => 'password', 'name' => 'password', 'label' => 'Password:',
            'class' => 'form-control', 'required' => true
          )))
      ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\User'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'appbundle_user';
    }
}

學校類型.php

<?php

namespace AppBundle\Form;

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

class SchoolType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', 'text', array('attr' => array(
              'class' => 'form-control', 'id' => 'schoolName', 'name' => 'schoolName',
              'placeholder' => 'np. Szkoła podstawowa nr. 5 w Warszawie', 'label' => 'Nazwa Szkoły',
               'required' => true
            )))
            ->add('shortcut', 'text', array('attr' => array(
              'class' => 'form-control', 'id' => 'shortcut', 'name' => 'shortcut',
              'placeholder' => 'np. SP5Warszawa', 'label' => 'Skrót', 'required' => true
            )))
        ;

    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\School'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'school';
    }
}

最后是樹枝模板:

  {{ form_start(form) }}
    <div class="form-group">
        {{ form_row('form.school.name') }}
    </div>

    <div class="form-group">
      {{ form_row('form.school.shortcut') }}
    </div>

    <div class="form-group">
      {{ form_row('form.login') }}
    </div>

    <div class="form-group">
      {{ form_row('form.login') }}
    </div>

    {{ form_row('form.status') }}
  <span style="display:inline-block;">
    <button type="submit" class="btn btn-default">Create</button>
    {{ form_end(form) }}

為什么它不起作用? 我收到以下錯誤:

Neither the property "school" nor one of the methods "getSchool()", "school()", "isSchool()", "hasSchool()", "__get()" exist and have public access in class "AppBundle\Entity\User".

你的 User 類必須有一個名為 school 的屬性。

/**
 * @ORM\Entity()
 * @ORM\Table(name="users")
 */
class User
{

/**
 * @ORM\OneToMany(targetEntity="Bundle\Entity\Schools",mappedBy="user")
 */
protected $school;

然后,為它生成實體,

php app/console doctrine:generate:entities Bundle:User

或手動編寫函數:

public function setSchool($school)
{
    $this->school= $school;

    return $this;
}    

public function getSchool()
{
    return $this->school;
}

它准確地告訴您您需要知道的內容。 在您的 User 實體中,您要么與 School 實體沒有關系,要么缺少 School 的 getter 和 setter。 假設它是一對一的關系,你應該有類似的東西:

   /**
     * @OneToOne(targetEntity="School", inversedBy="user")
     * @JoinColumn(name="school_id", referencedColumnName="id")
     **/
    private $school;

使用吸氣劑和吸氣劑:

public function setSchool(School $school = null)
{
    $this->school = $school;

    return $this;
}

public function getSchool()
{
    return $this->school;
}

請注意,這些應該由學說生成實體命令自動生成。 如果您正確設置了 User->School 關系並且缺少 setter/getter,則您可能根本沒有運行它。

另請閱讀有關關聯映射文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM