Difference between revisions of "Extension:SearchLog.php"

From Organic Design wiki
(1.0.6 - fix index problem)
(V1.0.7 Added a boolean switch to ''Display raw Unicode'' - including UTF-8)
Line 1: Line 1:
 
<?php
 
<?php
# Extension:SearchLog{{php}}{{Category:Extensions|SearchLog}}
+
# Extension:SearchLog {{php}}{{Category:Extensions|SearchLog}}
 
# - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
 
# - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
 
# - Author: [http://www.organicdesign.co.nz/nad User:Nad]
 
# - Author: [http://www.organicdesign.co.nz/nad User:Nad]
Line 7: Line 7:
 
if (!defined('MEDIAWIKI')) die('Not an entry point.');
 
if (!defined('MEDIAWIKI')) die('Not an entry point.');
 
   
 
   
define('SEARCHLOG_VERSION','1.0.6, 2007-12-09');
+
define('SEARCHLOG_VERSION','1.0.7`, 2007-12-09');
 
   
 
   
 
$wgSearchLogPath          = dirname(__FILE__);
 
$wgSearchLogPath          = dirname(__FILE__);
Line 42: Line 42:
 
$period = isset($_REQUEST['period']) ? $_REQUEST['period'] : false;
 
$period = isset($_REQUEST['period']) ? $_REQUEST['period'] : false;
 
$error  = '';
 
$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($wgSearchLogFile,'r')) {
 
if ($fh = fopen($wgSearchLogFile,'r')) {
if (ereg('^([0-9]{4})([0-9]{2})[0-9]{2},',fread($fh,16),$match)) list(,$y1,$m1) = $match;
+
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;
 
fseek($fh,-$len,SEEK_END);
 
fseek($fh,-$len,SEEK_END);
$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,$match)) list(,$y2,$m2) = $match;
 
if (ereg('^([0-9]{4})([0-9]{2})[0-9]{2},',$end,$match)) list(,$y2,$m2) = $match;
Line 65: Line 64:
 
   
 
   
 
# Render the months as a dropdown-list
 
# Render the months as a dropdown-list
$wgOut->addHTML(
+
$wgOut->addHTML(  
wfElement('form',array('action' => $title->getLocalURL('action=submit'),'method' => 'POST'),null)
+
                        "<fieldset><legend>Select time period: </legend>" 
. "Select time period: <select name=\"period\"><option>$wgSearchLogEntireLog</option>$months</select>"
+
. wfElement('form',array('action' => $title->getLocalURL('action=submit'),'method' => 'POST'),null)
 +
. "<select name=\"period\"><option>$wgSearchLogEntireLog</option>$months</select>"
 
. wfElement('input',array('type' => 'submit'))
 
. wfElement('input',array('type' => 'submit'))
. '</form>'
+
. "<br /><br />"
 +
. wfCheckLabel("Display raw Unicode","wpEscapeChars", "wpEscapeChars", $checked = true)
 +
. '</form></fieldset>'
 
);
 
);
 
   
 
   
Line 94: Line 96:
 
                                 $table  = "\n<table class=\"sortable\" id=\"searchlog\">\n";
 
                                 $table  = "\n<table class=\"sortable\" id=\"searchlog\">\n";
 
                                 $table .= "<tr><th>Search phrase</th><th>Number of occurences during period</th></tr>";
 
                                 $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";
+
global $wgRequest;
                                 $table .= "</table>\n";
+
                                 foreach ($total as $k => $v) {
 +
                                if($wgRequest->getBool('wpEscapeChars')) {
 +
$k = preg_replace("/&/", "&#38;", $k);
 +
 +
$table .= "<tr><td>$k</td><td>$v</td></tr>\n";
 +
                                 }
 +
            $table .= "</table>\n";
 
   
 
   
 
} else $error = "Couldn't open log file <tt>$wgSearchLogFile</tt>";
 
} else $error = "Couldn't open log file <tt>$wgSearchLogFile</tt>";

Revision as of 23:10, 7 February 2008

<?php

  1. Extension:SearchLog Template:Php
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.
  1. - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
  2. - Author: User:Nad
  3. - Started: 2007-05-16

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

define('SEARCHLOG_VERSION','1.0.7`, 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(

                       "<fieldset><legend>Select time period: </legend>"  

. wfElement('form',array('action' => $title->getLocalURL('action=submit'),'method' => 'POST'),null) . "<select name=\"period\"><option>$wgSearchLogEntireLog</option>$months</select>" . wfElement('input',array('type' => 'submit')) . "

"

			. wfCheckLabel("Display raw Unicode","wpEscapeChars", "wpEscapeChars", $checked = true)

. '</form></fieldset>' );

# 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 .= "";

global $wgRequest;

                               foreach ($total as $k => $v) {
                               	if($wgRequest->getBool('wpEscapeChars')) {

$k = preg_replace("/&/", "&", $k); }

$table .= "\n";
                               }
$table .= "
Search phraseNumber 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); } }

}

  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'])) { $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()); } ?>