Zend Form: Nasıl benim iradesine viraj yapabilirim?

14 Cevap php

Ben bile ZF ile anlaşma birkaç kitap satın almış, konuyla ilgili Google tarafından sunulan mesajları dolaştılar ettik, manuel birçok kez okudum. Şimdi, neden hala şaşkın ben?

Ben, Zend_Form kullanarak, ince doğrular ve işlevleri bir biçimde yapabilirsiniz. Bunu ben ve ben bunu istiyorum hata mesajları ile bakmak istiyorum tam benzeyen bir form yapmak ne yapamam. Ben formu, vb ortasında metin eklemek istiyorum, ben korkak düzenleri istiyorum, özel düğmeleri istiyorum

Herkes şeyler bu tür ulaşmanın basit bir yolu var mı? Çerçeve Bana zaman tasarrufu ziyade mal oluyor gibi bana hissettiren bir şey? Ben, benim kendi formunu yapmak ... Zend Form vazgeçmek olabilir onun eylem yayınlanmıştır verileri doğrulamak ve işlemek için bir sayfa isabet var ve elimden geldiğince hızlı yazabilirsiniz gibi yaklaşık yapabilirdi ama gerçekten bu "get" ve mümkün olmak istiyorum görünüşte amaçlandığı olarak kullanmak için.

Herhangi bir tavsiye? Herhangi bir basit zend formu ile "nasıl için" özel düğmeler, korkak düzenleri ve temel (zor konular üzerinde atlamak temel öğreticiler veya olduğu gibi oldukça gelişmiş ton) için "Getting Things Done"?

14 Cevap

Barrett Conrad'ın tavsiye ben önerdi olurdu budur. Ayrıca, sizin formu işlemek için bir form nesnesi kullanmanız gerekmez unutmayın.

Yapabileceğin bir şey form sınıf olarak aynı adı taşıyan unsurları vardır sizin görünümü komut bir form oluşturun.

Sizin HTML formu:

<form action="/login/" method="post">
<fieldset>
    <label for="username">Username:</label>
    <input type="text" size="10" name="username" />
    <label for="password">Password:</label>
    <input type="password" size="10" name="password" />
    <input type="submit" />
</fieldset>
</form>

Sizin sınıfı:

class LoginForm extends Zend_Form
{
    public function init()
    {
        $username = $this->createElement('text','username');
        $username->setRequired(true);
        $this->addElement($username);

        $password = $this->createElement('password','password');
        $password->setRequired(true);
        $this->addElement($password);        
    }
}

Form sınıfı, HTML formu, sizin sınıfta her eleman kendi doğrulayıcılar ve gereksinimleri vardır yansıtır. Geri eylem form sınıfının bir örneğini oluşturmak ve sonrası doğrulamak / Bu formda karşı değişkenler olsun:

$form = new LoginForm();
if ($this->_request->isPost()) {
    if ($form->isValid($this->_request->getParams())) {
        // do whatever you need to do
    } else {
        $this->view->errors = $form->getMessages();
    }
}

Bu yöntemi kullanarak, bir grup içinde formun üstündeki hata mesajları görüntüleyebilirsiniz.

Bu temel bir örnektir, ama bu dekoratörler kullanmayı öğrenmek için zaman harcamadan formun sunumu üzerinde tam kontrole sahip olmanızı sağlar. Zend_Form gücü çok bence, kendi onay ve filtreleme özellikleri olduğunu. Bu size bu gücü veriyor. Geri Böyle bir çözüm için ana beraberlik sizin œkod HTML formu form sınıf ile out-of-senkron olabilir olmasıdır.

Lütfen görünümünde tek tek her öğe Render - örneğin

<!-- view script here -->
<form method="POST">
Name: <?php echo $this->myForm->getElement('name')->render(); ?>
some other text between the fields
Birthdate: <?php echo $this->myForm->getElement('birthdate')->render(); ?>
<input type="submit" />
</form>

Bu (hata iletileri görüntülemek ve doğrulama başarısız olduğunda form alanlarının değerlerini korumak için yani) Zend_Form görünümü yardımcıları kullanma yeteneğini korur, ancak sizi tam özelleştirme yeteneği verir.

