如何使用 SonataAdmin 创建一个隐藏在表单中的实体字段?

How to make a field that is an entity as hidden in the form with SonataAdmin?

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

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 字段,知道它是实体类型?

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

我建议您创建一个转换器 class,它将视图层中的 entity 转换为 int,并从 int 反转为 entity在模型层中,并在配置表单中使用 addModelTransformer 方法。

  1. 创建模型 Transformer class,它实现 Symfony\Component\Form\DataTransformerInterface 并包含 2 个方法 transformreverseTransform。这个 class 可以通过传递 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 调用转换方法:

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'));//.....
}