Dans mon dernier projet, j'avais aussi ce dilemme. Ma solution n'est peut-être pas la plus élégante, mais elle a fait l'affaire. Rappelez-vous, j'utilise un décorateur Formulaire de vuescript au lieu d'un décorateur complet généré des éléments. Mais vous pouvez ajuster cet exemple pour utiliser les décorateurs que je présume. Ce que je montre est un exemple très basique, pour vous donner une idée générale. Voici ce que j'ai fait:
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);
}
}
Donc, fondamentalement, je passe une des constantes de classe à son constructeur. Et en fonction de cette valeur, je détermine quels éléments sont nécessaires pour le formulaire et comment les éléments doivent être rendus. Par exemple, pour créer, vous pouvez sélectionner un champ de formulaire déroulant dans lequel vous souhaitez sélectionner un Locale, où pour supprimer, il s'agit d'un champ masqué (non représenté dans mon exemple btw).
J'espère que cela vous a donné quelques idées.
PS:
Dans l'un des viewscripts sélectionnés, vous pouvez alors montrer simplement la valeur d'un élément (avec le rendu de l'élément caché aussi), avec quelque chose comme:
<?
$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
Alors, je pense que vous seriez le meilleur avec l'utilisation de décorateurs de scripts pour le formulaire, ou vous pourriez rouler votre propre décorateur d'élément de formulaire qui rend le champ caché (si nécessaire) et montre simplement sa valeur dans une balise html.
Pourquoi créer Je considère à partir de zéro lorsque votre vue est exactement semblable à votre formulaire, sauf pour les éléments d'entrée? Pour une vraie génération de CRUD, je pense que cela doit être automatisé. –