Zend Framework nasıl dekoratörler kullanarak bir etiket form öğeleri sarmak mı?

4 Cevap php

Ben gibi etiketler ile form öğeleri kaydırmak istiyorum

<label for="email">E-mail <input type="text" name="email" id="email" /></label>

Ben bulabildiğim tek seçenek yerleşimi değiştirmek için; Ancak sadece 'prepend' ve 'append' kabul eder:

<!-- prepend -->
<label for="email">E-mail</label> <input type="text" name="email" id="email" />
<!-- append -->
<input type="text" name="email" id="email" /> <label for="email">E-mail</label>

Ben sonra ben ne değildir. Ben Zend_Form_Decorator_Label sınıf değiştirebilir, ama bu son alternatiftir.

4 Cevap

Bu ne yazık ki, muhtemelen özel bir dekoratör yazmak gerekecek mümkün görünmüyor. Yine de, oldukça basit olmalıdır.

Çok az / hiç değişiklik ile çalışması gerektiğini öylesine im sadece burada bu yazacağız lütfen unutmayın, bu denenmemiş ama başka bir dekoratör kapalı tabanlı bulunuyor

class Your_Form_Decorator_Date extends Zend_Form_Decorator_Abstract {
    public function render($content) {
       $element = $this->getElement();

       $name = $element->getFullyQualifiedName();
       return '<label for="'.$name.'">'. $element->getLabel() . ' '.$content.'</label>';

    }
}

Şimdi formunuza doğru öneki eklerseniz.

$this->addPrefixPath('Your_Form', 'Your/Form/');

Sen bir etiket etiketinde girişi (FormElement dekoratör) sarmak için bu kullanmak gerekir.

Üzgünüm aslında bu test etmek için bir şansı vardı ama benim diğer dekoratörler nasıl vermemiştir. Bu ince olmalıdır.

EDIT: Teşekkürler etiket metni Gnarf işlenen olmadığını işaret için. Bu artık sabittir.

Ben her zaman dekoratörler waaaay herhangi bir durum için aşırı mühendislik olarak buldum ve bu tür iş mantığını sunum katmanı ayırma amacı yendi. Size sunu üzerinde çok daha fazla kontrol verecek olan, zerdüştlerin kısmi yardımcıyı kullanın veya Zend_Form veya ikisinin bir kombinasyonunu kullanarak kendi widget oluşturabilirsiniz.

Metin ve herhangi bir satır öğesi geçerli olmalıdır rağmen bazı XHTML referans siteler, onlar, etiketler için geçerli alt unsurları olarak girdi öğeleri listesi yok. Bu izin değil başka bir nedeni olabilir.

Ben etiketin içindekiler alanının açıklamasını arethe çünkü It ;) kullanan değil sanırım. Bu açıklama içine eleman eklemeyi saçmalık. Eğer ihtiyacınız varsa, bir div veya bunun gibi bir şey içine de sarabilirsiniz.

Bunun tek nedeni kötü csss yazılır :)

Ben label sağ yanındaki elemanı için sıraya istediğiniz varsayarak yaşıyorum.

Örnek

$email = new Zend_Form_Element_Text('email');
$email->setLabel('Email: ');
$form = new Zend_Form();
$form->addElement($email);

Şimdi, bu gibi formu verecek

<label>Email:</label>
      <input type="text"/>

Hemen yanındaki etikete metin kutusuna sahip olmak için, ayrı ayrı 'label' dekoratör işlemek gerekir. Bunu yapmak için:

Ben görünümünde bir değişkene atanan benim denetleyicisi, bir form oluşturduk:

//in controller
$this->view->form = $form;

//in view script
$form = $this->form;

//('tag', null) tells the renderer not to wrap the label in the usual <dt> tag,  
//but not to use anything at all
$form->getElement('email')->getDecorator('label')->setOption('tag', null);

ve sonra görünümü komut ...

<?php print($form->email) ?>

Bu kendi etiketinin yanındaki Metin elemanı verecek