2012-11-17 33 views
6

gerekli. , Şartlı gerekli bazı Input s yapmak mümkün mü? Ben böyle bir kod anlamına: Şartlı ben o <code>InputFilter</code> var kullanarak giriş doğrulayarak am Zend Framework 2. kullanarak uygulama yapıyorum Zend Framework'ün 2 inputfilter

$filter = new \Zend\InputFilter\InputFilter(); 
$factory = new \Zend\InputFilter\Factory(); 
$filter->add($factory->createInput(array(
    'name' => 'type', 
    'required' => true 
))); 
$filter->add($factory->createInput(array(
    'name' => 'smth', 
    'required' => true 
))); 

Ben alanını something, type 1 eşittir SADECE zaman, gerekli istiyorum. Bunu yapmanın bir yolu var mı? Yoksa sadece özel doğrulayıcı mı oluşturmalıyım?

cevap

8

Önce, sen itibariyle boş/boş değerlere doğrulamasını etkinleştirmek isteyebilirsiniz Empty values passed to Zend framework 2 validators

aşağıdaki örnekte olduğu gibi bir geri çağırma giriş filtresi kullanabilirsiniz:

$filter = new \Zend\InputFilter\InputFilter(); 
$type = new \Zend\InputFilter\Input('type'); 
$smth = new \Zend\InputFilter\Input('smth'); 

$smth 
    ->getValidatorChain() 
    ->attach(new \Zend\Validator\NotEmpty(\Zend\Validator\NotEmpty::NULL)) 
    ->attach(new \Zend\Validator\Callback(function ($value) use ($type) { 
     return $value || (1 != $type->getValue()); 
    })); 

$filter->add($type); 
$filter->add($smth); 

Bu temelde çalışacak değeri smth boş bir dize olduğunda nd type değeri 1 değildir. type değeri 1 ise, smth boş bir dize farklı olmak zorundadır.

+0

PHP'nin arayüzleri kontrol etmenin çok gevşek bir yolu olduğundan, bir değerleme aracı tanımlamak mümkündür: 'isValid ($ value, array $ context = [])'. Bu şekilde, 'bağlam', içeriğe dayalı olarak validasyonu etkinleştirmek/devre dışı bırakmak için kullanılabilir. – Ocramius

-3

Maalesef bu kadar sevdiği koşullara dayalı gerekli seçeneğini ayarlamak olurdu: Her şeyden

$filter->add($factory->createInput(array(
    'name' => 'smth', 
    'required' => (isset($_POST['type']) && $_POST['type'] == '1'), 
))); 
+4

Bu yanlıştır. Bu vesile ile filtrelenmiş gereken istek temel alan bir filtre ile ilgili değerleri ayarlarken: Bu kavramsal olarak yanlış. – Ocramius

1

Örnek vermek gerekirse, Ocramius'un çalışması için $ type-> getValue her zaman NULL oldu. Ben $ bağlam kullanmaya hafifçe kodu değişti ve bu benim için hile yaptı:

$filter = new \Zend\InputFilter\InputFilter(); 
$type = new \Zend\InputFilter\Input('type'); 
$smth = new \Zend\InputFilter\Input('smth'); 

$smth 
    ->getValidatorChain() 
    ->attach(new \Zend\Validator\NotEmpty(\Zend\Validator\NotEmpty::NULL)) 
    ->attach(new \Zend\Validator\Callback(function ($value, $context){ 
     return $value || (1 != $context['type']); 
    })); 

$filter->add($type); 
$filter->add($smth);