1<?php 2/** 3 * Base class for checkboxes and radios 4 * 5 * PHP version 5 6 * 7 * LICENSE: 8 * 9 * Copyright (c) 2006-2010, Alexey Borzov <avb@php.net>, 10 * Bertrand Mansion <golgote@mamasam.com> 11 * All rights reserved. 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions 15 * are met: 16 * 17 * * Redistributions of source code must retain the above copyright 18 * notice, this list of conditions and the following disclaimer. 19 * * Redistributions in binary form must reproduce the above copyright 20 * notice, this list of conditions and the following disclaimer in the 21 * documentation and/or other materials provided with the distribution. 22 * * The names of the authors may not be used to endorse or promote products 23 * derived from this software without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 26 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 27 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 28 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 29 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 30 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 31 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 32 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 33 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 34 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 36 * 37 * @category HTML 38 * @package HTML_QuickForm2 39 * @author Alexey Borzov <avb@php.net> 40 * @author Bertrand Mansion <golgote@mamasam.com> 41 * @license http://opensource.org/licenses/bsd-license.php New BSD License 42 * @version SVN: $Id: InputCheckable.php 300722 2010-06-24 10:15:52Z mansion $ 43 * @link http://pear.php.net/package/HTML_QuickForm2 44 */ 45 46/** 47 * Base class for <input> elements 48 */ 49// require_once 'HTML/QuickForm2/Element/Input.php'; 50 51/** 52 * Base class for <input> elements having 'checked' attribute (checkboxes and radios) 53 * 54 * @category HTML 55 * @package HTML_QuickForm2 56 * @author Alexey Borzov <avb@php.net> 57 * @author Bertrand Mansion <golgote@mamasam.com> 58 * @version Release: @package_version@ 59 */ 60class HTML_QuickForm2_Element_InputCheckable extends HTML_QuickForm2_Element_Input 61{ 62 protected $persistent = true; 63 64 /** 65 * HTML to represent the element in "frozen" state 66 * 67 * Array index "checked" contains HTML for element's "checked" state, 68 * "unchecked" for not checked 69 * @var array 70 */ 71 protected $frozenHtml = array( 72 'checked' => 'On', 73 'unchecked' => 'Off' 74 ); 75 76 /** 77 * Contains options and data used for the element creation 78 * - content: Label "glued" to a checkbox or radio 79 * @var array 80 */ 81 protected $data = array('content' => ''); 82 83 public function __construct($name = null, $attributes = null, $data = null) 84 { 85 parent::__construct($name, $attributes, $data); 86 // "checked" attribute should be updated on changes to "value" attribute 87 // see bug #15708 88 $this->watchedAttributes[] = 'value'; 89 } 90 91 protected function onAttributeChange($name, $value = null) 92 { 93 if ('value' != $name) { 94 return parent::onAttributeChange($name, $value); 95 } 96 if (null === $value) { 97 unset($this->attributes['value'], $this->attributes['checked']); 98 } else { 99 $this->attributes['value'] = $value; 100 $this->updateValue(); 101 } 102 } 103 104 105 /** 106 * Sets the label to be rendered glued to the element 107 * 108 * This label is returned by {@link __toString()} method with the element's 109 * HTML. It is automatically wrapped into the <label> tag. 110 * 111 * @param string 112 * @return HTML_QuickForm2_Element_InputCheckable 113 */ 114 public function setContent($content) 115 { 116 $this->data['content'] = $content; 117 return $this; 118 } 119 120 /** 121 * Returns the label that will be "glued" to element's HTML 122 * 123 * @return string 124 */ 125 public function getContent() 126 { 127 return $this->data['content']; 128 } 129 130 131 public function setValue($value) 132 { 133 if ((string)$value == $this->getAttribute('value')) { 134 return $this->setAttribute('checked'); 135 } else { 136 return $this->removeAttribute('checked'); 137 } 138 } 139 140 public function getValue() 141 { 142 if (!empty($this->attributes['checked']) && empty($this->attributes['disabled'])) { 143 return $this->applyFilters($this->getAttribute('value')); 144 } else { 145 return null; 146 } 147 } 148 149 public function __toString() 150 { 151 if (0 == strlen($this->data['content'])) { 152 $label = ''; 153 } elseif ($this->frozen) { 154 $label = $this->data['content']; 155 } else { 156 return '<label>' . parent::__toString() . '<span>' . $this->data['content'] . '</span></label>'; 157 } 158 return parent::__toString() . $label; 159 } 160 161 public function getFrozenHtml() 162 { 163 if ($this->getAttribute('checked')) { 164 return $this->frozenHtml['checked'] . $this->getPersistentContent(); 165 } else { 166 return $this->frozenHtml['unchecked']; 167 } 168 } 169} 170?> 171