symfony 布尔值和选择符号类型

enyaitl3  于 2023-01-05  发布在  其他
关注(0)|答案(3)|浏览(119)

使用Symfony框架的选择类型,我们可以决定显示列表,单选按钮或复选框发挥这两个关键:

'multiple' => false,
'expanded' => true,  //example for radio buttons

假设在'choices'键中以数组形式给出的不同选择的值不是字符串,而是布尔值:

$builder->add('myproperty', 'choice', array(
    'choices' => array(
        'Yes' => true,
        'No' => false
     ),
     'label' => 'My Property',
     'required' => true,
     'empty_value' => false,
     'choices_as_values' => true
 ));

使用列表(选择)显示不同的选择没有问题,当显示表单时,列表中正确的选择被选中。
如果添加前面提到的两个键(multiple键和expanded键),用单选按钮替换列表,则字段中没有选中按钮(尽管它可以与select一起使用)。
有人知道为什么吗?
如何轻松地让它工作?
谢谢
注意:事实上,我认为它不适用于then中的任何一个,因为值是布尔值,最后变成字符串,但由于它适用于列表,我想知道为什么它不适用于其他列表。

5m1hhzi4

5m1hhzi41#

我添加了一个数据转换器;

$builder->add('myproperty', 'choice', array(
    'choices' => array(
        'Yes' => '1',
        'No' => '0'
     ),
     'label' => 'My Property',
     'required' => true,
     'empty_value' => false,
     'choices_as_values' => true
 )); 

 $builder->get('myProperty')
    ->addModelTransformer(new CallbackTransformer(
        function ($property) {
            return (string) $property;
        },
        function ($property) {
            return (bool) $property;
        }
  ));

它是神奇的:现在我选中了右边的单选按钮,实体中的值也正确了。

ntjbwcob

ntjbwcob2#

另一个解决方案是使用**Doctrine Lifecycle Callbacksphp类型转换**。
使用此表单类型:

use Symfony\Component\Form\Extension\Core\Type\ChoiceType;

//...

$builder->add('active', ChoiceType::class, [
    'choices' => [
        'active' => true,
        'inactive' => false
    ]
])

实体是这样的:

//...
use Doctrine\ORM\Mapping as ORM;

/**
 * ...
 * @ORM\HasLifecycleCallbacks()                      /!\ Don't forget this!
 * ...
 */
class MyEntity {

    //..

    /**
     * @var bool
     *
     * @ORM\Column(name="active", type="boolean")
     */
    private $active;

    //...

    /**
     * @ORM\PrePersist()
     */
    public function prePersist()
    {
        $this->active = (bool) $this->active; //Force using boolean value of $this->active
    }

    /**
     * @ORM\PreUpdate()
     */
    public function preUpdate()
    {
        $this->active = (bool) $this->active;
    }    

    //...
}
azpvetkf

azpvetkf3#

我的解决方案:

/**
 * @var BooleanToStringTransformer $transformer
*/
private $transformer;

/**
  * @param BooleanToStringTransformer $transformer
 */
public function __construct(BooleanToStringTransformer $transformer) {
   $this->transformer = $transformer;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('myProperty', TextType::class, [
            'empty_data' => false,
        ])
    ;

    $builder->get('myProperty')->addModelTransformer($this->transformer);
}
<?php

namespace App\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;

/**
 * Class BooleanToStringTransformer
 *
 * @package App\DataTransformer
 */
class BooleanToStringTransformer implements DataTransformerInterface
{
    /**
     * @param bool $boolean
     *
     * @return string
     */
    public function transform($boolean): string
    {
        // transform the boolean to a string
        return $boolean ? 'true' : 'false';
    }

    /**
     * @param string $string
     *
     * @return bool
     */
    public function reverseTransform($string): bool
    {
        // transform the string back to a boolean
        return filter_var($string, FILTER_VALIDATE_BOOL);
    }
}

相关问题