gpt4 book ai didi

forms - 如何在 Symfony 2 表单字段中设置默认值?

转载 作者:行者123 更新时间:2023-12-05 01:03:15 25 4
gpt4 key购买 nike

我一直在尝试使用 Symfony 2 设置表单。

所以我关注了the tutorial并且我创建了一个特殊的类来创建表单和处理 Controller 外部的验证过程(如文档中所示)

但是现在我需要自动填写一个字段,我听说我必须在 ProductType.php 中完成,这里创建了表单(用于我的产品)。

但我不知道该怎么做,这是我在 ProductType.php 中的 buildForm 函数:

class QuotesType extends AbstractType
{
private $id;

public function __construct($id){
$this->product_id = $id;
}

public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('user_name', 'text')
->add('user_lastname', 'text')
->add('user_email', 'email')
->add('user_comments', 'textarea')
->add('user_product_id', 'hidden', array(
'data' => $this->product_id,
));
;
}

它显然不起作用,因为我收到一条 SQL 错误,说我的字段为空。

如何为 user_product_id 设置默认值?我应该直接对对象做吗?

编辑:

这是我实体的部分代码:

namespace QN\MainBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
* QN\MainBundle\Entity\Quotes
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="QN\MainBundle\Entity\QuotesRepository")
*/
class Quotes
{

public function __construct($p_id)
{
$this->date = new \Datetime('today');
}
/**
* @var integer $id
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @var integer $user_product_id
*
* @ORM\Column(name="user_product_id", type="integer")
*/
private $user_product_id = "1";

/**
* @var datetime $date
*
* @ORM\Column(name="date", type="datetime")
*/
private $date;

还有我的 Controller :

public function requestAction($id)
{
$repository = $this->getDoctrine()
->getEntityManager()
->getRepository('QNMainBundle:Categories');
$categories = $repository->findAll();

$quote = new Quotes($id);
$form = $this->createForm(new QuotesType(), $quote);

$formHandler = new QuotesHandler($form, $this->get('request'), $this->getDoctrine()->getEntityManager());

if( $formHandler->process() )
{
return $this->redirect( $this->generateUrl('QNMain_Product', array('id' => $id)) );
}

return $this->render('QNMainBundle:Main:requestaform.html.twig', array(
'categories' => $categories,
'id' => $id,
'form' => $form->createView(),
));

}

我的处理程序:

namespace QN\MainBundle\Form;

use Symfony\Component\Form\Form;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManager;
use QN\MainBundle\Entity\Quotes;

class QuotesHandler
{
protected $form;
protected $request;
protected $em;

public function __construct(Form $form, Request $request, EntityManager $em)
{
$this->form = $form;
$this->request = $request;
$this->em = $em;
}

public function process()
{
if( $this->request->getMethod() == 'POST' )
{
$this->form->bindRequest($this->request);

if( $this->form->isValid() )
{
$this->onSuccess($this->form->getData());

return true;
}
}

return false;
}

public function onSuccess(Quotes $quote)
{
$this->em->persist($quote);
$this->em->flush();
}

}

我还把我尝试在实体中设置的 Date 放在这里,我可能在这两种情况下都做错了,因为我也不能让它工作..日期不在buildForm 函数,不知道该不该..

最佳答案

另一种方法是创建 Form Type Extension :

namespace App\Form\Extension;

// ...

class DefaultValueTypeExtension extends AbstractTypeExtension
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
if (null !== $default = $options['default']) {
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
static function (FormEvent $event) use ($default) {
if (null === $event->getData()) {
$event->setData($default);
}
}
);
}
}

public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefault('default', null);
}

public static function getExtendedTypes(): iterable
{
yield FormType::class;
}
}

现在任何可能的值都可以作为默认值传递给任何表单字段:

$form->add('user', null, ['default' => $this->getUser()]);
$form->add('user_product_id', null, ['default' => 1]);

当您没有机会 Hook 到绑定(bind)对象的初始化过程时,此方法特别有用。

关于forms - 如何在 Symfony 2 表单字段中设置默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11264491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com