Zend Framework formlar, dekoratörler ve doğrulama: geri düz HTML gitmeli?

10 Cevap php

10 Cevap

Ben de varsayılan dekoratörler büyük bir ağrı olarak bulabilirsiniz. I why olduklarını yolu anlıyorum, ama ben 'rahatsızlık faktörü' fena halde göz ardı edilmiştir düşünüyorum.

Her neyse, ben senin formlar için ViewScripts kullanarak öneriyoruz. Bunun yerine, ViewScripts, senin Formu sınıfında açıkça başvurulan bir tür "alt görünüm" olarak hareket ve her elemanın düzenini kontrol etmek için izin verir - bu İzlenme olarak aynı olmadığını unutmayın. ViewScripts nasıl kullanılacağı örnekler geçmişte bulmak biraz zor olmuştur, ama ben yararlı bir şey sağlayan bir bıçak almaya çalışacağım.

İlk olarak, form sınıfında loadDefaultDecorators geçersiz:

public function loadDefaultDecorators() {
     $this->setDecorators(
         array(
             array('ViewScript', 
                 array('viewScript' => 'foo/bar.phtml')
             )
          )
      );        
}

Bu bar.phtml /views/scripts/foo bulunan adında bir ViewScript referans olacaktır. "ViewScript" ve yukarıdaki "viewScript" in küçük harf farklılıkları unutmayın.

Sonra, bu can sıkıcı dt / aa sarma olmadan ama görüntüler sağlamak için her öğeye uygulanan dekoratörler esneteceksiniz. Örneğin:

$baz = new Zend_Form_Element_Text('bazInput');
$baz->setDecorators(array('ViewHelper','Errors'));

Son olarak, gibi sizin ViewScript, inşa etmek gerekir:

<form method="post" action="<?php echo $this-element->getAction() ?>">
    <table>
        <tr>
            <td><label for="bazInput">Baz:</label></td>
            <td><?php echo $this->element->bazInput ?></td>
        </tr>
    </table>
    <input type="submit" value="Submit Form" />
</form>

Açıkçası bu çok basit bir örnek, ama bu form elemanları ve form eylemi başvuru nasıl göstermektedir.

Sonra View, sadece her zamanki gibi formu referans ve çıkış. Javascript ekleyerek kolayca dahil - bu şekilde form düzenleri üzerinde çok daha hassas bir denetime sahip olabilir.

Bu yaklaşım, hem gereksinimlerini giderir inanıyorum: Eğer düz HTML formları oluşturmak ve hala Zend Form doğrulama mekanizmasının yararlanabilirsiniz.

