2009-04-22 10 views
6

Tôi có một yếu tố nút mà tôi đã tạo ra như vậy:Zend Framework Zend_Form Trang trí: <span> Phần tử nút bên trong?

$submit = new Zend_Form_Element_Button('submit'); 
$submit->setLabel('My Button'); 
$submit->setDecorators(array(
    'ViewHelper', 
    array('HtmlTag', array('tag' => 'li')) 
)); 
$submit->setAttrib('type', 'submit'); 

này tạo ra mã HTML sau đây:

<li> 
    <label for="submit" class="optional">My Button</label> 
    <button name="submit" id="submit" type="submit">My Button</button> 
</li> 

Tôi muốn quấn bên trong nút với một nhịp <> , như sau:

<button...><span>My Button</span></button> 

Cách tốt nhất để thực hiện điều này bằng Zend_Form là gì?

Trả lời

7

Tôi đã cố gắng và cuối cùng, không thể tự mình đạt được điều này bằng cách sử dụng cùng một cách tiếp cận. Dường như cách dễ nhất để thực hiện việc này là:

... 
$submit->setLabel('<span>My Button</span>'); 
... 

Tuy nhiên, khoảng thời gian sẽ được thoát. Đó là hoàn toàn có thể tắt thoát của một trang trí lable, tuy nhiên, thêm một trang trí nhãn ám chỉ rằng sản lượng không đúng cách, ví dụ:

$decorator = array(
    array('ViewHelper'), 
    array('HtmlTag', array('tag' => 'li')), 
    array('Label', array('escape' => false)) 
); 

$submit = new Zend_Form_Element_Button('submit'); 
$submit->setLabel('<span>My Button</span>'); 
$submit->setDecorators($decorator); 
$submit->setAttrib('type', 'submit'); 

... renders:

<label for="submit" class="optional"><span>My Button</span></label> 
<li> 
    <button name="submit" id="submit" type="submit">&lt;span&gt;My Button&lt;/span&gt</button> 
</li> 

... mà , ngoài việc ngữ nghĩa sai (dễ sửa chữa), vẫn còn thoát khỏi các thẻ span bên trong phần tử.

Vì vậy, bạn sẽ làm gì?

Tôi nghĩ rằng cách tiếp cận tốt nhất (và đây là lời khuyên của tôi khi kiểm soát chặt chẽ hiển thị Zend_Form) là sử dụng trang trí ViewScript.

$submit = new Zend_Form_Element_Button('submit'); 
$submit->setLabel('My Button'); 
$submit->setDecorators(array(array('ViewScript', array('viewScript' => '_submitButton.phtml')))); 
$submit->setAttrib('type', 'submit'); 

... sau đó trong _submitButton.phtml xác định như sau:

<li> 
    <?= $this->formLabel($this->element->getName(), $this->element->getLabel()); ?> 
    <button 
    <?php 

    $attribs = $this->element->getAttribs(); 

    echo 
    ' name="' . $this->escape($this->element->getName()) . '"' . 
    ' id="' . $this->escape($this->element->getId()) . '"' . 
    ' type="' . $this->escape($attribs['type']) . '"'; 
    ?> 
    <?php 

    $value = $this->element->getValue(); 

    if(!empty($value)) 
    { 
     echo ' value="' . $this->escape($this->element->getValue()) . '"'; 
    } 
    ?> 
    > 
    <span> 
    <?= $this->escape($this->element->getLabel()); ?> 
    </span> 
    </button> 
</li> 

Các _submitButton.phtml tập tin sẽ cần phải được trong một thư mục xem kịch bản (bạn có thể là tốt nhất bổ sung một trang cụ thể cho trình trang trí biểu mẫu của bạn bằng cách sử dụng $view->addScriptPath('/path/to/my/form/decorators')).