Eğer daha ileri gitmek istiyorsanız, o zaman tek tek form öğelerinin varsayılan dekoratörler kapatın ve daha sonra etiketleri (hata iletileri ve etiketler için yani) kullanılır tam olarak ne özelleştirmek veya tüm (diğer at dekoratörler kullanmayın, kendi takmak ya Form elemanının kendisi) işlemek ve sonra el tüm çevreleyen HTML yazmak daha. Form düzeyinde ve görünümü düzeyinde hem de Zend_Form faydaları kaybetmeden tam özelleştirme yeteneği.

Matthew Weier O'Phinney Zend_Form dekoratörler hakkında blog yazılarını bir dizi başladı:

  1. The simplest Zend_Form decorator
  2. From the inside out: How to layer decorators
  3. Rendering Zend_Form decorators individually
  4. Creating composite elements

Şu anda yeni ve parlak Zend\Form ki var daha karmaşık eski bileşeninden daha ama aynı zamanda çok daha fazla kontrol, kapsüllü ve güçlü olduğunu. Peki, ben aşağıda söylediğim geçerli değildir. Yeni bileşen IMHO büyük bir gelişme çünkü öyle ...

  • ... Size formu işlemek istiyorum nasıl üzerinde tam kontrol sağlayan, biraz daha görünüm kod yazmak gerekir ama buna değer
  • ... Maksimum olası ölçüde veri, mantık ve görünümü ayırır
  • ... HTML5 form elemanlarının kullanımını sağlar
  • ... Eğer birlikte formları koymak istiyorum nasıl size birçok seçenek sunar, örneğin hidrasyon, ek açıklamalar, vb

Old answer regarding Zend_Form

Ben tam olarak aynı sorun var çünkü ben gerçekten muhtemelen yardımcı olamaz. Ben Zend_Form dekoratörler güçlü olduğunu düşünüyorum ama bugüne kadar en azından programcı şimdiye kadar gördüğüm ve çeşitli projelere ZF önemli bir bölümünü kullandım ZF dostu ve sezgisel olmayan bir parça.

Ben sadece benim deneyim bir kaç ipucu verebilir dedi:

  • filtreler formunu kullanarak olmadan kullanımı kolay
  • Eğer ulaşmak istediğiniz şeylerin tüm dekoratörler yardımı ile yapılır değilse çoğu
  • Ben küçük form ve birim tarafından eklenen madde parça ile başladı ama sonuç deneme yanılma dayanmaktadır çünkü (özellikle dekoratörler ile) benim formlarda bazı yapıyorum bazı şeyler alamadım
  • Ben web üzerinde herhangi bir yerde bulduk olamazdı zend mailing bilgi var

Sağ tarafta bu ilgili sorulardan özellikle non-sezgisel doğasını göz önüne alındığında Zend_Form için kapsamlı dokümantasyon eksikliği olduğu açıktır. Gerçekten ZF çocuklar kadar ben Zend Framework gibi, bu konuda bir şeyler yapmak görmek istiyorum.

Yani bu cevap size bu sorunu olan tek kişi sen değilsin bildirmek için sadece muhtemelen.


ya da alternatif jedi mind tricks Elbette kullanabilirsiniz!

Söylenenleri eklemek için:

Eğer Zend_Form sopa ile karar verirseniz dekoratörler korkma, sen onları çok kullanarak olacak. Eğer 'get it' bir zamanlar maalesef docs zayıf ve onunla oynamaya neredeyse oraya tek yolu, oldukça basittir.

ViewScript ve ViewHelper dekoratörler size güç çok verir.

(Ben dojo olanlarla orijinal dekoratörler karşılaştırarak içgörü adil bir miktar kazandı) var ve onlar şeyler yaptığınızı görmek, farklı dekoratörler için kaynak aracılığıyla kazmak için korkmayın.

Ne Sean düşündüren size viewscript bu gibi bir şey kullanabilirsiniz, form-> render aramak gerekmez olduğunu düşünüyorum.

 <someHtmlThingy name="blah" value="<?php echo $this->formInstance->getElement('whatever')->getValue(); ?>" />