Ben büyük bir projede, son 10 ay içinde mümkün olduğunca çok sayıda Zend bileşenlerini kullanarak edilmiş ve Zend_Form *** en büyük acı olmuştur. Formlar güzel yapmak için işlemek için yavaş ve zor. Hatta bana Alt Formlar başlamak etmeyin. (: Ben ama hız vermek çok yardımcı görünmüyordu "scaling zend_form" adlı ilginç bir yazı gördüm

Ben görünümünde düz HTML kullanarak tüm benim formları yapma konusunda düşünme ve sadece doğrulama ve filtreleme (render değil) yapmak Zend_Form kullanıyorum. O, YA ben sadece tüm Formu yönü olmadan, Zend_Validate ve Zend_Filter kullanacaktır ya.

Eğer size yardımcı olur bir araç sadece bir araçtır. Aksi takdirde, sadece bir engel bulunuyor.

İşte Zend_Form ile öğrendim ne:

O şey yapalım, ve bu uzun vadede size satır kod bir ton tasarruf edecek.

Ticaret kapalı bir şeyler istediğiniz şekilde görüntülemek için almak için daha fazla CSS yazma sonuna kadar olduğunu. Neredeyse herhangi bir HTML öğesi bir şey gibi görünmek tarz olabilir, unutmayın. Varsayılan olarak, Zend_Form almak gerekiyor gibi spesifik (veya geniş) almak için CSS seçiciler bol verir. Ben bunları olmak istediğini tam olarak ne için varsayılan dekoratörler ebil'iþ bir davayı görmek için henüz ettik.

Verilen, ben büyük, çirkin bir CSS dosyası var, ama benim deneyim, muhtemelen sonunda zaten büyük, çirkin bir CSS dosyası olacaktır. Ben başvuru belirli bir form kodlama / doğrulama / filtreleme / taşıma / etc endişesi ancak bir CSS dosyasındaki bazı özel tarz unsurları ile ilgili değil kapalı ticaret alır.

İpucu Bu rota gitmek karar verirseniz: Kullandığınız emin bir CSS style reset script yapmak

İşte Zend Formunu kullanarak benim projelerde kullanmak birkaç dekoratörler vardır. Bu, inanıyorum ki, anlamak için yeteri kadar basit.

$stdRowDec = array('ViewHelper', 'Description', 'Errors', array(array('data'=>'HtmlTag'), array('tag' => 'td', 'width' => '200')), array('Label', array('escape' => false, 'class' => 'zfFormLabel', 'tag' => 'td')), array(array('row'=>'HtmlTag'), array('tag'=>'tr')));
$startRowDec = array('ViewHelper', 'Description', 'Errors', array(array('data'=>'HtmlTag'), array('tag' => 'td')), array('Label', array('escape' => false, 'tag' => 'td', 'class' => 'zfFormLabel')), array(array('row'=>'HtmlTag'), array('tag'=>'tr', 'openOnly'=>true)));
$startRowOpenOnlyDec = array('ViewHelper', 'Description', 'Errors', array(array('data'=>'HtmlTag'), array('tag' => 'td', 'openOnly'=>true)), array('Label', array('escape' => false, 'class' => 'zfFormLabel', 'tag' => 'td')), array(array('row'=>'HtmlTag'), array('tag'=>'tr', 'openOnly'=>true)));
$midRowDec = array('ViewHelper', 'Description', 'Errors', array(array('data'=>'HtmlTag'), array('tag' => 'td')),array('Label', array('escape' => false, 'class' => 'zfFormLabel', 'tag' => 'td')));
$midRowCloseOnlyDec = array('ViewHelper', 'Description', 'Errors', array(array('data'=>'HtmlTag'), array('tag' => 'td', 'closeOnly'=>'true')),array('Label', array('escape' => false, 'class' => 'zfFormLabel', 'tag' => 'td')));
$midRowCloseOnlyNoLabelDec = array('ViewHelper', 'Description', 'Errors', array(array('data'=>'HtmlTag'), array('tag' => 'td', 'closeOnly'=>'true')));
$endRowDec = array('ViewHelper', 'Description', 'Errors', array(array('data'=>'HtmlTag'), array('tag' => 'td')), array('Label', array('escape' => false, 'class' => 'zfFormLabel', 'tag' => 'td')), array(array('row'=>'HtmlTag'), array('tag'=>'tr', 'closeOnly'=>'true')));
$endRowCloseOnlyNoLabelDec = array('ViewHelper', 'Description', 'Errors', array(array('data'=>'HtmlTag'), array('tag' => 'td', 'closeOnly'=>'true')), array(array('row'=>'HtmlTag'), array('tag'=>'tr', 'closeOnly' => 'true')));
$buttonEndRowDec = array('ViewHelper', 'Description', 'Errors', array(array('data'=>'HtmlTag'), array('tag' => 'td', 'colspan'=>'2', 'align'=>'center')), array(array('row'=>'HtmlTag'), array('tag'=>'tr', 'closeOnly'=>'true')));
$buttonDecorators = array('ViewHelper', array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'element')), array(array('label' => 'HtmlTag'), array('tag' => 'td', 'placement' => 'prepend')), array(array('row' => 'HtmlTag'), array('tag' => 'tr')), );

I have been using Zend Framework for about a year and I have only used Zend_Form for one of my projects (the first one). I gave up on Zend_Form after I spent all of 15 mins trying to position my 'or Cancel' link. I do love the integration though.

