Difference between revisions of "Extension:SearchLog.php"
(Extension:SearchLog.php moved to Foo:SearchLog.php) |
(1.0.6 - fix index problem) |
||
Line 1: | Line 1: | ||
− | # | + | <?php |
+ | # Extension:SearchLog{{php}}{{Category:Extensions|SearchLog}} | ||
+ | # - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html) | ||
+ | # - Author: [http://www.organicdesign.co.nz/nad User:Nad] | ||
+ | # - Started: 2007-05-16 | ||
+ | |||
+ | if (!defined('MEDIAWIKI')) die('Not an entry point.'); | ||
+ | |||
+ | define('SEARCHLOG_VERSION','1.0.6, 2007-12-09'); | ||
+ | |||
+ | $wgSearchLogPath = dirname(__FILE__); | ||
+ | $wgSearchLogFile = "$wgSearchLogPath/logs/".ereg_replace('^www.','',$_SERVER['SERVER_NAME']); | ||
+ | $wgSearchLogEntireLog = 'Entire log'; # Should be a message | ||
+ | $wgSearchLogDateFormat = '%b %Y'; | ||
+ | $wgSearchLogReportHeading = "Search keywords used over '''\$1''' period"; # Should be a message | ||
+ | $wgSearchLogGroup = ''; # restrict viewing to a particular group by setting this | ||
+ | $wgExtensionFunctions[] = 'wfSetupSearchLog'; | ||
+ | |||
+ | $wgExtensionCredits['specialpage'][] = array( | ||
+ | 'name' => 'Special:SearchLog', | ||
+ | 'author' => '[http://www.organicdesign.co.nz/nad User:Nad]', | ||
+ | 'description' => 'Logs usage of the search box and allows reporting of keyword totals during given time periods', | ||
+ | 'url' => 'http://www.mediawiki.org/wiki/Extension:SearchLog', | ||
+ | 'version' => SEARCHLOG_VERSION | ||
+ | ); | ||
+ | |||
+ | require_once "$IP/includes/SpecialPage.php"; | ||
+ | |||
+ | class SpecialSearchLog extends SpecialPage { | ||
+ | |||
+ | # Constructor | ||
+ | function SpecialSearchLog() { | ||
+ | global $wgSearchLogGroup; | ||
+ | SpecialPage::SpecialPage('SearchLog',$wgSearchLogGroup); | ||
+ | } | ||
+ | |||
+ | # Override SpecialPage::execute() | ||
+ | function execute() { | ||
+ | global $wgOut,$wgSearchLogFile,$wgSearchLogEntireLog,$wgSearchLogReportHeading,$wgSearchLogDateFormat; | ||
+ | $this->setHeaders(); | ||
+ | $title = Title::makeTitle(NS_SPECIAL,'SearchLog'); | ||
+ | $period = isset($_REQUEST['period']) ? $_REQUEST['period'] : false; | ||
+ | $error = ''; | ||
+ | |||
+ | # Get the dates of the first and last entries for the dropdown list range | ||
+ | if ($fh = fopen($wgSearchLogFile,'r')) { | ||
+ | if (ereg('^([0-9]{4})([0-9]{2})[0-9]{2},',fread($fh,16),$match)) list(,$y1,$m1) = $match; | ||
+ | $len = fstat($fh); | ||
+ | $len = $len['size'] % 1024; | ||
+ | fseek($fh,-$len,SEEK_END); | ||
+ | $end = explode("\n",fread($fh,$len)); | ||
+ | $end = $end[count($end)-2]; | ||
+ | if (ereg('^([0-9]{4})([0-9]{2})[0-9]{2},',$end,$match)) list(,$y2,$m2) = $match; | ||
+ | fclose($fh); | ||
+ | } | ||
+ | |||
+ | # Construct a list of months if first and last successfully obtained | ||
+ | $months = ''; | ||
+ | if ($y1 && $y2) while (($y1*100+$m1) <= ($y2*100+$m2)) { | ||
+ | $p = strftime($wgSearchLogDateFormat,mktime(0,0,0,$m1,1,$y1)); | ||
+ | $selected = $p == $period ? ' selected' : ''; | ||
+ | $months .= "<option$selected>$p</option>\n"; | ||
+ | if ($m1 == 12) { $m1 = 1; $y1++; } else $m1++; | ||
+ | } | ||
+ | |||
+ | # Render the months as a dropdown-list | ||
+ | $wgOut->addHTML( | ||
+ | wfElement('form',array('action' => $title->getLocalURL('action=submit'),'method' => 'POST'),null) | ||
+ | . "Select time period: <select name=\"period\"><option>$wgSearchLogEntireLog</option>$months</select>" | ||
+ | . wfElement('input',array('type' => 'submit')) | ||
+ | . '</form>' | ||
+ | ); | ||
+ | |||
+ | # Generate a report if a period was specified | ||
+ | if ($period === false) $period = $wgSearchLogEntireLog; | ||
+ | if ($period) { | ||
+ | $heading = str_replace('$1',$period,$wgSearchLogReportHeading); | ||
+ | $wgOut->addWikiText("== $heading ==",true); | ||
+ | if ($fh = fopen($wgSearchLogFile,'r')) { | ||
+ | |||
+ | # Scan the file and sum the search phrases over the period | ||
+ | $total = array(); | ||
+ | while (!feof($fh)) { | ||
+ | if (preg_match('/^([0-9]{4})([0-9]{2})([0-9]{2}),(.+?),(.+?),(.+?),(.+)$/',fgets($fh),$match)) { | ||
+ | list(,$y,$m,$d,$time,$user,$type,$phrase) = $match; | ||
+ | $p = strftime($wgSearchLogDateFormat,mktime(0,0,0,$m,1,$y)); | ||
+ | $i = strtolower(trim($phrase)); | ||
+ | if ($period == $wgSearchLogEntireLog || $period == $p) $total[$i] = isset($total[$i]) ? $total[$i]++ : 1; | ||
+ | } | ||
+ | } | ||
+ | fclose($fh); | ||
+ | |||
+ | # Render the totals in a table | ||
+ | $table = "\n<table class=\"sortable\" id=\"searchlog\">\n"; | ||
+ | $table .= "<tr><th>Search phrase</th><th>Number of occurences during period</th></tr>"; | ||
+ | foreach ($total as $k => $v) $table .= "<tr><td>$k</td><td>$v</td></tr>\n"; | ||
+ | $table .= "</table>\n"; | ||
+ | |||
+ | } else $error = "Couldn't open log file <tt>$wgSearchLogFile</tt>"; | ||
+ | if ($error) $wgOut->addWikiText($error,true); | ||
+ | else $wgOut->addWikiText($table,true); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | # Called from $wgExtensionFunctions array when initialising extensions | ||
+ | function wfSetupSearchLog() { | ||
+ | global $wgLanguageCode,$wgMessageCache,$wgSearchLogFile,$wgUser; | ||
+ | |||
+ | # If a search has been posted, log the info | ||
+ | if (isset($_REQUEST['search'])) { | ||
+ | $search = $_REQUEST['search']; | ||
+ | if (isset($_REQUEST['fulltext'])) $type = 'fulltext'; | ||
+ | elseif (isset($_REQUEST['go'])) $type = 'go'; | ||
+ | else $type = 'other'; | ||
+ | |||
+ | # Append the data to the file | ||
+ | if (empty($search)) $search = $_REQUEST[$type]; | ||
+ | if ($fh = fopen($wgSearchLogFile,'a')) { | ||
+ | $text = date('Ymd,H:i:s,').$wgUser->getName().",$type,$search"; | ||
+ | fwrite($fh,"$text\n"); | ||
+ | fclose($fh); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | # Add the messages used by the specialpage | ||
+ | $wgMessageCache->addMessages(array('searchlog' => 'Search Log')); | ||
+ | |||
+ | # Add the specialpage to the environment | ||
+ | SpecialPage::addPage(new SpecialSearchLog()); | ||
+ | } | ||
+ | ?> |
Revision as of 21:39, 8 December 2007
<?php
- Extension:SearchLogTemplate:Php
- - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
- - Author: User:Nad
- - Started: 2007-05-16
if (!defined('MEDIAWIKI')) die('Not an entry point.');
define('SEARCHLOG_VERSION','1.0.6, 2007-12-09');
$wgSearchLogPath = dirname(__FILE__); $wgSearchLogFile = "$wgSearchLogPath/logs/".ereg_replace('^www.',,$_SERVER['SERVER_NAME']); $wgSearchLogEntireLog = 'Entire log'; # Should be a message $wgSearchLogDateFormat = '%b %Y'; $wgSearchLogReportHeading = "Search keywords used over \$1 period"; # Should be a message $wgSearchLogGroup = ; # restrict viewing to a particular group by setting this $wgExtensionFunctions[] = 'wfSetupSearchLog';
$wgExtensionCredits['specialpage'][] = array( 'name' => 'Special:SearchLog', 'author' => 'User:Nad', 'description' => 'Logs usage of the search box and allows reporting of keyword totals during given time periods', 'url' => 'http://www.mediawiki.org/wiki/Extension:SearchLog', 'version' => SEARCHLOG_VERSION );
require_once "$IP/includes/SpecialPage.php";
class SpecialSearchLog extends SpecialPage {
# Constructor function SpecialSearchLog() { global $wgSearchLogGroup; SpecialPage::SpecialPage('SearchLog',$wgSearchLogGroup); }
# Override SpecialPage::execute() function execute() { global $wgOut,$wgSearchLogFile,$wgSearchLogEntireLog,$wgSearchLogReportHeading,$wgSearchLogDateFormat; $this->setHeaders(); $title = Title::makeTitle(NS_SPECIAL,'SearchLog'); $period = isset($_REQUEST['period']) ? $_REQUEST['period'] : false; $error = ;
# Get the dates of the first and last entries for the dropdown list range if ($fh = fopen($wgSearchLogFile,'r')) { if (ereg('^([0-9]{4})([0-9]{2})[0-9]{2},',fread($fh,16),$match)) list(,$y1,$m1) = $match; $len = fstat($fh); $len = $len['size'] % 1024; fseek($fh,-$len,SEEK_END); $end = explode("\n",fread($fh,$len)); $end = $end[count($end)-2]; if (ereg('^([0-9]{4})([0-9]{2})[0-9]{2},',$end,$match)) list(,$y2,$m2) = $match; fclose($fh); }
# Construct a list of months if first and last successfully obtained $months = ; if ($y1 && $y2) while (($y1*100+$m1) <= ($y2*100+$m2)) { $p = strftime($wgSearchLogDateFormat,mktime(0,0,0,$m1,1,$y1)); $selected = $p == $period ? ' selected' : ; $months .= "<option$selected>$p</option>\n"; if ($m1 == 12) { $m1 = 1; $y1++; } else $m1++; }
# Render the months as a dropdown-list $wgOut->addHTML( wfElement('form',array('action' => $title->getLocalURL('action=submit'),'method' => 'POST'),null) . "Select time period: <select name=\"period\"><option>$wgSearchLogEntireLog</option>$months</select>" . wfElement('input',array('type' => 'submit')) . '</form>' );
# Generate a report if a period was specified if ($period === false) $period = $wgSearchLogEntireLog; if ($period) { $heading = str_replace('$1',$period,$wgSearchLogReportHeading); $wgOut->addWikiText("== $heading ==",true); if ($fh = fopen($wgSearchLogFile,'r')) {
# Scan the file and sum the search phrases over the period $total = array(); while (!feof($fh)) { if (preg_match('/^([0-9]{4})([0-9]{2})([0-9]{2}),(.+?),(.+?),(.+?),(.+)$/',fgets($fh),$match)) { list(,$y,$m,$d,$time,$user,$type,$phrase) = $match; $p = strftime($wgSearchLogDateFormat,mktime(0,0,0,$m,1,$y)); $i = strtolower(trim($phrase)); if ($period == $wgSearchLogEntireLog || $period == $p) $total[$i] = isset($total[$i]) ? $total[$i]++ : 1; } } fclose($fh);
# Render the totals in a table
$table = "\n
\n"; $table .= ""; foreach ($total as $k => $v) $table .= "\n"; $table .= "Search phrase | Number of occurences during period |
---|---|
$k | $v |
\n";
} else $error = "Couldn't open log file $wgSearchLogFile"; if ($error) $wgOut->addWikiText($error,true); else $wgOut->addWikiText($table,true); } }
}
- Called from $wgExtensionFunctions array when initialising extensions
function wfSetupSearchLog() { global $wgLanguageCode,$wgMessageCache,$wgSearchLogFile,$wgUser;
# If a search has been posted, log the info if (isset($_REQUEST['search'])) { $search = $_REQUEST['search']; if (isset($_REQUEST['fulltext'])) $type = 'fulltext'; elseif (isset($_REQUEST['go'])) $type = 'go'; else $type = 'other';
# Append the data to the file if (empty($search)) $search = $_REQUEST[$type]; if ($fh = fopen($wgSearchLogFile,'a')) { $text = date('Ymd,H:i:s,').$wgUser->getName().",$type,$search"; fwrite($fh,"$text\n"); fclose($fh); } }
# Add the messages used by the specialpage $wgMessageCache->addMessages(array('searchlog' => 'Search Log'));
# Add the specialpage to the environment SpecialPage::addPage(new SpecialSearchLog()); } ?>