2017-10-06 41 views
0

我喜歡它的一種形式:使用表達式constrainst非對象

class FeatureDynamicSequenceType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('upstream', IntegerType::class, [ 
       'data' => 0, 
       'constraints' => [ 
        new LessThan([ 
         'value' => 1000, 
        ]), 
       ], 
      ]) 
      ->add('downstream', IntegerType::class, [ 
       'data' => 0, 
       'constraints' => [ 
        new LessThan([ 
         'value' => 1000, 
        ]), 
       ], 
      ]) 
      ->add('showUtr', CheckboxType::class,[ 
       'data' => true, 
       'label' => 'Show UTR', 
       'required' => false, 
      ]) 
      ->add('showIntron', CheckboxType::class,[ 
       'data' => true, 
       'required' => false, 
      ]) 
     ; 
    } 
} 

在這種形式下,我想添加一個Constrainst,辦理入住手續: 如果showUtr或ShowIntron不會被檢查,然後上游和downstreal能「T是> 0

然後,我想是這樣的:

->add('upstream', IntegerType::class, [ 
    'data' => 0, 
    'constraints' => [ 
     new LessThan([ 
      'value' => 1000, 
     ]), 
     new Expression([ 
      'expression' => 'value > 0 && (this.showUtr || this.showIntron)', 
      'message' => 'You cannot set upstream if you do not display UTRs and introns.', 
     ]), 
    ], 
]) 

但我不能使用它,因爲它不是一個對象,值給我的上游字段的值(這是確定),但我不能訪問到showUtr或showIntron值...

編輯:嘗試回調封閉

->add('upstream', IntegerType::class, [ 
    'data' => 0, 
    'constraints' => [ 
     new LessThan([ 
      'value' => 1000, 
     ]), 
     new Callback([ 
      'callback' => function($data, ExecutionContextInterface $executionContectInterface) { 
       dump($data); 
       $executionContectInterface->addViolation('You cannot set upstream if you do not display UTRs and introns.'); 
      }, 

     ]) 
    ], 
]) 

我有同樣的問題,$數據只包含字段值。

我真的不想創建一個實體,因爲我不堅持它......而且我不相信沒有一個解決方案來檢查它,而不會創建一個實體。

回答

1

我前一個問題here

+0

我已經回調至試過,但問題是完全一樣的。 – mpiot

+0

您必須在configureOptions方法中使用'$ resolver-> setDefaults(['constraints'=> ...])''中的回調約束 –

+0

是的,如果我將測試放在configureOptions中,我可以訪問整個數據,然後在這個地方我已經嘗試了表達式和回調工作。不同之處在於,在Callback中,我可以在該字段上顯示錯誤。在表達式中,我有一個通用的表單錯誤。 – mpiot

1

回答我解決它使用:

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults([ 
     'constraints' => [ 
      new Callback([ 
       'callback' => function($data, ExecutionContextInterface $executionContectInterface) { 
        if ($data['upstream'] > 0 && (!$data['showUtr'] || !$data['showIntron'])) { 
         $executionContectInterface->buildViolation('You cannot set upstream if you do not display UTRs and introns.') 
          ->atPath('[upstream]') 
          ->addViolation() 
         ; 
        } 
       }, 
      ]), 
     ], 
    ]); 
} 

完整的代碼是:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('upstream', IntegerType::class, [ 
      'data' => 0, 
      'constraints' => [ 
       new LessThan([ 
        'value' => 1000, 
       ]), 
      ], 
     ]) 
     ->add('downstream', IntegerType::class, [ 
      'data' => 0, 
      'constraints' => [ 
       new LessThan([ 
        'value' => 1000, 
       ]), 
      ], 
     ]) 
     ->add('showUtr', CheckboxType::class, [ 
      'data' => true, 
      'label' => 'Show UTR', 
      'required' => false, 
     ]) 
     ->add('showIntron', CheckboxType::class, [ 
      'data' => true, 
      'required' => false, 
     ]) 
    ; 
} 

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults([ 
     'constraints' => [ 
      new Callback([ 
       'callback' => function($data, ExecutionContextInterface $executionContectInterface) { 
        if ($data['upstream'] > 0 && (!$data['showUtr'] || !$data['showIntron'])) { 
         $executionContectInterface->buildViolation('You cannot set upstream if you do not display UTRs and introns.') 
          ->atPath('[upstream]') 
          ->addViolation() 
         ; 
        } 
       }, 
      ]), 
     ], 
    ]); 
} 
相關問題