Revision [14728]
This is an old revision of MinorEditHack made by FishPete on 2006-06-28 19:24:42.
Minor Edit Hack
I successfully patched my wiki tonight. Have a look at http://www.kindred.de/SchreckNet/wikka.php?wakka=SandBox You won't see much, because its a private wiki but one minor and one major change is visible to unregistered users. I will delete this link in a few days
Please Backup your data, I don't see where my code could be harmful, but better be safe than sorry!
What does it do?
This hack of mine gives the users the possibility to mark pageupdates as minor ones (typos etc.).I wrote an action called "recentmajorchanges" which allows the user to see only major, only minor or all changes during the last number of days.
What has to be changed?
- a new field calles "minorchanges" has to be added to the table "wikka_pages" in the MYSQL database
- the function SavePage in wakka.class.php has to be changed
- the function ChangedDuringLastDays is "new"
- the edit handler has to be updated
- the action recentmajorchanges is "new"
Known Bugs
the handler "clone" throws a warning. Should be no problem, just add a ",0" to the SavePage(...) function call. Didn't have to time to check yet. It works despite of the warningto do
- better layout of recentmajorchanges
- maybe mark minor changes when 'all' changes are beeing displayed
- maybe userspecific default number of days to display
- ...
Change to the MYSQL Database
As a fist step you have to add a cell to the table "pages" in the MYSQL Database called "minorchange", which consists of a boolean value. FALSE or 0 meaning "no minor change", TRUE or !=0 means "minorchange"
the MYSQL Query is:
NOTE: I'm assuming you use the standart table prefix wikka_ here!
The PHP Code
Changes in /libs/wakka.class.php
SavePage
The function SavePage in /libs/wakka.class.php has to be altered to be able to save the minorchange flag. inserted lines are commented function SavePage($tag, $body, $note, $minorchange) //editet by FishPete
{
if (!isset($minorchange)) $minorchange='0';// inserted by FishPete
// get current user
$user = $this->GetUserName();
// TODO: check write privilege
if ($this->HasAccess("write", $tag))
{
// is page new?
if (!$oldPage = $this->LoadPage($tag))
{
// current user is owner if user is logged in, otherwise, no owner.
if ($this->GetUser()) $owner = $user;
}
else
{
// aha! page isn't new. keep owner!
$owner = $oldPage["owner"];
}
// set all other revisions to old
$this->Query("update ".$this->config["table_prefix"]."pages set latest = 'N' where tag = '".mysql_real_escape_string($tag)."'");
// add new revision
$this->Query("insert into ".$this->config["table_prefix"]."pages set ".
"tag = '".mysql_real_escape_string($tag)."', ".
"time = now(), ".
"owner = '".mysql_real_escape_string($owner)."', ".
"user = '".mysql_real_escape_string($user)."', ".
"note = '".mysql_real_escape_string($note)."', ".
"latest = 'Y', ".
"minorchange = ".$minorchange.", ". // inserted by FishPete
"body = '".mysql_real_escape_string($body)."'");
if ($pingdata = $this->GetPingParams($this->config["wikiping_server"], $tag, $user, $note))
$this->WikiPing($pingdata);
}
}
{
if (!isset($minorchange)) $minorchange='0';// inserted by FishPete
// get current user
$user = $this->GetUserName();
// TODO: check write privilege
if ($this->HasAccess("write", $tag))
{
// is page new?
if (!$oldPage = $this->LoadPage($tag))
{
// current user is owner if user is logged in, otherwise, no owner.
if ($this->GetUser()) $owner = $user;
}
else
{
// aha! page isn't new. keep owner!
$owner = $oldPage["owner"];
}
// set all other revisions to old
$this->Query("update ".$this->config["table_prefix"]."pages set latest = 'N' where tag = '".mysql_real_escape_string($tag)."'");
// add new revision
$this->Query("insert into ".$this->config["table_prefix"]."pages set ".
"tag = '".mysql_real_escape_string($tag)."', ".
"time = now(), ".
"owner = '".mysql_real_escape_string($owner)."', ".
"user = '".mysql_real_escape_string($user)."', ".
"note = '".mysql_real_escape_string($note)."', ".
"latest = 'Y', ".
"minorchange = ".$minorchange.", ". // inserted by FishPete
"body = '".mysql_real_escape_string($body)."'");
if ($pingdata = $this->GetPingParams($this->config["wikiping_server"], $tag, $user, $note))
$this->WikiPing($pingdata);
}
}
ChangedDuringLastDays
I wrote a function to display changes during the last days to be used instead of LoadRecentlyChanged() Just insert it right after the function LoadRecentlyChanged()
/*$interval: number of days which should be displayed
* $show: whether to show all, only major or only minor changes
* returns array of pages which were changed during the last ($interval) days and are according to $show criteria
*/
function LoadChangedDuringLastDays($interval, $show)
{
switch ($show)
{
case 'all':
$param=''; //no additional parameter in the MYSQL Query
break;
case 'major':
$param='AND minorchange = 0'; //to be used in the MYSQL Query
break;
case 'minor':
$param='AND minorchange !=0'; //to be used in the MYSQL Query
break;
}
if ($pages = $this->LoadAll("select * from ".$this->config["table_prefix"]."pages where time> DATE_SUB(now(),INTERVAL ".$interval." DAY) ".$param." order by time desc"))
{
foreach ($pages as $page)
{
$this->CachePage($page);
}
return $pages;
}
}
* $show: whether to show all, only major or only minor changes
* returns array of pages which were changed during the last ($interval) days and are according to $show criteria
*/
function LoadChangedDuringLastDays($interval, $show)
{
switch ($show)
{
case 'all':
$param=''; //no additional parameter in the MYSQL Query
break;
case 'major':
$param='AND minorchange = 0'; //to be used in the MYSQL Query
break;
case 'minor':
$param='AND minorchange !=0'; //to be used in the MYSQL Query
break;
}
if ($pages = $this->LoadAll("select * from ".$this->config["table_prefix"]."pages where time> DATE_SUB(now(),INTERVAL ".$interval." DAY) ".$param." order by time desc"))
{
foreach ($pages as $page)
{
$this->CachePage($page);
}
return $pages;
}
}
Changes in /handlers/page/edit.php
The next thing to do is add a checkbox to /handlers/pages/edit.php which allows the user to mark a change as a minor one. Since the little code changes are all over the place in this file I'll post the whole file on MinorEditHackEditPHP. The lines I changed are commented with " edited by FishPete. Just search for FishPete in the file and it should take you to the new lines.
The action RecentMajorChanges
This file is mainly the action recentchanges which I altered a bit. Save this code as /actions/recentmajorchanges.php
I took out the user specific maximum of changes to show, but its easy to take it back in. just un-comment the lines .
<?php
/**
* Display a list of recently changed pages, distinguishes between major and minor changes
*
* @package Actions
* @name RecentChanges
*
* @author {@link http://www.mornography.de/ Hendrik Mans} (wakka code)
* @author {@link http://wikkawiki.org/DarTar Dario Taraborelli} (preliminary code cleanup)
* @author {@link http://wikkawiki.org/FishPete Peter Fischaleck} (minor changes hack)
* @param: $days_to_show: how many days of changes should be displayed.
* @param: $what_to_show: eather 'minor', 'major' or 'all' changes should be displayed
*
*/
//defaults
if(!defined('REVISION_DATE_FORMAT')) define('REVISION_DATE_FORMAT', 'D, d M Y');
if(!defined('REVISION_TIME_FORMAT')) define('REVISION_TIME_FORMAT', 'H:i T');
if (!defined('PAGE_EDITOR_DIVIDER')) define ('PAGE_EDITOR_DIVIDER', '→');
if (!defined('MAX_REVISION_NUMBER')) define ('MAX_REVISION_NUMBER', '50');
//i18n
if (!defined('RECENT_MAJOR_CHANGES_HEADING')) define('RECENT_MAJOR_CHANGES_HEADING', 'Major Changes During the Last '); //edited
if (!defined('RECENT_MINOR_CHANGES_HEADING')) define('RECENT_MINOR_CHANGES_HEADING', 'Minor Changes During the Last '); //edited
if (!defined('All_RECENT_CHANGES_HEADING')) define('ALL_RECENT_CHANGES_HEADING', 'Changes During the Last '); //edited
if (!defined('WORD_FOR_DAY')) define ('WORD_FOR_DAY', ' Day(s)'); //edited
if (!defined('SHOW_ALL_BUTTON_TEXT')) define ('SHOW_ALL_BUTTON_TEXT', 'show all changes');
if (!defined('SHOW_MINOR_BUTTON_TEXT')) define ('SHOW_MINOR_BUTTON_TEXT', 'show only minor changes');
if (!defined('SHOW_MAJOR_BUTTON_TEXT')) define ('SHOW_MAJOR_BUTTON_TEXT', 'show only major changes');
if (!defined('UNREGISTERED_USER')) define('UNREGISTERED_USER', 'unregistered user ');
if (!defined('LABEL_HISTORY')) define('LABEL_HISTORY', 'history');
if (!defined('TITLE_REVISION_LINK')) define('TITLE_REVISION_LINK', 'View recent revisions list for %s');
if (!defined('TITLE_HISTORY_LINK')) define('TITLE_HISTORY_LINK', 'View edit history of %s');
if (!defined('WIKIPING_ENABLED')) define('WIKIPING_ENABLED', 'WikiPing enabled: Changes on this wiki are broadcast to <a href="http://%1$s">http://%1$s</a>');
if (!defined('NO_RECENTLY_CHANGED_PAGES')) define ('NO_RECENTLY_CHANGED_PAGES', 'There are no recently changed pages.');
if (!defined('NO_READABLE_RECENTLY_CHANGED_PAGES')) define ('NO_READABLE_RECENTLY_CHANGED_PAGES', 'There are no recently changed pages you have access to.');
//initialization
//$max = 0;
$readable = 0;
//defaults
if ( !isset($days_to_show)) $days_to_show = 7;
$what_to_show = 'major';
$heading=RECENT_MAJOR_CHANGES_HEADING;
// get the parameters
if (is_array($vars))
{
foreach ($vars as $param => $value)
{
switch ($param)
{
case 'days':
$days_to_show = $value;
break;
case 'show':
switch ($value)
{
case ('all'):
$what_to_show='all';
$heading = ALL_RECENT_CHANGES_HEADING;
break;
case ('minor'):
$what_to_show='minor';
$heading = RECENT_MINOR_CHANGES_HEADING;
break;
case ('major'):
$what_to_show='major';
$heading=RECENT_MAJOR_CHANGES_HEADING;
break;
}
}
}
}
if (isset($_REQUEST['show_minor']))
{
if (isset($_REQUEST['days']) && ($_REQUEST['days']>0)) $days_to_show=$_REQUEST['days'];
$what_to_show='minor';
$heading = RECENT_MINOR_CHANGES_HEADING;
}
if (isset($_REQUEST['show_major']))
{
if (isset($_REQUEST['days'])&& ($_REQUEST['days']>0)) $days_to_show=$_REQUEST['days'];
$what_to_show='major';
$heading = RECENT_MAJOR_CHANGES_HEADING;
}
if (isset($_REQUEST['show_all']))
{
if (isset($_REQUEST['days'])&& ($_REQUEST['days']>0)) $days_to_show=$_REQUEST['days'];
$what_to_show='all';
$heading = ALL_RECENT_CHANGES_HEADING;
}
echo $this->FormOpen("", "", "get");
echo('
<p>
Show pages changed up unto
<input name="days" type="text", size="1" maxlenght="2" value="'.$days_to_show.'"> days ago<br>
<input name="show_major" type="submit" value="'.SHOW_MAJOR_BUTTON_TEXT.'">
<input name="show_minor" type="submit" value="'.SHOW_MINOR_BUTTON_TEXT.'">
<input name="show_all" type="submit" value="'.SHOW_ALL_BUTTON_TEXT.'"></p>
');
echo $this->FormClose();
echo $this->Format('====='.$heading.$days_to_show.WORD_FOR_DAY.'===== --- ');
if ($pages = $this->LoadChangedDuringLastDays($days_to_show, $what_to_show)) //edited by FishPete
{
$curday = '';
//print feed link icon
//echo '<p><a href="'.$this->href('recentchanges.xml', $this->page['tag']).'"><img src="images/xml.png" width="36" height="14" alt="XML" /></a></p>'."\n";
/*if ($user = $this->GetUser())
{
$max = $user['changescount'];
} else
{
$max = MAX_REVISION_NUMBER;
}*/
//foreach ($pages as $i => $page)
foreach ($pages as $page)
{
//if (($i < $max) && $this->HasAccess('read', $page['tag']))
if ($this->HasAccess('read', $page['tag'])) //edited by FishPete
{
$readable++;
// day header
list($day, $time) = explode(' ', $page['time']);
if ($day != $curday)
{
$dateformatted = date(REVISION_DATE_FORMAT, strtotime($day));
if ($curday)
{
echo '</span><br />'."\n";
}
echo '<strong>'.$dateformatted.':</strong><br />'."\n".'<span class="recentchanges">'."\n";
$curday = $day;
}
$timeformatted = date(REVISION_TIME_FORMAT, strtotime($page["time"]));
$page_edited_by = $page['user'];
if (!$this->LoadUser($page_edited_by)) $page_edited_by .= ' ('.UNREGISTERED_USER.')';
// print entry
if ($page['note'])
{
$note = ' <span class="pagenote">['.$this->htmlspecialchars_ent($page['note']).']</span>';
}
else
{
$note = '';
}
echo ' ('.$this->Link($page['tag'], 'revisions', $timeformatted, 0, 1, sprintf(TITLE_REVISION_LINK, $page['tag'])).') ['.$this->Link($page['tag'], 'history', LABEL_HISTORY, 0, 1, sprintf(TITLE_HISTORY_LINK, $page['tag'])).'] - '.$this->Link($page['tag'], '', '', 0).' '.PAGE_EDITOR_DIVIDER.' '.$page_edited_by.' '.$note.'<br />'."\n";
}
}
if ($readable == 0)
{
echo '<em>'.NO_READABLE_RECENTLY_CHANGED_PAGES.'</em>';
}
echo '</span>'."\n";
//wikiping instructions
$wikipingserver = $this->config['wikiping_server'];
if (!$wikipingserver == '')
{
$wikipingserver_url_parsed = parse_url($wikipingserver);
$wikipingserver_host = $wikipingserver_url_parsed['host'];
printf('<br /><br />['.WIKIPING_ENABLED.']', $wikipingserver_host);
}
}
else
{
echo '<em>'.NO_RECENTLY_CHANGED_PAGES.'</em>';
}
echo $this->Format(' ::c:: ');
?>
/**
* Display a list of recently changed pages, distinguishes between major and minor changes
*
* @package Actions
* @name RecentChanges
*
* @author {@link http://www.mornography.de/ Hendrik Mans} (wakka code)
* @author {@link http://wikkawiki.org/DarTar Dario Taraborelli} (preliminary code cleanup)
* @author {@link http://wikkawiki.org/FishPete Peter Fischaleck} (minor changes hack)
* @param: $days_to_show: how many days of changes should be displayed.
* @param: $what_to_show: eather 'minor', 'major' or 'all' changes should be displayed
*
*/
//defaults
if(!defined('REVISION_DATE_FORMAT')) define('REVISION_DATE_FORMAT', 'D, d M Y');
if(!defined('REVISION_TIME_FORMAT')) define('REVISION_TIME_FORMAT', 'H:i T');
if (!defined('PAGE_EDITOR_DIVIDER')) define ('PAGE_EDITOR_DIVIDER', '→');
if (!defined('MAX_REVISION_NUMBER')) define ('MAX_REVISION_NUMBER', '50');
//i18n
if (!defined('RECENT_MAJOR_CHANGES_HEADING')) define('RECENT_MAJOR_CHANGES_HEADING', 'Major Changes During the Last '); //edited
if (!defined('RECENT_MINOR_CHANGES_HEADING')) define('RECENT_MINOR_CHANGES_HEADING', 'Minor Changes During the Last '); //edited
if (!defined('All_RECENT_CHANGES_HEADING')) define('ALL_RECENT_CHANGES_HEADING', 'Changes During the Last '); //edited
if (!defined('WORD_FOR_DAY')) define ('WORD_FOR_DAY', ' Day(s)'); //edited
if (!defined('SHOW_ALL_BUTTON_TEXT')) define ('SHOW_ALL_BUTTON_TEXT', 'show all changes');
if (!defined('SHOW_MINOR_BUTTON_TEXT')) define ('SHOW_MINOR_BUTTON_TEXT', 'show only minor changes');
if (!defined('SHOW_MAJOR_BUTTON_TEXT')) define ('SHOW_MAJOR_BUTTON_TEXT', 'show only major changes');
if (!defined('UNREGISTERED_USER')) define('UNREGISTERED_USER', 'unregistered user ');
if (!defined('LABEL_HISTORY')) define('LABEL_HISTORY', 'history');
if (!defined('TITLE_REVISION_LINK')) define('TITLE_REVISION_LINK', 'View recent revisions list for %s');
if (!defined('TITLE_HISTORY_LINK')) define('TITLE_HISTORY_LINK', 'View edit history of %s');
if (!defined('WIKIPING_ENABLED')) define('WIKIPING_ENABLED', 'WikiPing enabled: Changes on this wiki are broadcast to <a href="http://%1$s">http://%1$s</a>');
if (!defined('NO_RECENTLY_CHANGED_PAGES')) define ('NO_RECENTLY_CHANGED_PAGES', 'There are no recently changed pages.');
if (!defined('NO_READABLE_RECENTLY_CHANGED_PAGES')) define ('NO_READABLE_RECENTLY_CHANGED_PAGES', 'There are no recently changed pages you have access to.');
//initialization
//$max = 0;
$readable = 0;
//defaults
if ( !isset($days_to_show)) $days_to_show = 7;
$what_to_show = 'major';
$heading=RECENT_MAJOR_CHANGES_HEADING;
// get the parameters
if (is_array($vars))
{
foreach ($vars as $param => $value)
{
switch ($param)
{
case 'days':
$days_to_show = $value;
break;
case 'show':
switch ($value)
{
case ('all'):
$what_to_show='all';
$heading = ALL_RECENT_CHANGES_HEADING;
break;
case ('minor'):
$what_to_show='minor';
$heading = RECENT_MINOR_CHANGES_HEADING;
break;
case ('major'):
$what_to_show='major';
$heading=RECENT_MAJOR_CHANGES_HEADING;
break;
}
}
}
}
if (isset($_REQUEST['show_minor']))
{
if (isset($_REQUEST['days']) && ($_REQUEST['days']>0)) $days_to_show=$_REQUEST['days'];
$what_to_show='minor';
$heading = RECENT_MINOR_CHANGES_HEADING;
}
if (isset($_REQUEST['show_major']))
{
if (isset($_REQUEST['days'])&& ($_REQUEST['days']>0)) $days_to_show=$_REQUEST['days'];
$what_to_show='major';
$heading = RECENT_MAJOR_CHANGES_HEADING;
}
if (isset($_REQUEST['show_all']))
{
if (isset($_REQUEST['days'])&& ($_REQUEST['days']>0)) $days_to_show=$_REQUEST['days'];
$what_to_show='all';
$heading = ALL_RECENT_CHANGES_HEADING;
}
echo $this->FormOpen("", "", "get");
echo('
<p>
Show pages changed up unto
<input name="days" type="text", size="1" maxlenght="2" value="'.$days_to_show.'"> days ago<br>
<input name="show_major" type="submit" value="'.SHOW_MAJOR_BUTTON_TEXT.'">
<input name="show_minor" type="submit" value="'.SHOW_MINOR_BUTTON_TEXT.'">
<input name="show_all" type="submit" value="'.SHOW_ALL_BUTTON_TEXT.'"></p>
');
echo $this->FormClose();
echo $this->Format('====='.$heading.$days_to_show.WORD_FOR_DAY.'===== --- ');
if ($pages = $this->LoadChangedDuringLastDays($days_to_show, $what_to_show)) //edited by FishPete
{
$curday = '';
//print feed link icon
//echo '<p><a href="'.$this->href('recentchanges.xml', $this->page['tag']).'"><img src="images/xml.png" width="36" height="14" alt="XML" /></a></p>'."\n";
/*if ($user = $this->GetUser())
{
$max = $user['changescount'];
} else
{
$max = MAX_REVISION_NUMBER;
}*/
//foreach ($pages as $i => $page)
foreach ($pages as $page)
{
//if (($i < $max) && $this->HasAccess('read', $page['tag']))
if ($this->HasAccess('read', $page['tag'])) //edited by FishPete
{
$readable++;
// day header
list($day, $time) = explode(' ', $page['time']);
if ($day != $curday)
{
$dateformatted = date(REVISION_DATE_FORMAT, strtotime($day));
if ($curday)
{
echo '</span><br />'."\n";
}
echo '<strong>'.$dateformatted.':</strong><br />'."\n".'<span class="recentchanges">'."\n";
$curday = $day;
}
$timeformatted = date(REVISION_TIME_FORMAT, strtotime($page["time"]));
$page_edited_by = $page['user'];
if (!$this->LoadUser($page_edited_by)) $page_edited_by .= ' ('.UNREGISTERED_USER.')';
// print entry
if ($page['note'])
{
$note = ' <span class="pagenote">['.$this->htmlspecialchars_ent($page['note']).']</span>';
}
else
{
$note = '';
}
echo ' ('.$this->Link($page['tag'], 'revisions', $timeformatted, 0, 1, sprintf(TITLE_REVISION_LINK, $page['tag'])).') ['.$this->Link($page['tag'], 'history', LABEL_HISTORY, 0, 1, sprintf(TITLE_HISTORY_LINK, $page['tag'])).'] - '.$this->Link($page['tag'], '', '', 0).' '.PAGE_EDITOR_DIVIDER.' '.$page_edited_by.' '.$note.'<br />'."\n";
}
}
if ($readable == 0)
{
echo '<em>'.NO_READABLE_RECENTLY_CHANGED_PAGES.'</em>';
}
echo '</span>'."\n";
//wikiping instructions
$wikipingserver = $this->config['wikiping_server'];
if (!$wikipingserver == '')
{
$wikipingserver_url_parsed = parse_url($wikipingserver);
$wikipingserver_host = $wikipingserver_url_parsed['host'];
printf('<br /><br />['.WIKIPING_ENABLED.']', $wikipingserver_host);
}
}
else
{
echo '<em>'.NO_RECENTLY_CHANGED_PAGES.'</em>';
}
echo $this->Format(' ::c:: ');
?>
CategoryUserContributions