1<?php
2/**
3 * @package     Joomla.Platform
4 * @subpackage  Form
5 *
6 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
7 * @license     GNU General Public License version 2 or later; see LICENSE
8 */
9
10defined('JPATH_PLATFORM') or die;
11
12/**
13 * Form Field class for the Joomla Platform.
14 * Provides an input field for files
15 *
16 * @link   http://www.w3.org/TR/html-markup/input.file.html#input.file
17 * @since  1.7.0
18 */
19class JFormFieldFile extends JFormField
20{
21	/**
22	 * The form field type.
23	 *
24	 * @var    string
25	 * @since  1.7.0
26	 */
27	protected $type = 'File';
28
29	/**
30	 * The accepted file type list.
31	 *
32	 * @var    mixed
33	 * @since  3.2
34	 */
35	protected $accept;
36
37	/**
38	 * Name of the layout being used to render the field
39	 *
40	 * @var    string
41	 * @since  3.6
42	 */
43	protected $layout = 'joomla.form.field.file';
44
45	/**
46	 * Method to get certain otherwise inaccessible properties from the form field object.
47	 *
48	 * @param   string  $name  The property name for which to get the value.
49	 *
50	 * @return  mixed  The property value or null.
51	 *
52	 * @since   3.2
53	 */
54	public function __get($name)
55	{
56		switch ($name)
57		{
58			case 'accept':
59				return $this->accept;
60		}
61
62		return parent::__get($name);
63	}
64
65	/**
66	 * Method to set certain otherwise inaccessible properties of the form field object.
67	 *
68	 * @param   string  $name   The property name for which to set the value.
69	 * @param   mixed   $value  The value of the property.
70	 *
71	 * @return  void
72	 *
73	 * @since   3.2
74	 */
75	public function __set($name, $value)
76	{
77		switch ($name)
78		{
79			case 'accept':
80				$this->accept = (string) $value;
81				break;
82
83			default:
84				parent::__set($name, $value);
85		}
86	}
87
88	/**
89	 * Method to attach a JForm object to the field.
90	 *
91	 * @param   SimpleXMLElement  $element  The SimpleXMLElement object representing the `<field>` tag for the form field object.
92	 * @param   mixed             $value    The form field value to validate.
93	 * @param   string            $group    The field name group control value. This acts as an array container for the field.
94	 *                                      For example if the field has name="foo" and the group value is set to "bar" then the
95	 *                                      full field name would end up being "bar[foo]".
96	 *
97	 * @return  boolean  True on success.
98	 *
99	 * @see     JFormField::setup()
100	 * @since   3.2
101	 */
102	public function setup(SimpleXMLElement $element, $value, $group = null)
103	{
104		$return = parent::setup($element, $value, $group);
105
106		if ($return)
107		{
108			$this->accept = (string) $this->element['accept'];
109		}
110
111		return $return;
112	}
113
114	/**
115	 * Method to get the field input markup for the file field.
116	 * Field attributes allow specification of a maximum file size and a string
117	 * of accepted file extensions.
118	 *
119	 * @return  string  The field input markup.
120	 *
121	 * @note    The field does not include an upload mechanism.
122	 * @see     JFormFieldMedia
123	 * @since   1.7.0
124	 */
125	protected function getInput()
126	{
127		return $this->getRenderer($this->layout)->render($this->getLayoutData());
128	}
129
130	/**
131	 * Method to get the data to be passed to the layout for rendering.
132	 *
133	 * @return  array
134	 *
135	 * @since   3.6
136	 */
137	protected function getLayoutData()
138	{
139		$data = parent::getLayoutData();
140
141		$extraData = array(
142			'accept'   => $this->accept,
143			'multiple' => $this->multiple,
144		);
145
146		return array_merge($data, $extraData);
147	}
148}
149