/**
 * Special page "user contributions".
 * Shows a list of the contributions of a user.
 *
 * @return	none
 * @param	string	$par	(optional) user name of the user for which to show the contributions
 */
function wfSpecialContributions($par = null)
{
    global $wgUser, $wgOut, $wgLang, $wgContLang, $wgRequest, $wgTitle, $wgScript;
    $fname = 'wfSpecialContributions';
    $target = isset($par) ? $par : $wgRequest->getVal('target');
    if (!strlen($target)) {
        $wgOut->errorpage('notargettitle', 'notargettext');
        return;
    }
    $nt = Title::newFromURL($target);
    if (!$nt) {
        $wgOut->errorpage('notargettitle', 'notargettext');
        return;
    }
    $nt =& Title::makeTitle(NS_USER, $nt->getDBkey());
    list($limit, $offset) = wfCheckLimits();
    $offset = $wgRequest->getVal('offset');
    /* Offset must be an integral. */
    if (!strlen($offset) || !preg_match("/^[0-9]+\$/", $offset)) {
        $offset = 0;
    }
    $title = Title::makeTitle(NS_SPECIAL, "Contributions");
    $urlbits = "target=" . wfUrlEncode($target);
    $myurl = $title->escapeLocalURL($urlbits);
    $finder = new contribs_finder($target == 'newbies' ? 'newbies' : $nt->getText());
    $finder->set_limit($limit);
    $finder->set_offset($offset);
    $nsurl = $xnsurl = "";
    if (($ns = $wgRequest->getVal('namespace', null)) !== null) {
        $nsurl = "&namespace={$ns}";
        $xnsurl = htmlspecialchars($nsurl);
        $finder->set_namespace($ns);
    }
    if ($wgRequest->getText('go') == "prev") {
        $prevts = $finder->get_previous_offset_for_paging();
        $prevurl = $title->getLocalURL($urlbits . "&offset={$prevts}&limit={$limit}{$nsurl}");
        $wgOut->redirect($prevurl);
        return;
    }
    if ($wgRequest->getText('go') == "first") {
        $prevts = $finder->get_first_offset_for_paging();
        $prevurl = $title->getLocalURL($urlbits . "&offset={$prevts}&limit={$limit}{$nsurl}");
        $wgOut->redirect($prevurl);
        return;
    }
    $sk = $wgUser->getSkin();
    $id = User::idFromName($nt->getText());
    if (0 == $id) {
        $ul = $nt->getText();
    } else {
        $ul = $sk->makeLinkObj($nt, htmlspecialchars($nt->getText()));
        $userCond = '=' . $id;
    }
    $talk = $nt->getTalkPage();
    if ($talk) {
        $ul .= ' (' . $sk->makeLinkObj($talk, $wgLang->getNsText(NS_TALK)) . ')';
    }
    if ($target == 'newbies') {
        $ul = wfMsg('newbies');
    }
    $wgOut->setSubtitle(wfMsgHtml('contribsub', $ul));
    wfRunHooks('SpecialContributionsBeforeMainOutput', $id);
    $arr = $wgContLang->getFormattedNamespaces();
    $nsform = "<form method='get' action=\"{$wgScript}\">\n";
    $nsform .= wfElement("input", array("name" => "title", "type" => "hidden", "value" => $wgTitle->getPrefixedText()));
    $nsform .= wfElement("input", array("name" => "offset", "type" => "hidden", "value" => $offset));
    $nsform .= wfElement("input", array("name" => "limit", "type" => "hidden", "value" => $limit));
    $nsform .= wfElement("input", array("name" => "target", "type" => "hidden", "value" => $target));
    $nsform .= "<p>";
    $nsform .= wfMsgHtml('namespace');
    $nsform .= HTMLnamespaceselector($ns, '');
    $nsform .= wfElement("input", array("type" => "submit", "value" => wfMsg('allpagessubmit')));
    $nsform .= "</p></form>\n";
    $wgOut->addHTML($nsform);
    $contribsPage = Title::makeTitle(NS_SPECIAL, 'Contributions');
    $contribs = $finder->find();
    if (count($contribs) == 0) {
        $wgOut->addWikiText(wfMsg("nocontribs"));
        return;
    }
    list($early, $late) = $finder->get_edit_limits();
    $lastts = count($contribs) ? $contribs[count($contribs) - 1]->rev_timestamp : 0;
    $atstart = !count($contribs) || $late == $contribs[0]->rev_timestamp;
    $atend = !count($contribs) || $early == $lastts;
    $lasturl = $wgTitle->escapeLocalURL("action=history&limit={$limit}");
    $firsttext = wfMsgHtml("histfirst");
    $lasttext = wfMsgHtml("histlast");
    $prevtext = wfMsg("prevn", $limit);
    if ($atstart) {
        $lastlink = $lasttext;
        $prevlink = $prevtext;
    } else {
        $lastlink = "<a href=\"{$myurl}&amp;limit={$limit}{$xnsurl}\">{$lasttext}</a>";
        $prevlink = "<a href=\"{$myurl}&amp;offset={$offset}&amp;limit={$limit}{$xnsurl}&amp;go=prev\">{$prevtext}</a>";
    }
    $nexttext = wfMsg("nextn", $limit);
    if ($atend) {
        $firstlink = $firsttext;
        $nextlink = $nexttext;
    } else {
        $firstlink = "<a href=\"{$myurl}&amp;limit={$limit}{$xnsurl}&amp;go=first\">{$firsttext}</a>";
        $nextlink = "<a href=\"{$myurl}&amp;offset={$lastts}&amp;limit={$limit}{$xnsurl}\">{$nexttext}</a>";
    }
    $firstlast = "({$lastlink} | {$firstlink})";
    $urls = array();
    foreach (array(20, 50, 100, 250, 500) as $num) {
        $urls[] = "<a href=\"{$myurl}&amp;offset={$offset}&amp;limit={$num}{$xnsurl}\">" . $wgLang->formatNum($num) . "</a>";
    }
    $bits = implode($urls, ' | ');
    $prevnextbits = "{$firstlast} " . wfMsgHtml("viewprevnext", $prevlink, $nextlink, $bits);
    $wgOut->addHTML("<p>{$prevnextbits}</p>\n");
    $wgOut->addHTML("<ul>\n");
    foreach ($contribs as $contrib) {
        $wgOut->addHTML(ucListEdit($sk, $contrib));
    }
    $wgOut->addHTML("</ul>\n");
    $wgOut->addHTML("<p>{$prevnextbits}</p>\n");
}
Пример #2
0
/**
 * Special page "user contributions".
 * Shows a list of the contributions of a user.
 *
 * @return	none
 * @param	$par	String: (optional) user name of the user for which to show the contributions
 */
