|
|
Line 1: |
Line 1: |
− | <?php
| + | #REDIRECT [[Foo:SearchLog.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.5, 2007-09-06');
| |
− |
| |
− | $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));
| |
− | if ($period == $wgSearchLogEntireLog || $period == $p) $total[strtolower(trim($phrase))]++;
| |
− | }
| |
− | }
| |
− | 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());
| |
− | }
| |
− | ?>
| |