XmlSelect::addOption()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 4
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 3
nc 2
nop 2
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * Class for generating HTML <select> elements.
4
 *
5
 * This program is free software; you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License as published by
7
 * the Free Software Foundation; either version 2 of the License, or
8
 * (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License along
16
 * with this program; if not, write to the Free Software Foundation, Inc.,
17
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18
 * http://www.gnu.org/copyleft/gpl.html
19
 *
20
 * @file
21
 */
22
23
/**
24
 * Class for generating HTML <select> or <datalist> elements.
25
 */
26
class XmlSelect {
27
	protected $options = [];
28
	protected $default = false;
29
	protected $tagName = 'select';
30
	protected $attributes = [];
31
32
	public function __construct( $name = false, $id = false, $default = false ) {
33
		if ( $name ) {
34
			$this->setAttribute( 'name', $name );
35
		}
36
37
		if ( $id ) {
38
			$this->setAttribute( 'id', $id );
39
		}
40
41
		if ( $default !== false ) {
42
			$this->default = $default;
43
		}
44
	}
45
46
	/**
47
	 * @param string|array $default
48
	 */
49
	public function setDefault( $default ) {
50
		$this->default = $default;
0 ignored issues
show
Documentation Bug introduced by
It seems like $default of type string or array is incompatible with the declared type boolean of property $default.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
51
	}
52
53
	/**
54
	 * @param string|array $tagName
55
	 */
56
	public function setTagName( $tagName ) {
57
		$this->tagName = $tagName;
0 ignored issues
show
Documentation Bug introduced by
It seems like $tagName can also be of type array. However, the property $tagName is declared as type string. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
58
	}
59
60
	/**
61
	 * @param string $name
62
	 * @param string $value
63
	 */
64
	public function setAttribute( $name, $value ) {
65
		$this->attributes[$name] = $value;
66
	}
67
68
	/**
69
	 * @param string $name
70
	 * @return string|null
71
	 */
72
	public function getAttribute( $name ) {
73
		if ( isset( $this->attributes[$name] ) ) {
74
			return $this->attributes[$name];
75
		} else {
76
			return null;
77
		}
78
	}
79
80
	/**
81
	 * @param string $label
82
	 * @param string $value If not given, assumed equal to $label
83
	 */
84
	public function addOption( $label, $value = false ) {
85
		$value = $value !== false ? $value : $label;
86
		$this->options[] = [ $label => $value ];
87
	}
88
89
	/**
90
	 * This accepts an array of form
91
	 * label => value
92
	 * label => ( label => value, label => value )
93
	 *
94
	 * @param array $options
95
	 */
96
	public function addOptions( $options ) {
97
		$this->options[] = $options;
98
	}
99
100
	/**
101
	 * This accepts an array of form:
102
	 * label => value
103
	 * label => ( label => value, label => value )
104
	 *
105
	 * @param array $options
106
	 * @param string|array $default
107
	 * @return string
108
	 */
109
	static function formatOptions( $options, $default = false ) {
110
		$data = '';
111
112
		foreach ( $options as $label => $value ) {
113
			if ( is_array( $value ) ) {
114
				$contents = self::formatOptions( $value, $default );
115
				$data .= Html::rawElement( 'optgroup', [ 'label' => $label ], $contents ) . "\n";
116
			} else {
117
				// If $default is an array, then the <select> probably has the multiple attribute,
118
				// so we should check if each $value is in $default, rather than checking if
119
				// $value is equal to $default.
120
				$selected = is_array( $default ) ? in_array( $value, $default ) : $value === $default;
121
				$data .= Xml::option( $label, $value, $selected ) . "\n";
122
			}
123
		}
124
125
		return $data;
126
	}
127
128
	/**
129
	 * @return string
130
	 */
131
	public function getHTML() {
132
		$contents = '';
133
134
		foreach ( $this->options as $options ) {
135
			$contents .= self::formatOptions( $options, $this->default );
136
		}
137
138
		return Html::rawElement( $this->tagName, $this->attributes, rtrim( $contents ) );
139
	}
140
}
141