php - 如何在 Symfony 表单中创建作为 SubmitType 子级的自定义 SaveType

标签 php forms twitter-bootstrap symfony symfony-forms

我想在 Symfony 中制作一些简单的管理面板应用程序。我看到自版本 2.3 Symfony 引入了 Bootstrap 的表单主题,这很棒,但我想创建名为 SaveType 的自定义提交字段,它应该将默认类属性设置为 btn-primary 而不是 btn-default。

因此,来自 documentation我读到我可以创建该自定义字段类型并将其父级设置为 SubmitType

保存类型自定义字段

<?php

namespace AppBundle\Form\Custom;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\OptionsResolver\OptionsResolver;

/**
 * Class SaveType
 * @package AppBundle\Form
 */
class SaveType extends AbstractType
{
    /**
     * @param OptionsResolver $resolver
     * @return OptionsResolver|void
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        return $resolver->setDefaults(
            [
                'attr' => [
                    'class' => 'btn-primary',
                ],
            ]
        );
    }

    /**
     * @return string
     */
    public function getParent()
    {
        return SubmitType::class;
    }
}

产品实体

<?php

namespace AppBundle\Entity;

/**
 * Product
 */
class Product
{
    /**
     * @var int
     */
    private $id;

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

    /**
     * @var int
     */
    private $price;

    /**
     * @var bool
     */
    private $enabled;


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

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

        return $this;
    }

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

    /**
     * Set price
     *
     * @param integer $price
     *
     * @return Product
     */
    public function setPrice($price)
    {
        $this->price = $price;

        return $this;
    }

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

    /**
     * Set enabled
     *
     * @param boolean $enabled
     *
     * @return Product
     */
    public function setEnabled($enabled)
    {
        $this->enabled = $enabled;

        return $this;
    }

    /**
     * Get enabled
     *
     * @return bool
     */
    public function getEnabled()
    {
        return $this->enabled;
    }
}

使用 SaveType 的 ProductType

<?php

namespace AppBundle\Form;

use AppBundle\Form\Custom\SaveType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\MoneyType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

/**
 * Class ProductType
 * @package AppBundle\Form
 */
class ProductType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array                $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('price', MoneyType::class, [
                'currency' => 'PLN',
                'divisor' => 100,
            ])
            ->add('enabled')
            ->add('submit', SaveType::class, [
                'label' => 'Save',
            ]);
    }

    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Product',
        ));
    }
}

问题

呈现该表单会抛出以下错误:

Neither the property "submit" nor one of the methods "getSubmit()", "submit()", "isSubmit()", "hasSubmit()", "__get()" exist and have public access in class "AppBundle\Entity\Product".

注意事项

创建 SubmitTypeExtension 工作正常,但我不想在整个应用程序中更改标准 SubmitType 的行为。

最佳答案

解决方案实际上非常简单,正如我通过 this issue 发现的那样.您必须实现 SubmitButtonTypeInterface,以便它使用 SubmitButtonBuilder 而不是常规的 FormBuilder

这就是你的按钮类的样子:

namespace AppBundle\Form\Custom;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\SubmitButtonTypeInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class SaveType extends AbstractType implements SubmitButtonTypeInterface
{
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'label' => ' ',
            'attr' => [
                'title' => 'Save',
                'data-toggle' => "tooltip",
                'data-placement' => "bottom"
            ],
            'icon' => 'ok'
        ]);
    }

    public function getParent()
    {
        return SubmitType::class;
    }
}

关于php - 如何在 Symfony 表单中创建作为 SubmitType 子级的自定义 SaveType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35624785/

相关文章:

php - php mysqli更新表,数据相同返回0受影响的行

php - 如何使用php将sql查询的结果输入到html表中

javascript - 在表单上跳转到页面顶部提交到新页面

php - 使用 php 提取基本 mysql 数据

php - MySql SSL 与 Zend-Framework 的连接

php mysql ajax 注册表单与图像上传

javascript - 按照 tab-index 的顺序循环 jQuery 选择

jquery - 将下拉菜单放在 Bootstrap 轮播中会造成可见性问题

javascript - 单击汉堡按钮时覆盖并通过同一按钮禁用它

php - 如何创建 Bootstrap 网格?