summaryrefslogtreecommitdiff
path: root/includes/htmlform/HTMLCheckField.php
blob: 5f70362a5aea7faa09cd96261e473e5c8cdd8cbb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
<?php

/**
 * A checkbox field
 */
class HTMLCheckField extends HTMLFormField {
	function getInputHTML( $value ) {
		global $wgUseMediaWikiUIEverywhere;

		if ( !empty( $this->mParams['invert'] ) ) {
			$value = !$value;
		}

		$attr = $this->getTooltipAndAccessKey();
		$attr['id'] = $this->mID;

		$attr += $this->getAttributes( array( 'disabled', 'tabindex' ) );

		if ( $this->mClass !== '' ) {
			$attr['class'] = $this->mClass;
		}

		if ( $this->mParent->isVForm() ) {
			// Nest checkbox inside label.
			return Html::rawElement( 'label',
				array(
					'class' => 'mw-ui-checkbox-label'
				),
				Xml::check( $this->mName, $value, $attr ) . $this->mLabel );
		} else {
			$chkLabel = Xml::check( $this->mName, $value, $attr )
			. '&#160;'
			. Html::rawElement( 'label', array( 'for' => $this->mID ), $this->mLabel );

			if ( $wgUseMediaWikiUIEverywhere ) {
				$chkLabel = Html::rawElement(
					'div',
					array( 'class' => 'mw-ui-checkbox' ),
					$chkLabel
				);
			}

			return $chkLabel;
		}
	}

	/**
	 * For a checkbox, the label goes on the right hand side, and is
	 * added in getInputHTML(), rather than HTMLFormField::getRow()
	 * @return string
	 */
	function getLabel() {
		return '&#160;';
	}

	/**
	 * checkboxes don't need a label.
	 * @return bool
	 */
	protected function needsLabel() {
		return false;
	}

	/**
	 * @param WebRequest $request
	 *
	 * @return string
	 */
	function loadDataFromRequest( $request ) {
		$invert = false;
		if ( isset( $this->mParams['invert'] ) && $this->mParams['invert'] ) {
			$invert = true;
		}

		// GetCheck won't work like we want for checks.
		// Fetch the value in either one of the two following case:
		// - we have a valid token (form got posted or GET forged by the user)
		// - checkbox name has a value (false or true), ie is not null
		if ( $request->getCheck( 'wpEditToken' ) || $request->getVal( $this->mName ) !== null ) {
			// XOR has the following truth table, which is what we want
			// INVERT VALUE | OUTPUT
			// true   true  | false
			// false  true  | true
			// false  false | false
			// true   false | true
			return $request->getBool( $this->mName ) xor $invert;
		} else {
			return $this->getDefault();
		}
	}
}