2010-09-04 18 views
5

Các trang trí mặc định cho Zend_Form_Element_Radio làLàm cách nào để định dạng Zend_Form_Element_Radio để nhãn theo sau đầu vào?

<label for="type_id-1"><input type="radio" name="type_id" id="type_id-1" value="1">Pack</label> 

Thẻ label kết thúc tốt đẹp tag input. Thay vào đó, tôi muốn trông giống như

<input type="radio" name="type_id" id="type_id-1" value="1"><label for="type_id-1">Pack</label> 

Tôi nghĩ nó có thể liên quan đến "Nhãn" của phần tử, nhưng điều đó khác. Ngay cả với mã sau đây, tôi vẫn nhận được nhãn gói radio. Khi tôi sử dụng mã biểu mẫu này.

public function init() 
{ 
    parent::init(); 

    $this->setName('createdomain'); 

    $type_id = new Zend_Form_Element_Radio('type_id'); 
    $type_id->setLabel('Please Choose') 
      ->setRequired() 
      ->setMultiOptions(array('m' => "male", 'f' => 'female')); 

    $this->addElement($type_id); 

    $this->setElementDecorators(array(
    'ViewHelper', 
    array('Label',array('placement' => 'APPEND')), 
));  
} 

tôi nhận được HTML này kết quả là

<form id="createdomain" enctype="application/x-www-form-urlencoded" action="" method="post"><dl class="zend_form"> 
<label for="type_id-m"><input type="radio" name="type_id" id="type_id-m" value="m">male</label><br /> 
<label for="type_id-f"><input type="radio" name="type_id" id="type_id-f" value="f">female</label> 
<label for="type_id" class="required">Please Choose</label></dl> 
</form> 

Thông báo như thế nào có một thẻ label gói thẻ input?

+0

Bạn có thể làm điều đó bằng CSS ? –

+0

Tôi đang cố gắng sử dụng tập hợp nút giao diện người dùng của jQuery, điều này dự kiến ​​nhãn sẽ tuân theo thẻ đầu vào, không được bao gồm trong thẻ nhãn. –

Trả lời

-1

Đó là một vấn đề với jQuery và không phải là Zend Framework. Việc gói phần tử trong thẻ nhãn là hoàn toàn hợp lệ, nó chỉ là jQuery UI không hỗ trợ nó. Tôi đã đăng một số bug report.

* Cập nhật trả lời *

Tuy nhiên tôi nghĩ rằng những gì bạn đang cố gắng làm (như bạn nhận xét) là sử dụng buttonset jQuery UI, đó là những gì tôi đã làm khi tôi đi qua các lỗi jQuery UI . Tóm lại, bạn có hai lựa chọn cho đến khi lỗi được sửa:

1) Sử dụng trợ giúp xem tùy chỉnh của Dennis D. để vượt qua yếu tố nút radio mặc định.

2) Vá nút Zend Framework Radio xem trợ giúp với mã Dennis D. đã viết. Nó xuất hiện trong tệp Zend_View_Helper_FormRadio trên dòng 169 (Zend framework Version 1.11.0).

Đầu tiên tạo một nhãn mới và đóng thẻ

// Create the label 
$label = '<label' 
. $this->_htmlAttribs($label_attribs) . ' for="' . $optId . '">' 
. (('prepend' == $labelPlacement) ? $opt_label : '') 
. '<input type="' . $this->_inputType . '"' 
. $opt_label 
. '</label>'; 

Thứ hai thay đổi mã tạo nút radio để:

// Create the radio button 
$radio = '<input type="' . $this->_inputType . '"' 

