Я бы взглянул на Zend_Dojo , поскольку некоторые элементы могут быть близки к тому, что вы ищете.
В частности, dijit.form.TimeTextBox , возможно dijit.Calendar , так как вы можете отключить выбор даты выходных, или dijit.form.select , который представляет собой расширенное поле выбора, в которое вы можете поместить дни недели. Через Zend_Form
и Zend_Translate
, названия дней недели можно легко перевести на язык пользователя.
Я уверен, что будет доступно множество виджетов jQuery для того же.Если бы вы пошли по этому пути, вам пришлось бы проделать немного больше работы, чтобы получить его настолько тесно связанным с Zend_Form
, сколько вы захотите, но вы также можете сделать свои собственные декораторы и элементы.
Справочное руководство по Zend Framework содержит несколько основных примеров элементов формы Dojo TimeTextBox , DateTextBox и поля со списком / выделением .
Возможно использованиеэти богатые элементы пользовательского интерфейса даже излишни для того, что вы хотите, если это так, быстрый способ сделать то, что вы хотите с помощью предварительно заполненных элементов, - это создать вспомогательные методы для возврата массива значений (дней недели или времени), которые вы можетелегко вводить в 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());