我想知道在处理 CRUD 时是否有一种简单的方法可以从表单对象生成视图。
我的意思是,当我们有这些选项时: VIEW | 编辑 | DELETE 我想要像 EDIT 选项一样的 VIEW 选项,但没有表单元素,只有值。
这将大大减少创建这些视图所花费的时间。
有人知道这样的事情吗?
我想知道在处理 CRUD 时是否有一种简单的方法可以从表单对象生成视图。
我的意思是,当我们有这些选项时: VIEW | 编辑 | DELETE 我想要像 EDIT 选项一样的 VIEW 选项,但没有表单元素,只有值。
这将大大减少创建这些视图所花费的时间。
有人知道这样的事情吗?
在我的上一个项目中,我也遇到了这个困境。我的解决方案可能不是最优雅的,但它完成了工作。请注意,我使用 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 );
}
}
所以,基本上,我将一个类常量传递给它的构造函数。根据该值,我确定表单需要哪些元素,以及应该如何呈现这些元素。
例如,对于创建,您可以有一个选择下拉表单字段,您可以在其中选择一个区域设置,对于删除,这将是一个隐藏字段(顺便说一句,我的示例中未显示)。
希望这给了你一些想法。
PS:
在选定的视图脚本之一中,您可以简单地显示元素的值(以及渲染隐藏元素),例如:
<?
$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 标记中显示它的值。
来自 Nabble 的 Hector,给我看这个,这似乎是最好的方法:
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 访问它们。
但是如果你想让你的表单成为只读的,你可以在你的元素中添加 readonly (setAttrib('readonly', 'readonly')) 属性。
接受的答案的唯一问题是您正在创建所有元素然后忽略它们。
使用来自 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;
}
}