Zend Framework Formu Mantıksız Davranış

2 Cevap php

En Fikrimi göstermek için kullanacağınız kısa bir kod parçası ile bu kapalı başlayalım:

$title = new Zend_Form_Element_Text('title', array(
    'label' => 'Title',
    'required' => false,
    'filters' => array(
        'StringTrim',
        'HtmlEntities'
    ),
    'validators' => array(
        array('StringLength', false, array(3, 100))
    ),
));

Bu önemli satır:

'required' => false,

Hangi girdi alan zorunlu değildir ve bunu doldurmadan formu göndermek anlamına gelir. Ancak, bu da bu alanda doldurmak için seçerseniz filtreler ve validators bunun için geçerli değildir anlamına gelir.

Sağduyu bu irrasyonel bir davranış olduğunu söylüyor. Ben HTML giriş alanları ile ilgili olarak 'gerekli' kelimesini anlamak yolu: o dolu değil ama kullanıcı bunu filtreleri ve doğrulayıcılar hem de doldurmak için karar verirse bunun için geçerli olmalıdır eğer gerekli olmadığı bir giriş alanı null dönmelidir. Bu bana mantıklı budur. Benimle aynı fikirde veya benim sağduyu o kadar yaygın değil mi?

Şimdi daha pratik soru, bu Zend_Form nasıl davranacağını, çünkü ne ben yukarıda açıklandığı gibi çalışacak gerekli değildir alanları (hiçbir kullanıcı tarafından yazılmışsa, aksi takdirde NULL döndürür filtreleri ve normalde uygulamak doğrulayıcı) elde edebilirsiniz.

2 Cevap

Gerçekten tam bir Sorunuzun cevabı, ama yorumlar sözdizimi biçimlendirme yok çünkü; burada boş eğer alan değerler null yapmak için kullanabileceğiniz bir filtre bulunuyor.

class My_Filter_NullIfEmpty implements Zend_Filter_Interface
{
    public function filter( $value )
    {
          // maybe you need to expand the conditions here
    	if( 0 == strlen( $value ) )
    	{
    		return null;
    	}
    	return $value;
    }
}

About the required part: I'm not sure really. You could try to search the ZF mailinglists on Nabble:

http://www.nabble.com/Zend-Framework-Community-f16154.html

Or subscribe to their mailinglist, and ask them the question. Either through Nabble, or directly via the addresses on framework.zend.com: http://tinyurl.com/y4f9lz

Edit: Ok, so now I've done some tests myself, cause what you said all sounded counter intuitive to me. Your example works fine with me. This is what I've used:

<?php

class Form extends Zend_Form
{
    public function init()
    {

        $title = new Zend_Form_Element_Text('title', array(
                'label' => 'Title',
                'required' => false,
                'filters' => array(
                    'StringTrim',
                    'HtmlEntities',
                    'NullIfEmpty' // be sure this one is available
                ),
                'validators' => array(
                    array('StringLength', false, array(3, 100))
                ),
            ));

        $this->addElement( $title );
    }
}

$form = new Form();

$postValues = array( 'title' => '' ); // or
$postValues = array( 'title' => '        ' ); // or
$postValues = array( 'title' => 'ab' ); // or
$postValues = array( 'title' => ' ab ' ); // or
$postValues = array( 'title' => '<abc>' ); // all work perfectly fine with me

// validate the form (which automatically sets the values in the form object)
if( $form->isValid( $postValues ) )
{
    // retrieve the relevant value
    var_dump( $form->getValue( 'title' ) );
}
else
{
    echo 'form invalid';
}

?>

Aslında ne sizin beklentileri olarak tarif Zend_Form nasıl çalıştığını tam olarak bulunmaktadır. Hiçbir değer geçirilir ise (a), bu doğrulama atlar, ama (b) değer geçirilir ise, o geçerli olmak üzere tüm doğrulayıcılar geçmesi gerekir: Eğer gerekli değil gibi elemanı işaretlerseniz, o zaman şu olur.

BTW, ZF soru sormak için en iyi yer ZF posta listeleri üzerinde: http://framework.zend.com/archives