Browse Source

Add "plugin" option to FlashMessage::set()

ADmad 5 years ago
parent
commit
dece36f82b
2 changed files with 39 additions and 1 deletions
  1. 7 1
      src/Http/FlashMessage.php
  2. 32 0
      tests/TestCase/Http/FlashMessageTest.php

+ 7 - 1
src/Http/FlashMessage.php

@@ -36,6 +36,7 @@ class FlashMessage
     protected $_defaultConfig = [
         'key' => 'flash',
         'element' => 'default',
+        'plugin' => null,
         'params' => [],
         'clear' => false,
         'duplicate' => true,
@@ -67,7 +68,9 @@ class FlashMessage
      * ### Options:
      *
      * - `key` The key to set under the session's Flash key.
-     * - `element` The element used to render the flash message.
+     * - `element` The element used to render the flash message. You can use
+     *     `'SomePlugin.name'` style value for flash elements from a plugin.
+     * - `plugin` Plugin name to use element from.
      * - `params` An array of variables to be made available to the element.
      * - `clear` A bool stating if the current stack should be cleared to start a new one.
      * - `escape` Set to false to allow templates to print out HTML content.
@@ -86,6 +89,9 @@ class FlashMessage
         }
 
         [$plugin, $element] = pluginSplit($options['element']);
+        if ($options['plugin']) {
+            $plugin = $options['plugin'];
+        }
 
         if ($plugin) {
             $options['element'] = $plugin . '.flash/' . $element;

+ 32 - 0
tests/TestCase/Http/FlashMessageTest.php

@@ -179,6 +179,38 @@ class FlashMessageTest extends TestCase
         $this->assertEquals($expected, $result);
     }
 
+    public function testSetWithPlugin(): void
+    {
+        $this->Flash->set('This is a test message', ['plugin' => 'FooBar']);
+        $expected = [
+            [
+                'message' => 'This is a test message',
+                'key' => 'flash',
+                'element' => 'FooBar.flash/default',
+                'params' => [],
+            ],
+        ];
+        $result = $this->Session->read('Flash.flash');
+        $this->assertEquals($expected, $result);
+
+        // Value of 'plugin' will override the plugin name used in 'element'
+        $this->Flash->set('This is a test message', [
+            'key' => 'msg',
+            'element' => 'Plugin.success',
+            'plugin' => 'FooBar',
+        ]);
+        $expected = [
+            [
+                'message' => 'This is a test message',
+                'key' => 'msg',
+                'element' => 'FooBar.flash/success',
+                'params' => [],
+            ],
+        ];
+        $result = $this->Session->read('Flash.msg');
+        $this->assertEquals($expected, $result);
+    }
+
     public function testSetExceptionMessage(): void
     {
         $this->assertNull($this->Session->read('Flash.flash'));