static function create($name, $label = null, $allowMultiple = null, $maxAllowed = null, $formFields = null)
 {
     $tif = new SFTemplateInForm();
     $tif->mTemplateName = str_replace('_', ' ', $name);
     $tif->mFields = array();
     if (is_null($formFields)) {
         $fields = $tif->getAllFields();
         $field_num = 0;
         foreach ($fields as $field) {
             $tif->mFields[] = SFFormField::create($field_num++, $field);
         }
     } else {
         $tif->mFields = $formFields;
     }
     $tif->mLabel = $label;
     $tif->mAllowMultiple = $allowMultiple;
     $tif->mMaxAllowed = $maxAllowed;
     return $tif;
 }
Exemple #2
0
 public function formSerialize($form_def = '', $source_is_page = false, $existing_page_content = null, $page_title = null)
 {
     //	public function formSerialize($form_def, $source_is_page, $existing_page_content = null, $page_title = null, $page_name_formula = null) {
     global $wgRequest, $wgUser, $wgParser;
     global $sfgTabIndex;
     // used to represent the current tab index in the form
     global $sfgFieldNum;
     // used for setting various HTML IDs
     global $sfgJSValidationCalls;
     // array of Javascript calls to determine if page can be saved
     # define a var for all fields
     $__fields = array();
     // initialize some variables
     $sfgTabIndex = 1;
     $sfgFieldNum = 1;
     $source_page_matches_this_form = false;
     $form_page_title = NULL;
     // $form_is_partial is true if:
     // (a) 'partial' == 1 in the arguments
     // (b) 'partial form' is found in the form definition
     // in the latter case, it may remain false until close to the end of
     // the parsing, so we have to assume that it will become a possibility
     $form_is_partial = false;
     $new_text = "";
     // if we have existing content and we're not in an active replacement
     // situation, preserve the original content. We do this because we want
     // to pass the original content on IF this is a partial form
     // TODO: A better approach here would be to pass the revision id of the
     // existing page content through the replace value, which would
     // minimize the html traffic and would allow us to do a concurrent
     // update check.  For now, we pass it through the hidden text field...
     if (!$wgRequest->getCheck('partial')) {
         $original_page_content = $existing_page_content;
     } else {
         $original_page_content = null;
         if ($wgRequest->getCheck('free_text')) {
             $existing_page_content = $wgRequest->getVal('free_text');
             $form_is_partial = true;
         }
     }
     // disable all form elements if user doesn't have edit permission -
     // two different checks are needed, because editing permissions can be
     // set in different ways
     // HACK - sometimes we don't know the page name in advance, but we still
     // need to set a title here for testing permissions
     if ($page_title == '') {
         $this->mPageTitle = Title::newFromText("Semantic Forms permissions test");
     } else {
         $this->mPageTitle = Title::newFromText($page_title);
     }
     if ($wgUser->isAllowed('edit') && $this->mPageTitle->userCanEdit()) {
         $form_is_disabled = false;
         $form_text = "";
         // show "Your IP address will be recorded" warning if user is
         // anonymous - wikitext for bolding has to be replaced with HTML
         if ($wgUser->isAnon()) {
             $anon_edit_warning = preg_replace("/'''(.*)'''/", "<strong>\$1</strong>", wfMsg('anoneditwarning'));
             $form_text .= "<p>{$anon_edit_warning}</p>\n";
         }
     } else {
         $form_is_disabled = true;
         // display a message to the user explaining why they can't edit the
         // page - borrowed heavily from EditPage.php
         if ($wgUser->isAnon()) {
             $skin = $wgUser->getSkin();
             $loginTitle = SpecialPage::getTitleFor('Userlogin');
             $loginLink = $skin->makeKnownLinkObj($loginTitle, wfMsgHtml('loginreqlink'));
             $form_text = wfMsgWikiHtml('whitelistedittext', $loginLink);
         } else {
             $form_text = wfMsg('protectedpagetext');
         }
     }
     $javascript_text = "";
     $sfgJSValidationCalls = array();
     $fields_javascript_text = "";
     // Remove <noinclude> sections and <includeonly> tags from form definition
     $form_def = StringUtils::delimiterReplace('<noinclude>', '</noinclude>', '', $form_def);
     $form_def = strtr($form_def, array('<includeonly>' => '', '</includeonly>' => ''));
     // parse wiki-text
     // add '<nowiki>' tags around every triple-bracketed form definition
     // element, so that the wiki parser won't touch it - the parser will
     // remove the '<nowiki>' tags, leaving us with what we need
     global $sfgDisableWikiTextParsing;
     if (!$sfgDisableWikiTextParsing) {
         $form_def = "__NOEDITSECTION__" . strtr($form_def, array('{{{' => '<nowiki>{{{', '}}}' => '}}}</nowiki>'));
         $wgParser->mOptions = new ParserOptions();
         $wgParser->mOptions->initialiseFromUser($wgUser);
         $form_def = $wgParser->parse($form_def, $this->mPageTitle, $wgParser->mOptions)->getText();
     }
     // turn form definition file into an array of sections, one for each
     // template definition (plus the first section)
     $form_def_sections = array();
     $start_position = 0;
     $section_start = 0;
     $free_text_was_included = false;
     $free_text_preload_page = null;
     $all_values_for_template = array();
     // unencode and HTML-encoded representations of curly brackets and
     // pipes - this is a hack to allow for forms to include templates
     // that themselves contain form elements - the escaping is needed
     // to make sure that those elements don't get parsed too early
     $form_def = str_replace(array('&#123;', '&#124;', '&#125;'), array('{', '|', '}'), $form_def);
     // and another hack - replace the 'free text' standard input with
     // a field declaration to get it to be handled as a field
     $form_def = str_replace('standard input|free text', 'field|<freetext>', $form_def);
     while ($brackets_loc = strpos($form_def, "{{{", $start_position)) {
         $brackets_end_loc = strpos($form_def, "}}}", $brackets_loc);
         $bracketed_string = substr($form_def, $brackets_loc + 3, $brackets_end_loc - ($brackets_loc + 3));
         $tag_components = explode('|', $bracketed_string);
         $tag_title = trim($tag_components[0]);
         if ($tag_title == 'for template' || $tag_title == 'end template') {
             // create a section for everything up to here
             $section = substr($form_def, $section_start, $brackets_loc - $section_start);
             $form_def_sections[] = $section;
             $section_start = $brackets_loc;
         }
         $start_position = $brackets_loc + 1;
     }
     // end while
     $form_def_sections[] = trim(substr($form_def, $section_start));
     // cycle through form definition file (and possibly an existing article
     // as well), finding template and field declarations and replacing them
     // with form elements, either blank or pre-populated, as appropriate
     $all_fields = array();
     $data_text = "";
     $template_name = "";
     $allow_multiple = false;
     $instance_num = 0;
     $all_instances_printed = false;
     $strict_parsing = false;
     // initialize list of choosers (dropdowns with available templates)
     $choosers = array();
     for ($section_num = 0; $section_num < count($form_def_sections); $section_num++) {
         $tif = new SFTemplateInForm();
         $start_position = 0;
         $template_text = "";
         // the append is there to ensure that the original array doesn't get
         // modified; is it necessary?
         $section = " " . $form_def_sections[$section_num];
         while ($brackets_loc = strpos($section, '{{{', $start_position)) {
             $brackets_end_loc = strpos($section, "}}}", $brackets_loc);
             $bracketed_string = substr($section, $brackets_loc + 3, $brackets_end_loc - ($brackets_loc + 3));
             $tag_components = explode('|', $bracketed_string);
             $tag_title = trim($tag_components[0]);
             // =====================================================
             // for template processing
             // =====================================================
             if ($tag_title == 'for template') {
                 $old_template_name = $template_name;
                 $template_name = trim($tag_components[1]);
                 $tif->template_name = $template_name;
                 $query_template_name = str_replace(' ', '_', $template_name);
                 // also replace periods with underlines, since that's what
                 // POST does to strings anyway
                 $query_template_name = str_replace('.', '_', $query_template_name);
                 $chooser_name = false;
                 $chooser_caption = false;
                 // cycle through the other components
                 for ($i = 2; $i < count($tag_components); $i++) {
                     $component = $tag_components[$i];
                     if ($component == 'multiple') {
                         $allow_multiple = true;
                     }
                     if ($component == 'strict') {
                         $strict_parsing = true;
                     }
                     $sub_components = explode('=', $component);
                     if (count($sub_components) == 2) {
                         if ($sub_components[0] == 'label') {
                             $template_label = $sub_components[1];
                         } elseif ($sub_components[0] == 'chooser') {
                             $allow_multiple = true;
                             $chooser_name = $sub_components[1];
                         } elseif ($sub_components[0] == 'chooser caption') {
                             $chooser_caption = $sub_components[1];
                         }
                     }
                 }
                 // if this is the first instance, add the label in the form
                 if ($old_template_name != $template_name && isset($template_label)) {
                     // add a placeholder to the form text so the fieldset can be
                     // hidden if chooser support demands it
                     if ($chooser_name !== false) {
                         $form_text .= "<fieldset [[placeholder]] haschooser=true>\n";
                     } else {
                         $form_text .= "<fieldset>\n";
                     }
                     $form_text .= "<legend>{$template_label}</legend>\n";
                 }
                 $template_text .= "{{" . $tif->template_name;
                 # reads all the fields of the template definition page
                 $all_fields = $tif->getAllFields();
                 // remove template tag
                 $section = substr_replace($section, '', $brackets_loc, $brackets_end_loc + 3 - $brackets_loc);
                 $template_instance_query_values = $wgRequest->getArray($query_template_name);
                 // if we are editing a page, and this template can be found more than
                 // once in that page, and multiple values are allowed, repeat this
                 // section
                 $existing_template_text = null;
                 // replace underlines with spaces in template name, to allow for
                 // searching on either
                 $search_template_str = str_replace('_', ' ', $tif->template_name);
                 if ($source_is_page || $form_is_partial) {
                     if ($allow_multiple) {
                         // find instances of this template in the page -
                         // if there's at least one, re-parse this section of the
                         // definition form for the subsequent template instances in
                         // this page; if there's none, don't include fields at all.
                         // there has to be a more efficient way to handle multiple
                         // instances of templates, one that doesn't involve re-parsing
                         // the same tags, but I don't know what it is.
                         if (stripos(str_replace('_', ' ', $existing_page_content), '{{' . $search_template_str) !== false) {
                             $instance_num++;
                         } else {
                             $all_instances_printed = true;
                         }
                     }
                     // get the first instance of this template on the page being edited,
                     // even if there are more
                     if (($start_char = stripos(str_replace('_', ' ', $existing_page_content), '{{' . $search_template_str)) !== false) {
                         $fields_start_char = $start_char + 2 + strlen($search_template_str);
                         // skip ahead to the first real character
                         while (in_array($existing_page_content[$fields_start_char], array(' ', '\\n', '|'))) {
                             $fields_start_char++;
                         }
                         $template_contents = array('0' => '');
                         // cycle through template call, splitting it up by pipes ('|'),
                         // except when that pipe is part of a piped link
                         $field = "";
                         $uncompleted_square_brackets = 0;
                         $uncompleted_curly_brackets = 2;
                         $template_ended = false;
                         for ($i = $fields_start_char; !$template_ended && $i < strlen($existing_page_content); $i++) {
                             $c = $existing_page_content[$i];
                             if ($c == '[') {
                                 $uncompleted_square_brackets++;
                             } elseif ($c == ']' && $uncompleted_square_brackets > 0) {
                                 $uncompleted_square_brackets--;
                             } elseif ($c == '{') {
                                 $uncompleted_curly_brackets++;
                             } elseif ($c == '}' && $uncompleted_curly_brackets > 0) {
                                 $uncompleted_curly_brackets--;
                             }
                             // handle an end to a field and/or template declaration
                             $template_ended = $uncompleted_curly_brackets == 0 && $uncompleted_square_brackets == 0;
                             $field_ended = $c == '|' && $uncompleted_square_brackets == 0;
                             if ($template_ended || $field_ended) {
                                 // if this was the last character in the template, remove
                                 // the closing curly brackets
                                 if ($template_ended) {
                                     $field = substr($field, 0, -1);
                                 }
                                 // either there's an equals sign near the beginning or not -
                                 // handling is similar in either way; if there's no equals
                                 // sign, the index of this field becomes the key
                                 $sub_fields = explode('=', $field, 2);
                                 if (count($sub_fields) > 1) {
                                     $template_contents[trim($sub_fields[0])] = trim($sub_fields[1]);
                                 } else {
                                     $template_contents[] = trim($sub_fields[0]);
                                 }
                                 $field = '';
                             } else {
                                 $field .= $c;
                             }
                         }
                         $existing_template_text = substr($existing_page_content, $start_char, $i - $start_char);
                         // now remove this template from the text being edited
                         // if this is a partial form, establish a new insertion point
                         if ($existing_page_content && $form_is_partial && $wgRequest->getCheck('partial')) {
                             // if something already exists, set the new insertion point
                             // to its position; otherwise just let it lie
                             if (strpos($existing_page_content, $existing_template_text) !== false) {
                                 $existing_page_content = str_replace('{{{insertionpoint}}}', '', $existing_page_content);
                                 $existing_page_content = str_replace($existing_template_text, '{{{insertionpoint}}}', $existing_page_content);
                             }
                         } else {
                             $existing_page_content = str_replace($existing_template_text, '', $existing_page_content);
                         }
                         // if this is not a multiple-instance template, and we've found
                         // a match in the source page, there's a good chance that this
                         // page was created with this form - note that, so we don't
                         // send the user a warning
                         // (multiple-instance templates have a greater chance of
                         // getting repeated from one form to the next)
                         if (!$allow_multiple) {
                             $source_page_matches_this_form = true;
                         }
                     }
                 }
                 // if the input is from the form (meaning the user has hit one
                 // of the bottom row of buttons), and we're dealing with a
                 // multiple template, get the values for this instance of this
                 // template, then delete them from the array, so we can get the
                 // next group next time - the next() command for arrays doesn't
                 // seem to work here
                 if (!$source_is_page && $allow_multiple && $wgRequest) {
                     $all_instances_printed = true;
                     if ($old_template_name != $template_name) {
                         $all_values_for_template = $wgRequest->getArray($query_template_name);
                     }
                     if ($all_values_for_template) {
                         $cur_key = key($all_values_for_template);
                         // skip the input coming in from the "starter" div
                         if ($cur_key == 'num') {
                             unset($all_values_for_template[$cur_key]);
                             $cur_key = key($all_values_for_template);
                         }
                         if ($template_instance_query_values = current($all_values_for_template)) {
                             $all_instances_printed = false;
                             unset($all_values_for_template[$cur_key]);
                         }
                     }
                 }
                 //  save the template name
                 $field = array();
                 $field['tmpl_name'] = $tif->template_name;
                 // =====================================================
                 // end template processing
                 // =====================================================
             } elseif ($tag_title == 'end template') {
                 // remove this tag, reset some variables, and close off form HTML tag
                 $section = substr_replace($section, '', $brackets_loc, $brackets_end_loc + 3 - $brackets_loc);
                 $template_name = null;
                 if (isset($template_label)) {
                     $form_text .= "</fieldset>\n";
                     unset($template_label);
                 }
                 $allow_multiple = false;
                 $all_instances_printed = false;
                 $instance_num = 0;
                 // if the hiding placeholder is still around, this fieldset should
                 // be hidden because it is empty and choosers are being used. So,
                 // hide it.
                 $form_text = str_replace("[[placeholder]]", "style='display:none'", $form_text);
                 $__fields["template" . count($__fields)] = $field;
                 // =====================================================
                 // field processing
                 // =====================================================
             } elseif ($tag_title == 'field') {
                 $field_name = trim($tag_components[1]);
                 // cycle through the other components
                 $is_mandatory = false;
                 $is_hidden = false;
                 $is_restricted = false;
                 $is_uploadable = false;
                 $is_list = false;
                 $input_type = null;
                 $field_args = array();
                 $default_value = "";
                 $possible_values = null;
                 $preload_page = null;
                 for ($i = 2; $i < count($tag_components); $i++) {
                     $component = trim($tag_components[$i]);
                     if ($component == 'mandatory') {
                         $is_mandatory = true;
                     } elseif ($component == 'hidden') {
                         $is_hidden = true;
                     } elseif ($component == 'restricted') {
                         $is_restricted = true;
                     } elseif ($component == 'uploadable') {
                         $field_args['is_uploadable'] = true;
                     } elseif ($component == 'list') {
                         $is_list = true;
                     } elseif ($component == 'autocomplete') {
                         $field_args['autocomplete'] = true;
                     } elseif ($component == 'no autocomplete') {
                         $field_args['no autocomplete'] = true;
                     } elseif ($component == 'remote autocompletion') {
                         $field_args['remote autocompletion'] = true;
                     } else {
                         $sub_components = explode('=', $component);
                         if (count($sub_components) == 2) {
                             if ($sub_components[0] == 'input type') {
                                 $input_type = $sub_components[1];
                             } elseif ($sub_components[0] == 'default') {
                                 $default_value = $sub_components[1];
                             } elseif ($sub_components[0] == 'preload') {
                                 // free text field has special handling
                                 if ($field_name == 'free text' || ($field_name = '<freetext>')) {
                                     $free_text_preload_page = $sub_components[1];
                                 } else {
                                     // this variable is not used
                                     $preload_page = $sub_components[1];
                                 }
                             } elseif ($sub_components[0] == 'values') {
                                 $possible_values = explode(',', $sub_components[1]);
                             } elseif ($sub_components[0] == 'values from category') {
                                 $possible_values = SFUtils::getAllPagesForCategory($sub_components[1], 10);
                             } elseif ($sub_components[0] == 'values from concept') {
                                 $possible_values = SFUtils::getAllPagesForConcept($sub_components[1]);
                             } else {
                                 $field_args[$sub_components[0]] = $sub_components[1];
                             }
                             // for backwards compatibility
                             if ($sub_components[0] == 'autocomplete on' && $sub_components[1] == null) {
                                 $field_args['no autocomplete'] = true;
                             }
                         }
                     }
                 }
                 $field_args['part_of_multiple'] = $allow_multiple;
                 // get the value from the request, if it's there, and if it's not
                 // an array
                 $escaped_field_name = str_replace("'", "\\'", $field_name);
                 if (isset($template_instance_query_values) && $template_instance_query_values != null && array_key_exists($escaped_field_name, $template_instance_query_values)) {
                     $field_query_val = $template_instance_query_values[$escaped_field_name];
                     if ($field_query_val && !is_array($field_query_val)) {
                         $cur_value = $field_query_val;
                     }
                 } else {
                     $cur_value = '';
                 }
                 if ($cur_value && !is_array($cur_value)) {
                     # no escaping needed
                     // $cur_value = str_replace('"', '&quot;', $cur_value);
                 }
                 if ($cur_value == null) {
                     // set to default value specified in the form, if it's there
                     $cur_value = $default_value;
                 }
                 // if the user is starting to edit a page, and that page contains
                 // the current template being processed, get the current template
                 // field's value in the existing page
                 if ($source_is_page && !empty($existing_template_text)) {
                     if (isset($template_contents[$field_name])) {
                         $cur_value = $template_contents[$field_name];
                     } else {
                         $cur_value = '';
                     }
                     if ($cur_value) {
                         # no escaping needed
                         // $cur_value = str_replace('"', '&quot;', $cur_value);
                     }
                 }
                 // handle the free text field - if it was declared as
                 // "field|free text" (a deprecated usage), it has to be outside
                 // of a template
                 if ($template_name == '' && $field_name == 'free text' || $field_name == '<freetext>') {
                     // add placeholders for the free text in both the form and
                     // the page, using <free_text> tags - once all the free text
                     // is known (at the end), it will get substituted in
                     if ($is_hidden) {
                         $new_text = SFFormUtils::hiddenFieldHTML('free_text', '<free_text>');
                     } else {
                         if (!array_key_exists('rows', $field_args)) {
                             $field_args['rows'] = 5;
                         }
                         if (!array_key_exists('cols', $field_args)) {
                             $field_args['cols'] = 80;
                         }
                         $sfgTabIndex++;
                         $sfgFieldNum++;
                         list($new_text, $new_javascript_text) = SFFormInputs::textAreaHTML('<free_text>', 'free_text', false, $form_is_disabled || $is_restricted, $field_args);
                         $fields_javascript_text .= $new_javascript_text;
                     }
                     $free_text_was_included = true;
                     // add a similar placeholder to the data text
                     $data_text .= "<free_text>\n";
                 }
                 if ($template_name == '') {
                     $section = substr_replace($section, $new_text, $brackets_loc, $brackets_end_loc + 3 - $brackets_loc);
                 } else {
                     if (is_array($cur_value)) {
                         // first, check if it's a list
                         if (array_key_exists('is_list', $cur_value) && $cur_value['is_list'] == true) {
                             $cur_value_in_template = "";
                             if (array_key_exists('delimiter', $field_args)) {
                                 $delimiter = $field_args['delimiter'];
                             } else {
                                 $delimiter = ",";
                             }
                             foreach ($cur_value as $key => $val) {
                                 if ($key !== "is_list") {
                                     if ($cur_value_in_template != "") {
                                         $cur_value_in_template .= $delimiter . " ";
                                     }
                                     $cur_value_in_template .= $val;
                                 }
                             }
                         } else {
                             // otherwise:
                             // if it has 1 or 2 elements, assume it's a checkbox; if it has
                             // 3 elements, assume it's a date
                             // - this handling will have to get more complex if other
                             // possibilities get added
                             if (count($cur_value) == 1) {
                                 // manually load SMW's message values here, in case they
                                 // didn't get loaded before
                                 wfLoadExtensionMessages('SemanticMediaWiki');
                                 $words_for_false = explode(',', wfMsgForContent('smw_false_words'));
                                 // for each language, there's a series of words that are
                                 // equal to false - get the word in the series that matches
                                 // "no"; generally, that's the third word
                                 $index_of_no = 2;
                                 if (count($words_for_false) > $index_of_no) {
                                     $no = ucwords($words_for_false[$index_of_no]);
                                 } elseif (count($words_for_false) == 0) {
                                     $no = "0";
                                     // some safe value if no words are found
                                 } else {
                                     $no = ucwords($words_for_false[0]);
                                 }
                                 $cur_value_in_template = $no;
                             } elseif (count($cur_value) == 2) {
                                 wfLoadExtensionMessages('SemanticMediaWiki');
                                 $words_for_true = explode(',', wfMsgForContent('smw_true_words'));
                                 // get the value in the 'true' series that tends to be "yes",
                                 // and go with that one - generally, that's the third word
                                 $index_of_yes = 2;
                                 if (count($words_for_true) > $index_of_yes) {
                                     $yes = ucwords($words_for_true[$index_of_yes]);
                                 } elseif (count($words_for_true) == 0) {
                                     $yes = "1";
                                     // some safe value if no words are found
                                 } else {
                                     $yes = ucwords($words_for_true[0]);
                                 }
                                 $cur_value_in_template = $yes;
                                 // if it's 3 or greater, assume it's a date or datetime
                             } elseif (count($cur_value) >= 3) {
                                 $month = $cur_value['month'];
                                 $day = $cur_value['day'];
                                 if ($day != '') {
                                     global $wgAmericanDates;
                                     if ($wgAmericanDates == false) {
                                         // pad out day to always be two digits
                                         $day = str_pad($day, 2, "0", STR_PAD_LEFT);
                                     }
                                 }
                                 $year = $cur_value['year'];
                                 if (isset($cur_value['hour'])) {
                                     $hour = $cur_value['hour'];
                                 }
                                 if (isset($cur_value['minute'])) {
                                     $minute = $cur_value['minute'];
                                 }
                                 if (isset($cur_value['second'])) {
                                     $second = $cur_value['second'];
                                 }
                                 if (isset($cur_value['ampm24h'])) {
                                     $ampm24h = $cur_value['ampm24h'];
                                 }
                                 if (isset($cur_value['timezone'])) {
                                     $timezone = $cur_value['timezone'];
                                 }
                                 if ($month != '' && $day != '' && $year != '') {
                                     // special handling for American dates - otherwise, just
                                     // the standard year/month/day (where month is a number)
                                     global $wgAmericanDates;
                                     if ($wgAmericanDates == true) {
                                         $cur_value_in_template = "{$month} {$day}, {$year}";
                                     } else {
                                         $cur_value_in_template = "{$year}/{$month}/{$day}";
                                     }
                                     // include whatever time information we have
                                     if (isset($hour)) {
                                         $cur_value_in_template .= " " . str_pad(intval(substr($hour, 0, 2)), 2, '0', STR_PAD_LEFT) . ":" . str_pad(intval(substr($minute, 0, 2)), 2, '0', STR_PAD_LEFT);
                                     }
                                     if (isset($second)) {
                                         $cur_value_in_template .= ":" . str_pad(intval(substr($second, 0, 2)), 2, '0', STR_PAD_LEFT);
                                     }
                                     if (isset($ampm24h)) {
                                         $cur_value_in_template .= " {$ampm24h}";
                                     }
                                     if (isset($timezone)) {
                                         $cur_value_in_template .= " {$timezone}";
                                     }
                                 } else {
                                     $cur_value_in_template = "";
                                 }
                             }
                         }
                     } else {
                         // value is not an array
                         $cur_value_in_template = $cur_value;
                     }
                     if ($query_template_name == null || $query_template_name == '') {
                         $input_name = $field_name;
                     } elseif ($allow_multiple) {
                         // 'num' will get replaced by an actual index, either in PHP
                         // or in Javascript, later on
                         $input_name = $query_template_name . '[num][' . $field_name . ']';
                     } else {
                         $input_name = $query_template_name . '[' . $field_name . ']';
                     }
                     // disable this field if either the whole form is disabled, or
                     // it's a restricted field and user doesn't have sysop privileges
                     $is_disabled = $form_is_disabled || $is_restricted && (!$wgUser || !$wgUser->isAllowed('editrestrictedfields'));
                     // create an SFFormTemplateField instance based on all the
                     // parameters in the form definition, and any information from
                     // the template definition (contained in the $all_fields parameter)
                     # creation of a form field from the definition page
                     $possible_values['_element'] = "value";
                     $form_field = $this->createFromDefinitionForSerialization($field_name, $input_name, $is_mandatory, $is_hidden, $is_uploadable, $possible_values, $is_disabled, $is_list, $input_type, $field_args, $all_fields, $strict_parsing);
                     // if this is not part of a 'multiple' template, incrememt the
                     // global tab index (used for correct tabbing)
                     if (!$field_args['part_of_multiple']) {
                         $sfgTabIndex++;
                     }
                     // increment the global field number regardless
                     $sfgFieldNum++;
                     // if the field is a date field, and its default value was set
                     // to 'now', and it has no current value, set $cur_value to be
                     // the current date
                     if ($default_value == 'now' && ($cur_value == '' || $cur_value == 'now')) {
                         if ($input_type == 'date' || $input_type == 'datetime' || $input_type == 'datetime with timezone' || $input_type == '' && $form_field->template_field->field_type == 'Date') {
                             $cur_time = time();
                             $year = date("Y", $cur_time);
                             $month = date("n", $cur_time);
                             $day = date("j", $cur_time);
                             global $wgAmericanDates, $sfg24HourTime;
                             if ($wgAmericanDates == true) {
                                 $month_names = SFFormUtils::getMonthNames();
                                 $month_name = $month_names[$month - 1];
                                 $cur_value_in_template = "{$month_name} {$day}, {$year}";
                             } else {
                                 $cur_value_in_template = "{$year}/{$month}/{$day}";
                             }
                             if ($input_type == 'datetime' || $input_type == 'datetime with timezone') {
                                 if ($sfg24HourTime) {
                                     $hour = str_pad(intval(substr(date("G", $cur_time), 0, 2)), 2, '0', STR_PAD_LEFT);
                                 } else {
                                     $hour = str_pad(intval(substr(date("g", $cur_time), 0, 2)), 2, '0', STR_PAD_LEFT);
                                 }
                                 $minute = str_pad(intval(substr(date("i", $cur_time), 0, 2)), 2, '0', STR_PAD_LEFT);
                                 $second = str_pad(intval(substr(date("s", $cur_time), 0, 2)), 2, '0', STR_PAD_LEFT);
                                 if ($sfg24HourTime) {
                                     $cur_value_in_template .= " {$hour}:{$minute}:{$second}";
                                 } else {
                                     $ampm = date("A", $cur_time);
                                     $cur_value_in_template .= " {$hour}:{$minute}:{$second} {$ampm}";
                                 }
                             }
                             if ($input_type == 'datetime with timezone') {
                                 $timezone = date("T", $cur_time);
                                 $cur_value_in_template .= " {$timezone}";
                             }
                         }
                     }
                     // if the field is a text field, and its default value was set
                     // to 'current user', and it has no current value, set $cur_value
                     // to be the current user
                     if ($default_value == 'current user' && ($cur_value == '' || $cur_value == 'current user')) {
                         if ($input_type == 'text' || $input_type == '') {
                             $cur_value_in_template = $wgUser->getName();
                             $cur_value = $cur_value_in_template;
                         }
                     }
                     # field + field value
                     $form_field->cur_value = $cur_value;
                     # possible_values hack
                     $__tmpValues = $form_field->template_field->possible_values;
                     $form_field->template_field->possible_values = array();
                     if ($__tmpValues != NULL) {
                         foreach ($__tmpValues as $key => $value) {
                             $form_field->template_field->possible_values["value" . $key] = $value;
                         }
                     }
                     $field["field" . count($field)] = $this->toArrayForSerialize($form_field);
                     $new_text = "dummy";
                     // set only in order to break
                     if ($new_text) {
                         $section = substr_replace($section, $new_text, $brackets_loc, $brackets_end_loc + 3 - $brackets_loc);
                     } else {
                         $start_position = $brackets_end_loc;
                     }
                 }
             } else {
                 // tag is not one of the three allowed values
                 // ignore tag
                 $start_position = $brackets_end_loc;
             }
             // end if
         }
         // end while
     }
     // end for
     // get free text, and add to page data, as well as retroactively
     // inserting it into the form
     // If $form_is_partial is true then either:
     // (a) we're processing a replacement (param 'partial' == 1)
     // (b) we're sending out something to be replaced (param 'partial' is missing)
     if ($form_is_partial) {
         if (!$wgRequest->getCheck('partial')) {
             $free_text = $original_page_content;
             $form_text .= SFFormUtils::hiddenFieldHTML('partial', 1);
         } else {
             $free_text = null;
             $existing_page_content = preg_replace('/²\\{(.*?)\\}²/s', '{{\\1}}', $existing_page_content);
             $existing_page_content = preg_replace('/\\{\\{\\{insertionpoint\\}\\}\\}/', '', $existing_page_content);
             $existing_page_content = Sanitizer::safeEncodeAttribute($existing_page_content);
         }
     } elseif ($source_is_page) {
         // if the page is the source, free_text will just be whatever in the
         // page hasn't already been inserted into the form
         $free_text = trim($existing_page_content);
         // or get it from a form submission
     } elseif ($wgRequest->getCheck('free_text')) {
         $free_text = $wgRequest->getVal('free_text');
         if (!$free_text_was_included) {
             $data_text .= "<free_text>";
         }
         // or get it from the form definition
     } elseif ($free_text_preload_page != null) {
         $free_text = SFFormUtils::getPreloadedText($free_text_preload_page);
     } else {
         $free_text = null;
     }
     # the free text is set here
     // if the FCKeditor extension is installed, use that for the free text input
     global $wgFCKEditorDir;
     if ($wgFCKEditorDir) {
         $showFCKEditor = SFFormUtils::getShowFCKEditor();
         $free_text = htmlspecialchars($free_text);
         if ($showFCKEditor & RTE_VISIBLE) {
             $free_text = SFFormUtils::prepareTextForFCK($free_text);
         }
     } else {
         $showFCKEditor = 0;
         $free_text = Sanitizer::safeEncodeAttribute($free_text);
     }
     // now that we have it, substitute free text into the form and page
     $form_text = str_replace('<free_text>', $free_text, $form_text);
     $data_text = str_replace('<free_text>', $free_text, $data_text);
     # return the fields
     return $__fields;
 }