Заполнение часов / дат в Zend_Form_Element_Select
Я ищу Zend_Form
элементы, которые позволят мне интегрировать Zend_Date
ценится легко.
Например, мне нужно выбрать час и день недели в моих формах. например, средство выбора часов должно отображать все значения часов с 12:00 до 23:00, а средство выбора дня недели должно отображать все доступные дни недели.
Я искал какую-то интеграцию между Zend_Form_Element_Select
а также Zend_Date
, но я не смог найти никаких готовых к использованию элементов. Я хотел бы использовать zend_date, поэтому здесь будут использоваться настройки локализации, которые я уже использую.
В идеале это должен быть элемент формы Zend, в котором я могу указать нужный мне тип значения, например:
$hour = new Form_Element_DateSelect('hour');
$hour->setDateFormat(Zend_Date:HOUR);
или же
$weekday = new Form_Element_DateSelect('hour');
$hour->setDateFormat(Zend_Date:DAYOFWEEK);
Я могу сделать это, используя стандартные Zend_Form_Element_Select
и предварительно заполнив значения, однако мне любопытно, сделал ли кто-то элементы для этих случаев или есть идея сделать эти элементы многократно используемыми и поддерживать несколько форматов даты.
$hour = new Zend_Form_Element_Select('hour');
$hour->setRequired(true)
->setLabel('Hour:')
$this->addElement($hour);
$time = new Zend_Date();
$time->setTime('00:00:00');
for ($i=0;$i<=23;$i++) {
$hour->addMultiOption($time->get('HH:mm'), $time->toString(Zend_Date::TIME_SHORT));
$time->addHour(1);
}
1 ответ
Я бы взглянул на Zend_Dojo, так как в нем могут быть элементы, близкие к тому, что вы ищете.
В частности, dijit.form.TimeTextBox, возможно, dijit.Calendar, поскольку вы можете отключить выбор дат выходных, или dijit.form.select, который представляет собой расширенное поле выбора, в которое вы можете поместить рабочие дни. Через Zend_Form
а также Zend_Translate
названия дней недели могут быть легко переведены на язык пользователя.
Я уверен, что множество jQuery виджетов для того же будет доступно. Если бы вы пошли по этому пути, вам пришлось бы сделать немного больше работы, чтобы он был тесно связан с Zend_Form
как вы хотите, но вы также можете создавать свои собственные декораторы и элементы.
Справочное руководство по Zend Framework содержит несколько основных примеров элементов формы Dojo TimeTextBox, DateTextBox и Combo / Select Boxes.
Возможно, использование этих богатых элементов пользовательского интерфейса даже излишне для того, что вы хотите, если это так, быстрый способ сделать то, что вы хотите с предварительно заполненными элементами, - это создать вспомогательные методы для возврата массива значений (дней недели или времени), которые Вы можете легко кормить в Zend_Form_Element_Select::setMultiOptions()
,
например
public function getWeekdays()
{
$locale = new Zend_Locale('en_US'); // or get from registry
$days = Zend_Locale::getTranslationList('Days', $locale);
return $days['format']['wide'];
}
public function getTimes($options = array())
{
$start = null; // time to start
$end = null; // time to end
$increment = 900; // increment in seconds
$format = Zend_Date::TIME_SHORT; // date/time format
if (is_array($options)) {
if (isset($options['start']) && $options['start'] instanceof Zend_Date) {
$start = $options['start'];
}
if (isset($options['end']) && $options['end'] instanceof Zend_Date) {
$end = $options['end'];
}
if (isset($options['increment']) && is_int($options['increment']) && (int)$options['increment'] > 0) {
$increment = (int)$options['increment'];
}
if (isset($options['format']) && is_string($options['format'])) {
$format = $options['format'];
}
}
if ($start == null) {
$start = new Zend_Date('00:00:00', Zend_Date::TIME_LONG);
}
if ($end == null) {
$end = new Zend_Date('23:59:00', Zend_Date::TIME_LONG);
}
$times = array();
$time = new Zend_Date($start);
while($time < $end) { // TODO: check $end > $time
$times[] = $time->toString($format);
$time->add($increment, Zend_Date::SECOND);
}
return $times;
}
Называя их:
$opts = array('start' => new Zend_Date('07:00:00', Zend_Date::TIME_LONG),
'end' => new Zend_Date('20:00:00', Zend_Date::TIME_LONG),
'increment' => 3600);
$element->setMultiOptions($form->getTimes($opts));
$element2->setMultiOptions($form->getWeekdays());