浏览代码

Add FlashHelper.php

euromark 11 年之前
父节点
当前提交
e4263cbaca
共有 3 个文件被更改,包括 226 次插入1 次删除
  1. 100 0
      Test/Case/View/Helper/FlashHelperTest.php
  2. 4 1
      View/Helper/CommonHelper.php
  3. 122 0
      View/Helper/FlashHelper.php

+ 100 - 0
Test/Case/View/Helper/FlashHelperTest.php

@@ -0,0 +1,100 @@
+<?php
+
+App::uses('FlashHelper', 'Tools.View/Helper');
+App::uses('View', 'View');
+App::uses('MyCakeTestCase', 'Tools.TestSuite');
+
+/**
+ * FlashHelper tests
+ */
+class FlashHelperTest extends MyCakeTestCase {
+
+	public $fixtures = array('core.cake_session');
+
+	public $Flash;
+
+	public function setUp() {
+		parent::setUp();
+
+		Router::reload();
+		$View = new View(null);
+		$this->Flash = new FlashHelper($View);
+	}
+
+	/**
+	 * FlashHelperTest::testFlashMessage()
+	 *
+	 * @return void
+	 */
+	public function testMessage() {
+		$result = $this->Flash->message(h('Foo & bar'), 'success');
+		$expected = '<div class="flash-messages flashMessages"><div class="message success">Foo &amp;amp; bar</div></div>';
+		$this->assertEquals($expected, $result);
+	}
+
+	/**
+	 * FlashHelperTest::testFlash()
+	 *
+	 * @return void
+	 */
+	public function testFlash() {
+		$this->Flash->addTransientMessage(h('Foo & bar'), 'success');
+
+		$result = $this->Flash->flash();
+		$expected = '<div class="flash-messages flashMessages"><div class="message success">Foo &amp; bar</div></div>';
+		$this->assertEquals($expected, $result);
+
+		$this->Flash->addTransientMessage('I am an error', 'error');
+		$this->Flash->addTransientMessage('I am a warning', 'warning');
+		$this->Flash->addTransientMessage('I am some info', 'info');
+		$this->Flash->addTransientMessage('I am also some info');
+		$this->Flash->addTransientMessage('I am sth custom', 'custom');
+
+		$result = $this->Flash->flash();
+		$this->assertTextContains('message error', $result);
+		$this->assertTextContains('message warning', $result);
+		$this->assertTextContains('message info', $result);
+		$this->assertTextContains('message custom', $result);
+
+		$result = substr_count($result, 'message info');
+		$this->assertSame(2, $result);
+	}
+
+	/**
+	 * Test that you can define your own order or just output a subpart of
+	 * the types.
+	 *
+	 * @return void
+	 */
+	public function testFlashWithTypes() {
+		$this->Flash->addTransientMessage('I am an error', 'error');
+		$this->Flash->addTransientMessage('I am a warning', 'warning');
+		$this->Flash->addTransientMessage('I am some info', 'info');
+		$this->Flash->addTransientMessage('I am also some info');
+		$this->Flash->addTransientMessage('I am sth custom', 'custom');
+
+		$result = $this->Flash->flash(array('warning', 'error'));
+		$expected = '<div class="flash-messages flashMessages"><div class="message warning">I am a warning</div><div class="message error">I am an error</div></div>';
+		$this->assertEquals($expected, $result);
+
+		$result = $this->Flash->flash(array('info'));
+		$expected = '<div class="flash-messages flashMessages"><div class="message info">I am some info</div><div class="message info">I am also some info</div></div>';
+		$this->assertEquals($expected, $result);
+
+		$result = $this->Flash->flash();
+		$expected = '<div class="flash-messages flashMessages"><div class="message custom">I am sth custom</div></div>';
+		$this->assertEquals($expected, $result);
+	}
+
+	/**
+	 * TearDown method
+	 *
+	 * @return void
+	 */
+	public function tearDown() {
+		parent::tearDown();
+
+		unset($this->Flash);
+	}
+
+}

+ 4 - 1
View/Helper/CommonHelper.php

