Extension:Dynamic Article List for PHP4

From MediaWiki.org

Jump to: navigation, search
Manual on MediaWiki Extensions
List of MediaWiki Extensions
Dynamic Article List for PHP4

Release status: unknown

Implementation Tag
Description
Author(s) Shannon McNaught
Download see below

Contents

[edit] Maintainer

Shannon McNaught (smcnaught) - I am also available on irc.chekmate.org #MediaWiki

[edit] Homepage

ChekMate Technical Focus Group

[edit] License

Copyright (C) 2005  Shannon McNaught

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

[edit] Introduction

Original Code by: Zengji (11:41, 13 December 2005)

DynamicArticleList is a MediaWiki 1.5 extension. It is designed to provide add-on sort ability among all posted articles. Now five types of Dynamic Article List have been implemented.

  1. Newly Posted Articles
  2. Recently Updated Articles
  3. Recent Discussions
  4. Most Popular Articles
  5. Recent BLOG Entries

User could easily find the latest or most popular topics cross site with the help of Dynamic Article List.

Note: Most up to date version of this extension can be found at: http://www.chekmate.org/wiki/index.php/Projects

This extension is written with the help from Dynamic Page List on the MediaWiki extensions area.

[edit] Prerequisite

  • This version works with PHP4 or higher
  • Dynamic Article List strongly depends on "recentchanges" table, however MediaWiki engine 1.5.0 preiodically flushes old entries from the "recentchanges" table. It's recommended to disable the auto-deletion feature. - Open Article.php in "includes" folder, comment the line "$dbw->query( $sql )" at the start of function "editUpdates".

[edit] Installation

  • Copy DynamicArticleList.php to "extensions" folder.
  • Add a line require_once( "extensions/DynamicArticleList.php" ); into "LocalSettings.php".

[edit] Usage

[edit] Tag and its Parameters

Tag Name DynamicArticleList
Parameters title (optional) Title of the output article list
type (optional) Type of dynamic article list (new/update/discussion/hot)
count (optional) Output count of articles

Note:

  • "categoryRoot" has been removed to work with PHP4
  • All articles will be candidates.
  • The value of parameter "type" could be one of the following (default is new ):
    • new => Newly Posted Articles
    • update => Recently Updated Articles
    • discussion => Recent Discussions
    • hot => Most Popular Articles
    • blog => Recent BLOG Entries
  • The default value of "count" is 5 .

[edit] Screenshot

Image:DynamicArticleListPHP4.png

[edit] Samples

A sample snapshot of Dynamic Article List is shown below.

<DynamicArticleList>
  title=Newly Posted Articles
  type=new
  count=5
</DynamicArticleList>

When "type" is set to new ,
The output record format would be Page Title (author) - [create time]
When "type" is set to update or discussion ,
The output record format would be Page Title (last editor) - [update time]

The underlaying wiki codes are:

<DynamicArticleList>
  title=Newly Posted Articles
  type=new
  count=5 
</DynamicArticleList>

Another sample snapshot of Dynamic Article List is shown below.

<DynamicArticleList>
  title=Most Popular Articles
  type=hot
  count=5
</DynamicArticleList>

When "type" is set to hot ,
The output record format would be Page Title - (accessed times)

The underlaying wiki codes are:

<DynamicArticleList>
  title=Most Popular Articles
  type=hot
  count=5
</DynamicArticleList>

[edit] DynamicArticleList.php

<?php
/*
 * Purpose: Dynamic Output of Article List (Main Page always not in list)
 * Note: Currently support four types (new, hot, update, discussion).
 *      new             => Newly Posted Articles
 *      update          => Recently Updated Articles
 *      hot             => Most Popular Articles
 *      discussion      => Recently Updated Discussion
 * @author: Zeng Ji (zengji@gmail.com)
 *
 * To install, add following to LocalSettings.php
 * require_once ("extensions/DynamicArticleList.php");
 */
 
$wgExtensionFunctions[] = "wfDynamicArticleList";
 
function wfDynamicArticleList() {
       global $wgParser;
 
       $wgParser->setHook( "DynamicArticleList", "DynamicArticleList" );
}
 
