/**
  * Gets the properties pointing from the current page to this one.
  */
 static function getPagePropertiesOfPage($title)
 {
     if (self::$mLinkedPagesRetrieved) {
         return;
     }
     $store = SFUtils::getSMWStore();
     if (class_exists('SMWDataItem')) {
         $value = SMWDIWikiPage::newFromTitle($title);
     } else {
         $value = $title;
     }
     $data = $store->getSemanticData($value);
     foreach ($data->getProperties() as $property) {
         $propertyValues = $data->getPropertyValues($property);
         foreach ($propertyValues as $propertyValue) {
             $propertyName = null;
             $linkedPageName = null;
             if ($propertyValue instanceof SMWDIWikiPage) {
                 $propertyName = $property->getKey();
                 $linkedPageName = $propertyValue->getDBkey();
             } elseif ($propertyValue instanceof SMWWikiPageValue) {
                 $propertyName = $property->getWikiValue();
                 $linkedPageName = $propertyValue->getWikiValue();
             }
             // Needed for SMW 1.7 (?)
             $linkedPageName = str_replace('_', ' ', $linkedPageName);
             if (!is_null($linkedPageName)) {
                 if (array_key_exists($linkedPageName, self::$mLinkedPages)) {
                     self::$mLinkedPages[$linkedPageName][] = $propertyName;
                 } else {
                     self::$mLinkedPages[$linkedPageName] = array($propertyName);
                 }
             }
         }
     }
     self::$mLinkedPagesRetrieved = true;
 }
