2010-02-19 79 views
1

我想知道在處理CRUD時是否有一種簡單的方法來從表單對象中生成視圖。有沒有辦法從Zend_Form生成視圖? (只讀)

我的意思是,當我們有這些選項時:VIEW |編輯| DELETE 我希望我的VIEW選項像編輯選項,但沒有表單元素,只是值。

這將最大限度地減少創建這些視圖所花費的時間。

有人知道這樣的事情嗎?

回答

1

赫克託從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; 
    } 
} 
0

我不確定我是否理解,但我認爲對於視圖選項,您可以從模型中獲取數據。無需通過Zend_Form訪問它們。

但是,如果你想讓表單只讀,你可以添加只讀(setAttrib('readonly','readonly'))屬性給你的元素。

+0

爲什麼要創建我從頭查看時,您的看法是完全一樣的,以您的形式除了輸入元素?對於真正的CRUD一代,我認爲這需要自動化。 – 2010-02-20 05:17:40

3

在我上一個項目中,我也遇到了這個困境。我的解決方案可能不是最優雅的,但它完成了這項工作。請注意,我使用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標籤中顯示它的值。

+0

Thx!你給我一些亮光。考慮到這一點,我曾想過如果不是觀看腳本,我可以爲我的「表單頁面閱讀」獲取不同的視圖幫助,例如 $ value。這個viewhelper將回顯通過$ form-> populate()傳遞的值,並且將使用正常形式的相同裝飾器,除了呈現該元素的視圖幫助器。因此,我認爲我可以實現完全的CRUD生成。 – 2010-02-20 05:12:23

+0

@凱恩:正好!這就是我所提議的。 :) – 2010-02-20 05:34:49

0

與接受的答案唯一的問題是,你創造的所有元素,然後忽略他們。

使用fireeyedboy的答案中的控制邏輯,您可以改爲將所有元素切換到Zend_View_Helper_FormNote,它們做同樣的事情。

只取決於優化是否重要。

0

做了幾個小的補充公認的答案,以覆蓋可能是特殊情況下的共同要素:

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; 
    } 
} 
相關問題