标签: symfony-forms

在普通表单类上使用奏鸣曲字段类型

我正在尝试在首页上插入自定义奏鸣曲表单字段类型,而不是在 SonataAdmin 中,如下所示:

 $form = $this->createFormBuilder($content)
            ->add('titleEs', 'text', array('required' => true, 'label' => 'label.title.spanish', 'attr' => array('class' => 'col-xs-12 form-control input-lg')))
            ->add('contentEs', 'ckeditor', array('required' => true,'label' => 'label.content.spanish', 'attr' => array('class' => 'col-xs-12')))
            ->add('titleEn', 'text', array('required' => true,'label' => 'label.title.english', 'attr' => array('class' => 'col-xs-12 form-control input-lg')))
            ->add('contentEn', 'ckeditor', array('required' => true, 'label' => 'label.content.english', 'attr' => array('class' => 'col-xs-12')))
            ->add('header', 'sonata_type_model', array('required' => true,'label' => 'label.content.headerImage'), array('link_parameters' => array('context' => 'content/front', 'size' => 'big')))
            //->add('coverImage', 'sonata_type_model_list', array('required' => true,'label' …
Run Code Online (Sandbox Code Playgroud)

symfony-forms symfony form-fields sonata-admin sonata

5
推荐指数
1
解决办法
1755
查看次数

Symfony3 + Select2 AJAX - 禁用选项验证

我有一个带有 ChoiceType 字段的 Symfony3 表单。它使用带有 AJAX 数据源的 Select2。这一点工作正常。然而,当表单被提交时,Symfony 验证开始并抱怨:

This value is not valid  
Run Code Online (Sandbox Code Playgroud)

我想这是因为通过 AJAX 选择的选择不存在于表单类型的“选择”键中。

我对 Symfony 比较陌生。有人可以指出我正确的方向以禁用现场验证吗?

validation symfony-forms symfony select2

5
推荐指数
1
解决办法
2917
查看次数

Symfony Form 将变量选项从 Collection 传递到 FormType

我有一个集合类型:

->add('tipi', CollectionType::class, array(
                'entry_type' => TipiType::class,
                'allow_add' => true,
                'prototype' => true,
                'mapped' => false,
                'entry_options' => array(
                    'required' => true,
                    'label' => false,
                )
            ))
Run Code Online (Sandbox Code Playgroud)

扩展此表单类型:

->add('tipi', EntityType::class, array(
      'label' => 'Tipo',
      'class' => 'AppBundle:Tipi',
      'attr' => array('class' => 'form-control'),
      'query_builder' => function (EntityRepository $er) {
          return $er->createQueryBuilder('t')
                    ->innerJoin('t.requests', 'r')
          ;
      },
  ));
Run Code Online (Sandbox Code Playgroud)

在第一种表单类型中,我有一个从控制器发送的选项,如下所示:

$idRequest = $request->get('id');
$form = $this->createForm(RequestsType::class, $requests, array(
    'id_request' => $idRequest
));
Run Code Online (Sandbox Code Playgroud)

在第一个中我可以使用它,但在子 FormType 中则不能。我会在集合类型中传递这个变量。我怎样才能做到这一点?

$form = $this->createForm(new YourForm($options), $class);
Run Code Online (Sandbox Code Playgroud)

php forms symfony-forms symfony

5
推荐指数
0
解决办法
1384
查看次数

用常量数组填充 ChoiceType

使用底层实体中定义的常量数组填充 Symfony 表单 choiceType 并添加基于相同常量创建断言的最佳方法是什么。\n选项名称应存储在数据库中。

\n\n

我正在使用 Symfony 2.8,这就是我所做的。它运作良好,但我认为必须有一种更简单的方法来处理所有新的表单功能。

\n\n

谢谢,汉内斯

\n\n

实体

