X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FXml.php;h=464b142c05118aa91cd305fa638f2a564fe85ff9;hb=a88a955ebfa5f626a3e52afc85bc036ee5dd465d;hp=7db9ee8cca4baa0fc3d27ac294867e8391146c09;hpb=5cfdfc467b71c518c7629a7315a0fcdaba1b99c2;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Xml.php b/includes/Xml.php index 7db9ee8cca..464b142c05 100644 --- a/includes/Xml.php +++ b/includes/Xml.php @@ -41,7 +41,7 @@ class Xml { * Return null if no attributes given. * @param $attribs Array of attributes for an XML element */ - private static function expandAttributes( $attribs ) { + public static function expandAttributes( $attribs ) { $out = ''; if( is_null( $attribs ) ) { return null; @@ -56,7 +56,7 @@ class Xml { /** * Format an XML element as with self::element(), but run text through the - * UtfNormal::cleanUp() validator first to ensure that no invalid UTF-8 + * $wgContLang->normalize() validator first to ensure that no invalid UTF-8 * is passed. * * @param $element String: @@ -65,12 +65,13 @@ class Xml { * @return string */ public static function elementClean( $element, $attribs = array(), $contents = '') { + global $wgContLang; if( $attribs ) { $attribs = array_map( array( 'UtfNormal', 'cleanUp' ), $attribs ); } if( $contents ) { wfProfileIn( __METHOD__ . '-norm' ); - $contents = UtfNormal::cleanUp( $contents ); + $contents = $wgContLang->normalize( $contents ); wfProfileOut( __METHOD__ . '-norm' ); } return self::element( $element, $attribs, $contents ); @@ -112,11 +113,11 @@ class Xml { * * @param $selected Mixed: Namespace which should be pre-selected * @param $all Mixed: Value of an item denoting all namespaces, or null to omit - * @param $hidden Mixed: Include hidden namespaces? [WTF? --RC] * @param $element_name String: value of the "name" attribute of the select tag + * @param $label String: optional label to add to the field * @return string */ - public static function namespaceSelector( $selected = '', $all = null, $hidden = false, $element_name = 'namespace' ) { + public static function namespaceSelector( $selected = '', $all = null, $element_name = 'namespace', $label = null ) { global $wgContLang; $namespaces = $wgContLang->getFormattedNamespaces(); $options = array(); @@ -139,12 +140,16 @@ class Xml { $options[] = self::option( $name, $index, $index === $selected ); } - return Xml::openElement( 'select', array( 'id' => 'namespace', 'name' => $element_name, + $ret = Xml::openElement( 'select', array( 'id' => 'namespace', 'name' => $element_name, 'class' => 'namespaceselector' ) ) . "\n" . implode( "\n", $options ) . "\n" . Xml::closeElement( 'select' ); + if ( !is_null( $label ) ) { + $ret = Xml::label( $label, $element_name ) . ' ' . $ret; + } + return $ret; } /** @@ -158,16 +163,46 @@ class Xml { public static function monthSelector( $selected = '', $allmonths = null, $id = 'month' ) { global $wgLang; $options = array(); - if( is_null( $selected ) ) + if( is_null( $selected ) ) $selected = ''; - if( !is_null( $allmonths ) ) + if( !is_null( $allmonths ) ) $options[] = self::option( wfMsg( 'monthsall' ), $allmonths, $selected === $allmonths ); for( $i = 1; $i < 13; $i++ ) - $options[] = self::option( $wgLang->getMonthName( $i ), $i, $selected === $i ); + $options[] = self::option( $wgLang->getMonthName( $i ), $i, $selected === $i ); return self::openElement( 'select', array( 'id' => $id, 'name' => 'month', 'class' => 'mw-month-selector' ) ) . implode( "\n", $options ) . self::closeElement( 'select' ); } + + /** + * @param $year Integer + * @param $month Integer + * @return string Formatted HTML + */ + public static function dateMenu( $year, $month ) { + # Offset overrides year/month selection + if( $month && $month !== -1 ) { + $encMonth = intval( $month ); + } else { + $encMonth = ''; + } + if( $year ) { + $encYear = intval( $year ); + } else if( $encMonth ) { + $thisMonth = intval( gmdate( 'n' ) ); + $thisYear = intval( gmdate( 'Y' ) ); + if( intval($encMonth) > $thisMonth ) { + $thisYear--; + } + $encYear = $thisYear; + } else { + $encYear = ''; + } + return Xml::label( wfMsg( 'year' ), 'year' ) . ' '. + Xml::input( 'year', 4, $encYear, array('id' => 'year', 'maxlength' => 4) ) . ' '. + Xml::label( wfMsg( 'month' ), 'month' ) . ' '. + Xml::monthSelector( $encMonth, -1 ); + } /** * @@ -360,21 +395,14 @@ class Xml { * @return string HTML */ public static function submitButton( $value, $attribs=array() ) { - return self::element( 'input', array( 'type' => 'submit', 'value' => $value ) + $attribs ); + return Html::element( 'input', array( 'type' => 'submit', 'value' => $value ) + $attribs ); } /** - * Convenience function to build an HTML hidden form field. - * @param $name String: name attribute for the field - * @param $value String: value for the hidden field - * @param $attribs Array: optional custom attributes - * @return string HTML + * @deprecated Synonymous to Html::hidden() */ - public static function hidden( $name, $value, $attribs=array() ) { - return self::element( 'input', array( - 'name' => $name, - 'type' => 'hidden', - 'value' => $value ) + $attribs ); + public static function hidden( $name, $value, $attribs = array() ) { + return Html::hidden( $name, $value, $attribs ); } /** @@ -540,7 +568,10 @@ class Xml { $s = 'null'; } elseif ( is_int( $value ) ) { $s = $value; - } elseif ( is_array( $value ) ) { + } elseif ( is_array( $value ) && // Make sure it's not associative. + array_keys($value) === range( 0, count($value) - 1 ) || + count($value) == 0 + ) { $s = '['; foreach ( $value as $elt ) { if ( $s != '[' ) { @@ -549,7 +580,8 @@ class Xml { $s .= self::encodeJsVar( $elt ); } $s .= ']'; - } elseif ( is_object( $value ) ) { + } elseif ( is_object( $value ) || is_array( $value ) ) { + // Objects and associative arrays $s = '{'; foreach ( (array)$value as $name => $elt ) { if ( $s != '{' ) { @@ -637,21 +669,66 @@ class Xml { foreach( $fields as $labelmsg => $input ) { $id = "mw-$labelmsg"; - $form .= Xml::openElement( 'tr', array( 'id' => $id ) ); $form .= Xml::tags( 'td', array('class' => 'mw-label'), wfMsgExt( $labelmsg, array('parseinline') ) ); - $form .= Xml::openElement( 'td' ) . $input . Xml::closeElement( 'td' ); + $form .= Xml::openElement( 'td', array( 'class' => 'mw-input' ) ) . $input . Xml::closeElement( 'td' ); + $form .= Xml::closeElement( 'tr' ); + } + + if( $submitLabel ) { + $form .= Xml::openElement( 'tr' ); + $form .= Xml::tags( 'td', array(), '' ); + $form .= Xml::openElement( 'td', array( 'class' => 'mw-submit' ) ) . Xml::submitButton( wfMsg( $submitLabel ) ) . Xml::closeElement( 'td' ); $form .= Xml::closeElement( 'tr' ); } $form .= ""; - - if ($submitLabel) { - $form .= Xml::submitButton( wfMsg($submitLabel) ); - } + return $form; } + + /** + * Build a table of data + * @param $rows An array of arrays of strings, each to be a row in a table + * @param $attribs An array of attributes to apply to the table tag [optional] + * @param $headers An array of strings to use as table headers [optional] + * @return string + */ + public static function buildTable( $rows, $attribs = array(), $headers = null ) { + $s = Xml::openElement( 'table', $attribs ); + if ( is_array( $headers ) ) { + foreach( $headers as $id => $header ) { + $attribs = array(); + if ( is_string( $id ) ) $attribs['id'] = $id; + $s .= Xml::element( 'th', $attribs, $header ); + } + } + foreach( $rows as $id => $row ) { + $attribs = array(); + if ( is_string( $id ) ) $attribs['id'] = $id; + $s .= Xml::buildTableRow( $attribs, $row ); + } + $s .= Xml::closeElement( 'table' ); + return $s; + } + + /** + * Build a row for a table + * @param $attribs An array of attributes to apply to the tr tag + * @param $cells An array of strings to put in + * @return string + */ + public static function buildTableRow( $attribs, $cells ) { + $s = Xml::openElement( 'tr', $attribs ); + foreach( $cells as $id => $cell ) { + $attribs = array(); + if ( is_string( $id ) ) $attribs['id'] = $id; + $s .= Xml::element( 'td', $attribs, $cell ); + } + $s .= Xml::closeElement( 'tr' ); + return $s; + } } class XmlSelect { @@ -673,13 +750,46 @@ class XmlSelect { $this->attributes[$name] = $value; } + public function getAttribute( $name ) { + if ( isset($this->attributes[$name]) ) { + return $this->attributes[$name]; + } else { + return null; + } + } + public function addOption( $name, $value = false ) { - $value = $value ? $value : $name; + // Stab stab stab + $value = ($value !== false) ? $value : $name; $this->options[] = Xml::option( $name, $value, $value === $this->default ); } + + // This accepts an array of form + // label => value + // label => ( label => value, label => value ) + public function addOptions( $options ) { + $this->options[] = trim(self::formatOptions( $options, $this->default )); + } + + // This accepts an array of form + // label => value + // label => ( label => value, label => value ) + static function formatOptions( $options, $default = false ) { + $data = ''; + foreach( $options as $label => $value ) { + if ( is_array( $value ) ) { + $contents = self::formatOptions( $value, $default ); + $data .= Xml::tags( 'optgroup', array( 'label' => $label ), $contents ) . "\n"; + } else { + $data .= Xml::option( $label, $value, $value === $default ) . "\n"; + } + } + + return $data; + } public function getHTML() { return Xml::tags( 'select', $this->attributes, implode( "\n", $this->options ) ); } -} \ No newline at end of file +}