Example #2
0
 /**
  *	This method will try to store the data in mOptions.
  *
  * It will return true on success or an error message on failure.
  * The used form and target page will be available in mOptions after
  * execution of the method.
  *
  * This method also sets HTTP response headers according to the result.
  *
  * @param bool $prefillFromExisting If this is set, existing values in the page will be used to prefill the form.
  * @return true or an error message
  */
 public function storeSemanticData($prefillFromExisting = true)
 {
     global $wgOut, $wgRequest;
     // If the wiki is read-only we might as well stop right away
     if (wfReadOnly()) {
         return $this->reportError(wfMsg('sf_autoedit_readonly', wfReadOnlyReason()));
     }
     // ensure 'form' key exists
     if (!array_key_exists('form', $this->mOptions)) {
         $this->mOptions['form'] = null;
     }
     // ensure 'target' key exists
     if (!array_key_exists('target', $this->mOptions)) {
         $this->mOptions['target'] = null;
     }
     // If we have no target article and no form we might as well stop right away
     if (!$this->mOptions['target'] && !$this->mOptions['form']) {
         return $this->reportError(wfMsg('sf_autoedit_notargetspecified'));
     }
     // check if form was specified
     if (!$this->mOptions['form']) {
         // If no form was specified, find the default one for
         // this page.
         $title = Title::newFromText($this->mOptions['target']);
         $form_names = SFFormLinker::getDefaultFormsForPage($title);
         // if no form can be found, return
         if (count($form_names) == 0) {
             return $this->reportError(wfMsg('sf_autoedit_noformfound'));
         }
         // if more than one form found, return
         if (count($form_names) > 1) {
             return $this->reportError(wfMsg('sf_autoedit_toomanyformsfound'));
         }
         // There should now be exactly one form.
         $this->mOptions['form'] = $form_names[0];
     }
     // we only care for the form's body
     $wgOut->setArticleBodyOnly(true);
     $formedit = new SFFormEdit();
     $data = array();
     $oldRequest = $wgRequest;
     // Get the form definition and target page (if there is one),
     // as specified in the options string, then create the actual
     // HTML form from them, and call that form to modify or create
     // the page.
     if ($prefillFromExisting) {
         $wgRequest = new FauxRequest($this->mOptions, true);
         // get the Semantic Form
         if ($this->mOptions['target']) {
             $formedit->execute($this->mOptions['form'] . '/' . $this->mOptions['target']);
         } else {
             $formedit->execute($this->mOptions['form']);
         }
         // extract its data
         $form = $this->parseDataFromHTMLFrag($data, trim($wgOut->getHTML()), 'sfForm');
         if (!$form) {
             // something went wrong
             $wgRequest = $oldRequest;
             return $this->reportError(wfMsg('sf_autoedit_nosemanticform', array($this->mOptions['target'], $this->mOptions['form'])));
         }
     } else {
         self::addToArray($data, "wpSave", "Save");
     }
     // and modify as specified
     $data = SFUtils::array_merge_recursive_distinct($data, $this->mOptions);
     ////////////////////////////////////////////////////////////////////////
     // Store the modified form
     // $wgOut->clearHTML();
     $wgRequest = new FauxRequest($data, true);
     // get the MW form
     if ($this->mOptions['target']) {
         $formedit->execute($this->mOptions['form'] . '/' . $this->mOptions['target'], false);
     } else {
         $formedit->execute($this->mOptions['form'], false);
     }
     $this->mOptions['form'] = $formedit->mForm;
     $this->mOptions['target'] = $formedit->mTarget;
     $wgRequest = $oldRequest;
     if ($formedit->mError) {
         return $this->reportError($formedit->mError);
     } else {
         if (!headers_sent()) {
             header("X-Location: " . $wgOut->getRedirect());
             header("X-Form: " . $formedit->mForm);
             header("X-Target: " . $formedit->mTarget);
         }
         if ($this->isApiQuery()) {
             $this->getResult()->addValue(null, 'result', array('code' => '200', 'location' => $wgOut->getRedirect(), 'form' => $formedit->mForm, 'target' => $formedit->mTarget));
         }
     }
     return true;
 }
 static function createFormLink(&$parser, $params, $parserFunctionName)
 {
     // Set defaults.
     $inFormName = $inLinkStr = $inExistingPageLinkStr = $inLinkType = $inTooltip = $inQueryStr = $inTargetName = '';
     if ($parserFunctionName == 'queryformlink') {
         $inLinkStr = wfMessage('runquery')->text();
     }
     $inCreatePage = false;
     $classStr = '';
     $inQueryArr = array();
     $targetWindow = '_self';
     // assign params
     // - support unlabelled params, for backwards compatibility
     // - parse and sanitize all parameter values
     foreach ($params as $i => $param) {
         $elements = explode('=', $param, 2);
         // set param_name and value
         if (count($elements) > 1) {
             $param_name = trim($elements[0]);
             // parse (and sanitize) parameter values
             $value = trim($parser->recursiveTagParse($elements[1]));
         } else {
             $param_name = null;
             // parse (and sanitize) parameter values
             $value = trim($parser->recursiveTagParse($param));
         }
         if ($param_name == 'form') {
             $inFormName = $value;
         } elseif ($param_name == 'link text') {
             $inLinkStr = $value;
         } elseif ($param_name == 'existing page link text') {
             $inExistingPageLinkStr = $value;
         } elseif ($param_name == 'link type') {
             $inLinkType = $value;
         } elseif ($param_name == 'query string') {
             // Change HTML-encoded ampersands directly to
             // URL-encoded ampersands, so that the string
             // doesn't get split up on the '&'.
             $inQueryStr = str_replace('&', '%26', $value);
             parse_str($inQueryStr, $arr);
             $inQueryArr = self::array_merge_recursive_distinct($inQueryArr, $arr);
         } elseif ($param_name == 'tooltip') {
             $inTooltip = Sanitizer::decodeCharReferences($value);
         } elseif ($param_name == 'target') {
             $inTargetName = $value;
         } elseif ($param_name == null && $value == 'popup') {
             self::loadScriptsForPopupForm($parser);
             $classStr = 'popupformlink';
         } elseif ($param_name == null && $value == 'new window') {
             $targetWindow = '_blank';
         } elseif ($param_name == null && $value == 'create page') {
             $inCreatePage = true;
         } elseif ($param_name !== null) {
             $value = urlencode($value);
             parse_str("{$param_name}={$value}", $arr);
             $inQueryArr = self::array_merge_recursive_distinct($inQueryArr, $arr);
         }
     }
     // Not the most graceful way to do this, but it is the
     // easiest - if this is the #formredlink function, just
     // ignore whatever values were passed in for these params.
     if ($parserFunctionName == 'formredlink') {
         $inLinkType = $inTooltip = null;
     }
     // If "red link only" was specified, and a target page was
     // specified, and it exists, just link to the page.
     if ($inTargetName != '') {
         $targetTitle = Title::newFromText($inTargetName);
         $targetPageExists = $targetTitle != '' && $targetTitle->exists();
     } else {
         $targetPageExists = false;
     }
     if ($parserFunctionName == 'formredlink' && $targetPageExists) {
         if ($inExistingPageLinkStr == '') {
             return Linker::link($targetTitle);
         } else {
             return Linker::link($targetTitle, $inExistingPageLinkStr);
         }
     }
     // The page doesn't exist, so if 'create page' was
     // specified, create the page now.
     if ($parserFunctionName == 'formredlink' && $inCreatePage && $inTargetName != '') {
         $targetTitle = Title::newFromText($inTargetName);
         SFFormLinker::createPageWithForm($targetTitle, $inFormName);
     }
     if ($parserFunctionName == 'queryformlink') {
         $formSpecialPage = SpecialPageFactory::getPage('RunQuery');
     } else {
         $formSpecialPage = SpecialPageFactory::getPage('FormEdit');
     }
     if ($inFormName == '') {
         $query = array('target' => $inTargetName);
         $link_url = $formSpecialPage->getTitle()->getLocalURL($query);
     } elseif (strpos($inFormName, '/') == true) {
         $query = array('form' => $inFormName, 'target' => $inTargetName);
         $link_url = $formSpecialPage->getTitle()->getLocalURL($query);
     } else {
         $link_url = $formSpecialPage->getTitle()->getLocalURL() . "/{$inFormName}";
         if (!empty($inTargetName)) {
             $link_url .= "/{$inTargetName}";
         }
         $link_url = str_replace(' ', '_', $link_url);
     }
     $hidden_inputs = "";
     if (!empty($inQueryArr)) {
         // Special handling for the buttons - query string
         // has to be turned into hidden inputs.
         if ($inLinkType == 'button' || $inLinkType == 'post button') {
             $query_components = explode('&', http_build_query($inQueryArr, '', '&'));
             foreach ($query_components as $query_component) {
                 $var_and_val = explode('=', $query_component, 2);
                 if (count($var_and_val) == 2) {
                     $hidden_inputs .= Html::hidden(urldecode($var_and_val[0]), urldecode($var_and_val[1]));
                 }
             }
         } else {
             $link_url .= strstr($link_url, '?') ? '&' : '?';
             $link_url .= str_replace('+', '%20', http_build_query($inQueryArr, '', '&'));
         }
     }
     if ($inLinkType == 'button' || $inLinkType == 'post button') {
         $formMethod = $inLinkType == 'button' ? 'get' : 'post';
         $str = Html::rawElement('form', array('action' => $link_url, 'method' => $formMethod, 'class' => $classStr, 'target' => $targetWindow), '<button ' . Html::expandAttributes(array('type' => 'submit', 'value' => $inLinkStr)) . '>' . $inLinkStr . '</button>' . $hidden_inputs);
     } else {
         // If a target page has been specified but it doesn't
         // exist, make it a red link.
         if (!empty($inTargetName)) {
             if (!$targetPageExists) {
                 $classStr .= " new";
             }
             // If no link string was specified, make it
             // the name of the page.
             if ($inLinkStr == '') {
                 $inLinkStr = $inTargetName;
             }
         }
         $str = Html::rawElement('a', array('href' => $link_url, 'class' => $classStr, 'title' => $inTooltip, 'target' => $targetWindow), $inLinkStr);
     }
     return $str;
 }
 /**
  * The function called if we're in index.php (as opposed to one of the
  * special pages)
  */
 static function displayForm($action, $article)
 {
     // @todo: This looks like bad code. If we can't find a form, we
     // should be showing an informative error page rather than
     // making it look like an edit form page does not exist.
     $title = $article->getTitle();
     $form_names = SFFormLinker::getDefaultFormsForPage($title);
     if (count($form_names) == 0) {
         return true;
     }
     $output = $action->getOutput();
     if (count($form_names) > 1) {
         $warning_text = "\t" . '<div class="warningbox">' . wfMessage('sf_formedit_morethanoneform')->text() . "</div>\n";
         $output->addWikiText($warning_text);
     }
     $form_name = $form_names[0];
     $page_name = SFUtils::titleString($title);
     SFFormEdit::printForm($form_name, $page_name);
     return false;
 }