Ben şimdi düz HTML formları kullanmak ve modeli Zend_Filter_Input kullanın (çoğu durumda Zend_Db_Table ama benim son projede bir Servis Katmanı eklemek zorunda).

Modeldeki ZFI kullanılarak kontrol kodunun bir örneği, parçacık. Hata işleme ve ortak doğrulama yöntemleri Zend_Db_Table ve benim sınıfları genişletmek bir alt sınıfında bulunmaktadır.

Bir görünüm yardımcı hata iletileri dizi biçimlendirir.

if ($this->_request->isPost()) {
    $data = $this->_request->getPost();
    $event = new Default_Model_DbTable_Event(); 		
    $event->createRow($data)->save();

    if ($event->hasErrors()) {
        $this->view->errors = $event->getErrorMessages();
        $this->view->event = $data;
    } else {
        $this->_redirect('events');
    }
}

Ben ikinci sözü ne lo_fye. Benim durumumda Zend Formlar aksak ve iyi düşünülmüş değildir.

The solution I found easiest and most flexible is to create two form files, 1. the form class, which initializes the form elements, then a view script to display the form elements. In my form class I turn off all decorators, minus the actual form element. e.g.: ->removeDecorator('HtmlTag') ->removeDecorator('DtDdWrapper') ->removeDecorator('Label') ->removeDecorator('Errors');

$ This-> setDecorators (array (array ('ViewScript', array ('viewScript' => 'yol / / script_form.phtml')): Sonra form elemanları başlatır kurucu sonunda, görünüm komut geçmek ));

$ This-> eleman> form_element_id: görünüm komut ben giriş alanı (örneğin) sadece o öğeyi göstermek nerede olacağını, sonra ben gibi tam olarak nasıl formu biçimlendirmek. Ve ben hata süslemeleri kaldırmak ve sadece hata yığınını kapmak ve ben düşünmek gerektiğini nasıl görüntülemek fark.

Olumsuz her bir form için bir görünüm komut dosyası oluşturmak ya da yeniden sistem çeşit kendiniz oluşturmak, böylece ekstra çalışma olacaktınız. Ama sonunda onun çok daha kolay imo, düzeninize sığacak formları tasarlamak için.

Zend Form kullanın ve kendinizi HTML üretir :) Sadece değişiklikleri ve Heep HTML ve ZF aynı form elemanları :) izlemek zorunda

Short Answer: Yalnızca doğrulama ve filtreleme için Zend_Form ve formu istediğiniz şekilde işlemek için düz eski görünümü komut dosyalarını kullanabilirsiniz.

Long Answer: Ben bu formun HTML üretmek için Zend_Form kullanmak için değmez sonuca geldi. En azından şirkette işe. Ama neden?

Sadece "sessizce" Benim form içinde bir div içinde bir bağlantı eklemek için bir sınıf oluşturmak istiyorsanız (veya kesmek kullanmak) değil, basit. Ben sadece kolayca basit HTML ile eklenebilir işlevsellik eklemek için birden dekoratörler oluşturmak zorunda istemiyorum, ve en önemlisi, bizimle çalışmak tasarımcılar sınıf [es] sadece bir (veya iki veya daha fazla) düzenlemek istemiyorum işlerini yapmak.

Biz Zend_Form kullanmaya devam, ama sadece bizim formları doğrulamak ve filtre. Ve bunları oluşturmak için değil.

Ben çok benim argümanlar ile aynı fikirde değilim biliyorum, ama uykusuz geceler Zend_Fom sayesinde çektirdi birinden sadece görüş bulunuyor.

@ Cal Jacobson tarafından üst cevaba Düzenle / Yorum.

Değişiklik yetersiz karakter olduğu için değişiklik yapamazsınız, çünkü yetersiz rep ama yorum yapamam ...

$this-element->getAction()

olmalıdır

$this->element->getAction()

Ben OP bunu biliyor ancak doğrudan cevap kodu kullanmak için çalışırken bir düzeltme, bir hatayı önlemek eminim.