我有一个奇怪的问题。
我创建了一个自定义表单元素。我创建了两个select-form-elements来选择时间(00:00)。
奇怪的是,当我在表单中使用它一次就可以了,但是当我第二次使用它时(因为约会有开始和结束时间),第一次再次显示。所以我最终得到了三倍的形式元素。当我再次使用它时,它也会显示前两个,最后是表单元素的6倍。
有人知道如何阻止他的发生吗?
守则:
表单元素
<?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;
}
}
视图助手
<?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;
}
}
谢谢!
彼得
答案 0 :(得分:1)
这种行为很正常。原因是当您从视图中调用帮助程序时,它只在App_View_Helper_FormTimeSelect
的实例上执行formTimeSelect()方法。您需要记住,在Zend应用程序执行期间,只有一个帮助程序实例。因此,在您的代码中,多次从视图中调用帮助程序只会将新的html(FormTimeSelect
方法的结果)附加到$ html变量中的现有字符串。如果多次调用该方法,您将看到该字符串的多个版本。因此,只需在$html=''
方法的开头重置(FormTimeSelect
)$ html的值。
希望这会澄清问题。