Example #5
0
 /**
  * The function called if we're in index.php (as opposed to one of the
  * special pages)
  */
 static function displayForm($action, $article)
 {
     global $wgOut, $sfgUseFormEditPage;
     // return "true" if the call failed (meaning, pass on handling
     // of the hook to others), and "false" otherwise
     if ($action != 'formedit') {
         return true;
     }
     // @todo: This looks like bad code. If we can't find a form, we
     // should be showing an informative error page rather than
     // making it look like an edit form page does not exist.
     $title = $article->getTitle();
     $form_names = SFFormLinker::getDefaultFormsForPage($title);
     if (count($form_names) == 0) {
         return true;
     }
     if (count($form_names) > 1) {
         $warning_text = "\t" . '<div class="warningMessage">' . wfMsg('sf_formedit_morethanoneform') . "</div>\n";
         $wgOut->addHTML($warning_text);
     }
     $form_name = $form_names[0];
     if ($sfgUseFormEditPage) {
         # Experimental new feature extending from the internal
         # EditPage class
         $editor = new SFFormEditPage($article, $form_name);
         $editor->edit();
         return false;
     }
     $page_name = SFUtils::titleString($title);
     $msg = SFFormEdit::printForm($form_name, $page_name);
     if ($msg) {
         // Some error occurred - display it.
         $msgdata = null;
         if (is_array($msg)) {
             if (count($msg) > 1) {
                 $msgdata = $msg[1];
             }
             $msg = $msg[0];
         }
         $wgOut->addHTML(Html::element('p', array('class' => 'error'), wfMsg($msg, $msgdata)));
     }
     return false;
 }
 /**
  * The function called if we're in index.php (as opposed to one of the
  * special pages)
  */
 static function displayForm($action, $article)
 {
     $output = $action->getOutput();
     $title = $article->getTitle();
     $form_names = SFFormLinker::getDefaultFormsForPage($title);
     if (count($form_names) == 0) {
         // If no form is set, display an interface to let the
         // user choose out of all the forms defined on this wiki
         // (or none at all).
         self::displayFormChooser($output, $title);
         return true;
     }
     if (count($form_names) > 1) {
         $warning_text = "\t" . '<div class="warningbox">' . wfMessage('sf_formedit_morethanoneform')->text() . "</div>\n";
         $output->addWikiText($warning_text);
     }
     $form_name = $form_names[0];
     $page_name = SFUtils::titleString($title);
     $sfFormEdit = new SFFormEdit();
     $sfFormEdit->printForm($form_name, $page_name);
     return false;
 }
