Zend_Form: Bir onay kutusu işaretli ise Eleman, yalnızca gerekli olmalıdır

6 Cevap php

Ben kullanıcı "Yeni adresi oluşturmak" a onay kutusunu işaretleyin ve sonra aynı biçimde bu yeni adres için alanları doldurun bir form var.

Şimdi onay kutusunun işaretli olup olmadığını SADECE bu yeni adresin alanları doğrulamak istiyor. Aksi takdirde, bunlar göz ardı edilmelidir.

Ben nasıl yapabilirim Zend_Validate ile Zend_Form kullanıyor?

Teşekkürler!

6 Cevap

Bunu yapmak için en iyi ve daha doğru bir şekilde özel bir doğrulayıcı oluşturma olduğunu düşünüyorum.

İki farklı şekillerde bu doğrulayıcı yapabileceği bir yöntem isValid, $ bağlam geçirilen ikinci parametre kullanılarak, yani doğrulanan bugünkü biçimidir, ya da, Onay Kutusu öğe enjekte, doğrulama gerçekleşmesi için kontrol edilmesi için bu ihtiyacı, kurucudaki. Ben son tercihim:

<?php
class RequiredIfCheckboxIsChecked extends Zend_Validate_Abstract {

    const REQUIRED = 'required';

    protected $element;

    protected $_messageTemplates = array(
        self::REQUIRED => 'Element required'
    );

    public function __construct( Zend_Form_Element_Checkbox $element )
    {
        $this->element = $element;
    }

    public function isValid( $value )
    {
        $this->_setValue( $value );

        if( $this->element->isChecked() && $value === '' ) {
            $this->_error( self::REQUIRED );
            return false;
        }

        return true;
    }

}

Kullanımı:

class MyForm extends Zend_Form {

    public function init()
    {
        //...

        $checkElement = new Zend_Form_Element_Checkbox( 'checkbox' );
        $checkElement->setRequired();

        $dependentElement = new Zend_Form_Element_Text( 'text' );
        $dependentElement->setAllowEmpty( false )
            ->addValidator( new RequiredIfCheckboxIsChecked( $checkElement ) );

        //...
    }

}

Ben kodu test değil, ama çalışması gerektiğini düşünüyorum.

Ben aslında bu çalıştırmak vermedi, ama bu nedenle içinde çalışması gerekir. Ben işe yaradığını daha önce benzer bir şey yaptık, ama kod nerede olduğunu hatırlayamadım.

<?php

class My_Form extends Zend_Form
{
  public function init()
  {
    $checkbox = new Zend_Form_Element_Checkbox("checkbox");
    $checkbox->setValue("checked");

    $textField = new Zend_Form_Element_Text("text");

    $this->addElements(array("checkbox", "text"));

    $checkbox = $this->getElement("checkbox");

    if ($checkbox->isChecked() )
    {
       //get textfield
       $textField = $this->getElement("text");

       //make fields required and add validations to it.
       $textField->setRequired(true);
    }

  }

}

İşte ben birbirimize karşı birden çok öğeleri doğrulamak gerekir yoksa ne

$f = new Zend_Form();

if($_POST && $f->isValid($_POST)) {
  if($f->checkbox->isChecked() && strlen($f->getValue('element')) === 0) {
    $f->element->addError('Checkbox checked, but element empty');
    $f->markAsError();
  }

  if(!$f->isErrors()) {
    // process
    ...
    ...
  }
}

Örneğin form özelliği uygulamak zorunda asla olsa ben de ZF bu nasıl merak ettik.

Akla gelen bir fikir gibi documented, bir parametre olarak onay kutusunu alanını kabul özel bir doğrulayıcı oluşturmak ve bir validator zinciri içinde çalıştırmak. Onay kutusu işaretli ise, validator hatası dönmek olabilir. Sonra tüm doğrulamaları başarısız ve ancak ondan sonra doğrulama başarısız olduğu formu tedavisinde olup olmadığını kontrol edebilirsiniz.

Form doğrulama özelleştirme bu düzeyde rahatsız edici olabilir, bu yüzden belki formun isValidPartial yöntemini kullanarak daha iyi olurdu.

Ben senin eleman başka bir zend form öğesinin değerine göre gerekli yapacak özel bir doğrulayıcı yarattı.

İşte tam code bulunuyor. Ben bu kimse yardımcı olur umarım.

Fikir özel doğrulayıcı oluşturmak ve koşullu elemanın adı ve yapıcı olduğunu koşullu elemanın değeri geçmektir. Zend_Validor en isValid yöntem zaten tüm form elemanı adları ve değerleriyle birlikte için validtor iliştiriyorsanız elemanının değerine erişimi vardır.

Yani, isValid yöntemi içinde size form elemanı gerekli bir unsur olması gerektiğini belirlemek için gereken tüm bilgilere sahip.

Senin iyi çözüm için size jcm ederiz.

Ben fark ettik ancak 2 şey:

  • Doğrulayıcı da isValid yöntem başarı durumunda true dönmek zorundadır.
  • Onaylayıcısı metin alanına false için allowEmpty seçeneğini geçecek olmadan form doğrulama sırasında yürütülmez.