/**
     * 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;
    }
Example #2
0
 /**
  * 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'])]);
 }
Example #3
0
    /**
     * 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;
    }
Example #4
0
 /**
  * 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);
 }
Example #5
0
 /**
  * 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'));
 }