Example #7
0
    function doRedirect($form_name, $page_name, $params)
    {
        global $wgOut;
        $page_title = Title::newFromText($page_name);
        if ($page_title->exists()) {
            // It exists - see if page is a redirect; if
            // it is, edit the target page instead.
            $article = new Article($page_title, 0);
            $article->loadContent();
            $redirect_title = Title::newFromRedirect($article->fetchContent());
            if ($redirect_title != null) {
                $page_title = $redirect_title;
                $page_name = SFUtils::titleURLString($redirect_title);
            }
            // HACK - if this is the default form for
            // this page, send to the regular 'formedit'
            // tab page; otherwise, send to the 'Special:FormEdit'
            // page, with the form name hardcoded.
            // Is this logic necessary? Or should we just
            // out-guess the user and always send to the
            // standard form-edit page, with the 'correct' form?
            $default_forms = SFFormLinker::getDefaultFormsForPage($page_title);
            if (count($default_forms) > 0) {
                $default_form_name = $default_forms[0];
            } else {
                $default_form_name = null;
            }
            if ($form_name == $default_form_name) {
                $redirect_url = $page_title->getLocalURL('action=formedit');
            } else {
                $redirect_url = self::getFormEditURL($form_name, $page_name);
            }
        } else {
            $redirect_url = self::getFormEditURL($form_name, $page_name);
            // Of all the request values, send on to 'FormEdit'
            // only 'preload' and specific form fields - we can
            // identify the latter because they show up as arrays.
            foreach ($_REQUEST as $key => $val) {
                if (is_array($val)) {
                    $template_name = urlencode($key);
                    foreach ($val as $field_name => $value) {
                        $field_name = urlencode($field_name);
                        $value = urlencode($value);
                        $redirect_url .= strpos($redirect_url, '?') > -1 ? '&' : '?';
                        $redirect_url .= $template_name . '[' . $field_name . ']=' . $value;
                    }
                } elseif ($key == 'preload') {
                    $redirect_url .= strpos($redirect_url, '?') > -1 ? '&' : '?';
                    $redirect_url .= "{$key}={$val}";
                }
            }
        }
        if (!is_null($params) && $params !== '') {
            $redirect_url .= strpos($redirect_url, '?') > -1 ? '&' : '?';
            $redirect_url .= $params;
        }
        $wgOut->setArticleBodyOnly(true);
        // Show "loading" animated image while people wait for the
        // redirect.
        global $sfgScriptPath;
        $text = "<p style=\"position: absolute; left: 45%; top: 45%;\"><img src=\"{$sfgScriptPath}/skins/loading.gif\" /></p>\n";
        $text .= <<<END
\t\t<script type="text/javascript">
\t\twindow.onload = function() {
\t\t\twindow.location="{$redirect_url}";
\t\t}
\t\t</script>

END;
        $wgOut->addHTML($text);
        return;
    }
 /**
  * Get the Title object of a form suitable for editing the target page.
  *
  * @return Title
  * @throws MWException
  */
 protected function getFormTitle()
 {
     // if no form was explicitly specified, try for explicitly set alternate forms
     if ($this->mOptions['form'] === '') {
         $this->logMessage('No form specified. Will try to find the default form for the target page.', self::DEBUG);
         $formNames = array();
         // try explicitly set alternative forms
         if (array_key_exists('alt_form', $this->mOptions)) {
             $formNames = (array) $this->mOptions['alt_form'];
             // cast to array to make sure we get an array, even if only a string was sent
         }
         // if no alternate forms were explicitly set, try finding a default form for the target page
         if (count($formNames) === 0) {
             // if no form and and no alt forms and no target page was specified, give up
             if ($this->mOptions['target'] === '') {
                 throw new MWException(wfMessage('sf_autoedit_notargetspecified')->parse());
             }
             $targetTitle = Title::newFromText($this->mOptions['target']);
             // if the specified target title is invalid, give up
             if (!$targetTitle instanceof Title) {
                 throw new MWException(wfMessage('sf_autoedit_invalidtargetspecified', $this->mOptions['target'])->parse());
             }
             $formNames = SFFormLinker::getDefaultFormsForPage($targetTitle);
             // if no default form can be found, try alternate forms
             if (count($formNames) === 0) {
                 $formNames = SFFormLinker::getFormsThatPagePointsTo($targetTitle->getText(), $targetTitle->getNamespace(), SFFormLinker::ALTERNATE_FORM);
                 // if still no form can be found, give up
                 if (count($formNames) === 0) {
                     throw new MWException(wfMessage('sf_autoedit_noformfound')->parse());
                 }
             }
         }
         // if more than one form was found, issue a notice and give up
         // this happens if no default form but several alternate forms are defined
         if (count($formNames) > 1) {
             throw new MWException(wfMessage('sf_autoedit_toomanyformsfound')->parse(), self::DEBUG);
         }
         $this->mOptions['form'] = $formNames[0];
         $this->logMessage('Using ' . $this->mOptions['form'] . ' as default form.', self::DEBUG);
     }
     $formTitle = Title::makeTitleSafe(SF_NS_FORM, $this->mOptions['form']);
     // if the given form is not a valid title, give up
     if (!$formTitle instanceof Title) {
         throw new MWException(wfMessage('sf_autoedit_invalidform', $this->mOptions['form'])->parse());
     }
     // if the form page is a redirect, follow the redirect
     if ($formTitle->isRedirect()) {
         $this->logMessage('Form ' . $this->mOptions['form'] . ' is a redirect. Finding target.', self::DEBUG);
         $formWikiPage = WikiPage::factory($formTitle);
         if (method_exists($formWikiPage, 'getContent')) {
             // MW 1.21+
             $formTitle = $formWikiPage->getContent(Revision::RAW)->getUltimateRedirectTarget();
         } else {
             $formTitle = Title::newFromRedirectRecurse($formWikiPage->getRawText());
         }
         // if we exeeded $wgMaxRedirects or encountered an invalid redirect target, give up
         if ($formTitle->isRedirect()) {
             $newTitle = WikiPage::factory($formTitle)->getRedirectTarget();
             if ($newTitle instanceof Title && $newTitle->isValidRedirectTarget()) {
                 throw new MWException(wfMessage('sf_autoedit_redirectlimitexeeded', $this->mOptions['form'])->parse());
             } else {
                 throw new MWException(wfMessage('sf_autoedit_invalidredirecttarget', $newTitle->getFullText(), $this->mOptions['form'])->parse());
             }
         }
     }
     // if specified or found form does not exist (e.g. is a red link), give up
     // FIXME: Throw specialized error message, so a list of alternative forms can be shown
     if (!$formTitle->exists()) {
         throw new MWException(wfMessage('sf_autoedit_invalidform', $this->mOptions['form'])->parse());
     }
     return $formTitle;
 }
    function doRedirect($form_name, $page_name, $params)
    {
        global $wgOut;
        $page_title = Title::newFromText($page_name);
        if ($page_title->exists()) {
            // It exists - see if page is a redirect; if
            // it is, edit the target page instead.
            $article = new Article($page_title, 0);
            $article->loadContent();
            $redirect_title = Title::newFromRedirect($article->fetchContent());
            if ($redirect_title != null) {
                $page_title = $redirect_title;
                $page_name = SFUtils::titleURLString($redirect_title);
            }
            // HACK - if this is the default form for
            // this page, send to the regular 'formedit'
            // tab page; otherwise, send to the 'Special:FormEdit'
            // page, with the form name hardcoded.
            // Is this logic necessary? Or should we just
            // out-guess the user and always send to the
            // standard form-edit page, with the 'correct' form?
            $default_forms = SFFormLinker::getDefaultFormsForPage($page_title);
            if (count($default_forms) > 0) {
                $default_form_name = $default_forms[0];
            } else {
                $default_form_name = null;
            }
            if ($form_name == $default_form_name) {
                $redirect_url = $page_title->getLocalURL('action=formedit');
            } else {
                $redirect_url = self::getFormEditURL($form_name, $page_name);
            }
        } else {
            $redirect_url = self::getFormEditURL($form_name, $page_name);
            // Of all the request values, send on to 'FormEdit'
            // only 'preload' and specific form fields - we can
            // identify the latter because they show up as arrays.
            foreach ($_REQUEST as $key => $val) {
                if (is_array($val)) {
                    $redirect_url .= strpos($redirect_url, '?') > -1 ? '&' : '?';
                    // Re-add the key (i.e. the template
                    // name), so we can make a nice query
                    // string snippet out of the whole
                    // thing.
                    $wrapperArray = array($key => $val);
                    $redirect_url .= urldecode(http_build_query($wrapperArray));
                } elseif ($key == 'preload') {
                    $redirect_url .= strpos($redirect_url, '?') > -1 ? '&' : '?';
                    $redirect_url .= "{$key}={$val}";
                }
            }
        }
        if (!is_null($params) && $params !== '') {
            $redirect_url .= strpos($redirect_url, '?') > -1 ? '&' : '?';
            $redirect_url .= $params;
        }
        $wgOut->setArticleBodyOnly(true);
        // Show "loading" animated image while people wait for the
        // redirect.
        global $sfgScriptPath;
        $text = <<<END
\t<p style="position: absolute; left: 45%; top: 45%;">
\t<img src="{$sfgScriptPath}/skins/loading.gif" />
\t</p>
 \t<meta http-equiv="refresh" content="0; url={$redirect_url}" />

END;
        $wgOut->addHTML($text);
        return;
    }
