/** * Renders a date time widget. * * @param array $data Data to render with. * @param \Cake\View\Form\ContextInterface $context The current form context. * @return string A generated select box. * @throws \RuntimeException When option data is invalid. */ public function render(array $data, ContextInterface $context) { $id = $data['id']; $name = $data['name']; $val = $data['val']; $type = $data['type']; $required = $data['required'] ? 'required' : ''; $disabled = isset($data['disabled']) && $data['disabled'] ? 'disabled' : ''; $role = isset($data['role']) ? $data['role'] : 'datetime-picker'; $format = null; $locale = isset($data['locale']) ? $data['locale'] : I18n::locale(); $timezoneAware = Configure::read('CrudView.timezoneAwareDateTimeWidget'); $timestamp = null; $timezoneOffset = null; if (isset($data['data-format'])) { $format = $this->_convertPHPToMomentFormat($data['data-format']); } if (!$val instanceof DateTimeInterface && !empty($val)) { $val = $type === 'date' ? Time::parseDate($val) : Time::parseDateTime($val); } if ($val) { if ($timezoneAware) { $timestamp = $val->format('U'); $dateTimeZone = new DateTimeZone(date_default_timezone_get()); $timezoneOffset = $dateTimeZone->getOffset($val) / 60; } $val = $val->format($type === 'date' ? 'Y-m-d' : 'Y-m-d H:i:s'); } if (!$format) { $format = $type === 'date' ? 'L' : 'L LT'; } $widget = <<<html <div class="input-group {$type}"> <input type="text" class="form-control" name="{$name}" value="{$val}" id="{$id}" role="{$role}" data-locale="{$locale}" data-format="{$format}" html; if ($timezoneAware && isset($timestamp, $timezoneOffset)) { $widget .= <<<html data-timestamp="{$timestamp}" data-timezone-offset="{$timezoneOffset}" html; } $widget .= <<<html {$required} {$disabled} /> <label for="{$id}" class="input-group-addon"> <span class="glyphicon glyphicon-calendar"></span> </label> </div> html; return $widget; }
/** * Render a LilDate field. * * This method accepts a number of keys: * * - `text` The text of the button. Unlike all other form controls, buttons * do not escape their contents by default. * - `escape` Set to true to enable escaping on all attributes. * - `type` The button type defaults to 'submit'. * * Any other keys provided in $data will be converted into HTML attributes. * * @param array $data The data to build a button with. * @param ContextInterface $context The form context. * * @return string */ public function render(array $data, ContextInterface $context) { $data += ['val' => '', 'name' => '']; if (is_a($data['val'], 'Cake\\I18n\\Time') || is_a($data['val'], 'Cake\\I18n\\Date') || is_a($data['val'], 'Cake\\I18n\\FrozenTime') || is_a($data['val'], 'Cake\\I18n\\FrozenDate')) { $data['value'] = $data['val']->toDateString(); } else { if ($theDate = Time::parseDate($data['val'], 'yyyy-MM-dd')) { $data['value'] = $theDate->toDateString(); } } // default field type is HTML5 date $fieldType = 'date'; // localized date input with jquery date picker if (Configure::read('Lil.legacyDateFields')) { $fieldType = 'text'; if ($theDate = Time::parseDate($data['value'], 'yyyy-MM-dd')) { $parts = str_split(Configure::read('Lil.dateFormat')); for ($i = 0; $i < sizeof($parts); $i++) { $parts[$i] = strtr($parts[$i], ['D' => str_pad($theDate->day, 2, '0', STR_PAD_LEFT), 'M' => str_pad($theDate->month, 2, '0', STR_PAD_LEFT), 'Y' => $theDate->year]); } $data['value'] = implode(Configure::read('Lil.dateSeparator'), $parts); } $this->view->Lil->jsReady(sprintf('$("#%1$s").datepicker(%2$s);', $data['id'], $this->_jsOptions())); } return $this->templates->format('input', ['type' => $fieldType, 'name' => $data['name'], 'attrs' => $this->templates->formatAttributes($data, ['name', 'val'])]); }
/** * Renders a date time widget. * * @param array $data Data to render with. * @param \Cake\View\Form\ContextInterface $context The current form context. * @return string A generated select box. * @throws \RuntimeException When option data is invalid. */ public function render(array $data, ContextInterface $context) { $id = $data['id']; $name = $data['name']; $val = $data['val']; $type = $data['type']; $required = $data['required'] ? 'required' : ''; $role = isset($data['role']) ? $data['role'] : 'datetime-picker'; $format = null; $timestamp = null; $locale = locale_get_primary_language(I18n::locale()); if (isset($data['data-format'])) { $format = $this->_convertPHPToMomentFormat($data['data-format']); } if (!$val instanceof DateTime && !empty($val)) { $val = $type === 'date' ? Time::parseDate($val) : Time::parseDateTime($val); } if ($val) { $timestamp = $val->format('U'); $val = $val->format($type === 'date' ? 'Y-m-d' : 'Y-m-d H:i:s'); } if (!$format) { $format = $type === 'date' ? 'L' : 'L LT'; } $widget = <<<html <div class="input-group {$type}"> <input type="text" class="form-control" name="{$name}" value="{$val}" id="{$id}" role="{$role}" data-locale="{$locale}" data-format="{$format}" data-timestamp="{$timestamp}" {$required} /> <span class="input-group-addon"> <span class="glyphicon glyphicon-calendar"></span> </span> </div> html; return $widget; }
/** * Tests that parsing a date respects de default timezone in PHP. * * @return void */ public function testParseDateDifferentTimezone() { date_default_timezone_set('Europe/Paris'); Time::$defaultLocale = 'fr-FR'; $result = Time::parseDate('12/03/2015'); $this->assertEquals('2015-03-12', $result->format('Y-m-d')); $this->assertEquals(new \DateTimeZone('Europe/Paris'), $result->tz); }
/** * Tests parsing a string into a Time object based on the locale format. * * @return void */ public function testParseDate() { $time = Time::parseDate('10/13/2013 12:54am'); $this->assertNotNull($time); $this->assertEquals('2013-10-13 00:00', $time->format('Y-m-d H:i')); $time = Time::parseDate('10/13/2013'); $this->assertNotNull($time); $this->assertEquals('2013-10-13 00:00', $time->format('Y-m-d H:i')); Time::$defaultLocale = 'fr-FR'; $time = Time::parseDate('13 10, 2013 12:54'); $this->assertNotNull($time); $this->assertEquals('2013-10-13 00:00', $time->format('Y-m-d H:i')); $time = Time::parseDate('13 foo 10 2013 12:54'); $this->assertNull($time); $time = Time::parseDate('13 10, 2013', 'dd M, y'); $this->assertNotNull($time); $this->assertEquals('2013-10-13', $time->format('Y-m-d')); }