X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FSpecialValidate.php;h=f58bf5e4a17dea4e377be7541a52743c5736742f;hb=39bb950f401807a71cb9e9b3d5f91d71876178bc;hp=e78be0fdfa23334217fe4d5f5139e970c2a8e81b;hpb=8ef2eb8092b1435a81153a14ddfb16151d092ae2;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/SpecialValidate.php b/includes/SpecialValidate.php index e78be0fdfa..f58bf5e4a1 100644 --- a/includes/SpecialValidate.php +++ b/includes/SpecialValidate.php @@ -23,424 +23,789 @@ * @subpackage SpecialPage */ -/** - * - * @package MediaWiki - * @subpackage SpecialPage - */ + class Validation { - var $topicList ; - var $voteCache ; - var $rev2date ; - var $date2ref ; + var $topicList; + var $voteCache; + var $page_id; + var $rev_fields = "rev_id,rev_page,rev_timestamp,rev_user_text,rev_user,rev_comment" ; - # Reads all revision information of the specified article - function prepareRevisions ( $id ) { - global $wgDBprefix ; - $this->rev2date = array () ; - $this->date2rev = array () ; - $sql = "SELECT * FROM {$wgDBprefix}revision WHERE rev_page='{$id}'" ; - $res = wfQuery( $sql, DB_READ ); - while( $x = wfFetchObject( $res ) ) { - $this->rev2date[$x->rev_id] = $x ; - $this->date2rev[$x->rev_timestamp] = $x ; - } - } + function getRevisionFromId( $rev_id ) { + if( isset( $this->id2rev[$rev_id] ) ) return $this->id2rev[$rev_id]; + + $db =& wfGetDB( DB_SLAVE ); + $fname = 'SpecialValidate::getRevisionFromId'; + $res = $db->select( 'revision', $this->rev_fields, array( 'rev_id' => $rev_id ), $fname, array( 'LIMIT' => 1 ) ); + $rev = $db->fetchObject($res); + $db->freeResult($res); + + $this->id2rev[$rev->rev_id] = $rev; + $this->ts2rev[$rev->rev_timestamp] = $rev; + + return $rev; + } + + function getRevisionFromTimestamp( $timestamp ) { + if( isset( $this->ts2rev[$timestamp] ) ) return $this->ts2rev[$timestamp]; + + $db =& wfGetDB( DB_SLAVE ); + $fname = 'SpecialValidate::getRevisionFromTimestamp'; + $res = $db->select( 'revision', $this->rev_fields, + array( 'rev_page' => $this->page_id, 'rev_timestamp' => $timestamp ), + $fname, array( 'LIMIT' => 1 ) + ); + $rev = $db->fetchObject($res); + $db->freeResult($res); + + $this->id2rev[$rev->rev_id] = $rev; + $this->ts2rev[$rev->rev_timestamp] = $rev; + + return $rev; + } # Returns a HTML link to the specified article revision - function getVersionLink( &$article , $revision , $text = "" ) { - $t = $article->getTitle() ; - if ( $text == "" ) $text = wfMsg("val_view_version"); - $ret = "getLocalURL ( "oldid={$revision}" ) . "\">" . $text . "" ; - return $ret ; + function getRevisionLink( &$article, $revision, $text = "" ) { + global $wgUser; + $sk = $wgUser->getSkin(); + $t = $article->getTitle(); + if( $text == "" ) $text = wfMsg("val_view_version"); + return $sk->makeKnownLinkObj( $t, $this->getParsedWiki($text), 'oldid='.urlencode($revision) ); } # Returns an array containing all topics you can vote on - function getTopicList () { - global $wgDBprefix ; - $ret = array () ; - $sql = "SELECT * FROM {$wgDBprefix}validate WHERE val_user=0" ; - $res = wfQuery( $sql, DB_READ ); - while( $x = wfFetchObject( $res ) ) { - $ret[$x->val_type] = $x ; + function getTopicList() { + $db =& wfGetDB( DB_SLAVE ); + + $topics = array(); + + # NOTE : This query returns only the topics to vote on + $res = $db->select( 'validate', '*', array( 'val_page' => 0 ), 'SpecialValidate::getTopicList' ); + while( $topic = $db->fetchObject($res) ) { + $topics[$topic->val_type] = $topic; } - ksort ( $ret ) ; - return $ret ; + $db->freeResult($res); + + ksort( $topics ); + return $topics; } # Merges one dataset into another - function mergeInto ( &$source , &$dest ) { - $ret = false ; - foreach ( $source AS $x => $y ) { - $doit = false ; - if ( !isset ( $dest[$x] ) ) $doit = true ; - else if ( $dest[$x]->value == 0 ) $doit = true ; - if ( $doit ) { - $dest[$x] = $y ; - $ret = true ; + function mergeInto( &$source, &$dest ) { + $ret = false; + foreach( $source as $x => $y ) { + $doit = false; + if( !isset( $dest[$x] ) ) { + $doit = true; + } elseif( $dest[$x]->value == 0 ) { + $doit = true; + } + if( $doit ) { + $dest[$x] = $y; + $ret = true; } } - if ( $ret ) ksort ( $dest ) ; - return $ret ; + if( $ret ) { + ksort ( $dest ); + } + return $ret; } # Merges all votes prior to the given revision into it - function mergeOldRevisions ( &$article , $revision ) { - $tmp = $this->voteCache ; - krsort ( $tmp ) ; - $update = false ; - $ts = $this->getTimestamp($revision) ; - $data = $this->voteCache[$ts] ; - foreach ( $tmp AS $x => $y ) { - if ( $x < $ts ) { - if ( $this->mergeInto ( $y , $data ) ) $update = true ; + function mergeOldRevisions( &$article, $revision ) { + $tmp = $this->voteCache; + krsort( $tmp ); + $update = false; + $ts = $this->getRevisionTimestamp( $revision ); + $data = $this->voteCache[$ts]; + foreach( $tmp as $x => $y ) { + if( $x < $ts ) { + if( $this->mergeInto( $y, $data ) ) { + $update = true; + } } } - if ( $update ) $this->setRevision ( $article , $revision , $data ) ; + if( $update ) { + $this->setRevision( $article, $revision, $data ); + } } # Clears all votes prior to the given revision - function clearOldRevisions ( &$article , $revision ) { - $tmp = $this->voteCache ; - $ts = $this->getTimestamp($revision); - foreach ( $tmp AS $x => $y ) { - if ( $x < $ts ) $this->deleteRevision ( $article , $this->getRevisionNumber($x) ) ; + function clearOldRevisions( &$article, $revision ) { + $tmp = $this->voteCache; + $ts = $this->getRevisionTimestamp( $revision ); + foreach( $tmp as $x => $y ) { + if( $x < $ts ) { + $this->deleteRevisionVote ( $article, $this->getRevisionId( $x ) ); + } } } # Updates the votes for the given revision from the FORM data - function updateRevision ( &$article , $revision ) { - global $wgUser, $wgRequest ; + function updateRevision( &$article, $revision ) { + global $wgRequest; - if ( isset ( $this->voteCache[$this->getTimestamp($revision)] ) ) $data = $this->voteCache[$this->getTimestamp($revision)] ; - else $data = array () ; - $nv = $wgRequest->getArray ( "re_v_{$revision}" , array() ) ; - $nc = $wgRequest->getArray ( "re_c_{$revision}" , array() ) ; + if( isset( $this->voteCache[$this->getRevisionTimestamp( $revision )] ) ) { + $data = $this->voteCache[$this->getRevisionTimestamp( $revision )]; + } else { + $data = array(); + } + $nv = $wgRequest->getArray( "re_v_{$revision}", array() ); + $nc = $wgRequest->getArray( "re_c_{$revision}", array() ); - foreach ( $nv AS $x => $y ) { - $data[$x]->value = $y ; - $data[$x]->comment = $nc[$x] ; + foreach( $nv as $x => $y ) { + $data[$x]->value = $y; + $data[$x]->comment = $nc[$x]; } - krsort ( $data ) ; + krsort( $data ); - $this->setRevision ( $article , $revision , $data ) ; + $this->setRevision( $article, $revision, $data ); } # Sets a specific revision to both cache and database - function setRevision ( &$article , $revision , &$data ) { - global $wgUser , $wgDBprefix ; - $this->deleteRevision ( $article , $revision ) ; - $this->voteCache[$this->getTimestamp($revision)] = $data ; - foreach ( $data AS $x => $y ) { - if ( $y->value > 0 ) { - $sql = "INSERT INTO {$wgDBprefix}validate (val_user,val_page,val_revision,val_type,val_value,val_comment) VALUES ('" ; - $sql .= $wgUser->getID() . "','" ; - $sql .= $article->getID() . "','" ; - $sql .= $revision . "','" ; - $sql .= $x . "','" ; - $sql .= $y->value . "','" ; - $sql .= Database::strencode ( $y->comment ) . "')" ; - $res = wfQuery( $sql, DB_WRITE ); + function setRevision( &$article, $revision, &$data ) { + global $wgUser; + $this->deleteRevisionVote( $article, $revision ); + $this->voteCache[ $this->getRevisionTimestamp($revision) ] = $data; + foreach( $data as $x => $y ) { + if( $y->value > 0 ) { + $ip = $wgUser->isAnon() ? $wgUser->getName() : ''; + $dbw =& wfGetDB( DB_MASTER ); + $dbw->insert( 'validate', + array( + 'val_user' => $wgUser->getId(), + 'val_page' => $article->getId(), + 'val_revision' => $revision, + 'val_type' => $x, + 'val_value' => $y->value, + 'val_comment' => $y->comment, + 'val_ip' => $ip ), + 'SpecialValidate::setRevision' + ); } } } + # Returns a map identifying the current user + function identifyUser( $user = "" ) { + global $wgUser; + if( $user == "" ) $user = $wgUser->getID(); + return User::isIP($user) + ? array( 'val_user' => 0, 'val_ip' => $user ) + : array( 'val_user' => $user ); + } + # Deletes a specific vote set in both cache and database - function deleteRevision ( &$article , $revision ) { - global $wgUser , $wgDBprefix ; - $ts = $this->getTimestamp ( $revision ) ; - if ( !isset ( $this->voteCache[$ts] ) ) return ; # Nothing to do - $sql = "DELETE FROM {$wgDBprefix}validate WHERE val_user='" . $wgUser->GetID() . "' AND " ; - $sql .= " val_page='" . $article->getID() . "' AND val_revision='{$revision}'" ; - $res = wfQuery( $sql, DB_WRITE ); - unset ( $this->voteCache[$ts] ) ; + function deleteRevisionVote( &$article, $revision ) { + $ts = $this->getRevisionTimestamp( $revision ); + if( !isset ( $this->voteCache[$ts] ) ) return; + + $db =& wfGetDB( DB_MASTER ); + $db->delete( + 'validate', + array_merge( + $this->identifyUser(), + array( + 'val_page' => $article->getID(), + 'val_revision' => $revision + ) + ), + 'SpecialValidate::deleteRevisionVote' + ); + + unset( $this->voteCache[$ts] ); } # Reads the entire vote list for this user for the given article - function getVoteList ( $id ) { - global $wgUser , $wgDBprefix ; - $r = array () ; # Revisions - $sql = "SELECT * FROM {$wgDBprefix}validate WHERE val_page=" . $id . " AND val_user=" . $wgUser->getID() ; - $res = wfQuery( $sql, DB_READ ); - while( $x = wfFetchObject( $res ) ) { - #$y = $x->val_revision ; - $y = $this->rev2date[$x->val_revision] ; - $y = $y->rev_timestamp ; - if ( !isset($r[$y]) ) $r[$y] = array () ; - $r[$y][$x->val_type]->value = $x->val_value ; - $r[$y][$x->val_type]->comment = $x->val_comment ; - } - return $r ; + function getVoteList( $id, $user = "" ) { + $db =& wfGetDB( DB_SLAVE ); + + # NOTE : This query gets the votes for a single user on a single page. + # Assuming most people will use the "merge" feature, + # this will be only a single entry. + $res = $db->select( 'validate', '*', array_merge( array( 'val_page' => $id ), $this->identifyUser($user) ) ); + + $revisions = array(); + while( $vote = $db->fetchObject($res) ) { + $ts = $this->getRevisionTimestamp( $vote->val_revision ); + if( ! isset( $revisions[$ts] ) ) { + $revisions[$ts] = array(); + } + $revisions[$ts][$vote->val_type]->value = $vote->val_value; + $revisions[$ts][$vote->val_type]->comment = $vote->val_comment; + } + $db->freeResult($res); + + return $revisions; + } + + # Reads a partial vote list for this user for all articles + function getAllVoteLists( $user , $offset , $limit ) { + $db =& wfGetDB( DB_SLAVE ); + $a = $this->identifyUser($user) ; + $b = array ( "ORDER BY" => "val_page,val_revision" , "OFFSET" => $offset , "LIMIT" => $limit ) ; + $res = $db->select( 'validate', '*', $a , 'getAllVotesList' , $b ); + + $votes = array(); + while( $vote = $db->fetchObject($res) ) { + $votes[$vote->val_page][$vote->val_revision][$vote->val_type] = $vote; + } + $db->freeResult($res); + + return $votes ; } # This functions adds a topic to the database - function addTopic ( $topic , $limit ) { - global $wgDBprefix ; - $a = 1 ; - while ( isset ( $this->topicList[$a] ) ) $a++ ; - $sql = "INSERT INTO {$wgDBprefix}validate (val_user,val_page,val_revision,val_type,val_value,val_comment) VALUES (" ; - $sql .= "'0','0','0','{$a}','{$limit}','" ; - $sql .= Database::strencode ( $topic ) . "')" ; - $res = wfQuery( $sql, DB_WRITE ); - $x->val_user = $x->val_page = $x->val_revision = 0 ; - $x->val_type = $a ; - $x->val_value = $limit ; - $x->val_comment = $topic ; - $this->topicList[$a] = $x ; - ksort ( $this->topicList ) ; + function addTopic( $topic, $limit ) { + $db =& wfGetDB( DB_MASTER ); + + $next_idx = 1; + while( isset( $this->topicList[$next_idx] ) ) { + $next_idx++; + } + + $db->insert( + 'validate', + array( + 'val_user' => 0, + 'val_page' => 0, + 'val_revision' => 0, + 'val_type' => $next_idx, + 'val_value' => $limit, + 'val_comment' => $topic, + 'val_ip' => '' + ), + 'SpecialValidate::addTopic' + ); + + $t->val_user = $t->val_page = $t->val_revision = 0; + $t->val_type = $next_idx; + $t->val_value = $limit; + $t->val_comment = $topic; + $t->val_ip = ""; + $this->topicList[$next_idx] = $t; + + ksort( $this->topicList ); } - # This functions adds a topic to the database - function deleteTopic ( $id ) { - global $wgDBprefix ; - $sql = "DELETE FROM {$wgDBprefix}validate WHERE val_type='{$id}'" ; - $res = wfQuery( $sql, DB_WRITE ); - unset ( $this->topicList[$id] ) ; + # This function deletes a topic and all votes for it. CAREFUL! + function deleteTopic( $id ) { + $db =& wfGetDB( DB_MASTER ); + $db->delete( 'validate', array( 'val_type' => $id ), 'SpecialValidate::deleteTopic' ); + unset( $this->topicList[$id] ); } # This function returns a link text to the page validation statistics - function link2statistics ( &$article ) { + function getStatisticsLink( &$article ) { + global $wgUser; + $sk = $wgUser->getSkin(); $nt = $article->getTitle(); - $url = htmlspecialchars( $nt->getLocalURL( 'action=validate&mode=list' ) ); - return wfMsg ( 'val_rev_stats_link', $nt->getPrefixedText(), $url ); + return $sk->makeKnownLinkObj( $nt, wfMsg( 'val_rev_stats', $nt->getPrefixedText() ), 'action=validate&mode=list' ); + } + + # This function returns a link text to the page validation statistics of a single revision + function getRevisionStatsLink( &$article, $revision ) { + global $wgUser; + $sk = $wgUser->getSkin(); + $nt = $article->getTitle(); + $text = $this->getParsedWiki( wfMsg('val_revision_stats_link') ); + $query = "action=validate&mode=details&revision={$revision}"; + return '(' . $sk->makeKnownLinkObj( $nt, $text, $query ) . ')'; + } + + # This function returns a link text to the user rating statistics page + function getUserRatingsLink( $user, $text ) { + global $wgUser; + $sk = $wgUser->getSkin(); + if( $user == 0 ) $user = $wgUser->getName(); + $nt = Title::newFromText( 'Special:Validate' ); + return $sk->makeKnownLinkObj( $nt, $text, 'mode=userstats&user='.urlencode($user) ); } # Returns the timestamp of a revision based on the revision number - function getTimestamp ( $revision ) { - $ts = $this->rev2date[$revision] ; - $ts = $ts->rev_timestamp ; - return $ts ; + function getRevisionTimestamp( $rev_id ) { + $rev = $this->getRevisionFromId( $rev_id ); + return $rev->rev_timestamp; } # Returns the revision number of a revision based on the timestamp - function getRevisionNumber ( $ts ) { - $revision = $this->date2rev[$ts] ; - $revision = $revision->rev_id ; - return $revision ; + function getRevisionId( $ts ) { + $rev = $this->getRevisionFromTimestamp( $ts ); + return $rev->rev_id; } # HTML generation functions from this point on # Returns the metadata string for a revision - function getMetadata ( $idx ) { - $metadata = "" ; - $x = $this->rev2date[$idx] ; - $metadata .= wfTimestamp ( TS_DB , $x->rev_timestamp ) ; - $metadata .= " by " ; - if ( $x->rev_user == 0 ) { - $metadata .= $x->rev_user_text ; + function getMetadata( $rev_id, &$article ) { + global $wgUser; + $sk = $wgUser->getSkin(); + + $metadata = ""; + $x = $this->getRevisionFromId($rev_id); + $metadata .= wfTimestamp( TS_DB, $x->rev_timestamp ); + $metadata .= " by "; + if( $x->rev_user == 0 ) { + $metadata .= $x->rev_user_text; } else { - $u = new User ; - $u->setId ( $x->rev_user ) ; - $u->setName ( $x->rev_user_text ) ; - $nt = $u->getUserPage() ; - $url = "" . $nt->getText() . "" ; - $metadata .= $url ; + $u = new User; + $u->setId( $x->rev_user ); + $u->setName( $x->rev_user_text ); + $nt = $u->getUserPage(); + $metadata .= $sk->makeKnownLinkObj( $nt, htmlspecialchars( $nt->getText() ) ); } - $metadata .= " : \"" . htmlspecialchars ( $x->rev_comment ) . "\"" ; - return $metadata ; + $metadata .= ': '. $sk->commentBlock( $x->rev_comment, $article->getTitle() ); + return $metadata; + } + + # Generates a link to the topic description + function getTopicLink($s) { + $t = Title::newFromText ( wfMsg ( 'val_topic_desc_page' ) ) ; + # FIXME: Why doesn't this use standard linking code? + $r = "escapeLocalURL () ; + $r .= "#" . urlencode ( $s ) ; + $r .= "\">{$s}" ; + return $r ; + } + + # Generates HTML from a wiki text, e.g., a wfMsg + function getParsedWiki ( $text ) { + global $wgOut, $wgTitle, $wgParser ; + $parserOutput = $wgParser->parse( $text , $wgTitle, $wgOut->mParserOptions,false); + return $parserOutput->getText() ; } # Generates a form for a single revision - function getRevisionForm ( &$article , $idx , &$data , $focus = false ) { + function getRevisionForm( &$article, $idx, &$data, $focus = false ) { # Fill data with blank values - $ts = $idx ; - $revision = $this->getRevisionNumber ( $ts ) ; - foreach ( $this->topicList AS $x => $y ) { - if ( !isset ( $data[$x] ) ) { - $data[$x]->value = 0 ; - $data[$x]->comment = "" ; + $ts = $idx; + $revision = $this->getRevisionId( $ts ); + foreach( $this->topicList as $x => $y ) { + if( !isset( $data[$x] ) ) { + $data[$x]->value = 0; + $data[$x]->comment = ""; } } - ksort ( $data ) ; + ksort( $data ) ; # Generate form - $ret = "
\n\n"; + return $ret; } # Generates the page from the validation tab - function validatePageForm ( &$article , $revision ) { - global $wgOut, $wgRequest ; + function validatePageForm( &$article, $revision ) { + global $wgOut, $wgRequest, $wgUser; - $this->prepareRevisions ( $article->getID() ) ; - $this->topicList = $this->getTopicList() ; - $this->voteCache = $this->getVoteList ( $article->getID() ) ; + $ret = ""; + $this->page_id = $article->getID(); + $this->topicList = $this->getTopicList(); + $this->voteCache = $this->getVoteList( $article->getID() ); # Check for POST data $re = $wgRequest->getArray( 're_submit' ); - if ( isset ( $re ) ) - { - $id = array_keys ( $re ) ; + if ( isset( $re ) ) { + $id = array_keys( $re ); $id = $id[0] ; # $id is now the revision number the user clicked "OK" for - $clearOldRev = $wgRequest->getVal( "re_clear_{$id}" , 0 ); - $mergeOldRev = $wgRequest->getVal( "re_merge_{$id}" , 0 ); - $this->updateRevision ( $article , $id ) ; - if ( $mergeOldRev ) $this->mergeOldRevisions ( $article , $id ) ; - if ( $clearOldRev ) $this->clearOldRevisions ( $article , $id ) ; + $clearOldRev = $wgRequest->getVal( "re_clear_{$id}", 0 ); + $mergeOldRev = $wgRequest->getVal( "re_merge_{$id}", 0 ); + $this->updateRevision( $article, $id ); + if( $mergeOldRev ) { + $this->mergeOldRevisions( $article, $id ); } + if( $clearOldRev ) { + $this->clearOldRevisions( $article, $id ); + } + $ret .= '' . $this->getParsedWiki( wfMsg( 'val_revision_changes_ok' ) ) . "
"; + } else { + $ret .= $this->getParsedWiki( wfMsg ('val_votepage_intro') ); + } # Make sure the requested revision exists - $ts = $this->rev2date[$revision]->rev_timestamp ; - if ( !isset ( $this->voteCache[$ts] ) ) $this->voteCache[$ts] = array () ; + $rev = $this->getRevisionFromId($revision); + $ts = $rev->rev_timestamp; + if( !isset( $this->voteCache[$ts] ) ) { + $this->voteCache[$ts] = array(); + } # Sort revisions list, newest first - krsort ( $this->voteCache ) ; + krsort( $this->voteCache ); # Output - $ret = "" ; $title = $article->getTitle(); - $title = $title->getPrefixedText() ; - $wgOut->setPageTitle ( wfMsg ( 'val_rev_for' ) . $title ) ; - foreach ( $this->voteCache AS $x => $y ) - { - $ret .= $this->getRevisionForm ( $article , $x , $y , $x == $ts ) ; - $ret .= "" . $this->getUserRatingsLink( $wgUser->getID(), wfMsg( 'val_show_my_ratings' ) ) . "
"; return $ret ; } # This function performs the "management" mode on Special:Validate - function manageTopics () { - global $wgRequest ; - $this->topicList = $this->getTopicList() ; - - $iamsure = $wgRequest->getVal ( "iamsure" , "0" ) == 1 ; - - if ( $iamsure && $wgRequest->getVal ( "m_add" , "--" ) != "--" ) { - $new_topic = $wgRequest->getVal ( "m_topic" ) ; - $new_limit = $wgRequest->getVal ( "m_limit" ) ; - if ( $new_topic != "" && $new_limit > 1 ) - $this->addTopic ( $new_topic , $new_limit ) ; - } - - $da = $wgRequest->getArray ( "m_del" ) ; - if ( $iamsure && isset ( $da ) && count ( $da ) > 0 ) { - $id = array_keys ( $da ) ; - $id = array_shift ( $id ) ; - $this->deleteTopic ( $id ) ; - } - - $r = "" . wfMsg ( 'val_warning' ) . "
\n" ; - $r .= "" . $y->val_type . " | \n" ; - $r .= "{$y->val_comment} | \n" ; - $r .= "1 .. {$y->val_value} | \n" ; - $r .= "\n" ; - $r .= " |
---|---|---|---|
\n" ; - $r .= " | \n" ; - $r .= " | \n" ; - $r .= " | \n" ; - $r .= " |
" . $this->getParsedWiki( wfMsg( 'val_warning' ) ) . "
\n"; + $r .= "{$y->val_type} | \n"; + $r .= "" . $this->getTopicLink ( $y->val_comment ) . " | \n"; + $r .= "1 .. " . intval( $y->val_value ) . " | \n"; + $r .= "\n"; + $r .= " |
---|---|---|---|
\n"; + $r .= ' | ' . "\n"; + $r .= ' | 1 .. | ' . "\n"; + $r .= '' . "\n"; + $r .= " |
'; +# $r .= '
\n"; + $r .= "" . str_replace( '$1', $url, wfMsg( 'val_revision_of' ) ) . "
\n"; + $ret .= "" . $this->getParsedWiki ( wfMsg('val_details_th') ) . " | " ; + + foreach( $topics as $t => $dummy ) { + $ret .= '' . $sk->commentBlock( $this->topicList[$t]->val_comment, $article->getTitle() ) . ' | '; + } + $ret .= "|
---|---|---|
"; + if( !User::IsIP( $u ) ) { # Logged-in user rating + $ret .= $this->getUserRatingsLink( $u, User::whoIs( $u ) ); + } else { # Anon rating + $ret .= $this->getUserRatingsLink( $u, $u ); + } + $ret .= " | "; + foreach( $topics as $t => $dummy ) { # Every column a topic + if( !isset( $data[$u][$t] ) ) { + $ret .= ""; + } else { + $ret .= " | "; + $ret .= $data[$u][$t]->val_value; + if( $data[$u][$t]->val_comment != "" ) { + $ret .= ' ' . $sk->commentBlock( $data[$u][$t]->val_comment, $article->getTitle() ); + } + $ret .= " | "; + } + } + $ret .= "
" . $this->getStatisticsLink( $article ) . "
"; + $ret .= "" . $this->getUserRatingsLink( $wgUser->getID(), wfMsg( 'val_show_my_ratings' ) ) . "
"; + + return $ret; + } + + function showList( &$article ) { + global $wgOut, $wgUser , $wgRequest; + $this->page_id = $article->getID(); + $this->topicList = $this->getTopicList(); + + $title = $article->getTitle(); + $wgOut->setPageTitle( wfMsg( 'val_validation_of', $title->getPrefixedText() ) ); + + $offset = $wgRequest->getVal ( "offset" , 0 ) ; + $limit = $wgRequest->getVal ( "limit" , 25 ) ; + + # Collecting statistic data + # Unfortunately, it has to read all the data, though it will only display a part + $db =& wfGetDB( DB_SLAVE ); + $res = $db->select( 'validate', 'val_revision,val_type,val_value', array( "val_page" => $this->page_id ), 'SpecialValidate::showList' );#, $b ); + + $statistics = array(); + while( $vote = $db->fetchObject($res) ) { + $ts = $this->getRevisionTimestamp($vote->val_revision); + if ( !isset ( $statistics[$ts] ) ) $statistics[$ts] = array () ; + if ( !isset ( $statistics[$ts][$vote->val_type]->count ) ) $statistics[$ts][$vote->val_type]->count = 0 ; + if ( !isset ( $statistics[$ts][$vote->val_type]->sum ) ) $statistics[$ts][$vote->val_type]->sum = 0 ; + $statistics[$ts][$vote->val_type]->count++; + $statistics[$ts][$vote->val_type]->sum += $vote->val_value; + } + $db->freeResult($res); + + krsort( $statistics ); + + $ret = "" . $this->getParsedWiki( wfMsg( "val_revision" ) ) . " | \n"; + foreach( $this->topicList as $topic ) { + $ret .= "" . $this->getTopicLink($topic->val_comment) . " | "; + } + $ret .= "|
---|---|---|
{$revision_link} {$details_link} | "; + foreach( $this->topicList as $topicType => $topic ) { + if( isset( $data[$topicType] ) ) { + $stats = $data[$topicType]; + $average = $stats->count == 0 ? 0 : $stats->sum / $stats->count; + $ret .= sprintf( "%1.1f (%d) | ", $average, $stats->count ); + } else { + $ret .= ""; + } } - $data[$idx][$x->val_type]->count++ ; - $data[$idx][$x->val_type]->sum += $x->val_value ; + $ret .= " |
" . $this->getUserRatingsLink( $wgUser->getID(), wfMsg( 'val_show_my_ratings' ) ) . "
"; + + return $ret; + } + + function getRatingText( $value, $max ) { + if( $max == 2 && $value == 1 ) { + $ret = wfMsg ( "val_no" ) . " "; + } elseif( $max == 2 && $value == 2 ) { + $ret = wfMsg( "val_yes" ); + } elseif( $value != 0 ) { + $ret = wfMsg( "val_of", $value, $max ) . " "; + } else { + $ret = ""; } + return $ret; + } + + function navBar ( $offset , $limit , $lastcount , $mode = "userstats" ) { + global $wgRequest , $wgUser , $wgTitle ; + $sk = $wgUser->getSkin(); + $r = array () ; + $user = $wgRequest->getVal( "user" ); + + if ( $mode == "userstats" ) { + $nt = Title::newFromText( 'Special:Validate' ); + } else { + $nt = $wgTitle ; + } + + $base = "action=validate&mode={$mode}&" ; + if ( $user != "" ) $base .= "user={$user}&" ; + $base .= "limit={$limit}&offset=" ; - krsort ( $data ) ; + if ( $offset > 0 ) { + $o = $offset - $limit ; + $t = $offset-$limit+1 ; + $r[] = $sk->makeKnownLinkObj( $nt, "{$t} <<" , $base.$o ); + } + + $s1 = $offset + 1 ; + $s2 = $s1 + $lastcount - 1 ; + $r[] = $s1 . " - " . $s2 ; + + if ( $lastcount == $limit ) { + $o = $offset + $limit ; + $t = $offset+$limit+1 ; + $r[] = $sk->makeKnownLinkObj( $nt, ">> {$t}" , $base.$o ); + } + + $r = implode ( " | " , $r ) ; + return $r ; + } + + function showUserStats( $user ) { + global $wgOut, $wgUser, $wgRequest; + $this->topicList = $this->getTopicList(); + $sk = $wgUser->getSkin(); + + $offset = $wgRequest->getVal( "offset" , 0 ); + $limit = $wgRequest->getVal( "limit" , 25 ); + $data = $this->getAllVoteLists( $user , $offset , $limit ) ; + + if( $user == $wgUser->getID() ) { + $wgOut->setPageTitle ( wfMsg ( 'val_my_stats_title' ) ); + } elseif( !User::IsIP( $user ) ) { + $wgOut->setPageTitle( wfMsg( 'val_user_stats_title', User::whoIs( $user ) ) ); + } else { + $wgOut->setPageTitle( wfMsg( 'val_user_stats_title', $user ) ); + } $ret = "" ; - $ret .= "" . wfMsg("val_revision") . " | " ; -# $ret .= "" . wfMsg("val_time") . " | " ; - foreach ( $this->topicList AS $x => $y ) - $ret .= "{$y->val_comment} | " ; - $ret .= "||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
{$url} | " ; -# $ret .= "" . wfTimestamp ( TS_DB , $ts ) . " | " ; - foreach ( $this->topicList AS $topicID => $dummy ) { - if ( isset ( $y[$topicID] ) ) { - $z = $y[$topicID] ; - if ( $z->count == 0 ) $a = 0 ; - else $a = $z->sum / $z->count ; - $ret .= sprintf ( "%1.1f (%d) | " , $a , $z->count ) ; - } else $ret .= "" ; + $ret = " |
"; + $ret .= $sk->makeKnownLinkObj( $title, $title->getEscapedText() ); + $ret .= " | |||
---|---|---|---|
"; + $ret .= $sk->makeKnownLinkObj( $title, wfMsg('val_revision_number', $revid ), "oldid={$revid}" ); + $ret .= " | "; + } + ksort( $revision ); + #$initial = true; + foreach( $revision as $topic => $rating ) { + if( !$initial ) { + $ret .= "|||
"; + } + $initial = false; + $ret .= " | " . $this->getTopicLink ( $this->topicList[$topic]->val_comment ) . " | "; + $ret .= "" . $this->getRatingText( $rating->val_value, $this->topicList[$topic]->val_value ) . " | "; + $ret .= "" . $sk->commentBlock( $rating->val_comment ) . " | "; + $ret .= "