当前位置: 首页 > 知识库问答 >
问题:

向表中添加新字段并编辑表单Symfony

姜景焕
2023-03-14

我是新来的Symfony,继承了一个项目,原来是php自定义,现在是Symfony 3的一半和一半。

我对Symfony知之甚少,但在php方面做了大量工作。

我想在产品表中添加一个名为"majorItem"的字段

我已经将majoritem添加到Products类中,将其添加到表单生成器中,并通过phpmyadmin将其添加到表中。

当应用程序构建表单时,我可以看到新的表单项。

如果我手动更改数据库中的字段,它不会反映在表单中。

我的假设是我没有将字段绑定到表单字段?

任何帮助都将不胜感激。

在form builder中,我现在有以下内容(简称..):

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $companyId = $builder->getData()->getCompanyId();
    $builder
        ->add('productCode')
        ->add('name')
        ->add('productType', ChoiceType::class, [
            'choices' => [
                'Primary' => 'Primary',
                'Secondary' => 'Secondary'
            ]
        ])
        ->add('majoritem', ChoiceType::class, [
            'choices' => [
                'No' => '0',
                'Yes' => '1'
            ]
        ])
        ]);
}

表单的更新操作如下所示:

   public function updateAction(Request $request, $productId)
{
    $product = $this->getDoctrine()->getRepository('EcoModelBundle:Products')
        ->find($productId);

    if (!$product)
    {
        throw new NotFoundHttpException('The requested product could not be found');
    }

    $form = $this->createForm(ProductsType::class, $product);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid())
    {
        $product = $form->getData();

        try
        {
            $em = $this->getDoctrine()->getManager();
            $em->persist($product);
            $em->flush();
            $request->getSession()->getFlashBag()->add('success', 'Product updated successfully');
        }
        catch (\Exception $e)
        {
            $request->getSession()->getFlashBag()->add('error', 'There was an error while saving the product. '
                . $e->getMessage());
        }
    }
    else if ($form->isSubmitted() && !$form->isValid())
    {
        $request->getSession()->getFlashBag()->add('error', 'The submitted data is invalid');
    }

    return $this->render('@EcoProducts/Product/update.html.twig', [
        'product' => $product,
        'form' => $form->createView()
    ]);
}

最后,Products类如下:

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

    /**
     * @var integer
     *
     * @ORM\Column(name="company_id", type="integer", nullable=false)
     */
    private $companyId;

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

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

    /**
     * @var string
     *
     * @ORM\Column(name="description", type="text", length=65535, nullable=false)
     */
    private $description;


    /**
     * @var integer
     *
     * @ORM\Column(name="majoritem", type="integer", nullable=false)
     */
    private $majoritem;



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

    /**
     * Set companyId
     *
     * @param integer $companyId
     *
     * @return Products
     */
    public function setCompanyId($companyId)
    {
        $this->companyId = $companyId;

        return $this;
    }

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






    /**
     * Set productCode
     *
     * @param string $productCode
     *
     * @return Products
     */
    public function setProductCode($productCode)
    {
        $this->productCode = $productCode;

        return $this;
    }

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

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

        return $this;
    }

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

    /**
     * Set description
     *
     * @param string $description
     *
     * @return Products
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

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


    /**
     * Set majoritem
     *
     * @param integer $majoritem
     *
     * @return Products
     */
    public function setMajoritem($majoritem)
    {
        $this->majoritem = $majoritem;

        return $this;
    }

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


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

    /**
     * Add detail
     *
     * @param \EcoModelBundle\Entity\ProjectDetails $detail
     *
     * @return Products
     */
    public function addDetail(\EcoModelBundle\Entity\ProjectDetails $detail)
    {
        $this->details[] = $detail;

        return $this;
    }

    /**
     * Remove detail
     *
     * @param \EcoModelBundle\Entity\ProjectDetails $detail
     */
    public function removeDetail(\EcoModelBundle\Entity\ProjectDetails $detail)
    {
        $this->details->removeElement($detail);
    }

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

所以,有趣的是,我做了一些改变...以下是我的产品类

    /**
 * Set majoritem
 *
 * @param integer $majoritem
 *
 * @return Products
 */
