Catrope has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/64946


Change subject: Revert "HTMLCheckMatrix support for forcing options on/off"
......................................................................

Revert "HTMLCheckMatrix support for forcing options on/off"

This reverts commit fe15256643a0a5b52372fd865ad15108a0f22454.

Change-Id: Ie1f8f2a815c956764fbf02a05259133353c8d340
---
M includes/HTMLForm.php
M includes/Preferences.php
D tests/phpunit/includes/HTMLCheckMatrixTest.php
3 files changed, 46 insertions(+), 214 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core 
refs/changes/46/64946/1

diff --git a/includes/HTMLForm.php b/includes/HTMLForm.php
index e2fa5fd..5e3bb06 100644
--- a/includes/HTMLForm.php
+++ b/includes/HTMLForm.php
@@ -1844,33 +1844,9 @@
  * A checkbox matrix
  * Operates similarly to HTMLMultiSelectField, but instead of using an array of
  * options, uses an array of rows and an array of columns to dynamically
- * construct a matrix of options. The tags used to identify a particular cell
- * are of the form "columnName-rowName"
- *
- * Options:
- *   columns:           Required list of columns in the matrix.
- *   rows:              Required list of rows in the matrix.
- *   force-options-on:  Accepts array of column-row tags to be displayed as 
enabled
- *                      but unavailable to change
- *   force-options-off: Accepts array of column-row tags to be displayed as 
disabled
- *                      but unavailable to change.
+ * construct a matrix of options.
  */