Example #10
0
 /**
  * The function called if we're in index.php (as opposed to one of the
  * special pages)
  */
 static function displayForm($action, $article)
 {
     // TODO: This function will be called as a hook handler and $action will
     //  be a string before MW 1.18. From 1.18 onwards this function will
     //  only be called for formedit actions, i.e. the if statement can be
     //  removed then.
     // return "true" if the call failed (meaning, pass on handling
     // of the hook to others), and "false" otherwise
     if (is_string($action) && $action !== 'formedit') {
         return true;
     }
     // @todo: This looks like bad code. If we can't find a form, we
     // should be showing an informative error page rather than
     // making it look like an edit form page does not exist.
     $title = $article->getTitle();
     $form_names = SFFormLinker::getDefaultFormsForPage($title);
     if (count($form_names) == 0) {
         return true;
     }
     // For backward-compatibility
     if (is_string($action)) {
         global $wgOut;
         $output = $wgOut;
     } else {
         $output = $action->getOutput();
     }
     if (count($form_names) > 1) {
         $warning_text = "\t" . '<div class="warningbox">' . wfMessage('sf_formedit_morethanoneform')->text() . "</div>\n";
         $output->addWikiText($warning_text);
     }
     $form_name = $form_names[0];
     $page_name = SFUtils::titleString($title);
     SFFormEdit::printForm($form_name, $page_name);
     return false;
 }