Điều này sẽ hiển thị những gì bạn đang tìm kiếm. Tôi chỉ mới bắt đầu xem xét trình trang trí ViewScript do các vấn đề linh hoạt mà tôi đang gặp phải trong công việc.Bạn sẽ nhận thấy rằng kịch bản của tôi không phải là linh hoạt, và chắc chắn không phải là trong BNF, cho tất cả các thành viên có thể được điền vào đối tượng phần tử. Điều đó nói rằng, đó là một sự khởi đầu và nó giải quyết vấn đề của bạn.

+0

Cảm ơn bạn đã trả lời rất chi tiết. Tôi biết về trình trang trí ViewScript, nhưng tôi không biết nó có thể được áp dụng cho các phần tử riêng lẻ. – leek

+0

Điều này rất hữu ích! – markus

0

Tôi sẽ thêm một lớp vào nút, sau đó xác định lớp đó trong CSS của bạn để làm cho nó hoạt động như một khoảng. Tôi chắc chắn rằng bạn đang muốn làm nhiều hơn là chỉ cần dính nó trong một khoảng.

Chỉ cần thêm một setAttrib() gọi:

$submit->setAttrib('class', 'submitButton'); 

Sau đó, trong CSS của bạn:

.submitButton { 
    display:inline; 
    font-weight:bold; /* Or whatever you're wanting to do */ 
} 

tôi thêm display: inline vì điều này sẽ làm cho các nút hành động như một khoảng. Điều này sẽ giúp bạn bắt đầu ít nhất. Tất nhiên bạn có thể căn cứ CSS của bạn trên id của nút là tốt, chỉ cần sử dụng display: inline để có được hành vi span.

+0

Mục tiêu của tôi thực sự là để làm "nút khoảng {display: none;}" để ẩn text của button (nhưng tôi muốn nó vẫn ở đó đợi những người không có CSS/JS hỗ trợ). – leek

+0

Aaah. Tôi biết có điều gì đó khác với nó! – Kekoa

5

Bạn có thể làm điều này:

$this->addElement(new Zend_Form_Element_Button(
      'send', 
      array(
       'label' => '<span>registrieren</span>', 
       'class' => 'button-red', 
       'type' => 'submit', 
       'escape' => false, 
       'required' => false, 
       'ignore' => false, 
      ) 
)); 
+0

THANK YOU !!!!!! – wiLLiamcastrO

1

Chỉ cần thoát nhãn hoạt động tốt. Nó chỉ phá vỡ khi ai đó bắt đầu rối tung với trang trí nhãn (thường xảy ra khi tùy chỉnh thẻ)

Bạn có thể sử dụng hàm Zend_Form setElementDecorators() và loại trừ một số yếu tố tạo kiểu. Đọc Ví dụ # 3 Đặt trang trí cho một số yếu tố trong Zend_Form Manual (bao gồm cả ghi chú!) Để biết thêm chi tiết.

Đối với những người vẫn còn nhầm lẫn, đây là một ví dụ mã để tạo kiểu dạng như một bảng, và có một nút được bọc trong khoảng thời gian kép:

//(...)putting some other elements in the form first 

//now add submit button 
$form  ->addElement('button', 'submit', array(
         'label'  => '<span><span>SUBMIT</span></span>', 
         'value'  => 'submit' 
      )); 

$form 
      //set decorators for non-button elements 
      ->setElementDecorators(array(
        'ViewHelper', 
        'Errors', 
        array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'element')), 
        array('Label', array('tag' => 'td')), 
        array(array('row' => 'HtmlTag'), array('tag' => 'tr'))), array('submit'), false) 
      //and then for button elements only 
      ->setElementDecorators(array(
        'ViewHelper', 
        'Errors', 
        array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'element')), 
        array(array('row' => 'HtmlTag'), array('tag' => 'tr'))), array('submit'), true) 
      //and finally for the form 
      ->setDecorators(array(
        'FormElements', 
        array('HtmlTag', array('tag' => 'table')), 
        'Form' 
      )); 

nơi $ form là một Zend_Form thành phần. Hi vọng điêu nay co ich!

0

Hãy thử với

$element->addDecorator('Label', array('tag' => 'span', 'class' => 'aClass'))