// The callback function for converting the input text to HTML output
function DynamicArticleList( $input ) {
 
       $dbr =& wfGetDB( DB_SLAVE );
 
       // INVALIDATE CACHE
       global $wgTitle;
       $wgTitle->invalidateCache();
 
       // Default Values
       $listTitle = false;
       $listType = 'new';
       $listCount = 5;
 
// ###### PARSE PARAMETERS ######
       $aParams = explode("\n", $input);
       foreach($aParams as $sParam) {
              $aParam = explode("=", $sParam);
              if( count( $aParam ) < 2 )
                      continue;
              $sType = trim($aParam[0]);
              $sArg = trim($aParam[1]);
 
              switch ($sType) {
                     case 'title':
                              $listTitle = $sArg;
                               break;
 
                       case 'type':
                               if ( in_array($sArg, array('new','hot','update', 'discussion','blog')) )
                                        $listType = $sArg;
                               break;
 
                       case 'count':
                               $listCount = IntVal( $sArg );
                               break;
 
               }
       }
 
// ###### CHECKS ON PARAMETERS ######
       if ($listTitle!=false && strlen($listTitle)==0)
                $listTitle=false;
 
// ###### BUILD SQL QUERY ######
       $sql = genSQL($listType, $listCount);
 
// ###### PROCESS SQL QUERY ######
       global $wgUser;
       global $wgLang;
       global $wgContLang;
 
      $res = $dbr->query($sql);
      $sk =& $wgUser->getSkin();
      if ($dbr->numRows( $res ) != 0) {
                 while( $row = $dbr->fetchObject ( $res ) ) {
                          $title = Title::makeTitle( $row->namespace, $row->title);
                          if ($listType == 'discussion')
                                   $sLink = $sk->makeKnownLinkObj($title, $wgContLang->convertHtml($title->getText()), '', '', 'Discussion: ');
                          else
                                   $sLink = $sk->makeKnownLinkObj($title, $wgContLang->convertHtml($title->getText()));
 
                       // Generate 'View Count' String (for 'hot')
                       if ($listType == 'hot')
                                $aViews[] = ' - ( ' . $row->count . ' views ) ';
                       else
                                $aViews = false;
 
                       // Generate 'Time' String (for 'new', 'update', 'discussion')
                       if ($listType != 'hot') {
                                $aDates[] = ' - [ ' . $wgLang->timeanddate($row->timestamp, true) . ' ] ';
                                $editorID = $row->user;
                                if ($editorID == 0) {
                                        $editor = wfMsg('anonymous');
                                        $aEditors[] = ' (' . $editor . ')';
                                } else {
                                        $editor = User::whoIs($editorID);
                      $aEditors[] = ' ( ' . $sk->makeLink($wgContLang->getNsText(NS_USER) . ':' . $editor,
htmlspecialchars($editor)) . ' )';
                                }
                      }         else {
                                $aDates = false;
                                $aEditors = false;
                      }
 
                       if ($listType == 'blog') {
                         $aViews = false;
                         $aDates = false;
                         $aEditors = false;
                       }
                       $aArticles[] = $sLink;
               }
       }
       $dbr->freeResult( $res );
 
// ###### GENERATE OUTPUT ######
       return OutputList($aArticles, $aEditors, $aDates, $aViews, $listTitle);
}
 
