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