1

在Zend Framework中設計器的設計有多糟糕,讓我非常難以理解。 我今天花了很多時間,還花了很多時間試圖弄清楚如何做一些簡單的前端任務。ZF中的Zend_Forms和裝飾器 - 在一個容器中顯示標籤,輸入和錯誤

在我看來,Zend_Forms和裝飾器是ZF最糟糕的部分,因爲後端和前端沒有正確分離。爲什麼表單類會規定如何打印HTML?

所有我在尋找,東西simple這樣的:

<div class="labeledField"> 
    <label for="username">Username</label> 
    <input type="text" id="username" name="username" /> 
</div> 
<div class="labeledField"> 
    <label for="password">Password</label> 
    <input type="password" id="password" name="password" /> 
</div> 

我希望它這樣的原因是因爲我想要的標籤坐在像場的頂部:

[Username  ] 
[Password  ] 

通過這種方式,我可以使標籤在選擇輸入時稍微淡化,但在選擇輸入時仍然保持不變。當輸入框包含任何內容時,使用JS標籤將被隱藏。此功能存在於Apple購物車上。

我喜歡Zend_form的驗證部分,如果後端代碼沒有規定HTML的外觀,我會喜歡它如何放置在前端。

在我看來,要麼採取的模板(從frontender與訪問/視圖/文件夾或我應該可以做一些事情,如:

<div class="labeledField"> 
    <?php 
    echo $this->form->username->getLabel(); 
    echo $this->form->username->getElement(); 
    $errors = $this->form->username->getErrors(); 
    if (sizeof($errors) > 0) { 
     ?> 
     <div class="errors"> 
     <?php 
     foreach($errors as $error) { 
      ?> 
      <li><?php echo $error ?></li> 
      <?php 
     } 
     ?> 
     </div> 
     <?php 
    } 
    ?> 
</div> 

但隨後的模板可以讓我只是回聲$ this->形式,並使用上述格式作爲我想要的字段。

+0

是的,Zend_Form是我最不喜歡的組件。我的建議:溝Zend_Form,並使用驗證器類來驗證您自己的手動編碼形式的輸入。 –

回答

2

沒有關於它的問題,裝飾者可以採取一些習慣讓我解決/回答你的一些問題/問題:

幾乎把我的頭髮都轉移到Zend Framework中設計器的設計上有多糟糕。我今天花了很多時間,還花了很多時間試圖弄清楚如何做一些本應該是簡單的前端任務。

是的,這是一個奇蹟,我什麼都留下了頭髮。

在我看來,Zend_Forms和裝飾器是ZF最糟糕的部分,因爲後端和前端沒有正確分離。爲什麼表單類會規定如何打印HTML?

我同意你在這裏,表單如何呈現是一個演示文稿問題,所以它可能更多的視圖相關。如果你真的想分開問題,你可以創建未裝飾的表單,然後在視圖腳本中添加裝飾器,也許使用一些自定義的視圖助手。這對我來說最有意義,儘管我承認我從來沒有打算這麼做。

對於設置一個單獨的表格上裝飾一個獨立的類的實例,看看EasyBib_Form_DecoratorUsing Zend_Form without Zend Framework MVC

在我看來,要麼採取的模板(從frontender與訪問/視圖/文件夾或者我應該可以做這樣的事情:

你幾乎不使用ViewScript decorator

$form->setDecorators(array(
    array('ViewScript', array(      // note case 
     'viewScript' => '_partials/forms/my.phtml', // note case 
))); 
有功能

這就是說,你想要的標記是相對簡單的使用標準裝飾:

// not tested, but should be pretty close 
$element->setDecorators(array(
    'ViewHelper', 
    'Label', 
    'Errors', 
    array('HtmlTag', array('tag' => 'div', 'attribs' => array('class' => 'labeledField'))), 
)); 

當然,形式的任何特殊造型或客戶端的操作 - 例如,你舉了蘋果車效果 - 可分層到客戶端的這個標記。

+0

感謝所有的信息,這是迄今爲止我聽到的最好的。儘管如此,我仍然沒有得到如何將它們拼湊在一起的邏輯:D你的例子可以直接使用,但試圖用它來做一些稍微不同的事情,但這不起作用,我正在摸索着我的腦袋,想知道我應該怎麼做從邏輯上思考它。試圖讓

Checkbox Label

+0

我有這樣的: '$ checkboxDecorator =陣列( \t \t '視圖助手', \t \t '標籤', \t \t '錯誤', \t \t陣列( 'HtmlTag',陣列(」標籤」 => '的div', '類'=> '複選框')), \t \t陣列( '標籤',陣列( '放置', 'APPEND')) \t);' 但隨後的標籤在容器外面...所以我認爲你需要在y之前完成那件作品ou包裹它們......它們都被包裹起來,但沒有被附加!不太清楚如何看待它 –

+0

現在好了,它已經成爲一個bug ...我通過將'label'更改爲'Label'來修復它......但下面的代碼可以同時使用小寫和大寫:'$ checkboxDecorator =陣列( \t \t '視圖助手', \t \t陣列( '標籤',陣列( '放置'=> 'APPEND')) \t);' –