@@======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