Browse Source

Add better support for template vars and tests in DateTime widget.

Mark Story 10 years ago
parent
commit
23ad3c9e9f

+ 19 - 3
src/View/Widget/DateTimeWidget.php

@@ -150,6 +150,15 @@ class DateTimeWidget implements WidgetInterface
             if (!isset($data[$select]['disabled'])) {
                 $data[$select]['disabled'] = $data['disabled'];
             }
+            if (isset($data[$select]['templateVars']) && $templateOptions['templateVars']) {
+                $data[$select]['templateVars'] = array_merge(
+                    $templateOptions['templateVars'],
+                    $data[$select]['templateVars']
+                );
+            }
+            if (!isset($data[$select]['templateVars'])) {
+                $data[$select]['templateVars'] = $templateOptions['templateVars'];
+            }
             $templateOptions[$select] = $this->{$method}($data[$select], $context);
             unset($data[$select]);
         }
@@ -310,6 +319,7 @@ class DateTimeWidget implements WidgetInterface
             'start' => date('Y', strtotime('-5 years')),
             'end' => date('Y', strtotime('+5 years')),
             'order' => 'desc',
+            'templateVars' => [],
             'options' => []
         ];
 
@@ -341,7 +351,8 @@ class DateTimeWidget implements WidgetInterface
             'names' => false,
             'val' => null,
             'leadingZeroKey' => true,
-            'leadingZeroValue' => false
+            'leadingZeroValue' => false,
+            'templateVars' => [],
         ];
 
         if (empty($options['options'])) {
@@ -372,6 +383,7 @@ class DateTimeWidget implements WidgetInterface
             'val' => null,
             'leadingZeroKey' => true,
             'leadingZeroValue' => false,
+            'templateVars' => [],
         ];
         $options['options'] = $this->_generateNumbers(1, 31, $options);
 
@@ -396,6 +408,7 @@ class DateTimeWidget implements WidgetInterface
             'end' => null,
             'leadingZeroKey' => true,
             'leadingZeroValue' => false,
+            'templateVars' => [],
         ];
         $is24 = $options['format'] == 24;
 
@@ -449,6 +462,7 @@ class DateTimeWidget implements WidgetInterface
             'round' => 'up',
             'leadingZeroKey' => true,
             'leadingZeroValue' => true,
+            'templateVars' => [],
         ];
         $options['interval'] = max($options['interval'], 1);
         if (empty($options['options'])) {
@@ -478,7 +492,8 @@ class DateTimeWidget implements WidgetInterface
             'val' => null,
             'leadingZeroKey' => true,
             'leadingZeroValue' => true,
-            'options' => $this->_generateNumbers(0, 59)
+            'options' => $this->_generateNumbers(0, 59),
+            'templateVars' => [],
         ];
 
         unset($options['leadingZeroKey'], $options['leadingZeroValue']);
@@ -497,7 +512,8 @@ class DateTimeWidget implements WidgetInterface
         $options += [
             'name' => '',
             'val' => null,
-            'options' => ['am' => 'am', 'pm' => 'pm']
+            'options' => ['am' => 'am', 'pm' => 'pm'],
+            'templateVars' => [],
         ];
         return $this->_select->render($options, $context);
     }

+ 40 - 0
tests/TestCase/View/Widget/DateTimeWidgetTest.php

@@ -1158,6 +1158,46 @@ class DateTimeWidgetTest extends TestCase
     }
 
     /**
+     * Test rendering with templateVars
+     *
+     * @return void
+     */
+    public function testRenderTemplateVars()
+    {
+        $templates = [
+            'select' => '<select data-s="{{svar}}" name="{{name}}"{{attrs}}>{{content}}</select>',
+            'option' => '<option data-o="{{ovar}}" value="{{value}}"{{attrs}}>{{text}}</option>',
+            'optgroup' => '<optgroup label="{{label}}"{{attrs}}>{{content}}</optgroup>',
+            'dateWidget' => '{{year}}{{month}}{{day}}{{hour}}{{minute}}{{second}}{{meridian}}{{help}}'
+        ];
+        $this->templates->add($templates);
+        $result = $this->DateTime->render([
+            'name' => 'date',
+            'year' => [
+                'templateVars' => ['ovar' => 'not-default']
+            ],
+            'month' => [
+                'names' => true
+            ],
+            'hour' => false,
+            'minute' => false,
+            'second' => false,
+            'meridian' => [],
+            'templateVars' => [
+                'svar' => 's-val',
+                'ovar' => 'o-val',
+                'help' => 'some help',
+            ]
+        ], $this->context);
+
+        $this->assertContains('<option data-o="not-default" value="2015">2015</option>', $result);
+        $this->assertContains('<option data-o="o-val" value="01">January</option>', $result);
+        $this->assertContains('<select data-s="s-val" name="date[year]">', $result);
+        $this->assertContains('<select data-s="s-val" name="date[month]">', $result);
+        $this->assertContains('</select>some help', $result);
+    }
+
+    /**
      * Test that secureFields omits removed selects
      *
      * @return void