'flash', 'element' => 'default', 'params' => [], 'clear' => false, 'duplicate' => true ]; /** * Constructor * * @param \Cake\Controller\ComponentRegistry $registry A ComponentRegistry for this component * @param array $config Array of config. */ public function __construct(ComponentRegistry $registry, array $config = []) { parent::__construct($registry, $config); $this->_session = $registry->getController()->getRequest()->getSession(); } /** * Used to set a session variable that can be used to output messages in the view. * If you make consecutive calls to this method, the messages will stack (if they are * set with the same flash key) * * In your controller: $this->Flash->set('This has been saved'); * * ### Options: * * - `key` The key to set under the session's Flash key * - `element` The element used to render the flash message. Default to 'default'. * - `params` An array of variables to make available when using an 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 * * @param string|\Exception $message Message to be flashed. If an instance * of \Exception the exception message will be used and code will be set * in params. * @param array $options An array of options * @return void */ public function set($message, array $options = []) { $options += (array)$this->getConfig(); if ($message instanceof Exception) { if (!isset($options['params']['code'])) { $options['params']['code'] = $message->getCode(); } $message = $message->getMessage(); } if (isset($options['escape']) && !isset($options['params']['escape'])) { $options['params']['escape'] = $options['escape']; } list($plugin, $element) = pluginSplit($options['element']); if ($plugin) { $options['element'] = $plugin . '.Flash/' . $element; } else { $options['element'] = 'Flash/' . $element; } $messages = []; if (!$options['clear']) { $messages = (array)$this->_session->read('Flash.' . $options['key']); } if (!$options['duplicate']) { foreach ($messages as $existingMessage) { if ($existingMessage['message'] === $message) { return; } } } $messages[] = [ 'message' => $message, 'key' => $options['key'], 'element' => $options['element'], 'params' => $options['params'] ]; $this->_session->write('Flash.' . $options['key'], $messages); } /** * Magic method for verbose flash methods based on element names. * * For example: $this->Flash->success('My message') would use the * success.ctp element under `src/Template/Element/Flash` for rendering the * flash message. * * If you make consecutive calls to this method, the messages will stack (if they are * set with the same flash key) * * Note that the parameter `element` will be always overridden. In order to call a * specific element from a plugin, you should set the `plugin` option in $args. * * For example: `$this->Flash->warning('My message', ['plugin' => 'PluginName'])` would * use the warning.ctp element under `plugins/PluginName/src/Template/Element/Flash` for * rendering the flash message. * * @param string $name Element name to use. * @param array $args Parameters to pass when calling `FlashComponent::set()`. * @return void * @throws \Cake\Http\Exception\InternalErrorException If missing the flash message. */ public function __call($name, $args) { $element = Inflector::underscore($name); if (count($args) < 1) { throw new InternalErrorException('Flash message missing.'); } $options = ['element' => $element]; if (!empty($args[1])) { if (!empty($args[1]['plugin'])) { $options = ['element' => $args[1]['plugin'] . '.' . $element]; unset($args[1]['plugin']); } $options += (array)$args[1]; } $this->set($args[0], $options); } }