Browse Source

Injecting requiredMessage into templateVars

Jeremy Harris 8 years ago
parent
commit
18c8cbfc2f
2 changed files with 94 additions and 4 deletions
  1. 13 4
      src/View/Helper/FormHelper.php
  2. 81 0
      tests/TestCase/View/Helper/FormHelperTest.php

+ 13 - 4
src/View/Helper/FormHelper.php

@@ -1443,16 +1443,25 @@ class FormHelper extends Helper
     {
         $context = $this->_getContext();
 
+        $options += [
+            'templateVars' => []
+        ];
+
         if (!isset($options['required']) && $options['type'] !== 'hidden') {
             $options['required'] = $context->isRequired($fieldName);
         }
 
         if (method_exists($context, 'getRequiredMessage')) {
             $message = $context->getRequiredMessage($fieldName);
-            if ($options['required'] && $message && $this->getConfig('autoSetCustomValidity')) {
-                $message = h(addslashes($message));
-                $options['oninvalid'] = "this.setCustomValidity('$message')";
-                $options['onvalid'] = "this.setCustomValidity('')";
+
+            if ($options['required'] && $message) {
+                $options['templateVars']['requiredMessage'] = $message;
+
+                if ($this->getConfig('autoSetCustomValidity')) {
+                    $message = h(addslashes($message));
+                    $options['oninvalid'] = "this.setCustomValidity('$message')";
+                    $options['onvalid'] = "this.setCustomValidity('')";
+                }
             }
         }
 

+ 81 - 0
tests/TestCase/View/Helper/FormHelperTest.php

@@ -8512,6 +8512,87 @@ class FormHelperTest extends TestCase
     }
 
     /**
+     * tests that custom validation messages are in templateVars
+     *
+     * @return void
+     */
+    public function testHtml5ErrorMessageInTemplateVars()
+    {
+        $validator = (new \Cake\Validation\Validator())
+            ->requirePresence('email', true, 'Custom error message')
+            ->requirePresence('password')
+            ->alphaNumeric('password')
+            ->notBlank('phone');
+
+        $table = $this->getTableLocator()->get('Contacts', [
+            'className' => __NAMESPACE__ . '\ContactsTable'
+        ]);
+        $table->setValidator('default', $validator);
+        $contact = new Entity();
+
+        $this->Form->create($contact, ['context' => ['table' => 'Contacts']]);
+        $this->Form->setTemplates([
+            'input' => '<input type="{{type}}" name="{{name}}"{{attrs}} data-message="{{requiredMessage}}" {{custom}}/>',
+            'inputContainer' => '{{content}}'
+        ]);
+
+        $result = $this->Form->control('password');
+        $expected = [
+            'label' => ['for' => 'password'],
+            'Password',
+            '/label',
+            'input' => [
+                'id' => 'password',
+                'name' => 'password',
+                'type' => 'password',
+                'value' => '',
+                'required' => 'required',
+                'data-message' => 'This field is required',
+            ]
+        ];
+        $this->assertHtml($expected, $result);
+
+        $result = $this->Form->control('phone');
+        $expected = [
+            'label' => ['for' => 'phone'],
+            'Phone',
+            '/label',
+            'input' => [
+                'id' => 'phone',
+                'name' => 'phone',
+                'type' => 'tel',
+                'value' => '',
+                'maxlength' => 255,
+                'required' => 'required',
+                'data-message' => 'This field cannot be left empty',
+            ],
+        ];
+        $this->assertHtml($expected, $result);
+
+        $result = $this->Form->control('email', [
+            'templateVars' => [
+                'custom' => 'data-custom="1"'
+            ]
+        ]);
+        $expected = [
+            'label' => ['for' => 'email'],
+            'Email',
+            '/label',
+            'input' => [
+                'id' => 'email',
+                'name' => 'email',
+                'type' => 'email',
+                'value' => '',
+                'maxlength' => 255,
+                'required' => 'required',
+                'data-message' => 'Custom error message',
+                'data-custom' => '1',
+            ],
+        ];
+        $this->assertHtml($expected, $result);
+    }
+
+    /**
      * testRequiredAttribute method
      *
      * Tests that formhelper sets required attributes.