Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 13
CRAP
0.00% covered (danger)
0.00%
0 / 185
CargoPageSchemas
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 13
2756
0.00% covered (danger)
0.00%
0 / 185
 registerClass
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 4
 createPageSchemasObject
0.00% covered (danger)
0.00%
0 / 1
110
0.00% covered (danger)
0.00%
0 / 30
 getDisplayColor
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 getTemplateDisplayString
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 getTemplateValues
0.00% covered (danger)
0.00%
0 / 1
30
0.00% covered (danger)
0.00%
0 / 13
 getTemplateDisplayValues
0.00% covered (danger)
0.00%
0 / 1
20
0.00% covered (danger)
0.00%
0 / 13
 getFieldDisplayString
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 isTemplateDataMultipleInstanceOnly
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 getTemplateEditingHTML
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 13
 getFieldEditingHTML
0.00% covered (danger)
0.00%
0 / 1
72
0.00% covered (danger)
0.00%
0 / 39
 createTemplateXMLFromForm
0.00% covered (danger)
0.00%
0 / 1
20
0.00% covered (danger)
0.00%
0 / 17
 createFieldXMLFromForm
0.00% covered (danger)
0.00%
0 / 1
56
0.00% covered (danger)
0.00%
0 / 26
 getFieldDisplayValues
0.00% covered (danger)
0.00%
0 / 1
42
0.00% covered (danger)
0.00%
0 / 22
<?php
/**
 * Static functions for use by the Page Schemas extension.
 *
 * @author Yaron Koren
 */