public function setMajoritem($majoritem)
{
    $this->majoritem = $majoritem;

    return $this;
}

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

这些似乎不起作用,或者至少我应该说getMajoritem不起作用?

如果将表单字段更改为简单的文本字段(而不是下拉列表),则当字段的基础数据为零时,表单将显示为空白。

但是,如果我输入1并提交表单,它会将数据库字段更新为1。

所以我想知道我的问题是否是表单生成器没有检索字段值并将其添加到表单中?

共有2个答案

穆正青
2023-03-14

尝试表单的整数值而不是字符串值,因为实体中的映射字段类型为整数:

->add('majoritem', ChoiceType::class, [
        'choices' => [
            'No' => 0, // <--- instead of '0'
            'Yes' => 1 // <--- instead of '1'
        ]
    ])
郗阳德
2023-03-14

使用以下命令检查映射是否正确:

php bin/console doctrine:schema:validate.

如果正确,您可以使用我们之前验证过的模式,使用以下命令更新数据库模式:

php bin/console doctrine:schema:update --force.

这将确保映射是通过教义完成的,如果介质中存在错误,ORM教义将负责通知您。

我还建议您通过使用迁移来更改模式,检查您的项目是否正在这样做,也许您应该通过迁移来更新模式:

php bin/console doctrine:migrations:diff

这将在src/Migrations/Version[timestamp]中创建一个文件。php

要更新数据库的架构,必须按以下方式执行:

php bin/console doctrine:migrations:execute --up [timestamp]

如果你想反转模式更新,你可以这样做:

php bin/console doctrine:migrations:execute --down [timestamp].

使用schema:updatemigrations之间的优势在于,使用后者,您可以反转schema更新操作

 类似资料:
  • 问题内容: 我已经做了一个不错的表格,并使用了一个复杂的“添加”函数来处理它。像这样开始 现在,我真的不想重复该方法中的所有功能,因此我想可以使用完全相同的模板,甚至可以id在表单中添加一个字段,以便该函数知道其正在编辑的内容。但这有几个问题 我将在哪里放置功能?之所以必须在此之后,是因为这是创建文章的地方,但它甚至永远都不会达到那个目的,因为由于唯一的约束,表单是无效的(除非用户编辑了所有内容)

  • 我正在尝试添加一个自定义字段到忍者表单(第3.3节)。到处都找不到完整的例子。 仔细查看代码,似乎过滤器'ninja_forms_register_fields'可以起到作用,但我无法让它在任何地方运行。

  • 抱歉,这个问题已经被问了1000次了,我觉得我已经读遍了每一个帖子--但我只是没有得到它的工作。 我不熟悉mysql和html,但我已经创建了一个显示在html表中的数据库--一切正常。现在我想为每一行添加一个编辑按钮。在我的主表页上,我添加了以下代码 它看起来工作得很好,因为它创建的链接都显示了唯一的id(这是主键)。 无论我做什么尝试,都无法在user_edit.php上的表中显示该数据。我的

  • 对于material-table,它们有一个属性来添加一个可编辑行,其中一个空的、可编辑的行被添加到表中,接受输入。我希望Ant的表组件具有相同的行为。您可以在底部的editable下拉切换下找到该行为的示例:https://material-table.com/#/docs/features/editable它们还有一个属性,用于将新行设置在顶部,这也是我想要的。 有没有人做过这个或者看到过这个

  • 问题内容: 我的表格中有3个字段。我有一个提交按钮和一个“添加其他字段”按钮。我知道我可以使用表单类中的方法添加字段。 我是Python和Django的新手,并且陷入了一个初学者的问题;我的问题是: 当我单击“添加其他字段”按钮时,添加其他字段的过程是什么? 是否需要再次呈现表单? 我如何以及何时打电话,甚至必须打电话? 如何将参数传递给? 问题答案: 你的表单必须基于从POST传递给它的一些变量

  • 我不得不向现有文档添加一个新字段/s。 下面是用于测试目的的过程AddNewField。 我做错了什么? 在调用fmongo.update后,我的收藏现在有两个文档!