Browse Source

Add button widget & test case.

mark_story 12 years ago
parent
commit
dd4f2264fe
2 changed files with 197 additions and 0 deletions
  1. 72 0
      src/View/Input/Button.php
  2. 125 0
      tests/TestCase/View/Input/ButtonTest.php

+ 72 - 0
src/View/Input/Button.php

@@ -0,0 +1,72 @@
+<?php
+/**
+ * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
+ * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * For full copyright and license information, please see the LICENSE.txt
+ * Redistributions of files must retain the above copyright notice.
+ *
+ * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ * @link          http://cakephp.org CakePHP(tm) Project
+ * @since         CakePHP(tm) v3.0
+ * @license       http://www.opensource.org/licenses/mit-license.php MIT License
+ */
+namespace Cake\View\Input;
+
+use Cake\View\Input\InputInterface;
+
+/**
+ * Button input class
+ *
+ * This input class can be used to render button elements.
+ * If you need to make basic submit inputs with type=submit,
+ * use the Basic input widget.
+ */
+class Button implements InputInterface {
+
+/**
+ * StringTemplate instance.
+ *
+ * @var Cake\View\StringTemplate
+ */
+	protected $_templates;
+
+/**
+ * Constructor.
+ *
+ * @param StringTemplate $templates
+ */
+	public function __construct($templates) {
+		$this->_templates = $templates;
+	}
+
+/**
+ * Render a button.
+ *
+ * This method accepts a number of keys:
+ *
+ * - `text` The text of the button. Unlike all other form controls, buttons
+ *   do not escape their contents by default.
+ * - `escape` Set to true to enable escaping on all attributes.
+ * - `type` The button type defaults to 'submit'.
+ *
+ * Any other keys provided in $data will be converted into HTML attributes.
+ *
+ * @param array $data The data to build an input with.
+ * @return string
+ */
+	public function render(array $data) {
+		$data += [
+			'text' => '',
+			'type' => 'submit',
+			'escape' => false,
+		];
+		return $this->_templates->format('button', [
+			'text' => $data['escape'] ? h($data['text']) : $data['text'],
+			'type' => $data['type'],
+			'attrs' => $this->_templates->formatAttributes($data, ['type', 'text']),
+		]);
+	}
+
+}

+ 125 - 0
tests/TestCase/View/Input/ButtonTest.php

@@ -0,0 +1,125 @@
+<?php
+/**
+ * CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
+ * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ *
+ * Licensed under The MIT License
+ * For full copyright and license information, please see the LICENSE.txt
+ * Redistributions of files must retain the above copyright notice.
+ *
+ * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
+ * @link          http://cakephp.org CakePHP(tm) Project
+ * @since         CakePHP(tm) v3.0
+ * @license       http://www.opensource.org/licenses/mit-license.php MIT License
+ */
+namespace Cake\Test\TestCase\View\Input;
+
+use Cake\TestSuite\TestCase;
+use Cake\View\Input\Button;
+use Cake\View\StringTemplate;
+
+/**
+ * Basic input test.
+ */
+class ButtonTest extends TestCase {
+
+	public function setUp() {
+		parent::setUp();
+		$templates = [
+			'button' => '<button type="{{type}}"{{attrs}}>{{text}}</button>',
+		];
+		$this->templates = new StringTemplate($templates);
+	}
+
+/**
+ * Test render in a simple case.
+ *
+ * @return void
+ */
+	public function testRenderSimple() {
+		$button = new Button($this->templates);
+		$result = $button->render(['name' => 'my_input']);
+		$expected = [
+			'button' => ['type' => 'submit', 'name' => 'my_input'],
+			'/button'
+		];
+		$this->assertTags($result, $expected);
+	}
+
+/**
+ * Test render with custom type
+ *
+ * @return void
+ */
+	public function testRenderType() {
+		$button = new Button($this->templates);
+		$data = [
+			'name' => 'my_input',
+			'type' => 'button',
+			'text' => 'Some button'
+		];
+		$result = $button->render($data);
+		$expected = [
+			'button' => ['type' => 'button', 'name' => 'my_input'],
+			'Some button',
+			'/button'
+		];
+		$this->assertTags($result, $expected);
+	}
+
+/**
+ * Test render with a text
+ *
+ * @return void
+ */
+	public function testRenderWithText() {
+		$button = new Button($this->templates);
+		$data = [
+			'text' => 'Some <value>'
+		];
+		$result = $button->render($data);
+		$expected = [
+			'button' => ['type' => 'submit'],
+			'Some <value>',
+			'/button'
+		];
+		$this->assertTags($result, $expected);
+
+		$data['escape'] = true;
+		$result = $button->render($data);
+		$expected = [
+			'button' => ['type' => 'submit'],
+			'Some &lt;value&gt;',
+			'/button'
+		];
+		$this->assertTags($result, $expected);
+	}
+
+/**
+ * Test render with additional attributes.
+ *
+ * @return void
+ */
+	public function testRenderAttributes() {
+		$button = new Button($this->templates);
+		$data = [
+			'name' => 'my_input',
+			'text' => 'Go',
+			'class' => 'btn',
+			'required' => true
+		];
+		$result = $button->render($data);
+		$expected = [
+			'button' => [
+				'type' => 'submit',
+				'name' => 'my_input',
+				'class' => 'btn',
+				'required' => 'required'
+			],
+			'Go',
+			'/button'
+		];
+		$this->assertTags($result, $expected);
+	}
+
+}