[英]Zend Form: How do I make it bend to my will?
我已多次閱讀本手冊,我已經仔細閱讀了Google提供的有關該主題的帖子,我甚至買了幾本與ZF有關的書籍。 現在,為什么我仍然困惑?
我可以使用Zend_Form創建一個驗證和運行正常的表單。 我無法做到的是一個看起來完全像我希望它看到我想要它的錯誤消息的表單。 我想要自定義按鈕,我想要時髦的布局,我想在表單中間插入文本等。
有沒有人有一種簡單的方法來實現這些事情? 讓我覺得這個框架的東西能節省我的時間而不是花錢嗎? 我可以放棄Zend Form ...制作我自己的表單,讓它的動作點擊頁面來驗證和處理發布的數據,我可以盡可能快地打字,但我真的想“得到”這個並且能夠使用它,因為它顯然是有意的。
有什么建議? 任何簡單的“如何使用”自定義按鈕,時髦的布局和基本(或者相當高級,因為有大量的基本教程可以跳過更難的問題)“使用zend形式完成任務”?
巴雷特康拉德的建議就是我所建議的。 另外,請記住,您不需要使用表單對象來呈現表單。
您可以做的一件事是在視圖腳本中創建一個表單,該表單具有與表單類同名的元素。
您的HTML表單:
<form action="/login/" method="post">
<fieldset>
<label for="username">Username:</label>
<input type="text" size="10" name="username" />
<label for="password">Password:</label>
<input type="password" size="10" name="password" />
<input type="submit" />
</fieldset>
</form>
你的班:
class LoginForm extends Zend_Form
{
public function init()
{
$username = $this->createElement('text','username');
$username->setRequired(true);
$this->addElement($username);
$password = $this->createElement('password','password');
$password->setRequired(true);
$this->addElement($password);
}
}
您的表單類反映了您的HTML表單,您的類中的每個元素都有自己的驗證器和要求。 回到您的操作中,您可以創建表單類的實例,並針對該表單驗證您的post / get vars:
$form = new LoginForm();
if ($this->_request->isPost()) {
if ($form->isValid($this->_request->getParams())) {
// do whatever you need to do
} else {
$this->view->errors = $form->getMessages();
}
}
您可以使用此方法在一個組中的表單頂部顯示錯誤消息。
這是一個基本示例,但它允許您完全控制表單的表示,而無需花時間學習使用裝飾器。 在我看來,Zend_Form的大部分優勢在於其驗證和過濾屬性。 這給了你力量。 回到這樣的解決方案的主要原因是您的視圖腳本HTML表單可能與您的表單類不同步。
例如,在視圖中單獨渲染每個元素
<!-- view script here -->
<form method="POST">
Name: <?php echo $this->myForm->getElement('name')->render(); ?>
some other text between the fields
Birthdate: <?php echo $this->myForm->getElement('birthdate')->render(); ?>
<input type="submit" />
</form>
這保持了使用Zend_Form視圖助手的能力(即,在驗證失敗時顯示錯誤消息並維護表單字段的值),但為您提供完全自定義功能。
如果你想更進一步,那么關閉各個表單元素的默認裝飾器,然后附加你自己以進一步自定義使用的標簽(即錯誤消息和標簽)或根本不使用裝飾器(其他而不是渲染表單元素本身)然后手動編寫所有周圍的HTML。 完整的自定義功能,同時在表單級別和視圖級別都不會失去Zend_Form的優勢。
Matthew Weier O'Phinney已經發布了一系列關於Zend_Form裝飾器的博客文章:
目前,我們已經獲得了新的和閃亮的Zend\\Form
,它比舊組件更復雜,但也更加可控,封裝和強大。 所以,我在下面說的不適用。 新的組件是恕我直言,因為它...
我可能無法幫助,因為我有完全相同的問題。 我認為Zend_Form裝飾器功能強大,但到目前為止我見過的程序員友好且不直觀的ZF,我已經在各種項目中使用了ZF的主要部分。
那說我只能從我的經驗中給出一些提示:
從相關問題到右側,很明顯Zend_Form缺乏全面的文檔,特別是考慮到它的非直觀性。 我真的很想看到ZF的人就像Zend Framework一樣對此做些什么。
所以這個答案可能只是讓你知道你並不是唯一一個遇到這個問題的人。
或者你可以使用jedi心靈技巧當然!
添加到說的內容:
不要害怕裝飾者,如果你決定堅持使用Zend_Form,你將會使用它們。 一旦你“得到它”,這是相當簡單的,不幸的是,文檔很弱並且玩它幾乎是到達那里的唯一方法。
ViewScript和ViewHelper裝飾器為您提供了強大的功能。
不要害怕挖掘存在的不同裝飾器的來源,看看他們是如何做的(我獲得了比較原始裝飾器與道場裝置的相當多的洞察力)。
我認為肖恩所建議的是你不需要調用form-> render,你可以在你的視圖中使用這樣的東西。
<someHtmlThingy name="blah" value="<?php echo $this->formInstance->getElement('whatever')->getValue(); ?>" />
我參與了一個項目(pre Zend_Form),我們在這個項目中構建了一組驗證器,並一直使用標准的viewcripts。 這是一個更多的工作(錯誤消息的管道等),但與使用Zend_Form創建元素相比並不過分。
如果您只想在表單元素之前或之后添加任意標記而不使用ViewScript裝飾器,則可以使用我的AnyMarkup裝飾器: http://www.zfsnippets.com/snippets/view/id/62
例如,以下是如何在包裝器標記內添加帶有圖像的輸入字段(需要包含正確設置自動加載的路徑):
$form->addElement('text', 'my_field', array( 'label' => 'Enter Info:', 'decorators' => array( 'ViewHelper', array('AnyMarkup', array( 'markup' => '<span class="imgwrapper">'. '<img src="info.png" alt="info icon"/></span>'), 'placement' => 'prepend' ), 'HtmlTag', 'Label' ) );
跳過表單范圍的裝飾器(IE - 打印表單的各個元素而不是僅僅依靠Form的標准View Helper來處理所有內容)是獲得一堆控制權的一種方法。
另一種選擇是簡單地手工編寫表單,只使用ZF來處理驗證和過濾。
不幸的是,更復雜的問題被忽略了,因為沒有真正的特定目的或目標,寫一個例子或操作方法真的很難。 我花了一些時間幫助那些想要修改隱藏元素顯示方式的 SO的其他開發人員,但他的案例非常具體,因此更容易深入細節。
大多數更復雜的任務實際上都歸結為擴展特定字段類型的默認幫助程序。 例如,我有一個項目,我希望將類“錯誤”應用於在提交表單后未通過驗證的所有字段,而不是寫出驗證錯誤文本:
<label for="field">Label:</label>
<input type="text" name="field" id="field" class="error">
這是一個相當復雜的過程,因為默認情況下視圖助手不能使用實際的表單元素,因此幫助程序無法檢查該元素是否存在驗證錯誤。 所以我進行了以下過程:
formXXX()
方法,並添加一個檢查以查看該元素是否有錯誤。 另外,我添加了一個setElement()
方法,裝飾者可以調用該方法來設置元素的實例,以便我的助手可以檢查錯誤。 Zend_Form_Decorator_ViewHelper
。 在其中,我訪問了視圖並實例化了表單元素類型的幫助器,並檢查了我在視圖助手中創建的setElement()
方法是否存在,如果存在則設置它。 通過這樣做,我可以擴展一些表單元素類型,而不是破壞整個腳本。 addElementPrefixPath('My_Form_Decorator'), 'path/to/decorator')
),它指向我的新表單裝飾器。 addHelperPath('/path/to/helpers', 'My_View_Helper');
您可以看到為什么編寫復雜的教程確實需要現實世界的問題。 設置這些輔助工具或復雜的裝飾器方案的重要部分是,它都是令人討厭的,它允許您非常輕松地創建許多符合相同設計方案的形式,並且如果更改,可以非常快速地修改它們的輸出需要制作。 但另一方面,如果你覺得你花了很多時間來確定如何為一個表格的利益做一個簡單的任務,我會說跳過它!
但是,如果您想要更具體的幫助,我會非常樂意提供幫助。 只是提出另一個問題(或更新此問題),我會盡力幫助。
whycantitbemorethan25c上面提到過它們,但是ViewScripts為渲染表單提供了非常細粒度的控制。 Zend_Form意味着很快,因此它假定許多默認值,如標准裝飾器,並按照它們添加到表單對象的方式對元素進行排序。 使用ViewScript,您可以跳過大部分內容,並將所有元素放在普通HTML中。
不要完全跳過裝飾器的概念。 即使稍后在ViewScript中使用它們,它們也會對各個元素進行樣式化。 例如,您可以像其他人建議的那樣將它們用於錯誤消息。
如果你有一個非常復雜的表單,它有多個具有相似動作的數據點(想想一個有活動/非活動按鈕的用戶列表和每個按鈕的刪除按鈕),你應該考慮Zend_Form_SubForm 。 子表單可以像普通表單一樣使用ViewScripts,如果使用帶有自己的ViewScripts的子表單的ViewScript級聯表單,最終會得到包含很好的邏輯和表示,而不僅僅是直接形式。
在這里回答。 希望它會幫助你。 我找到了正常數量的信息,直到找到它為止。
<table>
<tr>
<td>Page name: *</td>
<td><?php echo $this->pageForm->header_title;?></td>
</tr>
<tr>
<td>H1 tag: *</td>
<td><?php echo $this->pageForm->h1_tag;?></td>
</tr>
<tr>
<td>Page URL: *</td>
<td><?php echo $this->pageForm->url;?></td>
</tr>
<tr>
<td>Meta Description: </td>
<td><?php echo $this->pageForm->meta_description;?></td>
</tr>
<tr>
<td>Meta Keywords: </td>
<td><?php echo $this->pageForm->meta_keywords;?></td>
</tr>
<tr>
<td>Short Description: *</td>
<td><?php echo $this->pageForm->short_description;?></td>
</tr>
<tr>
<td colspan="2"><a href="<?php echo $this->websiteUrl;?>backend_template/list?placeValuesBeforeTB_=savedValues&TB_iframe=true&height=200&width=300&modal=true"
title="add a caption to title attribute / or leave blank" class="thickbox">Open iFrame Modal</a></td>
<td>
<a href="<?php echo $this->websiteUrl;?>backend_template/list?placeValuesBeforeTB_=savedValues&TB_iframe=true&height=200&width=300&modal=true" onclick="javascript:getDataFromAddPage()" title="Select Template For Page" class="thickbox" > TEST FORM </a>
</td>
</tr>
<tr>
<td>Featured: </td>
<td><?php echo $this->pageForm->featured;?></td>
</tr>
<tr>
<td>Mark as 404: </td>
<td><?php echo $this->pageForm->is_404page;?></td>
</tr>
<tr>
<td>Show in Navigation Menu: </td>
<td><?php echo $this->pageForm->in_navmain;?></td>
</tr>
<tr>
<td>Show in Static Menu:</td>
<td><?php echo $this->pageForm->in_navstatic;?></td>
</tr>
<tr>
<td><?php echo $this->pageForm->submit;?></td>
<td><?php echo $this->pageForm->button_close;?></td>
</tr>
</table>
你現在可能已經解決了這個問題,但我一直在做一些工作,需要一個類似的解決方案。
form->getSubform('subform'); foreach ($subform as $key => $value) { //some markup and custom code here print $value; //some markup and custom code here } ?>
在foreach循環中,您可以添加表標記。 如果您已正確命名表行的鍵,則它們應與表單鍵匹配。 您甚至可以使用循環來按鍵獲取相應的子表單,甚至可以使用鍵來獲取元素。 如果你知道鍵,你可以跳過foreach循環,只需說print $ subform ['somekey']; 假設您通過說$ form-> setIsArray(true)來設置主窗體; (不確定最后一部分是否是絕對必要的,但對於復雜的表格,無論如何都應該這樣設置。
我刪除了默認裝飾器,因此我可以完全控制每個元素中的打印。 Zend_Form應該有一個內置的方法來更輕松地抓取單個元素..但我認為這很有效。
希望對某人有幫助!
我給Zend_Form和裝飾器寫了一些子類,使它在<table>中布局表單。 它甚至有一些特殊的技巧來做同樣的行上顯示多個提交按鈕。
花了一整天的時間來完成它的工作。 它是針對Zend 1.5.1編寫的,因此不知道它是否適用於當前版本,但如果您感興趣我可能會在某處上傳源代碼。
這似乎是Zend Forms的一個非常普遍的抱怨。
(我知道CSS純粹主義者會因為使用表格來布局表單而得到poo-poo'd,雖然我同意CSS對大多數事情都更好,但我還沒有看到使用CSS看起來不錯的表單布局就像一個丑陋的kludge。使用表格,表格“只是工作”幾乎在我需要的每個瀏覽器上。)
編輯:好的,談到對不起的kludges,我已經把我的代碼用於在github中生成表格的zend表單。 去這里看看吧。 (因為gaoshan88要求它。)
Sean McSomething的第一個建議就是找到我的方法。 我一直以為做<?php echo $this->form ?>
來渲染表單太神奇了。 我將更進一步,通過$element->renderDecorator()
魔術方法渲染單個裝飾器而不是單個元素。 這樣,您就不必擔心定義裝飾器的順序。 你只需要他們在那里,你就不必添加那些討厭的,不直觀的HtmlTag
裝飾器。 我發了一篇關於此的博文 。
我不確定Zend是否已經擁有該功能,但是,快速解決方案是擴展類,使其接受html模板。
例如:
<?php
$form = new zend_form_whatever($field_list + $validators + $template);
echo $form;
?>
模板:
<form id="my_custom_form">
<label>{label.email}</label>
{input.email}
<span class="red">{error.email}</span>
<div>
{label.password}
{error.password}
{input.password}
</div>
<div class="purple">{input.submit}<div>
</form>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.