【问题标题】:How to make a field that is an entity as hidden in the form with SonataAdmin?如何使用 SonataAdmin 将实体字段隐藏在表单中?
【发布时间】:2017-11-16 12:02:20
【问题描述】:

我需要将实体字段添加为隐藏在我的表单中 在奏鸣曲的管理表单中,我有:

protected function configureFormFields(FormMapper $formMapper)
    {    
        if ($this->getRoot()->getSubject()->getId()) {
            $formMapper
                ->add('driverNight', 'hidden', array(), array('admin_code' => 'cab.admin.driver'))
            ->add('monday', 'checkbox', array('required' => false, "attr" => array('class' => 'checkbox-day'), 'label' => 'Monday', 'value' => '0'))
            ->add('tuesday', 'checkbox', array('required' => false, "attr" => array('class' => 'checkbox-day'), 'label' => 'Tuesday', 'value' => '0'))
            ->add('wednesday', 'checkbox', array('required' => false, "attr" => array('class' => 'checkbox-day'), 'label' => 'Wednesday', 'value' => '0'))
            ->add('thursday', 'checkbox', array('required' => false, "attr" => array('class' => 'checkbox-day'), 'label' => 'Thursday', 'value' => '0'))
            ->add('friday', 'checkbox', array('required' => false, "attr" => array('class' => 'checkbox-day'), 'label' => 'Friday', 'value' => '0'))
            ->add('saturday', 'checkbox', array('required' => false, "attr" => array('class' => 'checkbox-day'), 'label' => 'Saturday', 'value' => '0'))
            ->add('sunday', 'checkbox', array('required' => false, "attr" => array('class' => 'checkbox-day'), 'label' => 'Sunday', 'value' => '0'))

}

实际上,输入中没有值(请参阅检查图像)

知道 driverNight 字段是实体类型,如何将其隐藏?

【问题讨论】:

    标签: forms symfony sonata-admin


    【解决方案1】:

    您可以使用此处详述的数据转换器:data transformer

    我建议您创建一个转换器类,将视图层中的entity 转换为int,并在模型层中从int 反转为entity,并在您的配置表单。

    1. 创建实现Symfony\Component\Form\DataTransformerInterface并包含transformreverseTransform两个方法的模型Transformer类。可以通过传递 2 个参数来构造此类:实体管理器和将转换为 int 的用户实体对象。

    .

    class DriverToIntTransformer implements DataTransformerInterface {
    private $manager;
    private $driver;
    
    public function __construct(ObjectManager $manager, $oUser)
    {
        $this->manager = $manager;
        $this->driver = $oUser;
    }
    public function transform($user)
    {
        if (null === $user) {
            return $this->driver->getId();
        }
        return $user->getId();
    }
    public function reverseTransform($driverNumber)
    {
        if (!$driverNumber) {
            return;
        }
        $oDriver = $this->manager
            ->getRepository('YourUserBundle:User')
            // query for the driver with this id
            ->find($driverNumber);
        if (null === $oDriver) {
            throw new TransformationFailedException(sprintf(
                'An user with number "%s" does not exist!',
                $driverNumber
            ));
        }
        return $oDriver;
    }
    

    2调用transform方法:

    if ($this->getRoot()->getSubject()->getId()) {
            $driver = $this->getRoot()->getSubject()->getId(); 
    $em = $this->container->get('doctrine.orm.entity_manager');
            $oDriver = $em->getRepository('YourUserBundle:User')->find($driver);
            $formMapper
                ->add('driverNight', 'hidden', array(), array('admin_code' => 'cab.admin.driver'));
            $formBuilder = $formMapper->getFormBuilder();
            $formBuilder->get('driverNight')->addModelTransformer(new DriverToIntTransformer($em, $oDriver));
    
    
    
        $formMapper
            ->add('monday', 'checkbox', array('required' => false, "attr" => array('class' => 'checkbox-day'), 'label' => 'Monday', 'value' => '0'));//.....
    }
    

    【讨论】:

    • 谢谢,这正是我需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2016-07-11
    • 2010-09-30
    • 2010-11-18
    相关资源
    最近更新 更多