从通用数据生成Symfony表单

时间:2017-08-14 13:51:29

标签: php symfony doctrine symfony-forms

我正在设计一个管理报告的应用程序。我正在使用Symfony 3.2.6进行开发。在这个picture 中,您可以看到我的数据模型。我想做两件事: 1.为包含许多给定模块的报表创建新布局 2.创建此报告的实例并将其保存在数据库中

所以我认为这是用这种数据模型做到这一点的一种方法,不是吗?但是我现在如何在Symfony中创建一个表单?

我这样做:

$builder
        ->add('name', TextType::class)
    ;

    foreach ($options['moduleValues'] as $moduleValue)
    {
        if($moduleValue instanceof RangeModuleValue)
        {
            $builder->add('value', RangeType::class, array(
                'attr' => array(
                    'min' => $moduleValue->getRangeModule()->getStartValue(),
                    'max' => $moduleValue->getRangeModule()->getEndValue()
                )
            ));
        }
    }

但后来我收到了错误:

Neither the property "value" nor one of the methods "getValue()", "value()", "isValue()", "hasValue()", "__get()" exist and have public access in class "ReportBundle\Entity\Report".

我认为错误很明显,“value”在表range_module_value中。但是我应该如何改变我的设计或表格来处理这个问题呢?

注意:父类Module存在,因为将来会有其他模块,如“TextModule”。

这是我的班级报告:

class Report
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="name", type="string", length=255)
 */
private $name;

/**
 * @ORM\ManyToOne(targetEntity="ReportBundle\Entity\ReportLayout")
 * @ORM\JoinColumn(name="layout_id", referencedColumnName="id")
 */
private $layout;

/**
 * Report constructor.
 * @param int $id
 */
public function __construct($layout)
{
    $this->layout = $layout;
}


/**
 * @return int
 */
public function getLayout()
{
    return $this->layout;
}

/**
 * @param int $layout
 */
public function setLayout($layout)
{
    $this->layout = $layout;
}

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

/**
 * Set name
 *
 * @param string $name
 *
 * @return Report
 */
public function setName($name)
{
    $this->name = $name;

    return $this;
}

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

}

这里是RangeModuleValue类,我想在其中为特定报告保留模块的值。

class RangeModuleValue
{
/**
 * @var int
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\ManyToOne(targetEntity="ReportBundle\Entity\RangeModule")
 * @ORM\JoinColumn(name="rangeModule_id", referencedColumnName="id")
 */
private $rangeModule;

/**
 * @ORM\ManyToOne(targetEntity="ReportBundle\Entity\Report")
 * @ORM\JoinColumn(name="report_id", referencedColumnName="id")
 */
private $report;

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

/**
 * RangeModuleValue constructor.
 * @param $rangeModule
 * @param $report
 */
public function __construct($report, $rangeModule)
{
    $this->report = $report;
    $this->rangeModule = $rangeModule;
}


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

/**
 * Set rangeModule
 *
 * @param string $rangeModule
 *
 * @return RangeModuleValue
 */
public function setRangeModule($rangeModule)
{
    $this->rangeModule = $rangeModule;

    return $this;
}

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

/**
 * Set report
 *
 * @param string $report
 *
 * @return RangeModuleValue
 */
public function setReport($report)
{
    $this->report = $report;

    return $this;
}

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

/**
 * Set value
 *
 * @param integer $value
 *
 * @return RangeModuleValue
 */
public function setValue($value)
{
    $this->value = $value;

    return $this;
}

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

}

1 个答案:

答案 0 :(得分:0)

在课程报告中添加此功能以允许添加许多$rangeModule$value

public function addrangemodule (RangeModuleValue $rangeModule)
    {
        $day->setIdReport($this);
        $this->ranges->add($day);
    }

但是ranged应该是一个ArrayCollection:

 public function setranges(ArrayCollection $ranges)
    {
        $this->ranges= $ranges;
    }

在Controller中添加尽可能多的内容:  $ range = new RangeModuleValue();

    $report->addrangemodule ($range);

这段代码只是一个例子,我不确定他的作品。

有关详细信息,请参阅文档:

https://symfony.com/doc/current/form/form_collections.html

http://www.doctrine-project.org/api/common/2.3/class-Doctrine.Common.Collections.ArrayCollection.html