Skip to content

Commit

Permalink
Add button widget & test case.
Browse files Browse the repository at this point in the history
  • Loading branch information
markstory committed Jan 20, 2014
1 parent bbf9945 commit dd4f226
Show file tree
Hide file tree
Showing 2 changed files with 197 additions and 0 deletions.
72 changes: 72 additions & 0 deletions 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 changes: 125 additions & 0 deletions 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);
}

}

0 comments on commit dd4f226

Please sign in to comment.