标签: symfony-forms

用常量数组填充 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 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
查看次数

Symfony2表单集合:如何从集合中删除实体?

我尝试从集合中删除实体,但它不起作用.

我想我某处有错,但我不知道在哪里.

这里是我的代码updateAction:

    $em = $this->getDoctrine()->getEntityManager();

    $entity = new Person();

    if (!$entity) {
        throw $this->createNotFoundException('Unable to find Person entity.');
    }

    $editForm   = $this->createForm(new PersonType(), $entity);
    $deleteForm = $this->createDeleteForm($id);

    $request = $this->getRequest();

    $editForm->bindRequest($request);

    if ($editForm->isValid()) {
        $entity = $editForm->getData();

        $em->persist($entity);
        foreach($entity->getAddresses() as $address)
        {               
            $em->persist($address);
        }
        $em->flush();                                 

        return $this->redirect($this->generateUrl('person_show', array('id' => $id)));
    }

    return $this->render('AppPersonBundle:Person:edit.html.twig', array(
        'entity'      => $entity,
        'edit_form'   => $editForm->createView(),
        'delete_form' => $deleteForm->createView(),

    );
Run Code Online (Sandbox Code Playgroud)

请注意,要删除我的实体,我从html中删除div.

我的意思是我删除<div id="myapp_personbundle_persontype_address_4">了例如.

这是正确的方法吗?

php forms symfony-forms symfony

4
推荐指数
2
解决办法
2万
查看次数

sonata_type_model/symfony形成一对多关系而不保存

我在帐户和用户之间有一对多的关系.我正在使用sonata管理员进行CRUD.据我所知,它使用Symfony表单来完成工作.我试图添加这样的字段:

        ->add('users', 'entity', array(
            'class'    => 'AcmeDemoBundle:User',
            'required' => true,
            'multiple' => true,
            'expanded' => true
        ));
Run Code Online (Sandbox Code Playgroud)

我也尝试过sonata_type_model

        ->add('users', 'sonata_type_model', array(
            'class'    => 'AcmeDemoBundle:User',
            'required' => true,
            'multiple' => true,
            'expanded' => true
        ));
Run Code Online (Sandbox Code Playgroud)

问题是,在编辑帐户时(当我编辑用户的所有内容都会更新时),不会保存任何内容(与关系相关).我知道我必须更新拥有方(用户端),但我没有成功,因为"公共函数addUser($ user)"没有被调用所以我不能添加类似"$ user-> setAccount($ this )"到那个功能.

我的实体看起来像这样:

class Account
{
/**
 * @ORM\Id
 * @ORM\Column(type="integer")
 * @ORM\GeneratedValue(strategy="AUTO")
 */
protected $id;

/**
 * @ORM\Column(type="string")
 */
protected $name;

/**
 * @ORM\OneToMany(targetEntity="Acme\DemoBundle\User", mappedBy="account", cascade={"persist", "remove"})
 */
protected $users;

/**
 * Add users
 *
 * @param Acme\DemoBundle\Entity\User $user
 * @return …
Run Code Online (Sandbox Code Playgroud)

symfony-forms symfony symfony-sonata symfony-2.1 sonata-admin

4
推荐指数
1
解决办法
8086
查看次数

修改Symfony表单html属性/覆盖单个属性

我试图弄清楚如何使用Symfony2表单动态修改html属性.

这种情况是大多数时间使用默认占位符的情况,但有时,开发人员需要编写自定义消息.

我的表单类型如下所示:

    <?php

    namespace My\AwesomeBundle\FormType;

    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
    use My\AwesomeBundle\Transformer\ProcedureCodeTransformer;

    class ProcedureType extends AbstractType
    {

        private $em;
        private $user;


        public function __construct($em, $securityContext)
        {
            $this->em=$em;
            $this->user=$securityContext->getToken()->getUser();
        }

        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $transformer = new ProcedureTransformer( $this->em );
            $builder->addModelTransformer( $transformer );
        }

        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $user = $this->user;
            $resolver->setDefaults(
                array(
                    'class'       => 'My\AwesomeBundle\Entity\Procedure',
                    'label'       => 'Procedure',
                    'label_attr'  => array( 'class'=> 'control-label' ),
                    'required'    => false,
                    'empty_value' => '',

                    'attr'        => array(
                        'class' …
Run Code Online (Sandbox Code Playgroud)

symfony-forms symfony

4
推荐指数
1
解决办法
2800
查看次数

Symfony2最佳实践,业务逻辑和单元测试

我想用单元测试创​​建一个高度可维护的代码.

我已经阅读了最佳实践,因此根据最佳实践组织目录,只有一个名为AppBundle的包,我正在使用注释.

我有业务逻辑问题.我读过我不应该把业务逻辑放在控制器中.由于绝大多数代码都不是要重用,我把逻辑放在控制器中.昨天我在这里读到"逻辑应该存在于控制器中,除非你要对它进行单元测试或直到你需要重新使用它"这让我晕了:如果把逻辑放在里面,我不会进行单元测试控制器?

据我所知,"控制器应尽可能精简,只需很少的代码就可以将各种东西粘合在一起".但形式怎么样?表单通常具有类似"显示表单,如果它有效并执行某些操作并显示另一页"的逻辑.现在,如果我要将表单创建和逻辑放在服务(或模型?)中,我必须将页面渲染命令放在其中,所以基本上控制器将是1行,所有其余的都在服务,以及显示哪个页面的实际决定将在服务内部完成,而不是控制器本身...那么控制器的重点是什么,只是路由?

我真的需要在继续之前理解这一点(我已经开发了3个月,我必须做很多工作,但现在比从来没有好过)......

谢谢!

编辑:一些额外的考虑因素,以解决下面的一些评论.

我清楚地了解了表单在Symfony中的工作原理,创建了表单,并在同一个地方使用"isValid()"进行管理.

让我们假设以下控制器执行以下操作:

get the current customer from security context
queries the DB to get the field $user->getIsBillable()
if the user is not billable
    queries the DB to find if someone else is paying for him
else //the user is billable
    create and manage form1
if the user is not billable but there is someone who is paying for him
    check if the license is active (I have to call an external …
Run Code Online (Sandbox Code Playgroud)

unit-testing symfony-forms symfony

4
推荐指数
1
解决办法
707
查看次数