Completed
Branch master (33c24b)
by
unknown
30:03
created

OOUIHTMLForm   B

Complexity

Total Complexity 35

Size/Duplication

Total Lines 235
Duplicated Lines 2.98 %

Coupling/Cohesion

Components 2
Dependencies 17

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 7
loc 235
rs 7.0714
wmc 35
lcom 2
cbo 17

9 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A loadInputFromParameters() 7 7 1
F getButtons() 0 81 15
A wrapFieldSetSection() 0 22 1
A formatSection() 0 12 3
C getErrors() 0 30 7
A getHeaderText() 0 8 2
B getBody() 0 24 4
A wrapForm() 0 17 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
3
/**
4
 * HTML form generation and submission handling, OOUI style.
5
 *
6
 * This program is free software; you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation; either version 2 of the License, or
9
 * (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License along
17
 * with this program; if not, write to the Free Software Foundation, Inc.,
18
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19
 * http://www.gnu.org/copyleft/gpl.html
20
 *
21
 * @file
22
 */
23
24
/**
25
 * Compact stacked vertical format for forms, implemented using OOUI widgets.
26
 */
27
class OOUIHTMLForm extends HTMLForm {
28
	private $oouiErrors;
29
30
	public function __construct( $descriptor, $context = null, $messagePrefix = '' ) {
31
		parent::__construct( $descriptor, $context, $messagePrefix );
32
		$this->getOutput()->enableOOUI();
33
		$this->getOutput()->addModuleStyles( 'mediawiki.htmlform.ooui.styles' );
34
	}
35
36
	/**
37
	 * Symbolic display format name.
38
	 * @var string
39
	 */
40
	protected $displayFormat = 'ooui';
41
42 View Code Duplication
	public static function loadInputFromParameters( $fieldname, $descriptor,
43
		HTMLForm $parent = null
44
	) {
45
		$field = parent::loadInputFromParameters( $fieldname, $descriptor, $parent );
46
		$field->setShowEmptyLabel( false );
47
		return $field;
48
	}
49
50
	function getButtons() {
51
		$buttons = '';
52
53
		// IE<8 has bugs with <button>, so we'll need to avoid them.
54
		$isBadIE = preg_match( '/MSIE [1-7]\./i', $this->getRequest()->getHeader( 'User-Agent' ) );
55
56
		if ( $this->mShowSubmit ) {
57
			$attribs = [ 'infusable' => true ];
58
59
			if ( isset( $this->mSubmitID ) ) {
60
				$attribs['id'] = $this->mSubmitID;
61
			}
62
63
			if ( isset( $this->mSubmitName ) ) {
64
				$attribs['name'] = $this->mSubmitName;
65
			}
66
67
			if ( isset( $this->mSubmitTooltip ) ) {
68
				$attribs += Linker::tooltipAndAccesskeyAttribs( $this->mSubmitTooltip );
69
			}
70
71
			$attribs['classes'] = [ 'mw-htmlform-submit' ];
72
			$attribs['type'] = 'submit';
73
			$attribs['label'] = $this->getSubmitText();
74
			$attribs['value'] = $this->getSubmitText();
75
			$attribs['flags'] = $this->mSubmitFlags;
76
			$attribs['useInputTag'] = $isBadIE;
77
78
			$buttons .= new OOUI\ButtonInputWidget( $attribs );
79
		}
80
81
		if ( $this->mShowReset ) {
82
			$buttons .= new OOUI\ButtonInputWidget( [
83
				'type' => 'reset',
84
				'label' => $this->msg( 'htmlform-reset' )->text(),
85
				'useInputTag' => $isBadIE,
86
			] );
87
		}
88
89
		foreach ( $this->mButtons as $button ) {
90
			$attrs = [];
91
92
			if ( $button['attribs'] ) {
93
				$attrs += $button['attribs'];
94
			}
95
96
			if ( isset( $button['id'] ) ) {
97
				$attrs['id'] = $button['id'];
98
			}
99
100
			if ( $isBadIE ) {
101
				$label = $button['value'];
102
			} elseif ( isset( $button['label-message'] ) ) {
103
				$label = new OOUI\HtmlSnippet( $this->getMessage( $button['label-message'] )->parse() );
104
			} elseif ( isset( $button['label'] ) ) {
105
				$label = $button['label'];
106
			} elseif ( isset( $button['label-raw'] ) ) {
107
				$label = new OOUI\HtmlSnippet( $button['label-raw'] );
108
			} else {
109
				$label = $button['value'];
110
			}
111
112
			$attrs['classes'] = isset( $attrs['class'] ) ? (array)$attrs['class'] : [];
113
114
			$buttons .= new OOUI\ButtonInputWidget( [
115
				'type' => 'submit',
116
				'name' => $button['name'],
117
				'value' => $button['value'],
118
				'label' => $label,
119
				'flags' => $button['flags'],
120
				'useInputTag' => $isBadIE,
121
			] + $attrs );
122
		}
123
124
		if ( !$buttons ) {
125
			return '';
126
		}
127
128
		return Html::rawElement( 'div',
129
			[ 'class' => 'mw-htmlform-submit-buttons' ], "\n$buttons" ) . "\n";
130
	}
131
132
	protected function wrapFieldSetSection( $legend, $section, $attributes ) {
133
		// to get a user visible effect, wrap the fieldset into a framed panel layout
134
		$layout = new OOUI\PanelLayout( [
135
			'expanded' => false,
136
			'padded' => true,
137
			'framed' => true,
138
			'infusable' => false,
139
		] );
140
141
		$layout->appendContent(
142
			new OOUI\FieldsetLayout( [
143
				'label' => $legend,
144
				'infusable' => false,
145
				'items' => [
146
					new OOUI\Widget( [
147
						'content' => new OOUI\HtmlSnippet( $section )
148
					] ),
149
				],
150
			] + $attributes )
151
		);
152
		return $layout;
153
	}
154
155
	/**
156
	 * Put a form section together from the individual fields' HTML, merging it and wrapping.
157
	 * @param OOUI\FieldLayout[] $fieldsHtml
158
	 * @param string $sectionName
159
	 * @param bool $anyFieldHasLabel Unused
160
	 * @return string HTML
161
	 */
162
	protected function formatSection( array $fieldsHtml, $sectionName, $anyFieldHasLabel ) {
163
		$config = [
164
			'items' => $fieldsHtml,
165
		];
166
		if ( $sectionName ) {
167
			$config['id'] = Sanitizer::escapeId( $sectionName );
168
		}
169
		if ( is_string( $this->mWrapperLegend ) ) {
170
			$config['label'] = $this->mWrapperLegend;
171
		}
172
		return new OOUI\FieldsetLayout( $config );
173
	}
174
175
	/**
176
	 * @param string|array|Status $err
177
	 * @return string
178
	 */
179
	function getErrors( $err ) {
180
		if ( !$err ) {
181
			$errors = [];
182
		} elseif ( $err instanceof Status ) {
183
			if ( $err->isOK() ) {
184
				$errors = [];
185
			} else {
186
				$errors = $err->getErrorsByType( 'error' );
187
				foreach ( $errors as &$error ) {
188
					// Input:  array( 'message' => 'foo', 'errors' => array( 'a', 'b', 'c' ) )
189
					// Output: array( 'foo', 'a', 'b', 'c' )
190
					$error = array_merge( [ $error['message'] ], $error['params'] );
191
				}
192
			}
193
		} else {
194
			$errors = $err;
195
			if ( !is_array( $errors ) ) {
196
				$errors = [ $errors ];
197
			}
198
		}
199
200
		foreach ( $errors as &$error ) {
201
			$error = $this->getMessage( $error )->parse();
202
			$error = new OOUI\HtmlSnippet( $error );
203
		}
204
205
		// Used in getBody()
206
		$this->oouiErrors = $errors;
207
		return '';
208
	}
209
210
	function getHeaderText( $section = null ) {
211
		if ( is_null( $section ) ) {
212
			// We handle $this->mHeader elsewhere, in getBody()
213
			return '';
214
		} else {
215
			return parent::getHeaderText( $section );
216
		}
217
	}
218
219
	function getBody() {
220
		$fieldset = parent::getBody();
221
		// FIXME This only works for forms with no subsections
222
		if ( $fieldset instanceof OOUI\FieldsetLayout ) {
223
			$classes = [ 'mw-htmlform-ooui-header' ];
224
			if ( !$this->mHeader ) {
225
				$classes[] = 'mw-htmlform-ooui-header-empty';
226
			}
227
			if ( $this->oouiErrors ) {
228
				$classes[] = 'mw-htmlform-ooui-header-errors';
229
			}
230
			$fieldset->addItems( [
231
				new OOUI\FieldLayout(
232
					new OOUI\LabelWidget( [ 'label' => new OOUI\HtmlSnippet( $this->mHeader ) ] ),
233
					[
234
						'align' => 'top',
235
						'errors' => $this->oouiErrors,
236
						'classes' => $classes,
237
					]
238
				)
239
			], 0 );
240
		}
241
		return $fieldset;
242
	}
243
244
	function wrapForm( $html ) {
245
		$form = new OOUI\FormLayout( $this->getFormAttributes() + [
246
			'classes' => [ 'mw-htmlform-ooui' ],
247
			'content' => new OOUI\HtmlSnippet( $html ),
248
		] );
249
250
		// Include a wrapper for style, if requested.
251
		$form = new OOUI\PanelLayout( [
252
			'classes' => [ 'mw-htmlform-ooui-wrapper' ],
253
			'expanded' => false,
254
			'padded' => $this->mWrapperLegend !== false,
255
			'framed' => $this->mWrapperLegend !== false,
256
			'content' => $form,
257
		] );
258
259
		return $form;
260
	}
261
}
262