我想知道在處理CRUD時是否有一種簡單的方法來從表單對象中生成視圖。有沒有辦法從Zend_Form生成視圖? (只讀)
我的意思是,當我們有這些選項時:VIEW |編輯| DELETE 我希望我的VIEW選項像編輯選項,但沒有表單元素,只是值。
這將最大限度地減少創建這些視圖所花費的時間。
有人知道這樣的事情嗎?
我想知道在處理CRUD時是否有一種簡單的方法來從表單對象中生成視圖。有沒有辦法從Zend_Form生成視圖? (只讀)
我的意思是,當我們有這些選項時:VIEW |編輯| DELETE 我希望我的VIEW選項像編輯選項,但沒有表單元素,只是值。
這將最大限度地減少創建這些視圖所花費的時間。
有人知道這樣的事情嗎?
赫克託從Nabble,show me this,這似乎是最好的方式:
class Default_View_Helper_FormView extends Zend_View_Helper_Abstract
{
public function formView(Zend_Form $form)
{
$html = "<dl>";
foreach ($form->getElements as $element) {
$html .= "<dt>{$element->getLabel()}</dt>";
$html .= "<dd>{$element->getValue()}</dd>";
}
$html .= "</dl>";
return $html;
}
}
我不確定我是否理解,但我認爲對於視圖選項,您可以從模型中獲取數據。無需通過Zend_Form訪問它們。
但是,如果你想讓表單只讀,你可以添加只讀(setAttrib('readonly','readonly'))屬性給你的元素。
在我上一個項目中,我也遇到了這個困境。我的解決方案可能不是最優雅的,但它完成了這項工作。請注意,我使用Form viewscript裝飾器代替完整的裝飾器生成的元素。但你可以調整這個例子來使用我所設想的裝飾器。我所展示的是一個非常基本的例子,給你一個大概的想法。這是我做的:
class Cms_Form_Page extends Zend_Form
{
const FOR_CREATE = 'forCreate';
const FOR_READ = 'forRead';
const FOR_UPDATE = 'forUpdate';
const FOR_DELETE = 'forDelete';
protected $_name = 'page';
private $_for;
private $_viewScripts = array(
self::FOR_CREATE => 'page-manager/partials/form-page-create.phtml',
self::FOR_READ => 'page-manager/partials/form-page-read.phtml',
self::FOR_UPDATE => 'page-manager/partials/form-page-update.phtml',
self::FOR_DELETE => 'page-manager/partials/form-page-delete.phtml'
);
public function __construct($for = self::FOR_CREATE, $options = null)
{
$this->_for = $for;
parent::__construct($options);
}
public function init()
{
$this->setName($this->_name)
->setAttribs(array('accept-charset' => 'utf-8'))
->setDecorators(array(
'PrepareElements',
array('ViewScript', array('viewScript' => $this->_viewScripts[ $this->_for ])),
'Form'
));
$elements = array();
swith($this->_for)
{
case self::FOR_CREATE:
$title = new Zend_Form_Element_Text('title');
$elements[] = $title;
break
case self::FOR_READ:
$id = new Zend_Form_Element_Hidden('id');
$elements[] = $id;
break;
case self::FOR_UPDATE:
$id = new Zend_Form_Element_Hidden('id');
$elements[] = $id;
$title = new Zend_Form_Element_Text('title');
$elements[] = $title;
break;
case self::FOR_DELETE:
$id = new Zend_Form_Element_Hidden('id');
$elements[] = $id;
break;
default:
throw new Exception('invalid Form type');
}
$submit = new Zend_Form_Element_Button('submit');
$elements[] = $submit;
$this->addElements($elements);
}
}
所以,基本上,我將其中一個類常量傳遞給它的構造函數。基於這個價值,我確定了表單需要哪些元素,以及元素應該如何呈現。
例如,爲創建你可能有一個選擇下拉表單字段,你會選擇一個區域,刪除這將是一個隱藏的字段(在我的例子btw中沒有顯示)。
希望這給了你一些想法。
PS:
在選擇viewscripts之一然後你可以簡單地顯示一個元素的值,喜歡的東西(與呈現所隱藏的元素也一起):
<?
$form = $this->element;
?>
... some html
// let's presume id and locale are hidden form fields for current form type
// (Cms_Form_Page::FOR_UPDATE for instance)
<?= $form->id->renderViewHelper(); ?>
<?= $form->locale->renderViewHelper(); ?>
// and here we simply output the current locale value
// of course, you should have populated the values in the form somewhere first
<dt>Current locale:</dt>
<dd><?= $form->locale->getValue(); ?></dd>
...etc
所以,我認爲你最好是使用表單的viewscript裝飾器,或者你可以滾動你自己的表單元素裝飾器來渲染隱藏的字段(如果必須的話),並簡單地在一些html標籤中顯示它的值。
Thx!你給我一些亮光。考慮到這一點,我曾想過如果不是觀看腳本,我可以爲我的「表單頁面閱讀」獲取不同的視圖幫助,例如 $ value。這個viewhelper將回顯通過$ form-> populate()傳遞的值,並且將使用正常形式的相同裝飾器,除了呈現該元素的視圖幫助器。因此,我認爲我可以實現完全的CRUD生成。 – 2010-02-20 05:12:23
@凱恩:正好!這就是我所提議的。 :) – 2010-02-20 05:34:49
與接受的答案唯一的問題是,你創造的所有元素,然後忽略他們。
使用fireeyedboy的答案中的控制邏輯,您可以改爲將所有元素切換到Zend_View_Helper_FormNote
,它們做同樣的事情。
只取決於優化是否重要。
做了幾個小的補充公認的答案,以覆蓋可能是特殊情況下的共同要素:
class Default_View_Helper_FormView extends Zend_View_Helper_Abstract
{
public function formView(Zend_Form $form)
{
$html = '<dl>';
foreach ($form->getElements() as $element) {
if($element instanceof Zend_Form_Element_Submit) {
continue;
}
$html .= '<dt>' . $element->getLabel() . '</dt>';
$value = $element->getValue();
if($element instanceof Zend_Form_Element_Checkbox) {
$value = ($value) ? 'Yes' : 'No';
}
else if($element instanceof Zend_Form_Element_Select) {
$value = $element->getMultiOption($value);
}
$html .= '<dd>' . $value . '</dd>';
}
$html .= '</dl>';
return $html;
}
}
爲什麼要創建我從頭查看時,您的看法是完全一樣的,以您的形式除了輸入元素?對於真正的CRUD一代,我認爲這需要自動化。 – 2010-02-20 05:17:40