Sanırım onaylayıcıların setleri inşa edilmiş ve tüm yol boyunca standart viewscripts kullanılan bir proje (ön Zend_Form) üzerinde çalıştı. Bu Zend_Form ile unsurlarını oluşturmaya kıyasla aşırı değil biraz daha fazla iş (hata mesajları ve benzeri sıhhi tesisat), ama.

Sadece ViewScript dekoratör kullanmadan form elemanları önce veya sonra keyfi biçimlendirme eklemek istiyorsanız, benim AnyMarkup dekoratör kullanabilirsiniz: http://www.zfsnippets.com/snippets/view/id/62

Örneğin, burada bir sarıcı etiketi (ihtiyaçlar autoloading doğru ayarlanmış olması için yolları dahil) içinde bir görüntü ile giriş alanını Önlerine nasıl olduğunu:

$form->addElement('text', 'my_field', array(
  'label' => 'Enter Info:',
  'decorators' => array(
    'ViewHelper',
    array('AnyMarkup', array(
      'markup' => '<span class="imgwrapper">'.
        '<img src="info.png" alt="info icon"/></span>'),
      'placement' => 'prepend'
    ),
    'HtmlTag',
    'Label'
  )
);

Form çapında dekoratörler (IE - formun bireysel unsurları baskı yerine sadece her şeyi işlemek için formun standart Görünüm Yardımcısı dayanarak) üzerinde atlayarak kontrolü geri bir demet almak için tek yoldur.

Başka bir seçenek sadece formunuzu El-kodu ve yalnızca doğrulama ve filtreleme işlemek için ZF kullanmaktır.

Aklında bir gerçek belirli bir amaç veya hedef olmadan bir örnek yazmak veya nasıl yapılır gerçekten zor çünkü ne yazık ki, daha karmaşık bir konu üzerinden atlanır. I modify the way hidden elements were displayed isteyenler SO burada başka bir geliştirici yardım biraz zaman geçirdim, ama bu özelliklerini detaya daha kolay olduğunu bu yüzden onun durum çok özel oldu.

Daha karmaşık görevlerin çoğunluğu gerçekten özel bir alan türü için varsayılan bir yardımcı uzanan inmesi. Örneğin, ben bir formdan sonra doğrulamayı geçemedi yerine doğrulama hata metni üzerinden yazma teslim olmuştu tüm alanlara sınıf "hata" uygulamak istediği bir proje vardı:

<label for="field">Label:</label>
<input type="text" name="field" id="field" class="error">

Gerçek form elemanı varsayılan görünümü helper'a mevcut değildir, bu nedenle eleman bir doğrulama hatası varsa yardımcı kontrol edemez, çünkü bu oldukça karmaşık bir süreç oldu. Yani şu süreç hakkında gitti:

  1. Ben ben "hata" sınıfını uygulamak istedim her alan türü için bir müşteri görünümü bir yardımcı yaratmak zorundaydı. O, ben formXXX() yöntemini overrode ve eleman bir hata olup olmadığını görmek için bir onay ekleyebilirsiniz. Ayrıca, ben dekoratör yüzden benim yardımcı hataları kontrol edebilir elemanının bir örneğini ayarlamak için diyebiliriz setElement() metodu eklendi.
  2. Sonraki Ben varsayılan geçersiz kılmak zorunda Zend_Form_Decorator_ViewHelper. O, ben görünümü erişilen ve formu eleman türü için bir yardımcı örneği ve ben o var eğer o ayarı, benim görüşüme yardımcısında oluşturulan setElement() yöntemin varlığını kontrol etti. Bunu yaparak, ben bütün senaryoyu kırmadan çeşit eleman türlerini ve diğerlerini uzanabilir.
  3. Benim init her form için () fonksiyonu, benim yeni bir form dekoratör işaret (addElementPrefixPath('My_Form_Decorator'), 'path/to/decorator')) yeni bir unsur önek yolu eklemek zorunda kaldılar.
  4. Son olarak, Zend Framework ben ilk maddedeki yarattığı yardımcıları bulabiliriz ki benim uygulamaya yardımcı yolunu eklemek zorunda: addHelperPath('/path/to/helpers', 'My_View_Helper');

