2011-03-13 4 views
1

J'ai un problème étrange.Zend Framework L'élément de formulaire personnalisé se répète

J'ai créé un élément de formulaire personnalisé. Je l'ai créé avec deux select-forme-éléments pour sélectionner une heure (00:00). Les choses étranges est que quand je l'utilise une fois dans une forme c'est ok, mais quand je l'utilise une seconde fois (parce qu'un rendez-vous a un début et une heure de fin) le premier est montré à nouveau. Donc je me retrouve avec trois fois l'élément de forme. Quand je l'utilise encore, il montre les deux premiers et je finis avec 6 fois l'élément de forme.

Est-ce que quelqu'un sait comment l'empêcher de se produire?

Le code:

Form Élément

<?php 

class App_Form_Element_TimeSelect extends Zend_Form_Element_Xhtml 
{ 

    public $helper = 'FormTimeSelect'; 
    protected $hour = null; 
    protected $minutes = null; 

    public function setHour($hour) 
    { 
     $this->hour = $hour; 
     return $this; 
    } 

    public function setMinutes($minutes) 
    { 
     $this->minutes = $minutes; 
     return $this; 
    } 

    public function setValue($value) 
    { 
     if (is_array($value) 
       && isset($value['hour']) 
       && isset($value['minutes'])) 
     { 
      $this->setHour($value['hour']) 
        ->setMinutes($value['minutes']); 
     } 
    } 

    public function getValue() 
    { 
     if (!$this->hour || !$this->minutes) 
      return false; 
     return $this->hour . ':' . $this->minutes; 
    } 

} 

L'aide de vue

<?php 

class App_View_Helper_FormTimeSelect extends Zend_View_Helper_FormElement { 

    protected $html = ''; 

    public function FormTimeSelect($name, $value = null, $attribs = null) 
    { 
     $hour = '00'; 
     $minute = '00'; 
     if ($value) 
      list($hour, $minute) = split(':', $value); 

     $helper = new Zend_View_Helper_FormSelect(); 
     $helper->setView($this->view); 

     $hourarray = array('00' => '00', '01' => '01', '02' => '02', '03' => '03', 
      '04' => '04', '05' => '05', '06' => '06', '07' => '07', '08' => '08', 
      '09' => '09', '10' => '10', '11' => '11', '12' => '12', '13' => '13', 
      '14' => '14', '15' => '15', '16' => '16', '17' => '17', '18' => '18', 
      '19' => '19', '20' => '20', '21' => '21', '22' => '22', '23' => '23'); 
     $minutearray = array('00' => '00', '15' => '15', '30' => '30', '45' => '45'); 

     $this->html .= $helper->formSelect($name . '[hour]', $hour, null, $hourarray); 
     $this->html .= ' : '; 
     $this->html .= $helper->formSelect($name . '[minutes]', $minute, null, $minutearray); 

     return $this->html; 
    } 

} 

Merci!

Peter

+0

Essayez d'abord sans utiliser la notation de tableau ici: ($ nom [heure]). Il n'est pas très pratique avec Zend_Form, vous devrez peut-être utiliser des sous-formulaires pour les utiliser. –

Répondre

1

Ce comportement est normal. La raison en est que lorsque vous appelez un assistant à partir de la vue, il exécute simplement la méthode formTimeSelect() sur une instance de App_View_Helper_FormTimeSelect. Vous devez vous rappeler que lors de l'exécution de l'application Zend, il n'y a qu'une seule instance de l'assistant. Ainsi, dans votre code, appeler l'assistant à partir de la vue plusieurs fois ajoutera simplement le nouveau html (résultat de la méthode FormTimeSelect) à la chaîne existante dans une variable $ html. Si vous appelez la méthode plusieurs fois, vous verrez plusieurs versions de la chaîne. Il suffit donc de réinitialiser ($html='') la valeur de $ html au début de la méthode FormTimeSelect.

Espérons que cela clarifiera le problème.

+0

Merci! Ça marche! – Peter

Questions connexes