2011-09-28 35 views
6

Tôi muốn sử dụng tập lệnh xem để biểu mẫu zend của tôi vì nó có vẻ là cách tốt nhất để kiểm soát bố cục/thiết kế của biểu mẫu trong khi vẫn sử dụng các lớp Zend_Elements.Sử dụng ViewScript Decorator trên các biểu mẫu con lồng nhau (Mẫu Zend)

Từ tập lệnh chế độ xem, tôi hiển thị phần tử với $this->element->getElement('elementName').

Tôi đang gặp sự cố với tên của các phần tử. Đây thực sự là một biểu mẫu con bên trong một biểu mẫu con bên trong một biểu mẫu.

Khi tôi sử dụng các trang trí FormElements, tên đầy đủ của các thành phần được tạo thành [subForm] [subForm] [element], điều này rất tốt. Wehn ​​Tôi đã chuyển đến trình trang trí viewScript, nó đã thay đổi thành subForm [subForm] [element].

Tôi hiểu rằng tôi cần sử dụng trình trang trí PrepareElements để sửa lỗi này, nhưng điều này khiến tên thay đổi biểu mẫu [subForm] [form] [subForm] [subForm] [elements] (nó tăng gấp đôi hai tên đầu tiên trong khởi đầu).

Bất kỳ ý tưởng nào về cách xử lý này?

Cảm ơn.

CẬP NHẬT: Tôi đã cố gắng gỡ lỗi PrepareElements và tôi thực sự không hiểu những gì đang làm. Dường như nó hoạt động ok trong lần lặp đầu tiên, nhưng sau đó nó lại thêm tiền tố biểu mẫu [subform] khi chạy trên một trong các biểu mẫu con ở giữa.

Khi tôi không sử dụng trang trí PrepareElements, tôi chỉ thiếu tiền tố "biểu mẫu" trong tên (tức là thay vì biểu mẫu [subForm] [element], tôi chỉ nhận được subForm [element]).

Tôi có thể khắc phục điều này bằng cách nào đó không?

Tôi đã cố thay đổi thuộc tính nhưng chỉ thay thế tiền tố "subForm".

Nó thực sự có vẻ giống như những gì còn thiếu là một phương thức thuộc tính trên subForm.

Một lần nữa, tất cả điều này là do trình trang trí ViewScript. Nó hoạt động tốt với các trang trí FormElements.

CẬP NHẬT 2: Chỉ cần làm rõ, tôi không ngại thay đổi tên này, nhưng nó khiến các trường của tôi không điền khi tôi gọi form-> điền vào.

Edit: Tôi nghĩ rằng tôi đã thu hẹp vấn đề như thế này: khi tôi nhận được giá trị của tôi trở lại trong setDefaults, họ được sắp xếp như thế này:

array(
\"formElements1-name\" => value1... \"subFormName\" => array(
\"parentFormName\" => array(
\"subFormName\" => subForm-values-array 
) 
) 

... Vấn đề chính ở đây là số "parentFormName" => "subFormNAme".. nó lặp lại chính nó là gì? Tôi đã ở dạng chính. Tôi đoán điều này là do tôi đã đặt setElementsBelongTo(formName[subFormName]), nhưng nếu tôi không làm điều đó, thì tôi sẽ nhận được các giá trị biểu mẫu con hoàn toàn tách biệt khỏi biểu mẫu,

