Index: DynamicPageList.php =================================================================== RCS file: /cvsroot/wikipedia/extensions/intersection/DynamicPageList.php,v retrieving revision 1.9 diff -u -r1.9 DynamicPageList.php --- DynamicPageList.php 26 Aug 2005 17:59:22 -0000 1.9 +++ DynamicPageList.php 2 Dec 2005 22:00:25 -0000 @@ -6,9 +6,11 @@ of several categories. - Contributors: n:en:User:IlyaHaykinson n:en:User:Amgine + Contributors: + n:en:User:IlyaHaykinson n:en:User:Amgine w:de:Benutzer:Unendlich http://en.wikinews.org/wiki/User:Amgine http://en.wikinews.org/wiki/User:IlyaHaykinson + http://de.wikipedia.org/wiki/Benutzer:Unendlich 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 @@ -26,13 +28,13 @@ http://www.gnu.org/copyleft/gpl.html Current feature request list - 1. Unset cached of calling page - 2. Alternative formatting (not just unordered list) - 3. Configurable sort order, ascending/descending - 4. RSS feed output? + 1. RSS feed output? To install, add following to LocalSettings.php include("extensions/intersection/DynamicPageList.php"); +* +@module DynamicPageList +@version $ID 2.0$ */ @@ -56,330 +58,436 @@ global $wgParser, $wgMessageCache; $wgMessageCache->addMessages( array( - 'dynamicpagelist_toomanycats' => 'DynamicPageList: Too many categories!', - 'dynamicpagelist_toofewcats' => 'DynamicPageList: Too few categories!', - 'dynamicpagelist_noresults' => 'DynamicPageList: No results!', - 'dynamicpagelist_noincludecats' => 'DynamicPageList: You need to include at least one category, or specify a namespace!', + 'dynamicpagelist_toomanycats' => 'DynamicPageList: Too many categories!', + 'dynamicpagelist_toofewcats' => 'DynamicPageList: Too few categories!', + 'dynamicpagelist_noresults' => 'DynamicPageList: No results!', + 'dynamicpagelist_noincludecats' => 'DynamicPageList: You need to include at least one category, or specify a namespace!', + 'dynamicpagelist_noincludedcatsbutcatdate' => 'DynamicPageList: You need to include at least one category to use \'addfirstcategorydate=true\' or \'ordermethod=categoryadd\'!', + 'dynamicpagelist_morethanonecatbutcatdate' => 'DynamicPageList: If you include more than one category you cannot use \'addfirstcategorydate=true\' or \'ordermethod=categoryadd\'!', + 'dynamicpagelist_catoutputwithwrongordermethod' => 'DynamicPageList: You need to use \'ordermethod=title\' when using category-style output!', + ) ); $wgParser->setHook( "DynamicPageList", "DynamicPageList" ); } - -// The callback function for converting the input text to HTML output -function DynamicPageList( $input ) { - global $wgUser; - global $wgLang; - global $wgContLang; - global $wgDLPminCategories, $wgDLPmaxCategories,$wgDLPMinResultCount, $wgDLPMaxResultCount; - global $wgDLPAllowUnlimitedResults, $wgDLPAllowUnlimitedCategories; - - $aParams = array(); - $bCountSet = false; - - $sStartList = ''; - $sStartItem = '
  • '; - $sEndItem = '
  • '; - - $sOrderMethod = 'categoryadd'; - $sOrder = 'descending'; - $sRedirects = 'exclude'; - - $bNamespace = false; - $iNamespace = 0; - - $bSuppressErrors = false; - $bShowNamespace = true; - $bAddFirstCategoryDate = false; - - $aParams = explode("\n", $input); - - foreach($aParams as $sParam) - { - $aParam = explode("=", $sParam); - if( count( $aParam ) < 2 ) - continue; - $sType = trim($aParam[0]); - $sArg = trim($aParam[1]); - if ($sType == 'category') - { - $title = Title::newFromText( $sArg ); - if( is_null( $title ) ) - continue; - $aCategories[] = $title; - } - else if ($sType == 'notcategory') - { - $title = Title::newFromText( $sArg ); - if( is_null( $title ) ) - continue; - $aExcludeCategories[] = $title; - } - else if ('namespace' == $sType) - { - $ns = $wgContLang->getNsIndex($sArg); - if (NULL != $ns) - { - $iNamespace = $ns; - $bNamespace = true; - } - else - { - $iNamespace = intval($sArg); - if ($iNamespace >= 0) - { - $bNamespace = true; - } - else - { - $bNamespace = false; - } - } - } - else if ('count' == $sType) - { - //ensure that $iCount is a number; - $iCount = IntVal( $sArg ); - $bCountSet = true; - } - else if ('mode' == $sType) - { - switch ($sArg) - { - case 'none': - $sStartList = ''; - $sEndList = ''; - $sStartItem = ''; - $sEndItem = '
    '; - break; - case 'ordered': - $sStartList = '
      '; - $sEndList = '
    '; - $sStartItem = '
  • '; - $sEndItem = '
  • '; - break; - case 'unordered': - default: - $sStartList = ''; - $sStartItem = '
  • '; - $sEndItem = '
  • '; - break; - } - } - else if ('order' == $sType) - { - switch ($sArg) - { - case 'ascending': - $sOrder = 'ascending'; - break; - case 'descending': - default: - $sOrder = 'descending'; - break; - } - } - else if ('ordermethod' == $sType) - { - switch ($sArg) - { - case 'lastedit': - $sOrderMethod = 'lastedit'; - break; - case 'categoryadd': - default: - $sOrderMethod = 'categoryadd'; - break; - } - } - else if ('redirects' == $sType) - { - switch ($sArg) - { - case 'include': - $sRedirects = 'include'; - break; - case 'only': - $sRedirects = 'only'; - break; - case 'exclude': - default: - $sRedirects = 'exclude'; - break; - } - } - else if ('suppresserrors' == $sType) - { - if ('true' == $sArg) - $bSuppressErrors = true; - else - $bSuppressErrors = false; - } - else if ('addfirstcategorydate' == $sType) - { - if ('true' == $sArg) - $bAddFirstCategoryDate = true; - else - $bAddFirstCategoryDate = false; - } - else if ('shownamespace' == $sType) - { - if ('false' == $sArg) - $bShowNamespace = false; - else - $bShowNamespace = true; - } - } - $iCatCount = count($aCategories); - $iExcludeCatCount = count($aExcludeCategories); - $iTotalCatCount = $iCatCount + $iExcludeCatCount; - - if ($iCatCount < 1 && false == $bNamespace) - { - if (false == $bSuppressErrors) - return htmlspecialchars( wfMsg( 'dynamicpagelist_noincludecats' ) ); // "!!no included categories!!"; - else - return ''; - } - - if ($iTotalCatCount < $wgDLPminCategories) - { - if (false == $bSuppressErrors) - return htmlspecialchars( wfMsg( 'dynamicpagelist_toofewcats' ) ); // "!!too few categories!!"; - else - return ''; - } - - if ( $iTotalCatCount > $wgDLPmaxCategories && !$wgDLPAllowUnlimitedCategories ) - { - if (false == $bSuppressErrors) - return htmlspecialchars( wfMsg( 'dynamicpagelist_toomanycats' ) ); // "!!too many categories!!"; - else - return ''; - } - - if ($bCountSet) - { - if ($iCount < $wgDLPMinResultCount) - $iCount = $wgDLPMinResultCount; - if ($iCount > $wgDLPMaxResultCount) - $iCount = $wgDLPMaxResultCount; - } - else - { - if (!$wgDLPAllowUnlimitedResults) - { - $iCount = $wgDLPMaxResultCount; - $bCountSet = true; - } - } - - //disallow showing date if the query doesn't have an inclusion category parameter - if ($iCatCount < 1) - $bAddFirstCategoryDate = false; - - - //build the SQL query - $dbr =& wfGetDB( DB_SLAVE ); - $sPageTable = $dbr->tableName( 'page' ); - $categorylinks = $dbr->tableName( 'categorylinks' ); - $sSqlSelectFrom = "SELECT page_namespace, page_title, c1.cl_timestamp FROM $sPageTable"; - - if (true == $bNamespace) - $sSqlWhere = ' WHERE page_namespace='.$iNamespace.' '; - else - $sSqlWhere = ' WHERE 1=1 '; - - switch ($sRedirects) - { - case 'only': - $sSqlWhere .= ' AND page_is_redirect = 1 '; - break; - case 'exclude': - $sSqlWhere .= ' AND page_is_redirect = 0 '; - break; - } - - $iCurrentTableNumber = 0; - - for ($i = 0; $i < $iCatCount; $i++) { - $sSqlSelectFrom .= " INNER JOIN $categorylinks AS c" . ($iCurrentTableNumber+1); - $sSqlSelectFrom .= ' ON page_id = c'.($iCurrentTableNumber+1).'.cl_from'; - $sSqlSelectFrom .= ' AND c'.($iCurrentTableNumber+1).'.cl_to='. - $dbr->addQuotes( $aCategories[$i]->getDbKey() ); - - $iCurrentTableNumber++; - } + /* ** + * function: setParams + * ** + * Purpose: constructor, parse parameters + * parameters + * aCategories ARRAY category names + * aExcludeCategories ARRAY notcategory names + * bShowNamespace BOOL true = show namespace in link + * bNamespace BOOL true = only from namespace + * iNamspace INTEGER namespace id + * sOrder STRING sorting direction + * sOrderMethod STRING method of sorting to use + * bSuppressErrors BOOL true = do not return errors + * sRedirects STRING show, show only, or exclude redirects + * bAddFirstCategoryDate BOOL display date added to 1st category + * sStartList STRING HTML list type opening tag + * sEndList STRING HTML list type closing tag + * sStartItem STRING HTML list item opening tag + * sEndItem STRING HTML list item closing tag + * iCatCount INTEGER count of include categories + * iExcludeCatCount INTEGER count of exclued categories + * iTotalCatCount INTEGER count of both included and excluded + * bCountSet BOOL true = final category count determined + * iCount INTEGER total categories + * ** + * @param STRING $input + * @return ARRAY $aParameters + * ** */ +function setParams ( $input ) { + // Globals + global $wgContLang, $wgDLPminCategories; + global $wgDLPmaxCategories, $wgDLPMinResultCount, $wgDLPMaxResultCount; + global $wgDLPAllowUnlimitedResults, $wgDLPAllowUnlimitedCategories; + + $aParameters = array( + 'aCategories' => array(), + 'aExcludeCategories' => array(), + 'bShowNamespace' => true, + 'aNamespace' => array(), + 'abNamespace' => array(), + 'sOrder' => 'descending', + 'sOrderMethod' => 'lastedit', + 'bSuppressErrors' => false, + 'sRedirects' => 'exclude', + 'bAddFirstCategoryDate' => false, + 'sStartList' => '', + 'sStartItem' => '
  • ', + 'sEndItem' => '
  • ' + ); + + $aParams = explode("\n", $input); + + // Loop through passed parameters + foreach ($aParams as $sParam) { + $aParam = explode('=', $sParam); + + // if improper, skip + if ( count( $aParam ) < 2 ) continue; - for ($i = 0; $i < $iExcludeCatCount; $i++) { - $sSqlSelectFrom .= " LEFT OUTER JOIN $categorylinks AS c" . ($iCurrentTableNumber+1); - $sSqlSelectFrom .= ' ON page_id = c'.($iCurrentTableNumber+1).'.cl_from'; - $sSqlSelectFrom .= ' AND c'.($iCurrentTableNumber+1).'.cl_to='. - $dbr->addQuotes( $aExcludeCategories[$i]->getDbKey() ); + $sType = trim($aParam[0]); + $sArg = trim($aParam[1]); + + switch ( $sType ) { + case 'category': + $aCats = explode(',', $sArg); + $aaCats = array(); + foreach($aCats as $sParam) { + $sParam=trim($sParam); + $title = Title::newFromText( $sParam ); + if( $title != NULL ) $aaCats[] = $title; + } + if (!empty($aaCats)) $aParameters['aCategories'][] = $aaCats; + break; + case 'notcategory': + $title = Title::newFromText( $sArg ); + // if not a real category, skip + if( is_null( $title ) ) continue; + $aParameters['aExcludeCategories'][] = $title; + break; + case 'namespace': + $aNS = explode(',', $sArg); + if (count($aNS)) { + // If second namespace assignment, reset the array + $aParameters['aNamespace'] = array(); + $aParameters['abNamespace'] = array(); + foreach ($aNS as $key => $sNS) { + $sNS = trim($sNS); + // check valid namespace value + $ns = $wgContLang->getNsIndex($sNS); + if (NULL != $ns) { + $aParameters['aNamespace'][$key] = $ns; + $aParameters['abNamespace'][$key] = true; + } else { + $aParameters['aNamespace'][$key] = intval($sNS); + if ($aParameters['aNamespace'][$key] >= 0) { + $aParameters['abNamespace'][$key] = true; + } else { + $aParameters['abNamespace'][$key] = false; + } + } + } + } + break; + case 'shownamespace': + if ('false' == $sArg) $aParameters['bShowNamespace'] = false; + else $aParameters['bShowNamespace'] = true; + break; + case 'mode': + switch ($sArg) { + case 'none': + $aParameters['sStartList'] = ''; + $aParameters['sEndList'] = ''; + $aParameters['sStartItem'] = ''; + $aParameters['sEndItem'] = '
    '; + $aParameters['bLastEndItem'] = false; + break; + case 'inline': + $aParameters['sStartList'] = ''; + $aParameters['sEndList'] = ''; + $aParameters['sStartItem'] = ''; + $aParameters['sEndItem'] = ' - '; + $aParameters['bLastEndItem'] = false; + break; + case 'ordered': + $aParameters['sStartList'] = '
      '; + $aParameters['sEndList'] = '
    '; + $aParameters['sStartItem'] = '
  • '; + $aParameters['sEndItem'] = '
  • '; + $aParameters['bLastEndItem'] = true; + break; + case 'unordered': + default: + $aParameters['sStartList'] = ''; + $aParameters['sStartItem'] = '
  • '; + $aParameters['sEndItem'] = '
  • '; + $aParameters['bLastEndItem'] = true; + } + break; + case 'order': + switch ($sArg) { + case 'ascending': + $aParameters['sOrder'] = 'ascending'; + break; + case 'descending': + default: + $aParameters['sOrder'] = 'descending'; + } + break; + case 'ordermethod': + switch ($sArg) { + case 'lastedit': + $aParameters['sOrderMethod'] = 'lastedit'; + break; + case 'categoryadd': + default: + $aParameters['sOrderMethod'] = 'categoryadd'; + } + break; + case 'count': + $aParameters['iCount'] = IntVal( $sArg ); + $aParameters['bCountSet'] = true; + break; + case 'suppresserrors': + if ('true' == $sArg) $aParameters['bSuppressErrors'] = true; + else $aParameters['bSuppressErrors'] = false; + break; + case 'redirects': + switch ($sArg) { + case 'include': + $aParameters['sRedirects'] = 'include'; + break; + case 'only': + $aParameters['sRedirects'] = 'only'; + break; + case 'exclude': + default: + $aParameters['sRedirects'] = 'exclude'; + } + break; + case 'addfirstcategorydate': + if ('true' == $sArg) $aParameters['bAddFirstCategoryDate'] = true; + else $aParameters['bAddFirstCategoryDate'] = false; + break; + default: + } + } - $sSqlWhere .= ' AND c'.($iCurrentTableNumber+1).'.cl_to IS NULL'; + // Calculate and check category counts against configuration limits + + $aParameters['iCatCount'] = count($aParameters['aCategories']); + $aParameters['iTotalIncludeCatCount'] = count($aParameters['aCategories'], COUNT_RECURSIVE) - $aParameters['iCatCount']; + $aParameters['iExcludeCatCount'] = count($aParameters['aExcludeCategories']); + $aParameters['iTotalCatCount'] = $aParameters['iCatCount'] + $aParameters['iExcludeCatCount']; + + // 'DynamicPageList: You need to include at least one category, or specify a namespace!' + if ($aParameters['iCatCount'] < 1 && !count($aParameters['abNamespace'])) { + if (false == $aParameters['bSuppressErrors']) { + return htmlspecialchars( wfMsg( 'dynamicpagelist_noincludecats' ) ); + } else return ''; + } + + // 'DynamicPageList: Too few categories!' + if ($aParameters['iTotalIncludeCatCount'] < $wgDLPminCategories && !count($aParameters['abNamespace'])) { + if (false == $aParameters['bSuppressErrors']) { + echo $aParameters['iTotalIncludeCatCount'], $wgDLPminCategories; + return htmlspecialchars( wfMsg( 'dynamicpagelist_toofewcats' ) ); + } else return ''; + } + // 'DynamicPageList: Too many categories!' + if ( $aParameters['iTotalCatCount'] > $wgDLPmaxCategories && !$wgDLPAllowUnlimitedCategories ) { + if (false == $aParameters['bSuppressErrors']) + return htmlspecialchars( wfMsg( 'dynamicpagelist_toomanycats' ) ); + else return ''; + } + // DynamicPageList: You need to include at least one category to use \'addfirstcategorydate=true\' or \'ordermethod=categoryadd\'! + if ( $aParameters['iCatCount'] == 0 && ($aParameters['sOrderMethod'] == 'categoryadd' || $aParameters['bAddFirstCategoryDate'] == true) ) { + if (false == $aParameters['bSuppressErrors']) + return htmlspecialchars( wfMsg( 'dynamicpagelist_noincludedcatsbutcatdate' ) ); + else return ''; + } + // DynamicPageList: If you include more than one category you cannot use \'addfirstcategorydate=true\' or \'ordermethod=categoryadd\'! + if ($aParameters['iTotalCatCount'] > 1 && ($aParameters['sOrderMethod'] == 'categoryadd' || $aParameters['bAddFirstCategoryDate'] == true) ) { + if (false == $aParameters['bSuppressErrors']) + return htmlspecialchars( wfMsg( 'dynamicpagelist_morethanonecatbutcatdate' ) ); + else return ''; + } + // DynamicPageList: You need to use \'ordermethod=title\' when using category-style output! + if ($aParameters['sOutputMode'] == 'category' && $aParameters['sOrderMethod'] != 'title') { + if (false == $aParameters['bSuppressErrors']) + return htmlspecialchars( wfMsg( 'dpl2_catoutputwithwrongordermethod' ) ); + else return ''; + } + + if ($aParameters['bCountSet']) { + if ($aParameters['iCount'] < $wgDLPMinResultCount) $aParameters['iCount'] = $wgDLPMinResultCount; + if ($aParameters['iCount'] > $wgDLPMaxResultCount) $aParameters['iCount'] = $wgDLPMaxResultCount; + } else { + if (!$wgDLPAllowUnlimitedResults) { + $aParameters['iCount'] = $wgDLPMaxResultCount; + $aParameters['bCountSet'] = true; + } + } + + // prevent display of date when no include category defined + if ($aParameters['iCatCount'] < 1) $aParameters['bAddFirstCategoryDate'] = false; + + return $aParameters; +} + +/* ** + * function: BuildSQL + * ** + * Purpose: build the necessary SQL statement for the given parameters + * ** + * @return STRING SQL query + * ** */ +function BuildSQL ( $aParameters ) { + // Globals + + $dbr =& wfGetDB( DB_SLAVE ); - $iCurrentTableNumber++; + //build the SQL query + $sPageTable = $dbr->tableName( 'page' ); + $categorylinks = $dbr->tableName( 'categorylinks' ); + if ($aParameters['iTotalIncludeCatCount'] == 1) + $sSqlSelectFrom = "SELECT DISTINCT page_namespace, page_touched, page_title, c1.cl_timestamp FROM $sPageTable"; + else + $sSqlSelectFrom = "SELECT DISTINCT page_namespace, page_touched, page_title FROM $sPageTable"; + + // Set the selectfrom + $iCurrentTableNumber = 0; + + for ($i = 0; $i < $aParameters['iCatCount']; $i++) { + $sSqlSelectFrom .= " INNER JOIN $categorylinks AS c" . ($iCurrentTableNumber+1); + $sSqlSelectFrom .= ' ON page_id = c'.($iCurrentTableNumber+1).'.cl_from'; + $sSqlSelectFrom .= ' AND (c'.($iCurrentTableNumber+1).'.cl_to='. $dbr->addQuotes( $aParameters['aCategories'][$i][0]->getDbKey() ); + for ($j = 1; $j < count($aParameters['aCategories'][$i]); $j++) { + $sSqlSelectFrom .= ' OR c' . ($iCurrentTableNumber+1) . '.cl_to=' . $dbr->addQuotes( $aParameters['aCategories'][$i][$j]->getDbKey() ); + } + $sSqlSelectFrom .= ') '; + $iCurrentTableNumber++; } + + // if namespace + $i = count($aParameters['abNamespace']); + if ($i > 0) { + $sSqlWhere = ' WHERE (page_namespace=' . $aParameters['aNamespace'][0] . ' '; + if ($i > 1) { + for ($i = 1; $i < count($aParameters['aNamespace']); $i++ ) { + if (true == $aParameters['abNamespace'][$i]) + $sSqlWhere .= ' OR page_namespace=' . $aParameters['aNamespace'][$i]; + } + } + $sSqlWhere .= ') '; + } + // if only or exclude redirects... + switch ($aParameters['sRedirects']) { + case 'only': + if (isset($sSqlWhere)) $sSqlWhere .= ' AND page_is_redirect = 1 '; + else $sSqlWhere = ' WHERE page_is_redirect = 1 '; + break; + case 'exclude': + if (isset($sSqlWhere)) $sSqlWhere .= ' AND page_is_redirect = 0 '; + else $sSqlWhere = ' WHERE page_is_redirect = 0 '; + break; + } + if (!isset($sSqlWhere)) $sSqlWhere = ' WHERE 1=1 '; + + for ($i = 0; $i < $aParameters['iExcludeCatCount']; $i++) { + $sSqlSelectFrom .= " LEFT OUTER JOIN $categorylinks AS c" . ($iCurrentTableNumber+1); + $sSqlSelectFrom .= ' ON page_id = c'.($iCurrentTableNumber+1).'.cl_from'; + $sSqlSelectFrom .= ' AND c'.($iCurrentTableNumber+1).'.cl_to='. + $dbr->addQuotes( $aParameters['aExcludeCategories'][$i]->getDbKey() ); + + $sSqlWhere .= ' AND c'.($iCurrentTableNumber+1).'.cl_to IS NULL'; + + $iCurrentTableNumber++; + } + + // Set the sort method, direction + switch ($aParameters['sOrderMethod']) { + case 'lastedit': + $sSqlWhere .= ' ORDER BY page_touched '; + break; + case 'categoryadd': + $sSqlWhere .= ' ORDER BY c1.cl_timestamp '; + break; + case 'title': + default: + $sSqlWhere .= ' ORDER BY page_title '; + break; + } + + if ('descending' == $aParameters['sOrder']) $sSqlWhere .= 'DESC'; + else $sSqlWhere .= 'ASC'; + + // if count parameter set + if ($aParameters['bCountSet']) $sSqlWhere .= ' LIMIT ' . $aParameters['iCount']; - if ('descending' == $sOrder) - $sSqlOrder = 'DESC'; - else - $sSqlOrder = 'ASC'; - - if ('lastedit' == $sOrderMethod) - $sSqlWhere .= ' ORDER BY page_touched '; - else - $sSqlWhere .= ' ORDER BY c1.cl_timestamp '; - - $sSqlWhere .= $sSqlOrder; - - if ($bCountSet) - { - $sSqlWhere .= ' LIMIT ' . $iCount; - } + return $sSqlSelectFrom . $sSqlWhere; +} - //DEBUG: output SQL query - //$output .= 'QUERY: [' . $sSqlSelectFrom . $sSqlWhere . "]
    "; +function processQuery ( $sSql, $aParameters ) { + // Globals + global $wgUser, $wgLang; + + $dbr =& wfGetDB( DB_SLAVE ); + + //DEBUG: output SQL query + $output .= "QUERY: [{$sSql}]

    "; // process the query - $res = $dbr->query($sSqlSelectFrom . $sSqlWhere); + $res = $dbr->query($sSql); $sk =& $wgUser->getSkin(); - if ($dbr->numRows( $res ) == 0) - { - if (false == $bSuppressErrors) - return htmlspecialchars( wfMsg( 'dynamicpagelist_noresults' ) ); - else - return ''; + // if no results returned + if ($dbr->numRows( $res ) == 0) { + if (false == $aParameters['bSuppressErrors']) + return $output . htmlspecialchars( wfMsg( 'dynamicpagelist_noresults' ) ); + else return ''; } + - //start unordered list - $output .= $sStartList . "\n"; + // Display the output + //start list + $output .= $aParameters['sStartList'] . "\n"; //process results of query, outputing equivalent of
  • [[Article]]
  • for each result, //or something similar if the list uses other startlist/endlist while ($row = $dbr->fetchObject( $res ) ) { - $title = Title::makeTitle( $row->page_namespace, $row->page_title); - $output .= $sStartItem; - if (true == $bAddFirstCategoryDate) - $output .= $wgLang->date($row->cl_timestamp) . ': '; - - if (true == $bShowNamespace) - $output .= $sk->makeKnownLinkObj($title); - else - $output .= $sk->makeKnownLinkObj($title, htmlspecialchars($title->getText())); - $output .= $sEndItem . "\n"; + $title = Title::makeTitle( $row->page_namespace, $row->page_title); + $output .= $aParameters['sStartItem']; + if (true == $aParameters['bAddFirstCategoryDate']) + $output .= $wgLang->date($row->cl_timestamp) . ': '; + + if (true == $aParameters['bShowNamespace']) + $output .= $sk->makeKnownLinkObj($title); + else + $output .= $sk->makeKnownLinkObj($title, htmlspecialchars($title->getText())); + $output .= $aParameters['sEndItem'] . "\n"; } //end unordered list - $output .= $sEndList . "\n"; + $output .= $aParameters['sEndList'] . "\n"; + + return $output; - return $output; +} + +// The callback function for converting the input text to HTML output +function DynamicPageList( $input ) { + + // Disable page cache + global $wgTitle; + $dbw =& wfGetDB( DB_MASTER ); + $dbw->update( 'page', array( 'page_touched' => $dbw->timestamp( time() + 120 )), + array( + 'page_namespace' => $wgTitle->getNamespace(), + 'page_title' => $wgTitle->getDBkey() + ), 'DynamicPageList' + ); + + // parse the parameters + $aParameters = setParams( $input ); + if (!is_array($aParameters)) return $aParameters; + + // build the query + $sSql = BuildSql( $aParameters ); + + // Get output + $output = processQuery( $sSql, $aParameters ); + + return $output; } ?>