我构建了一个与任何实体无关的表单。
class CalculatorType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('debutActivite', 'date', array(
'label' => 'Quand avez-vous commencé votre activité ?',
'widget' => 'single_text',
'format' => 'dd/MM/yyyy',
'label_attr' => array(
'class' => 'control-label',
),
'attr' => array(
'class' => 'form-control createDatepicker',
'placeholder' => 'dd/mm/aaaa',
),
'required' => true,
))
->add('demandeAccreAccepteeDate', 'date', array(
'label' => 'A quelle date a-t-elle été acceptée ?',
'widget' => 'single_text',
'format' => 'dd/MM/yyyy',
'label_attr' => array(
'class' => 'control-label',
),
'attr' => array(
'class' => 'form-control createDatepicker',
'placeholder' => 'dd/mm/aaaa',
),
))
}
}
在我的控制器中,我检查表单是否有效:
public function indexAction(Request $request)
{
$form = $this->createForm(new CalculatorType(), array());
$form->handleRequest($request);
if ($form->isValid()) {
$data = $form->getData();
}
}
不需要“demandeAccreAccepteeDate”字段。但如果它不是空的,我想验证它是否大于或等于“debutActivite”字段。
如果知道我没有计算器实体,我该怎么做呢?
答案 0 :(得分:1)
创建一个课程(你不需要坚持执行数据库)来保存你的日期
namespace Your\Bundle;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\ExecutionContextInterface;
class Daterange
{
/**
* @Assert\Date()
*/
public $debutActivite;
/**
* @Assert\Date()
*/
public $demandeAccreAccepteeDate;
/**
* @Assert\Callback
*/
public function validate(ExecutionContextInterface $context)
{
// Do your checks
if ( ($this->demandeAccreAccepteeDate != '') &&
($this->demandeAccreAccepteeDate < $this->debutActivite) ) {
$context->addViolationAt(
'demandeAccreAccepteeDate',
'Date not valid. Is before debutActivite',
array(),
null
);
}
}
}
将日期分配给表单
class CalculatorType extends AbstractType
{
[..]
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Your\Bundle\Daterange',
));
}
}
在你的控制器中以这种方式创建表单(在开头添加use Your\Bundle\Daterange
)
$form = $this->createForm(new CalculatorType(), new Daterange());