有没有办法从Zend_Form生成视图? (只读)

问题描述:

我想知道在处理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'))属性给你的元素。

+0

为什么要创建我从头查看时,您的看法是完全一样的,以您的形式除了输入元素?对于真正的CRUD一代,我认为这需要自动化。 – 2010-02-20 05:17:40

在我上一个项目中,我也遇到了这个困境。我的解决方案可能不是最优雅的,但它完成了这项工作。请注意,我使用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

与接受的答案唯一的问题是,你创造的所有元素,然后忽略他们。

使用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; 
    } 
}