1 <?php
  2 /**
  3  * @package     Joomla.Platform
  4  * @subpackage  Form
  5  *
  6  * @copyright   Copyright (C) 2005 - 2017 Open Source Matters, Inc. All rights reserved.
  7  * @license     GNU General Public License version 2 or later; see LICENSE
  8  */
  9 
 10 defined('JPATH_PLATFORM') or die;
 11 
 12 JFormHelper::loadFieldClass('list');
 13 
 14 /**
 15  * Form Field class for the Joomla Platform.
 16  * Displays options as a list of checkboxes.
 17  * Multiselect may be forced to be true.
 18  *
 19  * @see    JFormFieldCheckbox
 20  * @since  11.1
 21  */
 22 class JFormFieldCheckboxes extends JFormFieldList
 23 {
 24     /**
 25      * The form field type.
 26      *
 27      * @var    string
 28      * @since  11.1
 29      */
 30     protected $type = 'Checkboxes';
 31 
 32     /**
 33      * Name of the layout being used to render the field
 34      *
 35      * @var    string
 36      * @since  3.5
 37      */
 38     protected $layout = 'joomla.form.field.checkboxes';
 39 
 40     /**
 41      * Flag to tell the field to always be in multiple values mode.
 42      *
 43      * @var    boolean
 44      * @since  11.1
 45      */
 46     protected $forceMultiple = true;
 47 
 48     /**
 49      * The comma seprated list of checked checkboxes value.
 50      *
 51      * @var    mixed
 52      * @since  3.2
 53      */
 54     public $checkedOptions;
 55 
 56     /**
 57      * Method to get certain otherwise inaccessible properties from the form field object.
 58      *
 59      * @param   string  $name  The property name for which to the the value.
 60      *
 61      * @return  mixed  The property value or null.
 62      *
 63      * @since   3.2
 64      */
 65     public function __get($name)
 66     {
 67         switch ($name)
 68         {
 69             case 'forceMultiple':
 70             case 'checkedOptions':
 71                 return $this->$name;
 72         }
 73 
 74         return parent::__get($name);
 75     }
 76 
 77     /**
 78      * Method to set certain otherwise inaccessible properties of the form field object.
 79      *
 80      * @param   string  $name   The property name for which to the the value.
 81      * @param   mixed   $value  The value of the property.
 82      *
 83      * @return  void
 84      *
 85      * @since   3.2
 86      */
 87     public function __set($name, $value)
 88     {
 89         switch ($name)
 90         {
 91             case 'checkedOptions':
 92                 $this->checkedOptions = (string) $value;
 93                 break;
 94 
 95             default:
 96                 parent::__set($name, $value);
 97         }
 98     }
 99 
100     /**
101      * Method to get the radio button field input markup.
102      *
103      * @return  string  The field input markup.
104      *
105      * @since   11.1
106      */
107     protected function getInput()
108     {
109         if (empty($this->layout))
110         {
111             throw new UnexpectedValueException(sprintf('%s has no layout assigned.', $this->name));
112         }
113 
114         return $this->getRenderer($this->layout)->render($this->getLayoutData());
115     }
116 
117     /**
118      * Method to attach a JForm object to the field.
119      *
120      * @param   SimpleXMLElement  $element  The SimpleXMLElement object representing the `<field>` tag for the form field object.
121      * @param   mixed             $value    The form field value to validate.
122      * @param   string            $group    The field name group control value. This acts as an array container for the field.
123      *                                      For example if the field has name="foo" and the group value is set to "bar" then the
124      *                                      full field name would end up being "bar[foo]".
125      *
126      * @return  boolean  True on success.
127      *
128      * @see     JFormField::setup()
129      * @since   3.2
130      */
131     public function setup(SimpleXMLElement $element, $value, $group = null)
132     {
133         $return = parent::setup($element, $value, $group);
134 
135         if ($return)
136         {
137             $this->checkedOptions = (string) $this->element['checked'];
138         }
139 
140         return $return;
141     }
142 
143     /**
144      * Method to get the data to be passed to the layout for rendering.
145      *
146      * @return  array
147      *
148      * @since   3.5
149      */
150     protected function getLayoutData()
151     {
152         $data = parent::getLayoutData();
153 
154         // True if the field has 'value' set. In other words, it has been stored, don't use the default values.
155         $hasValue = (isset($this->value) && !empty($this->value));
156 
157         // If a value has been stored, use it. Otherwise, use the defaults.
158         $checkedOptions = $hasValue ? $this->value : $this->checkedOptions;
159 
160         $extraData = array(
161             'checkedOptions' => is_array($checkedOptions) ? $checkedOptions : explode(',', (string) $checkedOptions),
162             'hasValue'       => $hasValue,
163             'options'        => $this->getOptions(),
164         );
165 
166         return array_merge($data, $extraData);
167     }
168 }
169