Example #11
0
 /**
  * The function called if we're in index.php (as opposed to one of the
  * special pages)
  */
 static function displayForm($action, $article)
 {
     global $sfgUseFormEditPage;
     // TODO: This function will be called as a hook handler and $action will
     //  be a string before MW 1.18. From 1.18 onwards this function will#
     //  only be called for formedit actions, i.e. the if statement can be
     //  removed then.
     // return "true" if the call failed (meaning, pass on handling
     // of the hook to others), and "false" otherwise
     if (is_string($action) && $action !== 'formedit') {
         return true;
     }
     // @todo: This looks like bad code. If we can't find a form, we
     // should be showing an informative error page rather than
     // making it look like an edit form page does not exist.
     $title = $article->getTitle();
     $form_names = SFFormLinker::getDefaultFormsForPage($title);
     if (count($form_names) == 0) {
         return true;
     }
     // For backward-compatibility
     if (is_string($action)) {
         global $wgOut;
         $output = $wgOut;
     } else {
         $output = $action->getOutput();
     }
     if (count($form_names) > 1) {
         $warning_text = "\t" . '<div class="warningbox">' . wfMsg('sf_formedit_morethanoneform') . "</div>\n";
         $output->addWikiText($warning_text);
     }
     $form_name = $form_names[0];
     if ($sfgUseFormEditPage) {
         # Experimental new feature extending from the internal
         # EditPage class
         $editor = new SFFormEditPage($article, $form_name);
         $editor->edit();
         return false;
     }
     $page_name = SFUtils::titleString($title);
     $msg = SFFormEdit::printForm($form_name, $page_name);
     if ($msg) {
         // Some error occurred - display it.
         $msgdata = null;
         if (is_array($msg)) {
             if (count($msg) > 1) {
                 $msgdata = $msg[1];
             }
             $msg = $msg[0];
         }
         $output->addHTML(Html::element('p', array('class' => 'error'), wfMsg($msg, $msgdata)));
     }
     return false;
 }