Karmaşık öğreticiler yazarken gerçekten gerçek dünya sorunları gerektirir neden görebilirsiniz. Yardımcıları, ya da karmaşık dekoratör planlarının bu tür kurma konusunda büyük bir bölümü tüm bu ön can sıkıcı olabilir, bu çok kolay, aynı tasarım düzeni için uygun ve düzgün, çok hızlı bir şekilde çıktı değiştirmek birçok formlar oluşturmanıza olanak sağlar, yani değişiklikler ise yapılması gerekmektedir. Eğer bir form yararına basit bir görev olması gerektiğini yapmak için nasıl sergiyi zaman büyük bir harcama gibi hissediyorum diğer taraftan eğer Ama, bunu atlamak söyleyebilirim!

Eğer daha özel bir şey için yardım isterseniz, ancak, ben yardım etmek için daha fazla mutlu olurdu. Sadece başka bir soruyu (ya da bu bir güncelleme) ve ben dışarı yardımcı olmak için elimden geleni yapacağım.

whycantitbemorethan25c yukarıda söz, ama ViewScripts Sana formları işleme için son derece ince taneli kontrolü verir. Zend_Form hızlı olması gerekiyordu ve bu yüzden standart dekoratörler gibi birçok varsayılan varsayar ve elemana onlar form nesnesine eklenen bir şekilde emreder edilir. ViewScript ile o çok atlamak ve tüm öğeleri yerleştirebilirsiniz ancak normal HTML içinde istiyorum.

Tamamen olsa Dekoratörler kavramı üzerine atlamak yok. Onlar daha sonra ViewScript kullanıldığında bile tek öğeleri stil. Diğerleri önerilen gibi Örneğin, hata iletileri için kullanabilirsiniz.

Eğer benzer eylemler düşünmelisiniz (aktif / inaktif düğmeleri ve her biri için bir silme düğmesi ile kullanıcılar bir liste düşünüyorum) ile birden çok veri noktaları vardır çok karmaşık form varsa Zend_Form_SubForm. Subforms sadece normal formları gibi ViewScripts kullanabilir ve kendi ViewScripts ile alt form ile bir ViewScript ile bir form basamakla eğer çok daha güçlü sadece düz bir forma daha güzel içerdiği mantık ve sunum ile sona.

Ben bir

formu düzen yapmak için Zend_Form için bazı alt sınıflar ve dekoratörler yazdı. Hatta markası birden gibi şeyler düğmeleri aynı satırda göstermek göndermek yapmak için bazı özel hileler vardı.

Bu çalışma almak için etrafında hack tam bir gün sürdü. Bu Zend 1.5.1 karşı yazılmış bu güncel sürümü ile çalışacak bu yüzden bilmiyorum, ama eğer ilgilendi Ben muhtemelen bir yere kaynağını yükleyebilir.

Bu Zend Forms ile çok yaygın bir şikayet gibi görünüyor.

