public static function render(array $parameters) { global $wgScriptPath; // Checks that... if (isset($parameters['fields']['x'], $parameters['fields']['y']) && is_array($parameters['fields']['x']) && is_array($parameters['fields']['y']) && count($parameters['fields']) == 2) { // Sets defaults $parameters = array_merge(self::$defaultParameters, $parameters); // Begins input $xmlOutput = parent::begin($parameters['class']); // Builds resource path $resourcePath = $wgScriptPath . '/extensions/DataCenter/Resources/Inputs/Position/'; // Converts mode to upper case to avoid case-sensitivity errors $mode = strtoupper($parameters['mode']); // Builds list of resource paths $resources = array('normal' => $resourcePath . $mode . '-Normal.png', 'n' => $resourcePath . $mode . '-N.png', 'e' => $resourcePath . $mode . '-E.png', 's' => $resourcePath . $mode . '-S.png', 'w' => $resourcePath . $mode . '-W.png'); // Builds lists of image map polygons $polygons = array('2D' => array('n' => '24,2,42,2,42,16,24,16', 'e' => '42,2,58,2,58,32,42,32', 's' => '24,16,42,16,42,32,24,32', 'w' => '8,2,24,2,24,32,8,32'), 'ISO' => array('n' => '30,0,60,17,30,17', 'e' => '60,17,30,34,30,17', 's' => '30,34,0,17,30,17', 'w' => '0,17,30,0,30,17')); // Creates structure of elements to be created $structure = array('x' => array('e' => array('op' => '+', 'func' => 'min', 'limit' => 'max'), 'w' => array('op' => '-', 'func' => 'max', 'limit' => 'min')), 'y' => array('n' => array('op' => '-', 'func' => 'max', 'limit' => 'min'), 's' => array('op' => '+', 'func' => 'min', 'limit' => 'max'))); // Creates shortcut to fields $fields = $parameters['fields']; // Builds effect $effect = DataCenterJs::buildEffect($parameters['effect'], array('this.x' => sprintf("document.getElementById( %s )", DataCenterJs::toScalar($fields['x']['id'])), 'this.y' => sprintf("document.getElementById( %s )", DataCenterJs::toScalar($fields['y']['id'])))); // Loops over each field $jsOutput = ''; foreach ($structure as $field => $directions) { // Adds label $xmlOutput .= DataCenterXml::tag('label', array('for' => $fields[$field]['id'], 'class' => 'label'), DataCenterUI::message('field', 'position-' . $field)); // Adds input $xmlOutput .= DataCenterXml::tag('input', array('type' => 'text', 'name' => $fields[$field]['name'], 'id' => $fields[$field]['id'], 'class' => 'number', 'value' => $fields[$field]['value'])); // Calculates minimum and maximum values $range = array('min' => min($fields[$field]['min'], $fields[$field]['max']), 'max' => max($fields[$field]['min'], $fields[$field]['max'])); foreach ($directions as $direction => $options) { // Builds javascript to connect button to input $jsOutput .= <<<END \t\t\t\t\t\t\$('#{$fields[$field]['id']}_{$direction}).on({ \t\t\t\t\t\t\t'mouseover': \t\t\t\t\t\t\tfunction() { \t\t\t\t\t\t\t\tdocument.getElementById( \t\t\t\t\t\t\t\t\t'{$parameters['id']}' \t\t\t\t\t\t\t\t).src = '{$resources[$direction]}'; \t\t\t\t\t\t\t}, \t\t\t\t\t\t\t'mouseout': \t\t\t\t\t\t\tfunction() { \t\t\t\t\t\t\t\tdocument.getElementById( \t\t\t\t\t\t\t\t\t'{$parameters['id']}' \t\t\t\t\t\t\t\t).src = '{$resources['normal']}'; \t\t\t\t\t\t\t}, \t\t\t\t\t\t\t'click': \t\t\t\t\t\t\tfunction() { \t\t\t\t\t\t\t\tvar input = document.getElementById( \t\t\t\t\t\t\t\t\t'{$fields[$field]['id']}' \t\t\t\t\t\t\t\t); \t\t\t\t\t\t\t\tvar value = parseInt( input.value ); \t\t\t\t\t\t\t\tif ( !isNaN( value ) ) { \t\t\t\t\t\t\t\t\tinput.value = Math.{$options['func']}( \t\t\t\t\t\t\t\t\t\tvalue {$options['op']} 1, \t\t\t\t\t\t\t\t\t\t{$range[$options['limit']]} \t\t\t\t\t\t\t\t\t) \t\t\t\t\t\t\t\t} \t\t\t\t\t\t\t\t{$effect} \t\t\t\t\t\t\t} \t\t\t\t\t\t}); END; } } // Begins map $xmlOutput .= DataCenterXml::open('map', array('name' => "{$parameters['id']}_map")); // Loops over each field foreach ($structure as $field => $directions) { // Loops over each direction foreach ($directions as $direction => $options) { $xmlOutput .= DataCenterXml::tag('area', array('href' => '#', 'shape' => 'poly', 'coords' => $polygons[$mode][$direction], 'id' => $fields[$field]['id'] . '_' . $direction)); } } // Ends map $xmlOutput .= DataCenterXml::close('map'); // Adds image $xmlOutput .= DataCenterXml::tag('img', array('src' => $resources['normal'], 'usemap' => "#{$parameters['id']}_map", 'id' => $parameters['id'], 'class' => 'navigator')); // Adds JavaScript $xmlOutput .= DataCenterXml::script($jsOutput); // Begins preloading $xmlOutput .= DataCenterXml::open('div', array('style' => 'display:none')); // Loops over each resource foreach ($resources as $resource) { // Adds resource $xmlOutput .= DataCenterXml::tag('img', array('src' => $resource)); } // Ends preloading $xmlOutput .= DataCenterXml::close('div'); // Ends input $xmlOutput .= parent::end(); // Returns XML return $xmlOutput; } }
/** * Builds an array of XML Attributes for javascript effects * @param options Array of Arrays of effect parameters, each * containing... * event Name of inline XML event * script JavaScript to run, with sprintf syntax for * including fields in the order listed * field Singular form of fields * fields Array of fields to supply to sprintf function * providing a way to get field information, * accessable to javascript in order given * Example: * array( * array( * 'event' => 'onmouseover', * 'script' => 'alert( 'Row ID: ' + %d )', * 'field' => 'id' * ) * ) * @param row DataCenterDBRow object from which to extract * field/fields from */ public static function buildEffects(array $options, $fields) { if ($fields instanceof DataCenterDBRow) { $fields = $fields->get(); } // Checks for required types if (is_array($fields)) { $effects = array(); // Loops over each effect foreach ($options as $effect) { if (isset($effect['event'], $effect['script'])) { // Builds effect $effects[$effect['event']] = DataCenterJs::buildEffect($effect['script'], $fields); } } // Returns XML attributes for effects return $effects; } else { return array(); } }
public static function render(array $parameters) { // Sets defaults $parameters = array_merge(self::$defaultParameters, $parameters); // Begins input $xmlOutput = parent::begin($parameters['class']); // Adds number $xmlOutput .= DataCenterXml::tag('input', array('type' => 'text', 'id' => $parameters['id'], 'name' => $parameters['name'], 'class' => 'number', 'value' => $parameters['value'], 'autocomplete' => 'off')); // Adds decriment button $xmlOutput .= DataCenterXml::tag('input', array('type' => 'button', 'id' => $parameters['id'] . '_dec', 'name' => $parameters['name'], 'class' => 'button-dec', 'value' => '-')); // Adds incriment button $xmlOutput .= DataCenterXml::tag('input', array('type' => 'button', 'id' => $parameters['id'] . '_inc', 'name' => $parameters['name'], 'class' => 'button-inc', 'value' => '+')); // Calculates the minimum value $min = min($parameters['min'], $parameters['max']); // Calculates the maximum value $max = max($parameters['min'], $parameters['max']); // Clamps the step value $step = max(min($parameters['step'], 1000), 1); // Builds effect $effect = DataCenterJs::buildEffect($parameters['effect'], array('this' => sprintf("document.getElementById( %s )", DataCenterJs::toScalar($parameters['id'])))); // Builds javascript to connect buttons to number $jsOutput = <<<END \t\t\t\$('#{$parameters['id']}') \t\t\t.on( \t\t\t\t'change', \t\t\t\tfunction() { \t\t\t\t\tvar input = document.getElementById( '{$parameters['id']}' ); \t\t\t\t\tvar value = parseInt( input.value ); \t\t\t\t\tif ( !isNaN( value ) ) { \t\t\t\t\t\tinput.value = Math.min( \t\t\t\t\t\t\tMath.max( value, {$min} ), {$max} \t\t\t\t\t\t); \t\t\t\t\t\t{$effect} \t\t\t\t\t} \t\t\t\t} \t\t\t) \t\t\t.on( \t\t\t\t'keyup', \t\t\t\tfunction() { \t\t\t\t\tvar input = document.getElementById( '{$parameters['id']}' ); \t\t\t\t\tvar value = parseInt( input.value ); \t\t\t\t\tif ( !isNaN( value ) ) { \t\t\t\t\t\tinput.value = Math.min( \t\t\t\t\t\t\tMath.max( value, {$min} ), {$max} \t\t\t\t\t\t); \t\t\t\t\t\t{$effect} \t\t\t\t\t} \t\t\t\t} \t\t\t) \t\t\t\$('#{$parameters['id']}_dec').on( \t\t\t\t'click', \t\t\t\tfunction() { \t\t\t\t\tvar input = document.getElementById( '{$parameters['id']}' ); \t\t\t\t\tvar value = parseInt( input.value ); \t\t\t\t\tif ( !isNaN( value ) ) { \t\t\t\t\t\tinput.value = Math.max( value - {$step}, {$min} ); \t\t\t\t\t} \t\t\t\t\t{$effect} \t\t\t\t} \t\t\t); \t\t\t\$('#{$parameters['id']}_inc').on( \t\t\t\t'click', \t\t\t\tfunction() { \t\t\t\t\tvar input = document.getElementById( '{$parameters['id']}' ); \t\t\t\t\tvar value = parseInt( input.value ); \t\t\t\t\tif ( !isNaN( value ) ) { \t\t\t\t\t\tinput.value = Math.min( value + {$step}, {$max} ); \t\t\t\t\t} \t\t\t\t\t{$effect} \t\t\t\t} \t\t\t); END; // Adds JavaScript $xmlOutput .= DataCenterXml::script($jsOutput); // Ends input $xmlOutput .= parent::end(); // Returns XML return $xmlOutput; }
public static function render(array $parameters) { global $wgUser; // Sets defaults $parameters = array_merge(self::$defaultParameters, $parameters); // Begins widget $xmlOutput = parent::begin($parameters['class']); // Builds form attributes $formAttributes = array('id' => 'form_' . $parameters['do'], 'name' => 'form_' . $parameters['do'], 'method' => 'post', 'action' => DataCenterXml::url($parameters['action']), 'onsubmit' => DataCenterJs::buildEffect($parameters['effect'], $parameters['row']->get())); // Begins form $xmlOutput .= DataCenterXml::open('form', $formAttributes); // Inserts content before fields $xmlOutput .= $parameters['insert']; // Begins table $xmlOutput .= DataCenterXml::open('table', self::$defaultAttributes['table']); // Creates array to keep track of the number of each type for auto-naming $count = array(); // Loops over each field foreach ($parameters['fields'] as $label => $options) { // Begins row $xmlOutput .= DataCenterXml::open('tr', self::$defaultAttributes['row']); // Checks if the key is a numeric index if (is_int($label)) { // Adds an empty cell $xmlOutput .= DataCenterXml::cell(self::$defaultAttributes['empty']); } else { // Adds a label cell $xmlOutput .= DataCenterXml::cell(self::$defaultAttributes['label'], DataCenterUI::message('field', $label)); } // Checks if field is not an array if (!is_array($options)) { // Uses value as the input type $options = array(); } // Checks if no type was set if (!isset($options['type'])) { // Uses "text" as the default $options['type'] = 'text'; } // Verifies the input type is available if (DataCenterUI::isInput($options['type'])) { // Copies field for use as options for input $inputOptions = $options; // Removes type from attributes since the input doesn't need it unset($inputOptions['type']); // Check no field or fields were set if (!isset($inputOptions['fields']) && !isset($inputOptions['field'])) { // Uses key as field $inputOptions['field'] = $label; } // Checks if this is an un-named field if (is_int($label)) { // Checks if there has been this type before if (isset($count[$options['type']])) { // Incriments type count $count[$options['type']]++; } else { // Starts counting fields of this type $count[$options['type']] = 0; } // Sets ID from type and count $inputOptions['id'] = "field_{$options['type']}_{$count[$options['type']]}"; // Sets name of input for form processing $inputOptions['name'] = "row[{$inputOptions['field']}]"; } else { // Checks if a specific field was given if (isset($inputOptions['field'])) { // Checks if no value was set if (!isset($inputOptions['value'])) { // Sets value of input from row $inputOptions['value'] = $parameters['row']->get($inputOptions['field']); } // Sets ID from name $inputOptions['id'] = "field_{$inputOptions['field']}"; // Sets name of input for form processing $inputOptions['name'] = "row[{$inputOptions['field']}]"; // Alternatively checks if a list of fields were given } elseif (isset($inputOptions['fields'])) { // Loops over each sub-field foreach ($inputOptions['fields'] as $key => $field) { // Checks if sub-field is an array if (is_array($inputOptions['fields'][$key])) { // Uses sub-field's specific field name $fieldName = $inputOptions['fields'][$key]['field']; } else { // Uses simple value as field name $fieldName = $field; // Creates arrray for sub-field options $inputOptions['fields'][$key] = array(); } // Checks if... if (!isset($inputOptions['fields'][$key]['value'])) { // Set the value of the field from the row $inputOptions['fields'][$key]['value'] = $parameters['row']->get($fieldName); } // Set the ID of the field $inputOptions['fields'][$key]['id'] = "field_{$fieldName}"; // Sets the name of the field $inputOptions['fields'][$key]['name'] = "row[{$fieldName}]"; } } } // Renders input $widget = DataCenterUI::renderInput($options['type'], $inputOptions); } else { // Alerts the user that the input did not exist $widget = DataCenterUI::message('error', 'no-ui-widget', $label); } // Adds input cell $xmlOutput .= DataCenterXml::cell(self::$defaultAttributes['field'], $widget); // Ends field row $xmlOutput .= DataCenterXml::close('tr'); } // Checks if row is a component if ($parameters['meta'] && $parameters['row'] instanceof DataCenterDBComponent) { // Adds meta fields $metaFields = $parameters['row']->getMetaFields(); $metaValues = $parameters['row']->getMetaValues(); $valuesTable = DataCenterDB::buildLookupTable('field', $metaValues); foreach ($metaFields as $metaField) { $field = $metaField->get('field'); $value = ''; if (isset($valuesTable[$field][0]) && $valuesTable[$field][0] instanceof DataCenterDBMetaValue) { $value = $valuesTable[$field][0]->get('value'); } // Begins row $xmlOutput .= DataCenterXml::open('tr', self::$defaultAttributes['meta']); // Adds label cell $xmlOutput .= DataCenterXml::cell(self::$defaultAttributes['label'], $metaField->get('name')); // Adds input cell $xmlOutput .= DataCenterXml::cell(self::$defaultAttributes['field'], DataCenterUI::renderInput($metaField->get('format'), array('name' => 'meta[' . $field . ']', 'id' => 'meta_' . $field, 'value' => $value))); // Ends field row $xmlOutput .= DataCenterXml::close('tr'); } // Adds change comment field $xmlOutput .= DataCenterXml::row(self::$defaultAttributes['change'], DataCenterXml::cell(self::$defaultAttributes['label'], DataCenterUI::message('field', 'change-summary')), DataCenterXml::cell(self::$defaultAttributes['field'], DataCenterUI::renderInput('string', array('name' => 'change[note]', 'id' => 'change_note')))); // Adds type of edit field $xmlOutput .= DataCenterXml::tag('input', array('type' => 'hidden', 'name' => 'change[type]', 'value' => $parameters['type'])); } // Adds cancel and submit button $xmlOutput .= DataCenterXML::row(DataCenterXml::cell(self::$defaultAttributes['buttons'], DataCenterXml::tag('input', array('type' => 'submit', 'name' => 'cancel', 'class' => 'cancel', 'value' => DataCenterUI::message('label', 'cancel'))) . DataCenterXml::tag('input', array('type' => 'submit', 'name' => 'submit', 'class' => 'submit', 'value' => DataCenterUI::message('label', $parameters['label']))))); // Ends table $xmlOutput .= DataCenterXml::close('table'); // Adds do field $xmlOutput .= DataCenterXml::tag('input', array('type' => 'hidden', 'name' => 'do', 'value' => $parameters['do'])); // Adds token field $xmlOutput .= DataCenterXml::tag('input', array('type' => 'hidden', 'name' => 'token', 'value' => $wgUser->editToken())); // Adds success field $xmlOutput .= DataCenterXml::tag('input', array('type' => 'hidden', 'name' => 'success', 'value' => DataCenterXml::url($parameters['success']))); // Adds failure field $xmlOutput .= DataCenterXml::tag('input', array('type' => 'hidden', 'name' => 'failure', 'value' => DataCenterXml::url($parameters['failure']))); // Adds canellation field $xmlOutput .= DataCenterXml::tag('input', array('type' => 'hidden', 'name' => 'cancellation', 'value' => DataCenterXml::url(count($parameters['cancellation']) > 0 ? $parameters['cancellation'] : $parameters['success']))); // Loops over hidden fields foreach ($parameters['hidden'] as $key => $value) { // Checks if key is numeric if (is_int($key)) { // Adds field with value from row $xmlOutput .= DataCenterXml::tag('input', array('type' => 'hidden', 'name' => "row[{$value}]", 'value' => $parameters['row']->get($value))); } else { // Adds field with specified value $xmlOutput .= DataCenterXml::tag('input', array('type' => 'hidden', 'name' => "row[{$key}]", 'value' => $value)); } } // Appends content after fields $xmlOutput .= $parameters['append']; // Ends form $xmlOutput .= DataCenterXml::close('form'); // Ends widget $xmlOutput .= DataCenterXml::close('div'); // Returns the results return $xmlOutput; }