Thứ ba tháo bế mạc của thẻ nhãn (như bạn' đã thực hiện nó) trong trình trợ giúp chế độ xem, thay đổi:

. $endTag 
. (('append' == $labelPlacement) ? $opt_label : '') 
. '</label>'; 

Và chỉ cần thay thế bằng:

. $endTag; 

Sau đó kết hợp các đài phát thanh và nhãn bằng cách sử dụng định vị vị trí:

// Combine the label and the radio button 
if ('prepend' == $labelPlacement) { 
    $radio = $label . $radio; 
} else { 
    $radio = $radio . $label; 
} 

Và đó là nó (một lần nữa Dennis D đã thực hiện nó trong giao diện helper) nhưng mã thay đổi sẽ giống như thế (bắt đầu tại dòng 169:

// Create the label 
     $label = '<label' 
       . $this->_htmlAttribs($label_attribs) . ' for="' . $optId . '">' 
       . $opt_label 
       . '</label>'; 

     // Create the radio button 
     $radio = '<input type="' . $this->_inputType . '"' 
       . ' name="' . $name . '"' 
       . ' id="' . $optId . '"' 
       . ' value="' . $this->view->escape($opt_value) . '"' 
       . $checked 
       . $disabled 
       . $this->_htmlAttribs($attribs) 
       . $endTag; 

     // Combine the label and the radio button 
     if ('prepend' == $labelPlacement) { 
      $radio = $label . $radio; 
     } else { 
      $radio = $radio . $label; 
     } 
     // add to the array of radio buttons 
     $list[] = $radio; 
+0

Tôi đồng ý, jQuery sẽ linh hoạt hơn một chút với định dạng của đầu vào và nhãn, nhưng tôi hoàn toàn tự tin hơn khi chỉnh sửa trang trí ZF hơn là đi sâu vào ruột của giao diện người dùng jQuery. –

-1

Hãy thử:

$this->setElementDecorators(array(
     'ViewHelper', 
     array('Label',array('placement' => 'APPEND')), 
    )); 

Check-out zendcasts video about it của nó thực sự tuyệt vời. Trang trí có thể thực sự phức tạp với ZF nhưng video này thực sự giải thích rõ điều đó.

+0

Xin lỗi, đó không phải là một trong hai. Với điều đó, Zend chỉ gắn thêm một 'nhãn' sau hai radio.
Tôi chắc chắn câu trả lời nằm ở đâu đó trong việc gán một ViewHelper khác cho phần tử radio, nhưng tôi chỉ không chắc chắn làm thế nào để làm điều đó. Cảm ơn sự giúp đỡ mặc dù. –

+0

@nvoyageur bạn nên đăng thêm mã sau đó bởi vì những gì tôi đăng trong câu trả lời của tôi hoạt động hoàn hảo và làm exaclty những gì bạn yêu cầu trong câu hỏi của bạn. Vì vậy, cái gì khác phải sai. Đăng toàn bộ biểu mẫu của bạn? – Iznogood

+0

Tôi đã cập nhật câu hỏi để bao gồm mã Biểu mẫu tôi đang sử dụng và HTML kết quả. Bạn sẽ nhận thấy thẻ 'input' được bao quanh bởi thẻ' label', sau đó cả hai nút radio được theo sau bởi một nhãn cho bộ nút. –

3

tôi đã tạo ra một helper xem tùy chỉnh tên MyLib_View_Helper_FormRadio (vì vậy nó được gọi là tự động nếu bootstraping bạn làm như vậy), và gạt và thay đổi phương pháp Zend_View_Helper_FormRadio :: formRadio() tại đường 160 (Phiên bản 1.11), nơi mà các nút radio được tạo ra.


$label = '<label ' . $this->_htmlAttribs($label_attribs) . ' for="' . $optId . '">' 
       . $opt_label 
       .'</label>'; 

     // Wrap the radios in labels 
     $radio = '<input type="' . $this->_inputType . '"' 
       . ' name="' . $name . '"' 
       . ' id="' . $optId . '"' 
       . ' value="' . $this->view->escape($opt_value) . '"' 
       . $checked 
       . $disabled 
       . $this->_htmlAttribs($attribs) 
       . $endTag; 

     if ('prepend' == $labelPlacement) { 
      $radio = $label . $radio; 
     } 
     elseif ('append' == $labelPlacement) { 
      $radio .= $label; 
     } 
0

có lẽ ý tưởng tốt nhất của tôi cho đến nay, là thay đổi ZF [Zend Framework] HTML code từ bên trong jQuery, do đó nó được tương thích với định dạng jQuery UI.

Dưới đây là giải pháp:

trong xây dựng Mẫu ZF:

$this->setElementDecorators(array(
           'ViewHelper', 
           'Errors', 
           array(array('rowElement'=>'HtmlTag'), array('tag'=>'div', 'class'=>'element')), 
           array('Label', array('class'=>'first')), 
     )); 

Điều quan trọng ở đây là div với class = yếu tố đó sẽ quấn tất cả các đầu vào [do đó nó rất dễ dàng để có được chúng trong jQuery]

Và đây là đoạn code JS:

$(function() { 
    $("div.element > label").each(function() { 
     $('input', this).after('<label for="'+$(this).attr('for')+'"></label>'); 
     $('label', this).text($(this).text()); 
     var input = $('input', this).detach(); 
     var label = $('label', this).detach(); 

     var parent = $(this).parent(); 
     $(this).remove(); 
     input.appendTo(parent); 
     label.appendTo(parent); 
    }); 
    $("div.element").buttonset(); 
}); 
0

đây là t ông điều tốt nhất bạn có thể có thể làm, mà tôi tìm thấy nó sau khi rất nhiều đau đớn :))

$radios = new Zend_Form_Element_Radio('notifications'); 
$notificationTypesArray = array(); 
foreach ($notificationTypes as $key => $value) { 
    $notificationTypesArray[$key] = $value 
$radios->removeDecorator('DtDdWrapper'); 
$radios->removeDecorator('HtmlTag'); 
$radios->setSeparator('</td></tr><tr><td class="notification_type_row">'); 
$radios->setDecorators(array(
    'ViewHelper', 
    'Errors', 
    array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'notification_type_row')), 
    array('Label', array('tag' => 'span')), 
    array(array('row' => 'HtmlTag'), array('tag' => 'tr')), 
); 
$radios->addMultiOptions($notificationTypesArray);    
$this->addElement($radios); 
Các vấn đề liên quan