Symfony 3.3预填充自定义表单

时间:2018-02-23 02:06:54

标签: php symfony doctrine-orm

我在Symfony 3.3中有一个自定义表单,其中包含以下信息:

                $builder->add('frecuency', TextType::class, array('required' => false,
        'label' => 'Execution Frecuency: '))
                    ->add('save_submit', SubmitType::class, 
                            array('label' => 'Save'));

我不再需要此表单上的字段,但此信息来自以下具有更多字段的实体:

/**
(...)
class SrvrsServers
{
/**
 * @var string
 *
 * @ORM\Column(name="id", type="integer", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue
 */
private $id;
(...)
/**
 * @var string
 *
 * @ORM\Column(name="frequency", type="integer", nullable=true)
 */    
private $frequency;

然后我的问题是如果表格完全是自定义的,那么如何从数据库填充此字段frecuency

我的控制器现在看起来像这样:

 /**
 * @Route("/server/{id}", name="edit_server")
 */
public function editAction ($id){

    $server = $this->getDoctrine()->getRepository('NCbrtBundle:SrvrsServers')
            ->find($id);
    if (!$server) {
        throw $this->createNotFoundException('Server not found for ID:  '. $id);
    }
    $form = $this->createForm(ServerType::class);

    return $this->render('NCbrtBundle:Server:server.html.twig', array(
        'form' => $form->createView(),
        'server' => $server,
    ));
}

我不知道如何或在何处将此信息提供给表单以及如何编写它。还有一个问题,我需要过滤来自数据库的信息,并根据值添加或修改它。该字段存储在几秒钟内,我需要以人类可读的格式存储它,如分钟,小时或天。我已经有了这样做的函数(类),但到目前为止还无法使用它。有人可以帮忙吗?

作为附加信息,这是表单的外观: enter image description here

1 个答案:

答案 0 :(得分:1)

您可以使用Data Transformer将字段的数据转换为可以在表单中显示的格式(并在提交时返回)。

public function buildForm(FormBuilderInterface $builder, array $options)
{
    //...
    $builder->add('frecuency', TextType::class, array(
        'required' => false,
        'label' => 'Execution Frecuency: ')
    )
    //...

    $builder->get('frecuency')
        ->addModelTransformer(new CallbackTransformer(
            function ($hashToReadableString) {
                // make readable string from hash
                $readableString = MyLib::unHash($hashToReadableString);

                return $readableString;
            },
            function ($readableStringToHash) {
                // transform the readable string back to a hash string
                $hashString = MyLib::hash($readableStringToHash);

                return $hashString;
            }
        ))
    ;
}

CallbackTransformer将两个回调函数作为参数。第一个将原始值转换为将用于渲染字段的格式。第二种方法是相反的:它将提交的值转换回您将在代码中使用的格式。

来源:Data Transformer