tức là giá trị mảng = array ( \ "formName \" => array ( formValues ​​ ), \ "subFormNAme \" => array ( subFormValues ​​ )

, trong khi tôi exepct nó được

array(
formName => array(
subFormNAme => values-array 
) 
)... 

là nó thậm chí có thể làm cho công việc này?

+0

Bản sao chính xác của [Zend: Trình bày trang và ký hiệu mảng ViewScript] (http://stackoverflow.com/questions/7155047/zend-viewscript-decorator-and-array-notation) – Phil

+1

Nó không trùng lặp vì tôi đã bằng cách sử dụng các giải pháp được đề xuất nhưng nó không hoạt động tốt. – Ran

+0

Các hình thức Zend phải là mảnh vỡ nhất, vô lý, điên rồ của crap tôi từng gặp phải sự bất hạnh phải chịu. Tôi hoàn toàn cảm thấy đau đớn của bạn, nếu bạn tìm ra những gì sai sau đó bằng mọi cách xin vui lòng cho tôi biết! – GordonM

Trả lời

2

Giải pháp hiện nay là sử dụng PrepareElements trang trí trên subforms với một sự thay đổi - loại bỏ các cuộc gọi đệ quy trong mã PrepareElements. Ngoài ra, không yêu cầu "setElementsBelongTo".

Điều này dường như tạo tên và id chính xác.

+0

Bạn có sửa đổi PrepareElements.php của Zend không? – artsylar

8

bạn chỉ cố gắng để đầu ra mẫu của bạn sử dụng <?php echo $this->form; ?> từ view script của bạn?

Điều đó hoạt động tốt cho các biểu mẫu đơn giản, nhưng đối với các biểu mẫu phức tạp hơn, tôi có xu hướng hiển thị từng phần tử riêng lẻ nhưng không cần sử dụng trình trang trí ViewScript trên từng phần tử riêng lẻ để thực hiện việc này. Chỉ cần thử nội dung như thế này từ tập lệnh xem của bạn:

<div class="form"> 
    <fieldset> 
     <legend>Some Form Name</legend> 
     <form action="<?php echo $this->escape($this->form->getAction()) ?>" 
       method="<?php echo $this->escape($this->form->getMethod()) ?>" 
       enctype="multipart/form-data"> 

      <?php echo $this->form->id; // render the id element here ?> 

      <div class="half"> 
       <?php echo $this->form->name; // render the user name field here ?> 
      </div> 
      <div class="half"> 
       <?php echo $this->form->description; // render the description element here ?> 
      </div> 
      <div class="clear"></div> 

      <div class="half"> 
       <?php echo $this->form->address1; // render the address ?> 
      </div> 
      <div class="half"> 
       <?php echo $this->form->address2; // render address2 ?> 
      </div> 
      <div class="clear"></div> 

      <div class="third"> 
       <?php echo $this->form->zip; // render zip code ?> 
      </div> 
      <div class="third"> 
       <?php echo $this->form->city; // render city ?> 
      </div> 
      <div class="third"> 
       <?php echo $this->form->state; // render state ?> 
      </div> 
      <div class="clear"></div> 

      <div class="half"> 
       <?php echo $this->form->country; // render country ?> 
      </div> 
      <div class="clear"></div> 

      <?php echo $this->form->submit; ?> 

     </form> 
    </fieldset> 
</div> 

Đó là cách tôi làm hầu hết các biểu mẫu vì tôi muốn có một số yếu tố chiếm một nửa chiều rộng và các phần tử khác có chiều rộng đầy đủ.

Đáng ngạc nhiên, hướng dẫn tham khảo không cho bạn biết rằng bạn có thể thực hiện việc này. Tôi dường như nhớ một trang về nó trong quá khứ nhưng không thể tìm thấy nó ngay bây giờ. Khi tôi bắt đầu với Zend Framework, tôi nghĩ rằng cách duy nhất tôi có thể nhận được hình thức của tôi để sản xuất chính xác như thế nào tôi muốn là tạo ra trang trí phức tạp, nhưng đó không phải là trường hợp.

Matthew Weier O'Phinney có một bài đăng trên blog tuyệt vời trên rendering Zend_Form decorators individually giải thích những gì tôi đã làm ở trên. Tôi hy vọng họ thêm điều này vào trang đầu tiên của Biểu mẫu Zend vì điều đó đã khiến tôi chán nản. Thực tế là, 90% biểu mẫu của tôi hiển thị các phần tử riêng lẻ thay vì chỉ lặp lại chính biểu mẫu đó.

Lưu ý: Để ngăn ZF kèm theo các phần tử biểu mẫu của tôi trong thẻ dt và dd, tôi áp dụng trang trí này cho tất cả các phần tử biểu mẫu chuẩn của tôi. Tôi có một lớp mẫu cơ sở mà tôi mở rộng tất cả các hình thức của tôi từ vì vậy tôi không phải lặp lại điều này ở khắp mọi nơi. Đây là trang trí cho phần tử để tôi có thể sử dụng các thẻ để chứa các phần tử của mình.

public $elementDecorators = array(
    'ViewHelper', 
    'Errors', 
    array('Description', array('tag' => 'p', 'class' => 'description')), 
    array('HtmlTag',  array('tag' => 'div', 'class' => 'form-div')), 
    array('Label',  array('class' => 'form-label', 'requiredSuffix' => '*')) 
); 

Đối nộp nút của tôi, tôi sử dụng

public $buttonDecorators = array(
    'ViewHelper', 
    array('HtmlTag', array('tag' => 'div', 'class' => 'form-button')) 
); 
+1

Đây chính xác là những gì tôi đang cố gắng làm, chỉ với các biểu mẫu con. Vấn đề là các tên được tạo ra của các phần tử biểu mẫu phụ là sai khi tôi sử dụng trình trang trí ViewScript. – Ran

0

Giải pháp sẽ là sử dụng thuộc tính phần tử biểu mẫu belongsTo().
Ví dụ:

new Zend_Form_Element_Text('<elementName>', array('belongsTo' => '<subformName>')) 

Bằng cách này, render() phương pháp sẽ sử dụng một tên yếu tố hình thức như

name="<subformName>[<elementName>]" 
0

tôi đã cùng một vấn đề và tôi giải quyết nó với một trang trí

1: Tạo biểu mẫu con chung với các thành phần

2: Sử dụng trang trí cụ thể với PrepareElements

3: Thay đổi hình thức để một mảng với setIsArray (true)

Ví dụ:

Mẫu

$i = 4; 
for($i = 0; $i < $nbReclam ; $i++) 
{ 
    $rowForm = new Zend_Form_SubForm($i); 
    $name= new Zend_Form_Element_Textarea('name'); 
    $rowForm->addElement($name); 
    $this->addSubForm($rowForm, $i); 
} 

$this->setDecorators(array(
      'PrepareElements', 
      array('ViewScript', array('viewScript' => 'myDecorator.phtml')), 
    )); 


$this->setIsArray(true); 

Decorator

<table> 
<thead> 
    <tr> 
     <th>N°</th> 
     <th>Name</th> 
    </tr> 
</thead> 
<tbody> 
    <?php foreach ($this->element->getSubForms() as $subForm) : ?> 
      <tr> 
       <td> <?php echo $i++?> </td> 
       <?php foreach ($subForm->getElements() as $row) : ?> 
        <td><?php echo $row ?></td> 
       <?php endforeach ?> 
      </tr> 
     <?php endforeach ?> 
    </tbody> 
</table> 

Thưởng thức

Xin lỗi vì tiếng anh của tôi , tôi là người Pháp

Các vấn đề liên quan