Difference between revisions of "Extension:SearchLog.php"

From Organic Design wiki
m
(ok code done, just gotta debug now)
Line 9: Line 9:
 
define('SEARCHLOG_VERSION','0.0.0, 2007-05-21');
 
define('SEARCHLOG_VERSION','0.0.0, 2007-05-21');
 
   
 
   
$wgSearchLogPath       = dirname(__FILE__);
+
$wgSearchLogPath         = dirname(__FILE__);
$wgExtensionFunctions[] = 'wfSetupSearchLog';
+
$wgSearchLogFile          = "$wgSearchLogPath/search.log";
 +
$wgSearchLogEntireLog    = 'Entire log'; # Should be a message
 +
$wgSearchLogDateFormat    = '%b %Y';
 +
$wgSearchLogReportHeading = "Search keywords used over '''\$1''' period"; # Should be a message
 +
$wgExtensionFunctions[]   = 'wfSetupSearchLog';
 
   
 
   
 
$wgExtensionCredits['specialpage'][] = array(
 
$wgExtensionCredits['specialpage'][] = array(
Line 31: Line 35:
 
# Override SpecialPage::execute()
 
# Override SpecialPage::execute()
 
function execute() {
 
function execute() {
global $wgOut,$wgSearchLogPath;
+
global $wgOut,$wgSearchLogFile,$wgSearchLogEntireLog,$wgSearchLogReportHeading,$wgSearchLogDateFormat;
 
$title  = Title::makeTitle(NS_SPECIAL,'SearchLog');
 
$title  = Title::makeTitle(NS_SPECIAL,'SearchLog');
$period = $_REQUEST['period'];
+
$period = isset($_REQUEST['period']) ? $_REQUEST['period'] : false;
 +
$error  = '';
  
 
# Get the dates of the first and last entries for the dropdown list range
 
# Get the dates of the first and last entries for the dropdown list range
if ($fh = fopen("$wgSearchLogPath/search.log",'r')) {
+
if ($fh = fopen($wgSearchLogFile,'r')) {
if (ereg('^([0-9]{4})([0-9]{2})[0-9]{2},',fread($fh,16),$m)) list(,$y1,$m1,$d1) = $m;
+
if (ereg('^([0-9]{4})([0-9]{2})[0-9]{2},',fread($fh,16),$match)) list(,$y1,$m1) = $match;
 
$len = fstat($fh);
 
$len = fstat($fh);
 
$len = $len['size'] % 1024;
 
$len = $len['size'] % 1024;
Line 43: Line 48:
 
$end = explode("\n",fread($fh,$len));
 
$end = explode("\n",fread($fh,$len));
 
$end = $end[count($end)-2];
 
$end = $end[count($end)-2];
if (ereg('^([0-9]{4})([0-9]{2})[0-9]{2},',$end,$m)) list(,$y2,$m2,$d2) = $m;
+
if (ereg('^([0-9]{4})([0-9]{2})[0-9]{2},',$end,$match)) list(,$y2,$m2) = $match;
 
fclose($fh);
 
fclose($fh);
 
}
 
}
Line 50: Line 55:
 
                 $months = '';
 
                 $months = '';
 
                 if ($y1 && $y2) while (($y1*100+$m1) <= ($y2*100+$m2)) {
 
                 if ($y1 && $y2) while (($y1*100+$m1) <= ($y2*100+$m2)) {
                         $p = strftime('%b %Y',mktime(0,0,0,$m1,1,$y1));
+
                         $p = strftime($wgSearchLogDateFormat,mktime(0,0,0,$m1,1,$y1));
 
                         $selected = $p == $period ? ' selected' : '';
 
                         $selected = $p == $period ? ' selected' : '';
 
                         $months .= "<option$selected>$p</option>\n";
 
                         $months .= "<option$selected>$p</option>\n";
Line 59: Line 64:
 
$wgOut->addHTML(
 
$wgOut->addHTML(
 
wfElement('form',array('action' => $title->getLocalURL('action=submit'),'method' => 'POST'),null)
 
wfElement('form',array('action' => $title->getLocalURL('action=submit'),'method' => 'POST'),null)
. "Select time period: <select name=\"period\"><option>Entire log</option>$months</select>"
+
. "Select time period: <select name=\"period\"><option>$wgSearchLogEntireLog</option>$months</select>"
 
. wfElement('input',array('type' => 'submit'))
 
. wfElement('input',array('type' => 'submit'))
 
. '</form>'
 
. '</form>'
Line 65: Line 70:
  
 
# Generate a report if a period was specified
 
# Generate a report if a period was specified
 +
if ($period === false) $period = $wgSearchLogEntireLog;
 
if ($period) {
 
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 (ereg('^([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{| class=\"sortable\"\n!Search phrase!!Number of occurences during period\n";
 +
foreach ($total as $k => $v) $table .= "|-\n|$k||$v\n";
 +
$table .= "\n|}\n";
 +
 +
} else $error = "Couldn't open log file <tt>$wgSearchLogFile</tt>";
 +
if ($error) $wgOut->addWikiText($error,true);
 +
else $wgOut->addWikiText($table,true);
 
}
 
}
 
}
 
}
Line 73: Line 102:
 
# Called from $wgExtensionFunctions array when initialising extensions
 
# Called from $wgExtensionFunctions array when initialising extensions
 
function wfSetupSearchLog() {
 
function wfSetupSearchLog() {
global $wgLanguageCode,$wgMessageCache,$wgSearchLogPath,$wgUser;
+
global $wgLanguageCode,$wgMessageCache,$wgSearchLogFile,$wgUser;
  
 
# If a search has been posted, log the info
 
# If a search has been posted, log the info
Line 82: Line 111:
  
 
# Append the data to the file
 
# Append the data to the file
if ($fh = fopen("$wgSearchLogPath/search.log",'a')) {
+
if ($fh = fopen($wgSearchLogFile,'a')) {
 
$text = date('Ymd,H:i:s,').$wgUser->getName().",$type,".$_REQUEST['search'];
 
$text = date('Ymd,H:i:s,').$wgUser->getName().",$type,".$_REQUEST['search'];
 
fwrite($fh,"$text\n");
 
fwrite($fh,"$text\n");

Revision as of 00:54, 24 May 2007

<?php

  1. Extension:SearchLog
Info.svg These are the MediaWiki extensions we're using and/or developing. Please refer to the information on the mediawiki.org wiki for installation and usage details. Extensions here which have no corresponding mediawiki article are either not ready for use or have been superseded. You can also browse our extension code in our local Subversion repository or our GitHub mirror.

{{#Security:*|dev}}{{#Security:view|*}}Template:Php

  1. - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
  2. - Author: User:NadCategory:Extensions created with Template:SpecialPage
  3. - Started: 2007-05-16

if (!defined('MEDIAWIKI')) die('Not an entry point.');

define('SEARCHLOG_VERSION','0.0.0, 2007-05-21');

$wgSearchLogPath = dirname(__FILE__); $wgSearchLogFile = "$wgSearchLogPath/search.log"; $wgSearchLogEntireLog = 'Entire log'; # Should be a message $wgSearchLogDateFormat = '%b %Y'; $wgSearchLogReportHeading = "Search keywords used over \$1 period"; # Should be a message $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() { SpecialPage::SpecialPage('SearchLog'); }

# Override SpecialPage::execute() function execute() { global $wgOut,$wgSearchLogFile,$wgSearchLogEntireLog,$wgSearchLogReportHeading,$wgSearchLogDateFormat; $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 (ereg('^([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{| class=\"sortable\"\n!Search phrase!!Number of occurences during period\n"; foreach ($total as $k => $v) $table .= "|-\n|$k||$v\n"; $table .= "\n|}\n";

} else $error = "Couldn't open log file $wgSearchLogFile"; if ($error) $wgOut->addWikiText($error,true); else $wgOut->addWikiText($table,true); } }

}

  1. 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'])) { if (isset($_REQUEST['go'])) $type = 'go'; else if (isset($_REQUEST['fulltext'])) $type = 'fulltext'; else $type = 'other';

# Append the data to the file if ($fh = fopen($wgSearchLogFile,'a')) { $text = date('Ymd,H:i:s,').$wgUser->getName().",$type,".$_REQUEST['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()); } ?>