php - Symfony2.3 多对多形式

标签 php forms symfony many-to-many

我在处理我的表单时遇到了一些问题。

我的表单布局如下:

用户(FOSUserBundle)
成员(自定义类)
地区(自定义类)

成员(member)表单是用户表单的子表单,区域表单是成员(member)表单的子表单。

首先,我得到的错误是:

Neither the property "region" nor one of the methods "setRegion()", "_set()" or "_call()" exist and have public access in class "Netsite\Bundle\AdminBundle\Entity\Member".

当我提交表单时会发生这种情况:

$form->handleRequest($request);

这里是所有相关代码:

成员.orm.yml

Netsite\Bundle\AdminBundle\Entity\Member:
type:  entity
table: member
id:
    id:
        type: integer
        generator:
            strategy: AUTO
fields:
    security_question:
        type: string
        length: 255
    security_answer:
        type: string
        length: 255
----- SNIP -----
manyToMany:
    region:
        targetEntity: Region
        cascade: ["persist", "remove"]

实体\成员.php

<?php

namespace Netsite\Bundle\AdminBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Member
 */
class Member
{
    /**
     * @var \Doctrine\Common\Collections\Collection
     */
    private $region;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->region = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Add region
     *
     * @param \Netsite\Bundle\AdminBundle\Entity\Region $region
     * @return Member
     */
    public function addRegion(\Netsite\Bundle\AdminBundle\Entity\Region $region)
    {
        $this->region[] = $region;

        return $this;
    }

    /**
     * Remove region
     *
     * @param \Netsite\Bundle\AdminBundle\Entity\Region $region
     */
    public function removeRegion(\Netsite\Bundle\AdminBundle\Entity\Region $region)
    {
        $this->region->removeElement($region);
    }

    /**
     * Get region
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getRegion()
    {
        return $this->region;
    }

Form\MemberType.php

<?php
namespace Netsite\Bundle\AdminBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Validator\Constraints\NotBlank;

class MemberType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
            ->add('region', new RegionType())

区域.orm.yml

Netsite\Bundle\AdminBundle\Entity\Region:
type:  entity
table: region
id:
    id:
        type: integer
        generator:
            strategy: AUTO
fields:
    region:
        type: string
        length: 255

实体\区域.php

<?php

namespace Netsite\Bundle\AdminBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Region
 */
class Region
{
    /**
     * @var integer
     */
    private $id;

    /**
     * @var string
     */
    private $region;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set region
     *
     * @param string $region
     * @return Region
     */
    public function setRegion($region)
    {
        $this->region = $region;

        return $this;
    }

    /**
     * Get region
     *
     * @return string 
     */
    public function getRegion()
    {
        return $this->region;
    }
}

Form\RegionType.php

<?php
namespace Netsite\Bundle\AdminBundle\Form;

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

class RegionType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
            ->add('region', 'entity', array(
                'class' => 'Netsite\Bundle\AdminBundle\Entity\Region',
                'property' => 'region',
                'empty_data' => null,
                'multiple' => true,
                'expanded' => true,
                'required' => false,
                'label' => false
             ))
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'Netsite\Bundle\AdminBundle\Entity\Region',
            'cascade_validation' => true
        ));
    }

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

我不知道我做错了什么。

最佳答案

我想你想在 MemberType.php 中替换:

$builder->add('region', new RegionType())

$builder->add('region', 'entity',
              array(
                  'class' => 'YourBundle:Region',
                  'multiple' => true,
                  'expanded' => true,
                  'required' => true|false,
                  'property' => 'region',
                  'label' => 'your.label',
                  'error_bubbling' => true,
              )
)

这将渲染一个带有标记为 Region::region 的复选框的区域(顺便说一句,令人困惑的命名方案。应该只是“名称”)。多个复选标记将反射(reflect)在多个 M2M 条目中。

关于php - Symfony2.3 多对多形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18720922/

相关文章:

php - Codeigniter CSRF 仅对一次 ajax 请求有效

php - 将字符串连接到数据库中的现有字符串

php - Symfony 4 一些用户无法登录,csrf token 无效,可能是 php session 问题,没有产生错误

php - Twig:从配置文件中添加 Twig 扩展调试

javascript - 如何在选项标签中使用多种颜色为文本着色

phpunit - Symfony 2带PhpUnit 3.6 : changing target hostname for test purposes

php - 给定周数计算星期几

php - Smarty:从字符串/浮点值的末尾修剪零

php - MySQL 数据库填充下拉框和 PHP 搜索

Javascript/jQuery 在计时器后点击