function genSQL( $type, $count) {
       $dbr =& wfGetDB( DB_SLAVE );
       $sPageTable = $dbr->tableName( 'page' );
       $sRevisionTable = $dbr->tableName( 'revision' );
       $sRecentChangesTable = $dbr->tableName( 'recentchanges' );
 
 
       $sql = '';
       if ($type == 'hot') {
 
                     $sql = "
                             SELECT DISTINCT
                             page_title as title,
                             page_namespace AS namespace,
                             page_counter as count
                             FROM $sPageTable
                             WHERE page_namespace=".NS_MAIN." AND page_is_redirect=0 AND
page_id!=1 AND page_title NOT LIKE \"%Sandbox%\"
                             ORDER by count DESC
                             LIMIT $count
                     ";
 
      } elseif ($type == 'update') {
 
            // Step 1: Get revision list order by rev_id
 
                    $sql = "
                            SELECT
                             page_id,
                             MAX(rev_id) AS max_rev_id
                            FROM $sPageTable
                            INNER JOIN $sRevisionTable ON page_id=rev_page
 
                             WHERE page_is_new!=1 AND page_namespace=0 AND page_is_redirect=0
AND page_id!=1 AND page_title NOT LIKE \"%Sandbox%\"
                             GROUP BY page_id
                             ORDER by max_rev_id DESC
                             LIMIT $count
                     ";
 
             // Step 2: According to revision list, generate SQL to retrieve article page information.
             $res = $dbr->query($sql);
             $inClause = '';
             if ($dbr->numRows( $res ) == 0) {
                     $inClause = "-1";
             } else {
                     while( $obj = $dbr->fetchObject( $res ) ) {
                             if( isset( $obj->max_rev_id ) ) {
                                      $inClause .= $obj->max_rev_id . ',';
                             }
                     }
                     $inClause = substr($inClause, 0, strlen($inClause)-1);   //delete tailing ','
             }
             $dbr->freeResult( $res );
 
             $sql = "
                     SELECT
                      page_title AS title,
                      page_namespace AS namespace,
                      rev_user AS user,
                      rev_timestamp AS timestamp
                     FROM $sRevisionTable, $sPageTable
                     WHERE rev_page=page_id AND rev_id IN (". $inClause . ") AND page_title NOT LIKE \"%Sandbox%\"
                     ORDER BY rev_id DESC";
 
      } elseif ($type == 'discussion') {
 
             // Step 1: Get revision list order by rev_id.
                     $sql = "
                             SELECT
                              p1.page_id,
                              MAX(rev_id) AS max_rev_id
                             FROM $sPageTable AS p1
                             INNER JOIN $sRevisionTable ON p1.page_id=rev_page
                            WHERE p1.page_is_redirect=0 AND (p1.page_namespace=1 OR p1.page_namespace=3)
                            GROUP BY rev_page
                            ORDER by max_rev_id DESC
                            LIMIT $count
                    ";
 
            // Step 2: According to revision list, generate SQL to retrieve discussion page information.
            $res = $dbr->query($sql);
            $inClause = '';
            if ($dbr->numRows( $res ) == 0) {
                    $inClause = "-1";
            } else {
                    while( $obj = $dbr->fetchObject( $res ) ) {
                            if( isset( $obj->max_rev_id ) ) {
                                     $inClause .= $obj->max_rev_id . ',';
                            }
                    }
                    $inClause = substr($inClause, 0, strlen($inClause)-1);        //delete tailing ','
            }
            $dbr->freeResult( $res );
 
            $sql = "
                    SELECT
                     page_title AS title,
                     page_namespace AS namespace,
                     rev_user AS user,
                     rev_timestamp AS timestamp
                    FROM $sRevisionTable, $sPageTable
                    WHERE rev_page=page_id AND rev_id IN (". $inClause . ")
                    ORDER BY rev_id DESC";
 
      } elseif ($type == 'blog') {
                       $sql = "
                               SELECT DISTINCT
                                page_title AS title,
                                page_namespace AS namespace,
                                rc_user AS user,
                                rc_timestamp AS timestamp
                               FROM $sPageTable
                               INNER JOIN $sRecentChangesTable ON page_id=rc_cur_id
                               WHERE rc_new=1 AND rc_namespace=2 AND page_is_redirect=0 AND
page_id!=1
AND page_title LIKE '%BlogEntry%'
 
                               ORDER by rc_id DESC
                               LIMIT $count
                      ";
 
      }     else { // default type is 'new'
 
                       $sql = "
                               SELECT DISTINCT
                                page_title AS title,
                                page_namespace AS namespace,
                                rc_user AS user,
                                rc_timestamp AS timestamp
                               FROM $sPageTable
                               INNER JOIN $sRecentChangesTable ON page_id=rc_cur_id
                               WHERE rc_new=1 AND rc_namespace=0 AND page_is_redirect=0 AND
page_id!=1
                               ORDER by rc_id DESC
                               LIMIT $count
                      ";
       }
 
       return $sql;
}
 
function OutputList ( $aArticles, $aEditors, $aDates, $aViews, $listTitle ) {
       if ($listTitle != false) {
                $r .= " <h3>" . $listTitle . "</h3>\n";
                $r .= " <hr/>\n";
       }
 
       $sStartList = '<ul>';
       $sEndList = '</ul>';
       $sStartItem = '<li>';
       $sEndItem = '</li>';
 
       $r .= $sStartList . "\n";
       for ($i=0; $i<count($aArticles); $i++) {
               $editorString = "";
               $dateString = "";
               $viewString = "";
               if ($aEditors != false)
                 $editorString = "<font size=-2>" . $aEditors[$i] . "</font>";
               if ($aDates != false)
                 $dateString = "<font size=-2>" . $aDates[$i] . "</font>";
               if ($aViews != false)
                 $viewString = "<font size=-2>" . $aViews[$i] . "</font>";
               $r .= $sStartItem . $aArticles[$i] . $viewString ."<br>". $editorString . $dateString . $sEndItem . "\n";
       }
       $r .= $sEndList . "\n";
 
       return $r;
}
?>

[edit] Other sites using this extension

Personal tools