2010-02-19 3 views
1

Je me demandais s'il existait un moyen facile de générer des vues à partir d'objets de formulaire en traitant des CRUD. Je veux dire, quand nous avons ces options: VIEW | EDIT | DELETE Je veux mon option VIEW comme l'option EDIT, mais sans les éléments de formulaire, juste les valeurs.Existe-t-il un moyen de générer des vues à partir de Zend_Form? (en lecture seule)

Cela minimisera le temps passé à créer ces vues.

Quelqu'un sait quelque chose comme ça?

Répondre

1

Hector de Nabble, show me this, qui semble être la meilleure façon:

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

Je ne suis pas sûr si je comprends, mais je pense que pour l'option d'affichage, vous pouvez simplement récupérer les données de votre modèle. Pas besoin d'y accéder via Zend_Form. Mais si vous voulez que votre formulaire soit en lecture seule, vous pouvez ajouter l'attribut readonly (setAttrib ('readonly', 'readonly')) à vos éléments.

+0

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é. –

3

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.

+0

Thx! Tu me fais un peu de lumière. Dans cet esprit, j'ai pensé que si au lieu d'un viewcript je peux avoir un viewhelper différent pour mon "formulaire-page-lire", ce qui sera une valeur $ par exemple. Ce viewhelper fera écho à la valeur passée par $ form-> populate() et utilisera les mêmes décorateurs d'un formulaire normal, à l'exception du viewhelper qui rendra l'élément. Avec cela je pense que je peux réaliser une génération complètement CRUD. –

+0

@Keyne: exactement! C'était en quelque sorte ce que je proposais. :) –

0

Le seul problème avec la réponse acceptée est que vous créez tous les éléments et les ignorer. En utilisant la logique de contrôle de la réponse de fireeyedboy, vous pouvez à la place passer tous les éléments à Zend_View_Helper_FormNote qui fait la même chose.

Cela dépend uniquement de l'importance de l'optimisation.

0

a fait un ajout de quelques mineures à la réponse acceptée pour couvrir des éléments communs qui peuvent être des cas particuliers:

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; 
    } 
} 
Questions connexes