function wfSpecialContributions($par = null)
{
    global $wgUser, $wgOut, $wgLang, $wgRequest;
    $target = isset($par) ? $par : $wgRequest->getVal('target');
    if (!strlen($target)) {
        $wgOut->showErrorPage('notargettitle', 'notargettext');
        return;
    }
    $nt = Title::newFromURL($target);
    if (!$nt) {
        $wgOut->showErrorPage('notargettitle', 'notargettext');
        return;
    }
    $options = array();
    list($options['limit'], $options['offset']) = wfCheckLimits();
    $options['offset'] = $wgRequest->getVal('offset');
    /* Offset must be an integral. */
    if (!strlen($options['offset']) || !preg_match('/^[0-9]+$/', $options['offset'])) {
        $options['offset'] = '';
    }
    $title = SpecialPage::getTitleFor('Contributions');
    $options['target'] = $target;
    $nt =& Title::makeTitle(NS_USER, $nt->getDBkey());
    $finder = new ContribsFinder($target == 'newbies' ? 'newbies' : $nt->getText());
    $finder->setLimit($options['limit']);
    $finder->setOffset($options['offset']);
    if (($ns = $wgRequest->getVal('namespace', null)) !== null && $ns !== '') {
        $options['namespace'] = intval($ns);
        $finder->setNamespace($options['namespace']);
    } else {
        $options['namespace'] = '';
    }
    if ($wgUser->isAllowed('rollback') && $wgRequest->getBool('bot')) {
        $options['bot'] = '1';
    }
    if ($wgRequest->getText('go') == 'prev') {
        $offset = $finder->getPreviousOffsetForPaging();
        if ($offset !== false) {
            $options['offset'] = $offset;
            $prevurl = $title->getLocalURL(wfArrayToCGI($options));
            $wgOut->redirect($prevurl);
            return;
        }
    }
    if ($wgRequest->getText('go') == 'first' && $target != 'newbies') {
        $offset = $finder->getFirstOffsetForPaging();
        if ($offset !== false) {
            $options['offset'] = $offset;
            $prevurl = $title->getLocalURL(wfArrayToCGI($options));
            $wgOut->redirect($prevurl);
            return;
        }
    }
    if ($target == 'newbies') {
        $wgOut->setSubtitle(wfMsgHtml('sp-contributions-newbies-sub'));
    } else {
        $wgOut->setSubtitle(wfMsgHtml('contribsub', contributionsSub($nt)));
    }
    $id = User::idFromName($nt->getText());
    wfRunHooks('SpecialContributionsBeforeMainOutput', $id);
    $wgOut->addHTML(contributionsForm($options));
    $contribs = $finder->find();
    if (count($contribs) == 0) {
        $wgOut->addWikiText(wfMsg('nocontribs'));
        return;
    }
    list($early, $late) = $finder->getEditLimits();
    $lastts = count($contribs) ? $contribs[count($contribs) - 1]->rev_timestamp : 0;
    $atstart = !count($contribs) || $late == $contribs[0]->rev_timestamp;
    $atend = !count($contribs) || $early == $lastts;
    // These four are defaults
    $newestlink = wfMsgHtml('sp-contributions-newest');
    $oldestlink = wfMsgHtml('sp-contributions-oldest');
    $newerlink = wfMsgHtml('sp-contributions-newer', $options['limit']);
    $olderlink = wfMsgHtml('sp-contributions-older', $options['limit']);
    if (!$atstart) {
        $stuff = $title->escapeLocalURL(wfArrayToCGI(array('offset' => ''), $options));
        $newestlink = "<a href=\"{$stuff}\">{$newestlink}</a>";
        $stuff = $title->escapeLocalURL(wfArrayToCGI(array('go' => 'prev'), $options));
        $newerlink = "<a href=\"{$stuff}\">{$newerlink}</a>";
    }
    if (!$atend) {
        $stuff = $title->escapeLocalURL(wfArrayToCGI(array('go' => 'first'), $options));
        $oldestlink = "<a href=\"{$stuff}\">{$oldestlink}</a>";
        $stuff = $title->escapeLocalURL(wfArrayToCGI(array('offset' => $lastts), $options));
        $olderlink = "<a href=\"{$stuff}\">{$olderlink}</a>";
    }
    if ($target == 'newbies') {
        $firstlast = "({$newestlink})";
    } else {
        $firstlast = "({$newestlink} | {$oldestlink})";
    }
    $urls = array();
    foreach (array(20, 50, 100, 250, 500) as $num) {
        $stuff = $title->escapeLocalURL(wfArrayToCGI(array('limit' => $num), $options));
        $urls[] = "<a href=\"{$stuff}\">" . $wgLang->formatNum($num) . "</a>";
    }
    $bits = implode($urls, ' | ');
    $prevnextbits = $firstlast . ' ' . wfMsgHtml('viewprevnext', $newerlink, $olderlink, $bits);
    $wgOut->addHTML("<p>{$prevnextbits}</p>\n");
    $wgOut->addHTML("<ul>\n");
    $sk = $wgUser->getSkin();
    foreach ($contribs as $contrib) {
        $wgOut->addHTML(ucListEdit($sk, $contrib));
    }
    $wgOut->addHTML("</ul>\n");
    $wgOut->addHTML("<p>{$prevnextbits}</p>\n");
}