@@ -17,6 +17,7 @@ class CommonHelper extends AppHelper {
 	 *
 	 * @param array $types Types to output. Defaults to all if none are specified.
 	 * @return string HTML
+	 * @deprecated Use FlashHelper::flash() instead.
 	 */
 	public function flash(array $types = array()) {
 		// Get the messages from the session
@@ -71,6 +72,7 @@ class CommonHelper extends AppHelper {
 	 * @param string $type Type (success, warning, error, info)
 	 * @param bool $escape Set to false to disable escaping.
 	 * @return string HTML
+	 * @deprecated Use FlashHelper::flashMessage() instead.
 	 */
 	public function flashMessage($msg, $type = 'info', $escape = true) {
 		$html = '<div class="flash-messages flashMessages">';
@@ -102,6 +104,7 @@ class CommonHelper extends AppHelper {
 	 * @param string $msg
 	 * @param string $class
 	 * @return void
+	 * @deprecated Use FlashHelper::addTransientMessage() instead.
 	 */
 	public function addFlashMessage($msg, $class = null) {
 		CommonComponent::transientFlashMessage($msg, $class);
@@ -113,7 +116,7 @@ class CommonHelper extends AppHelper {
 	 * @param mixed $msg
 	 * @param mixed $class
 	 * @return void
-	 * @deprecated Use addFlashMessage() instead
+	 * @deprecated Use FlashHelper::addTransientMessage() instead.
 	 */
 	public function transientFlashMessage($msg, $class = null) {
 		$this->addFlashMessage($msg, $class);

+ 122 - 0
View/Helper/FlashHelper.php

@@ -0,0 +1,122 @@
+<?php
+App::uses('AppHelper', 'View/Helper');
+App::uses('FlashComponent', 'Tools.Controller/Component');
+App::uses('Hash', 'Utility');
+
+/**
+ * Flash helper
+ */
+class FlashHelper extends AppHelper {
+
+	public $helpers = array('Session');
+
+	/**
+	 * Display all flash messages.
+	 *
+	 * TODO: export div wrapping method (for static messaging on a page)
+	 *
+	 * @param array $types Types to output. Defaults to all if none are specified.
+	 * @return string HTML
+	 */
+	public function flash(array $types = array()) {
+		// Get the messages from the session
+		$messages = (array)$this->Session->read('messages');
+		$cMessages = (array)Configure::read('messages');
+		if (!empty($cMessages)) {
+			$messages = (array)Hash::merge($messages, $cMessages);
+		}
+		$html = '';
+		if (!empty($messages)) {
+			$html = '<div class="flash-messages flashMessages">';
+
+			if ($types) {
+				foreach ($types as $type) {
+					// Add a div for each message using the type as the class.
+					foreach ($messages as $messageType => $msgs) {
+						if ($messageType !== $type) {
+							continue;
+						}
+						foreach ((array)$msgs as $msg) {
+							$html .= $this->_message($msg, $messageType);
+						}
+					}
+				}
+			} else {
+				foreach ($messages as $messageType => $msgs) {
+					foreach ((array)$msgs as $msg) {
+						$html .= $this->_message($msg, $messageType);
+					}
+				}
+			}
+			$html .= '</div>';
+			if ($types) {
+				foreach ($types as $type) {
+					CakeSession::delete('messages.' . $type);
+					Configure::delete('messages.' . $type);
+				}
+			} else {
+				CakeSession::delete('messages');
+				Configure::delete('messages');
+			}
+		}
+
+		return $html;
+	}
+
+	/**
+	 * Outputs a single flash message directly.
+	 * Note that this does not use the Session.
+	 *
+	 * @param string $message String to output.
+	 * @param string $type Type (success, warning, error, info)
+	 * @param bool $escape Set to false to disable escaping.
+	 * @return string HTML
+	 */
+	public function message($msg, $type = 'info', $escape = true) {
+		$html = '<div class="flash-messages flashMessages">';
+		if ($escape) {
+			$msg = h($msg);
+		}
+		$html .= $this->_message($msg, $type);
+		$html .= '</div>';
+		return $html;
+	}
+
+	/**
+	 * Formats a message
+	 *
+	 * @param string $msg Message to output.
+	 * @param string $type Type that will be formatted to a class tag.
+	 * @return string
+	 */
+	protected function _message($msg, $type) {
+		if (!empty($msg)) {
+			return '<div class="message' . (!empty($type) ? ' ' . $type : '') . '">' . $msg . '</div>';
+		}
+		return '';
+	}
+
+	/**
+	 * Add a message on the fly
+	 *
+	 * @param string $msg
+	 * @param string $class
+	 * @return void
+	 */
+	public function addTransientMessage($msg, $class = null) {
+		FlashComponent::transientMessage($msg, $class);
+	}
+
+	/**
+	 * CommonHelper::transientFlashMessage()
+	 *
+	 * @param mixed $msg
+	 * @param mixed $class
+	 * @return void
+	 * @deprecated Use addFlashMessage() instead
+	 */
+	public function transientFlashMessage($msg, $class = null) {
+		$this->addFlashMessage($msg, $class);
+	}
+
+}