(Ben düzen formları tabloları kullanarak üzerinde CSS titiz tarafından kaka poo'd alırsınız biliyorum, ve ben CSS birçok şey için iyi olduğunu kabul ederken, ben görünmüyor CSS kullanarak iyi bir form düzeni görmek için henüz Bir çirkin kludge gibi. tablolar ile formlar onları gerek her tarayıcı üzerinde oldukça fazla 'sadece çalışmak'.)

EDIT: Tamam, çirkin kludges konuşan github sekmeli zend formlar üretmek için benim kod koyduk. here onu görmek için gidin. (Çünkü gaoshan88 onun için sordum.)

BURAYA CEVAP. Size yardımcı olacağını umuyoruz. Onu bulana kadar ben bilgi enormal miktarı geçti.

<table>
    <tr>
        <td>Page name: *</td>
        <td><?php echo $this->pageForm->header_title;?></td>
    </tr>

    <tr>
        <td>H1 tag: *</td>
        <td><?php echo $this->pageForm->h1_tag;?></td>
    </tr>

    <tr>
        <td>Page URL: *</td>
        <td><?php echo $this->pageForm->url;?></td>
    </tr>

    <tr>
        <td>Meta Description: </td>
        <td><?php echo $this->pageForm->meta_description;?></td>
    </tr>

    <tr>
        <td>Meta Keywords: </td>
        <td><?php echo $this->pageForm->meta_keywords;?></td>
    </tr>

    <tr>
        <td>Short Description: *</td>
        <td><?php echo $this->pageForm->short_description;?></td>
    </tr>

    <tr>
        <td colspan="2"><a href="<?php echo $this->websiteUrl;?>backend_template/list?placeValuesBeforeTB_=savedValues&TB_iframe=true&height=200&width=300&modal=true"
                           title="add a caption to title attribute / or leave blank" class="thickbox">Open iFrame Modal</a></td>
         <td>
            <a href="<?php echo $this->websiteUrl;?>backend_template/list?placeValuesBeforeTB_=savedValues&TB_iframe=true&height=200&width=300&modal=true" onclick="javascript:getDataFromAddPage()" title="Select Template For Page" class="thickbox" > TEST FORM  </a>
         </td>
    </tr>

    <tr>
        <td>Featured: </td>
        <td><?php echo $this->pageForm->featured;?></td>
    </tr>

    <tr>
        <td>Mark as 404: </td>
        <td><?php echo $this->pageForm->is_404page;?></td>
    </tr>

    <tr>
        <td>Show in Navigation Menu: </td>
        <td><?php echo $this->pageForm->in_navmain;?></td>
    </tr>

    <tr>
        <td>Show in Static Menu:</td>
        <td><?php echo $this->pageForm->in_navstatic;?></td>
    </tr>

    <tr>
        <td><?php echo $this->pageForm->submit;?></td>
        <td><?php echo $this->pageForm->button_close;?></td>
    </tr>

</table>

Muhtemelen şimdi bu çözdük, ama bazı işler yapıyorum ve benzer bir çözüme ihtiyacı vardı.

form->getSubform('subform'); 
foreach ($subform as $key => $value) {
//some markup and custom code here
    print $value;
//some markup and custom code here

}
?>

foreach döngüsü içinde, tablo biçimlendirme ekleyebilirsiniz. Eğer uygun tablo satırları için anahtarlarını adını ettiyseniz, onlar formu tuşları ile uyumlu olmalıdır. Hatta anahtarı veya bir anahtar tarafından bile bir eleman tarafından uygun alt formu kapmak bir döngü kullanabilirsiniz. Eğer tuşları biliyorsanız foreach döngü atlayın ve sadece print $ alt form ['Somekey'] söyleyebiliriz; Eğer $ form-> setIsArray (true) diyerek ana formu set varsayarsak; (Emin değilim eğer o son kısmı kesinlikle gerekli, ama karmaşık formlar, zaten böyle ayarlanmış olmalıdır.

Ben bu yüzden her öğenin içinde baskı tam kontrole sahip olabilir varsayılan dekoratörler kaldırıldı. Zend_Form biraz daha kolay, tek tek öğeleri kapma için yerleşik bir yöntem olması gerektiğini .. ama bu oldukça iyi çalıştığını düşünüyorum.

O birisi yardımcı umut!

Sean McSomething ilk tavsiye benim için gitmek yoludur. Ben her zaman <?php echo $this->form ?> bir form işlemek için yaptığını çok büyülü olduğunu düşündüm. Ama bir adım daha ileri götürün ve $element->renderDecorator() sihirli yöntemler üzerinden bireysel dekoratörler ziyade bireysel öğeleri işlemek gerekir. Bu şekilde, size dekoratörler tanımlı sıraya konusunda endişelenmenize gerek olmayacaktır. Sen sadece onları orada olması gerekir, ve bu sinir bozucu, unintuitive HtmlTag dekoratörler eklemek zorunda kalmazsınız. I made a blog post about this.

Ben Zend zaten özelliği vardır ama eğer, hızlı çözüm, sınıfını genişleten bir html şablonu kabul yapmak olurdu emin değilim.

Örneğin:

<?php
$form = new zend_form_whatever($field_list + $validators + $template);
echo $form;
?>

şablonu:

<form id="my_custom_form">
    <label>{label.email}</label>
    {input.email}
    <span class="red">{error.email}</span>

    <div>
        {label.password}
        {error.password}
        {input.password}
    </div>

    <div class="purple">{input.submit}<div>
</form>