class CargoPageSchemas extends PSExtensionHandler {
    public static function registerClass() {
        global $wgPageSchemasHandlerClasses;
        $wgPageSchemasHandlerClasses[] = 'CargoPageSchemas';
        return true;
    }
    /**
     * Returns an object containing information on a Cargo field,
     * based on XML from the Page Schemas extension.
     */
    public static function createPageSchemasObject( $tagName, $xml ) {
        $cargoArray = [];
        if ( $tagName == "cargo_TemplateDetails" ) {
            foreach ( $xml->children() as $tag => $child ) {
                if ( $tag == $tagName ) {
                    foreach ( $child->children() as $tag => $elem ) {
                        $cargoArray[$tag] = (string)$elem;
                    }
                    return $cargoArray;
                }
            }
        }
        if ( $tagName == "cargo_Field" ) {
            foreach ( $xml->children() as $tag => $child ) {
                if ( $tag != $tagName ) {
                    continue;
                }
                $allowedValues = [];
                foreach ( $child->children() as $prop => $value ) {
                    if ( $prop == "AllowedValue" ) {
                        $allowedValues[] = (string)$value;
                    } else {
                        $cargoArray[$prop] = (string)$value;
                    }
                }
                $cargoArray['AllowedValues'] = $allowedValues;
                return $cargoArray;
            }
        }
        return null;
    }
    public static function getDisplayColor() {
        return '#e9cdff';
    }
    public static function getTemplateDisplayString() {
        return wfMessage( 'specialpages-group-cargo' )->escaped();
    }
    public static function getTemplateValues( $psTemplate ) {
        // TODO - fix this.
        $values = [];
        if ( $psTemplate instanceof PSTemplate ) {
            $psTemplate = $psTemplate->getXML();
        }
        foreach ( $psTemplate->children() as $tag => $child ) {
            if ( $tag == "cargo_TemplateDetails" ) {
                foreach ( $child->children() as $prop ) {
                    $values[$prop->getName()] = (string)$prop;
                }
            }
        }
        return $values;
    }
    /**
     * Displays Cargo details for one template in the Page Schemas XML.
     */
    public static function getTemplateDisplayValues( $templateXML ) {
        $templateValues = self::getTemplateValues( $templateXML );
        if ( count( $templateValues ) == 0 ) {
            return null;
        }
        $displayValues = [];
        foreach ( $templateValues as $key => $value ) {
            if ( $key == 'Table' ) {
                $propName = 'Table';
            }
            $displayValues[$propName] = $value;
        }
        return [ null, $displayValues ];
    }
    public static function getFieldDisplayString() {
        return wfMessage( 'cargo-pageschemas-cargofield' )->text();
    }
    public static function isTemplateDataMultipleInstanceOnly() {
        return false;
    }
    public static function getTemplateEditingHTML( $psTemplate ) {
        $hasExistingValues = false;
        $tableName = null;
        if ( $psTemplate !== null ) {
            $cargoArray = $psTemplate->getObject( 'cargo_TemplateDetails' );
            if ( $cargoArray !== null ) {
                $hasExistingValues = true;
                $tableName = PageSchemas::getValueFromObject( $cargoArray, 'Table' );
            }
        }
        $text = "\t<p>" . wfMessage( 'cargo-pageschemas-tablename' )->text() . ' ' .
            Html::input( 'cargo_template_table_name_num', $tableName, 'text', [ 'size' => 30 ] ) . "</p>\n";
        return [ $text, $hasExistingValues ];
    }
    /**
     * Returns the HTML for setting the options for the Cargo section
     * in Page Schemas' "edit schema" page.
     */
    public static function getFieldEditingHTML( $psField ) {
        global $wgCargoFieldTypes;
        $cargoArray = [];
        $hasExistingValues = false;
        if ( $psField !== null ) {
            $cargoArray = $psField->getObject( 'cargo_Field' );
            if ( $cargoArray !== null ) {
                $hasExistingValues = true;
            }
        }
        $fieldType = PageSchemas::getValueFromObject( $cargoArray, 'Type' );
        $allowedValues = PageSchemas::getValueFromObject( $cargoArray, 'AllowedValues' );
        if ( $allowedValues === null ) {
            $allowedValuesString = '';
        } else {
            $allowedValuesString = implode( ', ', $allowedValues );
        }
        $typeLabel = wfMessage( 'pf_createproperty_proptype' )->escaped();
        if ( $typeLabel == '' ) {
            $typeLabel = 'Type:';
        }
        $allowedValuesLabel = wfMessage( 'pf_createproperty_allowedvalsinput' )->escaped();
        if ( $allowedValuesLabel == '' ) {
            $allowedValuesLabel = 'Allowed values:';
        }
        $html_text = "<p>$typeLabel ";
        $selectBody = '';
        foreach ( $wgCargoFieldTypes as $type ) {
            $optionAttrs = [ 'value' => $type ];
            if ( $type == $fieldType ) {
                $optionAttrs['selected'] = true;
            }
            $selectBody .= Html::element( 'option', $optionAttrs, $type ) . "\n";
        }
        $html_text .= Html::rawElement( 'select', [ 'name' => 'cargo_field_type_num' ], $selectBody ) . "\n";
        $html_text .= "<p>$allowedValuesLabel<br />\n";
        $html_text .= Html::input( 'cargo_field_allowed_values_num', $allowedValuesString, 'text', [ 'size' => 100 ] );
        $html_text .= "\t</p>\n";
        return [ $html_text, $hasExistingValues ];
    }
    /**
     * Creates Page Schemas XML from Cargo information on templates.
     */
    public static function createTemplateXMLFromForm() {
        global $wgRequest;
        $xmlPerTemplate = [];
        $templateNum = -1;
        foreach ( $wgRequest->getValues() as $var => $val ) {
            $val = str_replace( [ '<', '>' ], [ '&lt;', '&gt;' ], $val );
            if ( substr( $var, 0, 26 ) == 'cargo_template_table_name_' ) {
                $templateNum = substr( $var, 26 );
                $xml = '<cargo_TemplateDetails>';
                if ( !empty( $val ) ) {
                    $xml .= "<Table>$val</Table>";
                }
                $xml .= '</cargo_TemplateDetails>';
                                $xmlPerTemplate[$templateNum] = $xml;
            }
        }
        return $xmlPerTemplate;
    }
    public static function createFieldXMLFromForm() {
        global $wgRequest;
        $fieldNum = -1;
        $xmlPerField = [];
        foreach ( $wgRequest->getValues() as $var => $val ) {
            if ( substr( $var, 0, 17 ) == 'cargo_field_type_' ) {
                $xml = '<cargo_Field>';
                $fieldNum = substr( $var, 17 );
                if ( !empty( $val ) ) {
                    $xml .= "<Type>$val</Type>";
                }
            } elseif ( substr( $var, 0, 27 ) == 'cargo_field_allowed_values_' ) {
                if ( !empty( $val ) ) {
                    // Replace the comma substitution character that has no chance of
                    // being included in the values list - namely, the ASCII beep.
                    $listSeparator = ',';
                    $allowedValuesStr = str_replace( "\\$listSeparator", "\a", $val );
                    $allowedValuesArray = explode( $listSeparator, $allowedValuesStr );
                    foreach ( $allowedValuesArray as $value ) {
                        // Replace beep back with comma, trim.
                        $value = str_replace( "\a", $listSeparator, trim( $value ) );
                        $xml .= '<AllowedValue>' . $value . '</AllowedValue>';
                    }
                }
                $xml .= '</cargo_Field>';
                $xmlPerField[$fieldNum] = $xml;
            }
        }
        return $xmlPerField;
    }
    /**
     * Displays the information about the Cargo field (if any)
     * for one field in the Page Schemas XML.
     */
    public static function getFieldDisplayValues( $field_xml ) {
        foreach ( $field_xml->children() as $tag => $child ) {
            if ( $tag == "cargo_Field" ) {
                $values = [];
                $allowedValues = [];
                foreach ( $child->children() as $prop => $value ) {
                    if ( $prop == "AllowedValue" ) {
                        $allowedValues[] = $value;
                    } else {
                        $values[$prop] = $value;
                    }
                }
                $allowedValuesStr = implode( ', ', $allowedValues );
                $allowedValuesLabel = wfMessage( 'pf_createclass_allowedvalues' )->escaped();
                if ( $allowedValuesLabel == '' ) {
                    $allowedValuesLabel = 'Allowed values:';
                }
                $values[$allowedValuesLabel] = $allowedValuesStr;
                return [ null, $values ];
            }
        }
        return null;
    }
}