Example #12
0
 /**
  * Get the Title object of a form suitable for editing the target page.
  *
  * @return Title
  * @throws MWException
  */
 protected function getFormTitle()
 {
     // if no form was specified, try finding the default form for the target page.
     if ($this->mOptions['form'] === '') {
         $this->logMessage('No form specified. Will try to find the default form for the target page.', self::DEBUG);
         // if no form and no target page was specified, give up
         if ($this->mOptions['target'] === '') {
             throw new MWException(wfMessage('sf_autoedit_notargetspecified')->parse());
         }
         $targetTitle = Title::newFromText($this->mOptions['target']);
         // if the specified target title is invalid, give up
         if (!$targetTitle instanceof Title) {
             throw new MWException(wfMessage('sf_autoedit_invalidtargetspecified', $this->mOptions['target'])->parse());
         }
         $formNames = SFFormLinker::getDefaultFormsForPage($targetTitle);
         // if no form can be found, give up
         if (count($formNames) === 0) {
             throw new MWException(wfMessage('sf_autoedit_noformfound')->parse());
         }
         // if more than one form was found, issue a warning and use the first form
         // FIXME: If we have more than one form, should we stop?
         if (count($formNames) > 1) {
             $this->logMessage(wfMessage('sf_autoedit_toomanyformsfound')->parse(), self::WARNING);
         }
         $this->mOptions['form'] = $formNames[0];
         $this->logMessage('Using ' . $this->mOptions['form'] . ' as default form.', self::DEBUG);
     }
     $formTitle = Title::makeTitleSafe(SF_NS_FORM, $this->mOptions['form']);
     // if the given form is not a valid title, give up
     if (!$formTitle instanceof Title) {
         throw new MWException(wfMessage('sf_autoedit_invalidform', $this->mOptions['form'])->parse());
     }
     // if the form page is a redirect, follow the redirect
     if ($formTitle->isRedirect()) {
         $this->logMessage('Form ' . $this->mOptions['form'] . ' is a redirect. Finding target.', self::DEBUG);
         // FIXME: Title::newFromRedirectRecurse is deprecated as of MW 1.21
         $formTitle = Title::newFromRedirectRecurse(WikiPage::factory($formTitle)->getRawText());
         // if we exeeded $wgMaxRedirects or encountered an invalid redirect target, give up
         if ($formTitle->isRedirect()) {
             $newTitle = WikiPage::factory($formTitle)->getRedirectTarget();
             if ($newTitle instanceof Title && $newTitle->isValidRedirectTarget()) {
                 throw new MWException(wfMessage('sf_autoedit_redirectlimitexeeded', $this->mOptions['form'])->parse());
             } else {
                 throw new MWException(wfMessage('sf_autoedit_invalidredirecttarget', $newTitle->getFullText(), $this->mOptions['form'])->parse());
             }
         }
     }
     // if specified or found form does not exist (e.g. is a red link), give up
     // FIXME: Throw specialized error message, so a list of alternative forms can be shown
     if (!$formTitle->exists()) {
         throw new MWException(wfMessage('sf_autoedit_invalidform', $this->mOptions['form'])->parse());
     }
     return $formTitle;
 }