-class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
-
-       static private $requiredParams = array(
-               // Required by underlying HTMLFormField
-               'fieldname',
-               // Required by HTMLCheckMatrix
-               'rows', 'columns'
-       );
-
-       public function __construct( $params ) {
-               $missing = array_diff( self::$requiredParams, array_keys( 
$params ) );
-               if ( $missing ) {
-                       throw HTMLFormFieldRequiredOptionsException::create( 
$this, $missing );
-               }
-               parent::__construct( $params );
-       }
+class HTMLCheckMatrix extends HTMLFormField {
 
        function validate( $value, $alldata ) {
                $rows = $this->mParams['rows'];
@@ -1934,25 +1910,23 @@
                foreach ( $rows as $rowLabel => $rowTag ) {
                        $rowContents = Html::rawElement( 'td', array(), 
$rowLabel );
                        foreach ( $columns as $columnTag ) {
-                               $thisTag = "$columnTag-$rowTag";
-                               // Construct the checkbox
-                               $thisAttribs = array(
-                                       'id' => "{$this->mID}-$thisTag",
-                                       'value' => $thisTag,
-                               );
-                               $checked = in_array( $thisTag, (array)$value, 
true);
-                               if ( $this->isTagForcedOff( $thisTag ) ) {
-                                       $checked = false;
-                                       $thisAttribs['disabled'] = 1;
-                               } elseif ( $this->isTagForcedOn( $thisTag ) ) {
-                                       $checked = true;
-                                       $thisAttribs['disabled'] = 1;
+                               // Knock out any options that are not wanted
+                               if ( isset( $this->mParams['remove-options'] )
+                                       && in_array( "$columnTag-$rowTag", 
$this->mParams['remove-options'] ) )
+                               {
+                                       $rowContents .= Html::rawElement( 'td', 
array(), ' ' );
+                               } else {
+                                       // Construct the checkbox
+                                       $thisAttribs = array(
+                                               'id' => 
"{$this->mID}-$columnTag-$rowTag",
+                                               'value' => $columnTag . '-' . 
$rowTag
+                                       );
+                                       $checkbox = Xml::check(
+                                               $this->mName . '[]',
+                                               in_array( $columnTag . '-' . 
$rowTag, (array)$value, true ),
+                                               $attribs + $thisAttribs );
+                                       $rowContents .= Html::rawElement( 'td', 
array(), $checkbox );
                                }
-                               $rowContents .= Html::rawElement(
-                                       'td',
-                                       array(),
-                                       Xml::check( "{$this->mName}[]", 
$checked, $attribs + $thisAttribs )
-                               );
                        }
                        $tableContents .= Html::rawElement( 'tr', array(), 
"\n$rowContents\n" );
                }
@@ -1962,16 +1936,6 @@
                        Html::rawElement( 'tbody', array(), 
"\n$tableContents\n" ) ) . "\n";
 
                return $html;
-       }
-
-       protected function isTagForcedOff( $tag ) {
-               return isset( $this->mParams['force-options-off'] )
-                       && in_array( $tag, $this->mParams['force-options-off'] 
);
-       }
-
-       protected function isTagForcedOn( $tag ) {
-               return isset( $this->mParams['force-options-on'] )
-                       && in_array( $tag, $this->mParams['force-options-on'] );
        }
 
        /**
@@ -2037,27 +2001,6 @@
                } else {
                        return array();
                }
-       }
-
-       function filterDataForSubmit( $data ) {
-               $columns = HTMLFormField::flattenOptions( 
$this->mParams['columns'] );
-               $rows = HTMLFormField::flattenOptions( $this->mParams['rows'] );
-               $res = array();
-               foreach ( $columns as $column ) {
-                       foreach ( $rows as $row ) {
-                               // Make sure option hasn't been forced
-                               $thisTag = "$column-$row";
-                               if ( $this->isTagForcedOff( $thisTag ) ) {
-                                       $res[$thisTag] = false;
-                               } elseif ($this->isTagForcedOn( $thisTag ) ) {
-                                       $res[$thisTag] = true;
-                               } else {
-                                       $res[$thisTag] = in_array( $thisTag, 
$data );
-                               }
-                       }
-               }
-
-               return $res;
        }
 }
 
@@ -2200,7 +2143,7 @@
 /**
  * Multi-select field
  */
-class HTMLMultiSelectField extends HTMLFormField implements 
HTMLNestedFilterable {
+class HTMLMultiSelectField extends HTMLFormField {
 
        function validate( $value, $alldata ) {
                $p = parent::validate( $value, $alldata );
@@ -2291,17 +2234,6 @@
                } else {
                        return array();
                }
-       }
-
-       function filterDataForSubmit( $data ) {
-               $options = HTMLFormField::flattenOptions( 
$this->mParams['options'] );
-
-               $res = array();
-               foreach ( $options as $opt ) {
-                       $res["$opt"] = in_array( $opt, $data );
-               }
-
-               return $res;
        }
 
        protected function needsLabel() {
@@ -2757,24 +2689,5 @@
 
        public function getInputHTML( $value ) {
                return '';
-       }
-}
-
-interface HTMLNestedFilterable {
-       /**
-        * Support for seperating multi-option preferences into multiple 
preferences
-        * Due to lack of array support.
-        * @param $data array
-        */
-       function filterDataForSubmit( $data );
-}
-
-class HTMLFormFieldRequiredOptionsException extends MWException {
-       static public function create( HTMLFormField $field, array $missing ) {
-               return new self( sprintf(
-                       "Form type `%s` expected the following parameters to be 
set: %s",
-                       get_class( $field ),
-                       implode( ', ', $missing )
-               ) );
        }
 }
diff --git a/includes/Preferences.php b/includes/Preferences.php
index 1733b37..972e2c6 100644
--- a/includes/Preferences.php
+++ b/includes/Preferences.php
@@ -1558,19 +1558,40 @@
        }
 
        /**
-        * Separate multi-option preferences into multiple preferences, since we
-        * have to store them separately
         * @param $data array
         * @return array
         */
        function filterDataForSubmit( $data ) {
+               // Support for separating multi-option preferences into 
multiple preferences
+               // Due to lack of array support.
                foreach ( $this->mFlatFields as $fieldname => $field ) {
-                       if ( $field instanceof HTMLNestedFilterable ) {
-                               $info = $field->mParams;
+                       $info = $field->mParams;
+
+                       if ( $field instanceof HTMLMultiSelectField ) {
+                               $options = HTMLFormField::flattenOptions( 
$info['options'] );
                                $prefix = isset( $info['prefix'] ) ? 
$info['prefix'] : $fieldname;
-                               foreach ( $field->filterDataForSubmit( 
$data[$fieldname] ) as $key => $value ) {
-                                       $data["$prefix-$key"] = $value;
+
+                               foreach ( $options as $opt ) {
+                                       $data["$prefix$opt"] = in_array( $opt, 
$data[$fieldname] );
                                }
+
+                               unset( $data[$fieldname] );
+
+                       } elseif ( $field instanceof HTMLCheckMatrix ) {
+                               $columns = HTMLFormField::flattenOptions( 
$info['columns'] );
+                               $rows = HTMLFormField::flattenOptions( 
$info['rows'] );
+                               $prefix = isset( $info['prefix'] ) ? 
$info['prefix'] : $fieldname;
+                               foreach ( $columns as $column ) {
+                                       foreach ( $rows as $row ) {
+                                               // Make sure option hasn't been 
removed
+                                               if ( !isset( 
$info['remove-options'] )
+                                                       || !in_array( 
"$column-$row", $info['remove-options'] ) )
+                                               {
+                                                       
$data["$prefix-$column-$row"] = in_array( "$column-$row", $data[$fieldname] );
+                                               }
+                                       }
+                               }
+
                                unset( $data[$fieldname] );
                        }
                }
diff --git a/tests/phpunit/includes/HTMLCheckMatrixTest.php 
b/tests/phpunit/includes/HTMLCheckMatrixTest.php
deleted file mode 100644
index 4e50e04..0000000
--- a/tests/phpunit/includes/HTMLCheckMatrixTest.php
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-
-/**
- * Unit tests for the HTMLCheckMatrix form field
- */
-class HtmlCheckMatrixTest extends MediaWikiTestCase {
-       static private $defaultOptions = array(
-               'rows' => array( 'r1', 'r2' ),
-               'columns' => array( 'c1', 'c2' ),
-               'fieldname' => 'test',
-       );
-
-       public function testPlainInstantiation() {
-               try {
-                       $form = new HTMLCheckMatrix( array() );
-               } catch ( MWException $e ) {
-                       $this->assertInstanceOf( 
'HTMLFormFieldRequiredOptionsException', $e );
-                       return;
-               }
-
-               $this->fail('Expected MWException indicating missing parameters 
but none was thrown.');
-       }
-
-       public function testInstantiationWithMinimumRequiredParameters() {
-               $form = new HTMLCheckMatrix( self::$defaultOptions );
-               $this->assertTrue(true); // form instantiation must throw 
exception on failure
-       }
-
-       public function testValidateCallsUserDefinedValidationCallback() {
-               $called = false;
-               $field = new HTMLCheckMatrix( self::$defaultOptions + array(
-                       'validation-callback' => function() use ( &$called ) {
-                               $called = true;
-                               return false;
-                       },
-               ) );
-               $this->assertEquals( false, $this->validate( $field, array() ) 
);
-               $this->assertTrue( $called );
-       }
-
-       public function testValidateRequiresArrayInput() {
-               $field = new HTMLCheckMatrix( self::$defaultOptions );
-               $this->assertEquals( false, $this->validate( $field, null ) );
-               $this->assertEquals( false, $this->validate( $field, true ) );
-               $this->assertEquals( false, $this->validate( $field, 'abc' ) );
-               $this->assertEquals( false, $this->validate( $field, new 
stdClass ) );
-               $this->assertEquals( true, $this->validate( $field, array() ) );
-       }
-
-       public function testValidateAllowsOnlyKnownTags() {
-               $field = new HTMLCheckMatrix( self::$defaultOptions );
-               $this->assertInternalType('string', $this->validate( $field, 
array( 'foo' ) ) );
-       }
-
-       public function testValidateAcceptsPartialTagList() {
-               $field = new HTMLCheckMatrix( self::$defaultOptions );
-               $this->assertTrue( $this->validate( $field, array() ) );
-               $this->assertTrue( $this->validate( $field, array( 'c1-r1' ) ) 
);
-               $this->assertTrue( $this->validate( $field, array( 'c1-r1', 
'c1-r2', 'c2-r1', 'c2-r2' ) ) );
-       }
-
-       /**
-        * This form object actually has no visibility into what happens later 
on, but essentially
-        * if the data submitted by the user passes validate the following is 
run:
-        * foreach ( $field->filterDataForSubmit( $data ) as $k => $v ) {
-        *     $user->setOption( $k, $v );
-        * }
-        */
-       public function testValuesForcedOnRemainOn() {
-               $field = new HTMLCheckMatrix( self::$defaultOptions + array(
-                       'force-options-on' => array( 'c2-r1' ),
-               ) );
-               $expected = array(
-                       'c1-r1' => false,
-                       'c1-r2' => false,
-                       'c2-r1' => true,
-                       'c2-r2' => false,
-               );
-               $this->assertEquals($expected, $field->filterDataForSubmit( 
array() ) );
-       }
-
-       public function testValuesForcedOffRemainOff() {
-               $field = new HTMLCheckMatrix( self::$defaultOptions + array(
-                       'force-options-off' => array( 'c1-r2', 'c2-r2' ),
-               ) );
-               $expected = array(
-                       'c1-r1' => true,
-                       'c1-r2' => false,
-                       'c2-r1' => true,
-                       'c2-r2' => false,
-               );
-               // array_keys on the result simulates submitting all fields 
checked
-               $this->assertEquals($expected, $field->filterDataForSubmit( 
array_keys($expected) ) );
-       }
-
-       protected function validate( HTMLFormField $field, $submitted ) {
-               return $field->validate(
-                       $submitted,
-                       array( self::$defaultOptions['fieldname'] => $submitted 
)
-               );
-       }
-}

-- 
To view, visit https://gerrit.wikimedia.org/r/64946
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie1f8f2a815c956764fbf02a05259133353c8d340
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: wmf/1.22wmf4
Gerrit-Owner: Catrope <roan.katt...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to