2011-09-28 109 views
6

我想使用視圖腳本來渲染我的zend窗體,因爲它似乎是 控制窗體佈局/設計的最佳方式,同時仍然使用Zend_Elements類。在嵌套子窗體上使用ViewScript裝飾器(Zend窗體)

從視圖腳本中,我使用$this->element->getElement('elementName')呈現元素。

我遇到了元素名稱的問題。這實際上是表單內子表單內的子表單。

當我使用FormElements裝飾器時,元素的完全限定名稱是form [subForm] [subForm] [element],這很好。 我移動到viewScript裝飾器,它改變爲subForm [subForm] [element]。

我知道我需要使用PrepareElements裝飾器來解決這個問題,但是這導致了名稱改變了form [subForm] [form] [subForm] [subForm] [elements](它將前兩個名字加倍開始)。

任何想法我應該如何處理?

謝謝。

更新:我試圖調試PrepareElements,我真的不明白在做什麼。 看起來它在第一次迭代中工作正常,但是當它在中間子窗體中的一個上運行時,它再次添​​加形式[子形式]前綴。當我不使用PrepareElements裝飾器時,我只是在名稱(即,而不是form [subForm] [element],我只得到subForm [element])中缺少了「表單」前綴)。

可能是我可以修正這個莫名其妙?

我試圖改變belongsTo但只替換了「subForm」前綴。

它實際上好像缺少的是subForm上的belongsTo方法。

再一次,這都是因爲ViewScript裝飾器。它適用於FormElements裝飾器。

更新2:只是爲了澄清,我不介意這個名稱的變化,但它會導致我的字段不填充時,我調用form->填充。

編輯:我認爲我已經收窄的問題:當我得到我的價值觀回來setDefaults,他們被下令這樣的:

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

... 這裏的主要問題是"parentFormName" => "subFormNAme"..它重複了什麼?我已經在主要形式。我猜這是因爲我設置了setElementsBelongTo(formName[subFormName]),但如果我不這樣做,那麼我會得到我的子表單值完全獨立於表格,即

即 值數組=陣列( \ 「表格名稱\」=>數組( formValues ),\ 「subFormNAme \」=>數組( subFormValues )

,雖然我怎樣exepct它是

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

它甚至有可能使這項工作?

+0

[Zend:ViewScript裝飾器和數組表示法]的完全重複(http://stackoverflow.com/questions/7155047/zend-viewscript-decorator-and-array-notation) – Phil

+1

這不是重複的,因爲我已經使用建議的解決方案,但效果不佳。 – Ran

+0

Zend表格必須是我所遭受的不幸中最糟糕,最可笑,最瘋狂的一段垃圾。我完全感覺到你的痛苦,如果你知道有什麼問題,那麼請儘量讓我知道! – GordonM

回答

2

目前的解決方案是使用的子窗體的PrepareElements裝飾與一個變化 - 除去在PrepareElements代碼遞歸調用。另外,不需要「setElementsBelongTo」。

這似乎會生成正確的名稱和ID。

+0

您是否修改了Zend的PrepareElements.php? – artsylar

8

你只是使用<?php echo $this->form; ?>從您的視圖腳本試圖輸出表單?

這適用於簡單的表單,但對於我更復雜的表單,我傾向於單獨呈現每個元素,但不需要在每個單獨元素上使用ViewScript裝飾器來執行此操作。只是嘗試這樣的事情從您的視圖腳本:

<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> 

這是我做了我的大部分形式,因爲我想有一些元素佔用一半的寬度和其他全寬。

令人驚訝的是,參考指南並沒有告訴你,你可以這樣做。我似乎記得過去的一個頁面,但現在找不到它。當我開始使用Zend Framework時,我認爲唯一能讓我的表單輸出我想要的東西的唯一方法是創建複雜的裝飾器,但事實並非如此。

Matthew Weier O'Phinney在rendering Zend_Form decorators individually上有一篇很棒的博客文章,它解釋了我在上面做了什麼。我希望他們把這個添加到Zend Form的第一頁,因爲起初這對我來說是令人沮喪的。事實是,我的表單中有90%單獨呈現元素,而不是僅僅回顯表單本身。

注意:爲了阻止ZF將我的表單元素封裝在dt和dd標記中,我將這個裝飾器應用於所有標準表單元素。我有一個基礎表單類,可以擴展我的所有表單,所以我不必在任何地方重複此操作。這是元素的裝飾器,所以我可以使用標籤來封裝我的元素。

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' => '*')) 
); 

對於我的提交按鈕我使用

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

這正是我想要做的,只有子表單。問題是當我使用ViewScript裝飾器時,生成的子表單元素的名稱是錯誤的。 – Ran

0

解決方案將使用belongsTo()表單元素屬性。
實施例:

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

以這種方式,呈現()方法將使用的一種形式的元素名稱等

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

我有同樣的問題,我用裝飾

解決了它1:使用元素創建通用子表格

2:使用PrepareElements的特定修飾器

3:變化形式與setIsArray(真)的陣列

實施例:

表格

$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); 

裝飾

<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> 

享受

對不起,我的英語,我是法國人