\n\n\n\n
class User implements UserInterface, \\Serializable\n{\n    const OCCUPATION_SCHOOL_HIGHER_DEGREE = \'Sch\xc3\xbclerin/Sch\xc3\xbcler an Gymnasium\';\n    const OCCUPATION_SCHOOL_LOWER_DEGREE = \'Sch\xc3\xbclerin/Sch\xc3\xbcler an Haupt-/Real- und anderen Schulen\';\n    const OCCUPATION_WORK_TRAINING = \'Berufsausbildung\';\n    const OCCUPATION_UNIVERSITY = \'Studium an einer Hochschule\';\n    const OCCUPATION_WORK_FULLTIME = \'Vollzeiterwerbst\xc3\xa4tigkeit\';\n    const OCCUPATION_WORK_PARTTIME = \'Teilzeiterwerbst\xc3\xa4tigkeit\';\n    const OCCUPATION_NATIONAL_SERVICE = \'Wehrdienst/Zivildienst/FSJ/F\xc3\x96J\';\n    const OCCUPATION_UNEMPLOYED = \'keine Besch\xc3\xa4ftigung\';\n    const OCCUPATION_OTHERS = \'sonstiges\';\n\n...\n/**\n     * @ORM\\Column(type="string", length=255, nullable=true)\n     * @Assert\\NotBlank(message = "Pflichtfeld.")\n     * @Assert\\Choice(\n     *      choices = {\n …
Run Code Online (Sandbox Code Playgroud)

symfony-forms symfony

5
推荐指数
1
解决办法
2582
查看次数

Symfony pre_submit 更改字段顺序

鉴于以下表单类型,我如何在提交之前呈现我的第二个字段?我试过了,$form->remove但我总是会收到这个错误:

Warning: Illegal offset type in isset or empty
Run Code Online (Sandbox Code Playgroud)

不太确定如何解决这个问题。

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('survey', EntityType::class, [
            'class' => SurveyManager::class,
            'attr' => [
                'class' => 'field-change',
            ],
        ])
        ->add('submit', SubmitType::class, [

        ])
        ->addEventListener(
            FormEvents::PRE_SUBMIT,
            function (FormEvent $event) {
                $form = $event->getForm();

                $data = $event->getData();
                $modifier = $data['survey'];
                $form->add('headquarter', EntityType::class, [
                    'class' => HeadQuarterManager::class,
                    'query_builder' => function (HeadQuarterManagerRepository $er) use ($modifier) {
                        return $er->getHeadquarter($modifier);
                    }, …
Run Code Online (Sandbox Code Playgroud)

php symfony-forms symfony

5
推荐指数
1
解决办法
654
查看次数

如何在 Symfony 3 中创建将显示在标题中每个子页面上的表单

我想在网站的每个子页面上显示相同的表单。在每个控制器的每个动作中将其传递给 Twig 是没有意义的。我不想创建某种将表单传递给 Twig 的 BaseController。

我觉得通过一些配置或服务注入应该可以,但我找不到合适的方法。

我已经将表单作为服务app_bundle.user.form.type.locale,但是在哪里注入它以及如何将参数传递给表单。

编辑:

action表单的属性始终是当前地址,因此它看起来像这样<select action="">

php dependency-injection symfony-forms symfony

5
推荐指数
2
解决办法
1614
查看次数

表单实体:添加额外选项

我使用 Symfony 表单来过滤一组数据。比如说,有一个“用户”下拉列表过滤日志记录表(每个记录可以与用户链接,但也可以不链接)。

换句话说,LogRecord <- many-to-one nullable -> User

问题是我希望它支持下拉列表中的 2 个选项:所有用户(禁用此字段的过滤)和“无用户”,它应该过滤字段 = NULL 的记录。但我不知道如何学习表单来区分这些情况,而不破坏表单验证过程。有任何想法吗?

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->setMethod('GET');

    $builder
        ->add('user', EntityType::class, array(
            'class' => 'AppBundle:User',
            'choice_label' => 'name',
            'placeholder' => 'All',
            'query_builder' => function (UserRepository $repo) {
                return $repo->findForOptionsQueryBuilder();
            },
            'label' => 'User',
            'required' => false,
        ));
}
Run Code Online (Sandbox Code Playgroud)

当前下拉列表:

  • 全部
  • 用户1
  • 用户2

所需的下拉菜单:

  • 全部
  • 无(空)
  • 用户1
  • 用户2

php symfony-forms symfony doctrine-orm

5
推荐指数
1
解决办法
1722
查看次数

Symfony:从子表单获取数据(CollectionType)

我在两个实体之间有一个 ManyToOne 关系ParentChild因此在FormType我使用的关系中CollectionType,如下所述:

class ParentType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('childs', CollectionType::class, array(
                'entry_type' => ChildType::class,
            ));
    }
}
Run Code Online (Sandbox Code Playgroud)

在 ChildType 类中,我想使用 EventListener 获取嵌入对象:

class ChildType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('lastName');

        $builder->addEventListener(
            FormEvents::POST_SET_DATA,//---after setting data
            function (FormEvent $event) {
                die(var_dump($event->getData()));//---this gives me null
            }
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

尽管我已将完整对象传递给控制器​​中的表单,但我得到的结果为 null: …

symfony-forms symfony

5
推荐指数
0
解决办法
1846
查看次数

empty_data 不适用于复合表单,或者实体未实例化(ArgumentCountError:函数参数太少)

我有一个Company有很多Employees 的。在我的表单中,我希望用户能够动态添加员工(足够简单)。EmployeeType(an AbstractType) 是复合词,包含名字和姓氏。在提交表单时,Symfony 似乎没有将表单中的数据传递到“新”员工的构造函数中。我收到一个错误

ArgumentCountError:函数 Employee::__construct() 的参数太少...传入了 0 个...并且预期正好有 3 个

显示和编辑现有的员工作品,因此我确信我的关系等都是正确的。

缩写代码:

公司

class Company
{
    protected $employees;

    public function __construct()
    {
        $this->employees = new ArrayCollection();
    }

    public function addEmployee(Employee $employee)
    {
        if ($this->employees->contains($employee)) {
            return;
        }
        $this->employees->add($employee);
    }

    public function removeEmployee(Employee $employee)
    {
        if (!$this->employees->contains($employee)) {
            return;
        }
        $this->employees->removeElement($employee);
    }
}
Run Code Online (Sandbox Code Playgroud)

员工

class Employee
{
    // ... firstName and lastName properties...

    public function __construct(Company $company, $firstName, $lastName)
    {
        $this->company = …
Run Code Online (Sandbox Code Playgroud)

symfony-forms symfony

5
推荐指数
1
解决办法
1152
查看次数

如何正确地将日期转换为字符串并以 symfony 形式转换回来,以便可以使用日期选择器

在我的 Symfony 4 应用程序中,我有一个包含日期类型字段的实体。默认情况下,Symfony 将其呈现为一组月、日、年的选择框。我已将其更改为文本小部件,以便我可以使用 jQuery UI 日期选择器。

但我在尝试提交表格时遇到了问题。

这是我的实体上的字段:

/**
 * @ORM\Column(type="date")
 */
private $start_date;
Run Code Online (Sandbox Code Playgroud)

这是我显示该字段的方式:

$builder->add('start_date', DateType::class, [
                'widget' => 'single_text',

                // prevents rendering it as type="date", to avoid HTML5 date pickers
                'html5' => false,

                // adds a class that can be selected in JavaScript
                'attr' => ['class' => 'js-datepicker'],
            ])
Run Code Online (Sandbox Code Playgroud)

在我的页面上使用 jquery 和 jqueryui,这允许显示日期选择器。

以下是我目前正在尝试从日期转换为字符串的方法,反之亦然。目前,我只是尝试使用硬编码日期,一旦我知道我在做什么,我当然会更改它。

$builder->get('start_date')
->addModelTransformer(new CallbackTransformer(
    function ( $dateAsString ) {
        return new \DateTime('2019-01-01');
    },
    function ( $dateAsDate ) {
        return '2019-01-01';
    }
));
Run Code Online (Sandbox Code Playgroud)

提交表单会产生此错误:预期参数类型为“DateTimeInterface”,给定“string”。 …

symfony-forms symfony

5
推荐指数
1
解决办法
5609
查看次数