@@======Minor Edit Hack======@@ First a warning, I am new to php and mysql, what I did was mostly trial and trial and trial and lots of errors - so if you find redudant code or you have suggestions for improvements , please tell me! ====What does it do?==== This hack of mine gives the users the possibility to mark pageupdates as minor changes (typos etc.). I also wrote an action called "recentmajorchanges" which allows the user to see only major, only minor or all changes during a 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 Issues==== the handler "clone" throws a warning. Just add a ",0" to the ""SavePage(...)"" function call, i.e. %%(php) $this->SavePage($to, $pagecontent, $note,0); #create target page. %% I don't know if there are calls to ""SavePage"" anywhere else. If so, these actions etc. will also throw a warning, but they should work despite the warning. ====to do==== -better layout of recentmajorchanges -mark minor changes when 'all' changes are beeing displayed -userspecific default number of days to display? -maybe sort all edits of one particular Page together, show only edit notes, date and history link if Page is not latest -Layout of this page -... ---- ====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: %%(mysql) ALTER TABLE `wikka_pages` ADD `minorchange` BOOL NOT NULL DEFAULT '0'; %% ''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 %%(php) function SavePage($tag, $body, $note, $minorchange) //editet by FishPete { if (!isset($minorchange)) $minorchange='0';// inserted by FishPete; if SavePage is called without the $minorchange parameter, assume no minorchange and continue // 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()"" %%(php) /*$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; } } %% ---- ===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. 29.6.06: I just added a line to edit.php to show the checkbox during "preview mode". -FishPete ---- ====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 . Pages which were edited twice appear twice in the list. That's a feature, not a bug ;-) -4.7.2006: minor change, I just altered RECENT_MAJOR_CHANGES_HEADER etc. to get rid of WORD_FOR_DAY and altered the echo statement which uses these definitions. The lines are marked with //edited 4.7.2006 --FishPete %%(php) http://%1$s'); 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('

Show pages changed up unto days ago

'); echo $this->FormClose(); echo $this->Format(sprintf($heading, $days_to_show).' --- '); //edited 4.7.2006 if ($pages = $this->LoadChangedDuringLastDays($days_to_show, $what_to_show)) //edited by FishPete { $curday = ''; //print feed link icon //echo '

XML

'."\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 '
'."\n"; } echo ''.$dateformatted.':
'."\n".''."\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 = ' ['.$this->htmlspecialchars_ent($page['note']).']'; } 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.'
'."\n"; } } if ($readable == 0) { echo ''.NO_READABLE_RECENTLY_CHANGED_PAGES.''; } echo '
'."\n"; //wikiping instructions $wikipingserver = $this->config['wikiping_server']; if (!$wikipingserver == '') { $wikipingserver_url_parsed = parse_url($wikipingserver); $wikipingserver_host = $wikipingserver_url_parsed['host']; printf('

['.WIKIPING_ENABLED.']', $wikipingserver_host); } } else { echo ''.NO_RECENTLY_CHANGED_PAGES.''; } echo $this->Format(' ::c:: '); ?> %% ---- CategoryUserContributions