index.php 106 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. /**
  4. * @author Patrick Cool <patrick.cool@UGent.be>, Ghent University, Belgium
  5. * @author Juan Carlos Raña <herodoto@telefonica.net>
  6. *
  7. * @package chamilo.wiki
  8. */
  9. // name of the language file that needs to be included
  10. $language_file = 'wiki';
  11. // including the global initialization file
  12. require_once '../inc/global.inc.php';
  13. // section (for the tabs)
  14. $this_section=SECTION_COURSES;
  15. // including additional library scripts
  16. require_once api_get_path(LIBRARY_PATH).'course.lib.php';
  17. require_once api_get_path(LIBRARY_PATH).'groupmanager.lib.php';
  18. require_once api_get_path(LIBRARY_PATH).'security.lib.php';
  19. require_once api_get_path(LIBRARY_PATH).'mail.lib.inc.php';
  20. require_once api_get_path(LIBRARY_PATH).'sortabletable.class.php';
  21. require_once api_get_path(LIBRARY_PATH).'formvalidator/FormValidator.class.php';
  22. require_once 'wiki.inc.php';
  23. // additional style information
  24. $htmlHeadXtra[] ='<link rel="stylesheet" type="text/css" href="'.api_get_path(WEB_CODE_PATH).'wiki/css/default.css"/>';
  25. // javascript for advanced parameters menu
  26. $htmlHeadXtra[] = '<script src="'.api_get_path(WEB_LIBRARY_PATH).'javascript/jquery-1.4.4.min.js" type="text/javascript" language="javascript"></script>'; //jQuery
  27. $htmlHeadXtra[] = '<script type="text/javascript" language="javascript">
  28. function advanced_parameters() {
  29. if(document.getElementById(\'options\').style.display == \'none\') {
  30. document.getElementById(\'options\').style.display = \'block\';
  31. document.getElementById(\'plus_minus\').innerHTML=\'&nbsp;'.Display::return_icon('div_hide.gif',get_lang('Hide'),array('style'=>'vertical-align:middle')).'&nbsp;'.get_lang('AdvancedParameters').'\';
  32. } else {
  33. document.getElementById(\'options\').style.display = \'none\';
  34. document.getElementById(\'plus_minus\').innerHTML=\'&nbsp;'.Display::return_icon('div_show.gif',get_lang('Show'),array('style'=>'vertical-align:middle')).'&nbsp;'.get_lang('AdvancedParameters').'\';
  35. }
  36. }
  37. function setFocus(){
  38. $("#search_title").focus();
  39. }
  40. $(document).ready(function () {
  41. setFocus();
  42. });
  43. </script>';
  44. // Database table definition
  45. $tbl_wiki = Database::get_course_table(TABLE_WIKI);
  46. $tbl_wiki_discuss = Database::get_course_table(TABLE_WIKI_DISCUSS);
  47. $tbl_wiki_mailcue = Database::get_course_table(TABLE_WIKI_MAILCUE);
  48. $tbl_wiki_conf = Database::get_course_table(TABLE_WIKI_CONF);
  49. /*
  50. Constants and variables
  51. */
  52. $tool_name = get_lang('ToolWiki');
  53. $MonthsLong = array (get_lang("JanuaryLong"), get_lang("FebruaryLong"), get_lang("MarchLong"), get_lang("AprilLong"), get_lang("MayLong"), get_lang("JuneLong"), get_lang("JulyLong"), get_lang("AugustLong"), get_lang("SeptemberLong"), get_lang("OctoberLong"), get_lang("NovemberLong"), get_lang("DecemberLong"));
  54. //condition for the session
  55. $session_id = api_get_session_id();
  56. $condition_session = api_get_session_condition($session_id);
  57. /*
  58. ACCESS
  59. */
  60. api_protect_course_script();
  61. api_block_anonymous_users();
  62. /*
  63. TRACKING
  64. */
  65. event_access_tool(TOOL_WIKI);
  66. /*
  67. HEADER & TITLE
  68. */
  69. // If it is a group wiki then the breadcrumbs will be different.
  70. //Setting variable
  71. $_clean['group_id'] = 0;
  72. if ($_SESSION['_gid'] OR $_GET['group_id']) {
  73. if (isset($_SESSION['_gid'])) {
  74. $_clean['group_id']=intval($_SESSION['_gid']);
  75. }
  76. if (isset($_GET['group_id'])) {
  77. $_clean['group_id']=intval($_GET['group_id']);
  78. }
  79. $group_properties = GroupManager :: get_group_properties($_clean['group_id']);
  80. $interbreadcrumb[] = array ("url" => "../group/group.php", "name" => get_lang('Groups'));
  81. $interbreadcrumb[] = array ("url"=>"../group/group_space.php?gidReq=".$_clean['group_id'], "name"=> get_lang('GroupSpace').' '.$group_properties['name']);
  82. $add_group_to_title = ' '.$group_properties['name'];
  83. $groupfilter='group_id="'.$_clean['group_id'].'"';
  84. //ensure this tool in groups whe it's private or deactivated
  85. if ($group_properties['wiki_state']==0) {
  86. api_not_allowed();
  87. } elseif ($group_properties['wiki_state']==2) {
  88. if (!api_is_allowed_to_edit(false,true) and !GroupManager :: is_user_in_group($_user['user_id'], $_SESSION['_gid'])) {
  89. api_not_allowed();
  90. }
  91. }
  92. } else {
  93. $groupfilter='group_id=0';
  94. }
  95. if ($_POST['action']=='export_to_pdf' && isset($_POST['wiki_id']) && api_get_setting('students_export2pdf') == 'true') {
  96. export_to_pdf($_POST['wiki_id'], api_get_course_id());
  97. }
  98. Display::display_header($tool_name, 'Wiki');
  99. $is_allowed_to_edit = api_is_allowed_to_edit(false,true);
  100. //api_display_tool_title($tool_name.$add_group_to_title);
  101. /*
  102. INITIALISATION
  103. */
  104. //the page we are dealing with
  105. if (!isset($_GET['title'])) {
  106. $page = 'index';
  107. } else {
  108. $page = $_GET['title'];
  109. }
  110. // some titles are not allowed
  111. // $not_allowed_titles=array("Index", "RecentChanges","AllPages", "Categories"); //not used for now
  112. /*
  113. MAIN CODE
  114. */
  115. // Tool introduction
  116. Display::display_introduction_section(TOOL_WIKI);
  117. /*
  118. ACTIONS
  119. */
  120. //release of blocked pages to prevent concurrent editions
  121. $sql='SELECT * FROM '.$tbl_wiki.'WHERE is_editing!="0" '.$condition_session;
  122. $result=Database::query($sql);
  123. while ($is_editing_block=Database::fetch_array($result)) {
  124. $max_edit_time = 1200; // 20 minutes
  125. $timestamp_edit = strtotime($is_editing_block['time_edit']);
  126. $time_editing = time()-$timestamp_edit;
  127. //first prevent concurrent users and double version
  128. if ($is_editing_block['is_editing']==$_user['user_id']) {
  129. $_SESSION['_version']=$is_editing_block['version'];
  130. } else {
  131. unset ( $_SESSION['_version'] );
  132. }
  133. //second checks if has exceeded the time that a page may be available or if a page was edited and saved by its author
  134. if ($time_editing>$max_edit_time || ($is_editing_block['is_editing']==$_user['user_id'] && $_GET['action']!='edit')) {
  135. $sql='UPDATE '.$tbl_wiki.' SET is_editing="0", time_edit="0000-00-00 00:00:00" WHERE is_editing="'.$is_editing_block['is_editing'].'" '.$condition_session;
  136. Database::query($sql);
  137. }
  138. }
  139. // saving a change
  140. if (isset($_POST['SaveWikiChange']) AND $_POST['title']<>'') {
  141. if(empty($_POST['title'])) {
  142. Display::display_error_message(get_lang("NoWikiPageTitle"));
  143. } elseif(!double_post($_POST['wpost_id'])) {
  144. //double post
  145. } elseif ($_POST['version']!='' && $_SESSION['_version']!=0 && $_POST['version']!=$_SESSION['_version']) {
  146. //prevent concurrent users and double version
  147. Display::display_error_message(get_lang("EditedByAnotherUser"));
  148. } else {
  149. $return_message=save_wiki();
  150. Display::display_confirmation_message($return_message, false);
  151. }
  152. }
  153. //saving a new wiki entry
  154. if (isset($_POST['SaveWikiNew'])) {
  155. if (empty($_POST['title'])) {
  156. Display::display_error_message(get_lang("NoWikiPageTitle"));
  157. } elseif (strtotime(get_date_from_select('startdate_assig')) > strtotime(get_date_from_select('enddate_assig'))) {
  158. Display::display_error_message(get_lang("EndDateCannotBeBeforeTheStartDate"));
  159. } elseif(!double_post($_POST['wpost_id'])) {
  160. //double post
  161. } else {
  162. $_clean['assignment']=Database::escape_string($_POST['assignment']); // for mode assignment
  163. if ($_clean['assignment']==1) {
  164. auto_add_page_users($_clean['assignment']);
  165. } else {
  166. $return_message=save_new_wiki();
  167. if ($return_message==false) {
  168. Display::display_error_message(get_lang('NoWikiPageTitle'), false);
  169. } else {
  170. Display::display_confirmation_message($return_message, false);
  171. }
  172. }
  173. }
  174. }
  175. // check last version
  176. if ($_GET['view']) {
  177. $sql='SELECT * FROM '.$tbl_wiki.'WHERE id="'.Database::escape_string($_GET['view']).'"'; //current view
  178. $result=Database::query($sql);
  179. $current_row=Database::fetch_array($result);
  180. $sql='SELECT * FROM '.$tbl_wiki.'WHERE reflink="'.Database::escape_string($page).'" AND '.$groupfilter.$condition_session.' ORDER BY id DESC'; //last version
  181. $result=Database::query($sql);
  182. $last_row=Database::fetch_array($result);
  183. if ($_GET['view']<$last_row['id']) {
  184. $message= '<center>'.get_lang('NoAreSeeingTheLastVersion').'<br /> '.get_lang("Version").' (<a href="index.php?cidReq='.$_course['id'].'&action=showpage&amp;title='.api_htmlentities(urlencode($current_row['reflink'])).'&view='.api_htmlentities($_GET['view']).'&session_id='.$current_row['session_id'].'&group_id='.$current_row['group_id'].'" title="'.get_lang('CurrentVersion').'">'.$current_row['version'].'</a> / <a href="index.php?cidReq='.$_course['id'].'&action=showpage&amp;title='.api_htmlentities(urlencode($last_row['reflink'])).'&group_id='.$last_row['group_id'].'&session_id='.$last_row['session_id'].'" title="'.get_lang('LastVersion').'">'.$last_row['version'].'</a>) <br />'.get_lang("ConvertToLastVersion").': <a href="index.php?cidReq='.$_course['id'].'&action=restorepage&amp;title='.api_htmlentities(urlencode($last_row['reflink'])).'&view='.api_htmlentities($_GET['view']).'">'.get_lang("Restore").'</a></center>';
  185. Display::display_warning_message($message,false);
  186. }
  187. ///restore page
  188. if ($_GET['action']=='restorepage') {
  189. //Only teachers and platform admin can edit the index page. Only teachers and platform admin can edit an assignment teacher
  190. if (($current_row['reflink']=='index' || $current_row['reflink']=='' || $current_row['assignment']==1) && (!api_is_allowed_to_edit(false,true) && intval($_GET['group_id'])==0)) {
  191. Display::display_normal_message(get_lang('OnlyEditPagesCourseManager'));
  192. } else {
  193. $PassEdit=false;
  194. //check if is a wiki group
  195. if ($current_row['group_id']!=0) {
  196. //Only teacher, platform admin and group members can edit a wiki group
  197. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin() || GroupManager :: is_user_in_group($_user['user_id'],intval($_GET['group_id']))) {
  198. $PassEdit=true;
  199. } else {
  200. Display::display_normal_message(get_lang('OnlyEditPagesGroupMembers'));
  201. }
  202. } else {
  203. $PassEdit=true;
  204. }
  205. // check if is an assignment
  206. if ($current_row['assignment']==1) {
  207. Display::display_normal_message(get_lang('EditAssignmentWarning'));
  208. $icon_assignment=Display::return_icon('wiki_assignment.png', get_lang('AssignmentDescExtra'),'',22);
  209. } elseif($current_row['assignment']==2) {
  210. $icon_assignment=Display::return_icon('wiki_work.png', get_lang('AssignmentWorkExtra'),'',22);
  211. if ((api_get_user_id()==$current_row['user_id'])==false) {
  212. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin()) {
  213. $PassEdit=true;
  214. } else {
  215. Display::display_warning_message(get_lang('LockByTeacher'));
  216. $PassEdit=false;
  217. }
  218. } else {
  219. $PassEdit=true;
  220. }
  221. }
  222. if ($PassEdit) { //show editor if edit is allowed
  223. if ($row['editlock']==1 && (api_is_allowed_to_edit(false,true)==false || api_is_platform_admin()==false)) {
  224. Display::display_normal_message(get_lang('PageLockedExtra'));
  225. } else {
  226. if ($last_row['is_editing']!=0 && $last_row['is_editing']!=$_user['user_id']) {
  227. //checking for concurrent users
  228. $timestamp_edit=strtotime($last_row['time_edit']);
  229. $time_editing=time()-$timestamp_edit;
  230. $max_edit_time=1200; // 20 minutes
  231. $rest_time=$max_edit_time-$time_editing;
  232. $userinfo=Database::get_user_info_from_id($last_row['is_editing']);
  233. $is_being_edited= get_lang('ThisPageisBeginEditedBy').' <a href=../user/userInfo.php?uInfo='.$userinfo['user_id'].'>'.api_get_person_name($userinfo['firstname'], $userinfo['lastname']).'</a>. '.get_lang('ThisPageisBeginEditedTryLater').' '.date( "i",$rest_time).' '.get_lang('MinMinutes').'';
  234. Display::display_normal_message($is_being_edited, false);
  235. } else {
  236. Display::display_confirmation_message(restore_wikipage($current_row['page_id'], $current_row['reflink'], $current_row['title'], $current_row['content'], $current_row['group_id'], $current_row['assignment'], $current_row['progress'], $current_row['version'], $last_row['version'], $current_row['linksto']).': <a href="index.php?cidReq='.$_course['id'].'&action=showpage&amp;title='.api_htmlentities(urlencode($last_row['reflink'])).'&session_id='.$last_row['session_id'].'&group_id='.$last_row['group_id'].'">'.api_htmlentities($last_row['title']).'</a>',false);
  237. }
  238. }
  239. }
  240. }
  241. }
  242. }
  243. if ($_GET['action']=='deletewiki') {
  244. if(api_is_allowed_to_edit(false,true) || api_is_platform_admin()) {
  245. if ($_GET['delete'] == 'yes') {
  246. $return_message=delete_wiki();
  247. Display::display_confirmation_message($return_message);
  248. }
  249. }
  250. }
  251. if ($_GET['action']=='discuss' && $_POST['Submit']) {
  252. Display::display_confirmation_message(get_lang('CommentAdded'));
  253. }
  254. /* WIKI WRAPPER */
  255. echo '<div id="wikiwrapper">';
  256. /** Actions bar (= action of the wiki tool, not of the page)**/
  257. //dynamic wiki menu
  258. ?>
  259. <script type="text/javascript">
  260. function menu_wiki(){
  261. if(document.getElementById("menuwiki").style.width=="160px"){
  262. var w=74;
  263. var b=2;
  264. var h=30;
  265. }
  266. else{
  267. var w=160;
  268. var b=1;
  269. var h=160;
  270. }
  271. document.getElementById("menuwiki").style.width=w+"px";
  272. document.getElementById("menuwiki").style.height=h+"px";
  273. document.getElementById("menuwiki").style.border=b+"px solid #cccccc";
  274. }
  275. </script>
  276. <?php
  277. echo '<div id="menuwiki">';
  278. echo '&nbsp;<a href="index.php?cidReq='.$_course['id'].'&action=show&amp;title=index&session_id='.$session_id.'&group_id='.$_clean['group_id'].'"'.is_active_navigation_tab('show').'>'.Display::return_icon('wiki.png',get_lang('HomeWiki'),'','32').'</a>&nbsp;';
  279. echo '&nbsp;<a href="javascript:void(0)" onClick="menu_wiki()">'.Display::return_icon('menu.png',get_lang('Menu'),'','22').'</a>';
  280. ///menu home
  281. echo '<ul>';
  282. if ( api_is_allowed_to_session_edit(false,true) ) {
  283. //menu add page
  284. echo '<li><a href="index.php?cidReq='.$_course['id'].'&action=addnew&session_id='.$session_id.'&group_id='.$_clean['group_id'].'"'.is_active_navigation_tab('addnew').'>'.get_lang('AddNew').'</a> ';
  285. }
  286. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin()) {
  287. // page action: enable or disable the adding of new pages
  288. if (check_addnewpagelock()==0) {
  289. $protect_addnewpage= '<img src="../img/off.png" title="'.get_lang('AddOptionProtected').'" alt="'.get_lang('AddOptionProtected').'" width="8" height="8" />';
  290. $lock_unlock_addnew='unlockaddnew';
  291. } else {
  292. $protect_addnewpage= '<img src="../img/on.png" title="'.get_lang('AddOptionUnprotected').'" alt="'.get_lang('AddOptionUnprotected').'" width="8" height="8" />';
  293. $lock_unlock_addnew='lockaddnew';
  294. }
  295. }
  296. echo '<a href="index.php?action=show&amp;actionpage='.$lock_unlock_addnew.'&amp;title='.api_htmlentities(urlencode($page)).'">'.$protect_addnewpage.'</a></li>';
  297. ///menu find
  298. echo '<li><a href="index.php?cidReq='.$_course['id'].'&action=searchpages&session_id='.$session_id.'&group_id='.$_clean['group_id'].'"'.is_active_navigation_tab('searchpages').'>'.get_lang('SearchPages').'</a></li>';
  299. ///menu all pages
  300. echo '<li><a href="index.php?cidReq='.$_course['id'].'&action=allpages&session_id='.$session_id.'&group_id='.$_clean['group_id'].'"'.is_active_navigation_tab('allpages').'>'.get_lang('AllPages').'</a></li>';
  301. ///menu recent changes
  302. echo '<li><a href="index.php?cidReq='.$_course['id'].'&action=recentchanges&session_id='.$session_id.'&group_id='.$_clean['group_id'].'"'.is_active_navigation_tab('recentchanges').'>'.get_lang('RecentChanges').'</a></li>';
  303. ///menu delete all wiki
  304. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin()) {
  305. echo '<li><a href="index.php?action=deletewiki&amp;title='.api_htmlentities(urlencode($page)).'"'.is_active_navigation_tab('deletewiki').'>'.get_lang('DeleteWiki').'</a></li>';
  306. }
  307. ///menu more
  308. echo '<li><a href="index.php?action=more&amp;title='.api_htmlentities(urlencode($page)).'"'.is_active_navigation_tab('more').'>'.get_lang('More').'</a></li>';
  309. echo '</ul>';
  310. echo '</div>';
  311. /*
  312. MAIN WIKI AREA
  313. */
  314. echo '<div id="mainwiki">';
  315. /** menuwiki (= actions of the page, not of the wiki tool) **/
  316. if (!in_array($_GET['action'], array('addnew', 'searchpages', 'allpages', 'recentchanges', 'deletewiki', 'more', 'mactiveusers', 'mvisited', 'mostchanged', 'orphaned', 'wanted'))) {
  317. echo '<div class="actions">';
  318. //menu show page
  319. echo '&nbsp;&nbsp;<a href="index.php?cidReq='.$_course['id'].'&action=showpage&amp;title='.api_htmlentities(urlencode($page)).'&session_id='.$session_id.'&group_id='.$_clean['group_id'].'"'.is_active_navigation_tab('showpage').'>'.Display::return_icon('page.png',get_lang('ShowThisPage'),'','32').'</a>';
  320. if (api_is_allowed_to_session_edit(false,true) ) {
  321. //menu edit page
  322. echo '<a href="index.php?cidReq='.$_course['id'].'&action=edit&amp;title='.api_htmlentities(urlencode($page)).'&session_id='.$session_id.'&group_id='.$_clean['group_id'].'"'.is_active_navigation_tab('edit').'>'.Display::return_icon('edit.png',get_lang('EditThisPage'),'','32').'</a>';
  323. //menu discuss page
  324. echo '<a href="index.php?action=discuss&amp;title='.api_htmlentities(urlencode($page)).'"'.is_active_navigation_tab('discuss').'>'.Display::return_icon('discuss.png',get_lang('DiscussThisPage'),'','32').'</a>';
  325. }
  326. //menu history
  327. echo '<a href="index.php?cidReq='.$_course['id'].'&action=history&amp;title='.api_htmlentities(urlencode($page)).'&session_id='.$session_id.'&group_id='.$_clean['group_id'].'"'.is_active_navigation_tab('history').'>'.Display::return_icon('history.png',get_lang('ShowPageHistory'),'','32').'</a>';
  328. //menu linkspages
  329. echo '<a href="index.php?action=links&amp;title='.api_htmlentities(urlencode($page)).'&session_id='.$session_id.'&group_id='.$_clean['group_id'].'"'.is_active_navigation_tab('links').'>'.Display::return_icon('what_link_here.png',get_lang('LinksPages'),'','32').'</a>';
  330. //menu delete wikipage
  331. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin()) {
  332. echo '<a href="index.php?action=delete&amp;title='.api_htmlentities(urlencode($page)).'"'.is_active_navigation_tab('delete').'>'.Display::return_icon('delete.png',get_lang('DeleteThisPage'),'','32').'</a>';
  333. }
  334. echo '</div>';
  335. }
  336. //In new pages go to new page
  337. if (isset($_POST['SaveWikiNew'])) {
  338. display_wiki_entry($_POST['reflink']);
  339. }
  340. /////////////////////// more options /////////////////////// Juan Carlos Raña Trabado
  341. //more for export to course document area. See display_wiki_entry
  342. if ($_POST['export2DOC']) {
  343. $titleDOC=$_POST['titleDOC'];
  344. $contentDOC=$_POST['contentDOC'];
  345. $groupIdDOC=(int)$_SESSION['_gid'];
  346. $export2doc = export2doc($titleDOC,$contentDOC,$groupIdDOC);
  347. if ($export2doc) {
  348. Display::display_confirmation_message(get_lang('ThePageHasBeenExportedToDocArea'));
  349. }
  350. }
  351. if ($_GET['action']=='more') {
  352. echo '<div class="actions">'.get_lang('More').'</div>';
  353. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin()) {
  354. //TODO: config area and private stats
  355. }
  356. echo '<table border="0">';
  357. echo ' <tr>';
  358. echo ' <td>';
  359. echo ' <ul>';
  360. //Submenu Most active users
  361. echo ' <li><a href="index.php?cidReq='.$_course['id'].'&action=mactiveusers&session_id='.$session_id.'&group_id='.$_clean['group_id'].'">'.get_lang('MostActiveUsers').'</a></li>';
  362. //Submenu Most visited pages
  363. echo ' <li><a href="index.php?cidReq='.$_course['id'].'&action=mvisited&session_id='.$session_id.'&group_id='.$_clean['group_id'].'">'.get_lang('MostVisitedPages').'</a></li>';
  364. //Submenu Most changed pages
  365. echo ' <li><a href="index.php?cidReq='.$_course['id'].'&action=mostchanged&session_id='.$session_id.'&group_id='.$_clean['group_id'].'">'.get_lang('MostChangedPages').'</a></li>';
  366. echo ' </ul>';
  367. echo ' </td>';
  368. echo ' <td>';
  369. echo ' <ul>';
  370. //Submenu Orphaned pages
  371. echo ' <li><a href="index.php?cidReq='.$_course['id'].'&action=orphaned&session_id='.$session_id.'&group_id='.$_clean['group_id'].'">'.get_lang('OrphanedPages').'</a></li>';
  372. //Submenu Wanted pages
  373. echo ' <li><a href="index.php?cidReq='.$_course['id'].'&action=wanted&session_id='.$session_id.'&group_id='.$_clean['group_id'].'">'.get_lang('WantedPages').'</a></li>';
  374. echo ' </ul>';
  375. echo' </td>';
  376. echo ' </tr>';
  377. echo '</table>';
  378. //Submenu Most linked pages
  379. //echo '<li><a href="index.php?cidReq='.$_course['id'].'&action=mostlinked&session_id='.$session_id.'&group_id='.$_clean['group_id'].'">'.get_lang('MostLinkedPages').'</a></li>';//TODO:
  380. //Submenu Dead end pages
  381. //echo '<li><a href="index.php?cidReq='.$_course['id'].'&action=deadend&session_id='.$session_id.'&group_id='.$_clean['group_id'].'">'.get_lang('DeadEndPages').'</a></li>';//TODO:
  382. //Submenu Most new pages (not versions)
  383. //echo '<li><a href="index.php?cidReq='.$_course['id'].'&action=mnew&session_id='.$session_id.'&group_id='.$_clean['group_id'].'">'.get_lang('MostNewPages').'</a></li>';//TODO:
  384. //Submenu Most long pages
  385. //echo '<li><a href="index.php?cidReq='.$_course['id'].'&action=mnew&session_id='.$session_id.'&group_id='.$_clean['group_id'].'">'.get_lang('MostLongPages').'</a></li>';//TODO:
  386. //Submenu Protected pages
  387. //echo '<li><a href="index.php?cidReq='.$_course['id'].'&action=protected&session_id='.$session_id.'&group_id='.$_clean['group_id'].'">'.get_lang('ProtectedPages').'</a></li>';//TODO:
  388. //Submenu Hidden pages
  389. //echo '<li><a href="index.php?cidReq='.$_course['id'].'&action=hidden&session_id='.$session_id.'&group_id='.$_clean['group_id'].'">'.get_lang('HiddenPages').'</a></li>';//TODO:
  390. //Submenu Most discuss pages
  391. //echo '<li><a href="index.php?cidReq='.$_course['id'].'&action=mdiscuss&session_id='.$session_id.'&group_id='.$_clean['group_id'].'">'.get_lang('MostDiscussPages').'</a></li>';//TODO:
  392. //Submenu Best scored pages
  393. //echo '<li><a href="index.php?cidReq='.$_course['id'].'&action=mscored&session_id='.$session_id.'&group_id='.$_clean['group_id'].'">'.get_lang('BestScoredPages').'</a></li>';//TODO:
  394. //Submenu Pages with more progress
  395. //echo '<li><a href="index.php?cidReq='.$_course['id'].'&action=mprogress&session_id='.$session_id.'&group_id='.$_clean['group_id'].'">'.get_lang('MProgressPages').'</a></li>';//TODO:
  396. //Submenu Most active users in discuss
  397. //echo '<li><a href="index.php?cidReq='.$_course['id'].'&action=mactiveusers&session_id='.$session_id.'&group_id='.$_clean['group_id'].'">'.get_lang('MostDiscussUsers').'</a></li>';//TODO:
  398. //Submenu Random page
  399. //echo '<li><a href="index.php?cidReq='.$_course['id'].'&action=mrandom&session_id='.$session_id.'&group_id='.$_clean['group_id'].'">'.get_lang('RandomPage').'</a></li>';//TODO:
  400. }
  401. /////////////////////// Most active users /////////////////////// Juan Carlos Raña Trabado
  402. if ($_GET['action']=='mactiveusers') {
  403. echo '<div class="actions">'.get_lang('MostActiveUsers').'</div>';
  404. $sql='SELECT *, COUNT(*) AS NUM_EDIT FROM '.$tbl_wiki.' WHERE '.$groupfilter.$condition_session.' GROUP BY user_id';
  405. $allpages=Database::query($sql);
  406. //show table
  407. if (Database::num_rows($allpages) > 0) {
  408. $row = array ();
  409. while ($obj = Database::fetch_object($allpages)) {
  410. $userinfo=Database::get_user_info_from_id($obj->user_id);
  411. $row = array ();
  412. $row[] = $obj->user_id <>0 ? '<a href="../user/userInfo.php?uInfo='.$userinfo['user_id'].'">'.api_htmlentities(api_get_person_name($userinfo['firstname'], $userinfo['lastname'])).'</a><a href="'.api_get_self().'?cidReq='.$_course['id'].'&action=usercontrib&user_id='.urlencode($row['user_id']).'&session_id='.api_htmlentities($_GET['session_id']).'&group_id='.api_htmlentities($_GET['group_id']).'"></a>' : get_lang('Anonymous').' ('.$obj->user_ip.')';
  413. $row[] ='<a href="'.api_get_self().'?cidReq='.$_course['id'].'&action=usercontrib&user_id='.urlencode($obj->user_id).'&session_id='.api_htmlentities($_GET['session_id']).'&group_id='.api_htmlentities($_GET['group_id']).'">'.$obj->NUM_EDIT.'</a>';
  414. $rows[] = $row;
  415. }
  416. $table = new SortableTableFromArrayConfig($rows,1,10,'MostActiveUsersA_table','','','DESC');
  417. $table->set_additional_parameters(array('cidReq' =>Security::remove_XSS($_GET['cidReq']),'action'=>Security::remove_XSS($_GET['action']),'session_id'=>Security::remove_XSS($_GET['session_id']),'group_id'=>Security::remove_XSS($_GET['group_id'])));
  418. $table->set_header(0,get_lang('Author'), true, array ('style' => 'width:30px;'));
  419. $table->set_header(1,get_lang('Contributions'), true);
  420. $table->display();
  421. }
  422. }
  423. /////////////////////// User contributions /////////////////////// Juan Carlos Raña Trabado
  424. if ($_GET['action']=='usercontrib') {
  425. $userinfo=Database::get_user_info_from_id($_GET['user_id']);
  426. echo '<div class="actions">'.get_lang('UserContributions').': <a href="../user/userInfo.php?uInfo='.$userinfo['user_id'].'">'.api_htmlentities(api_get_person_name($userinfo['firstname'], $userinfo['lastname'])).'</a><a href="'.api_get_self().'?cidReq='.$_course['id'].'&action=usercontrib&user_id='.urlencode($row['user_id']).'&session_id='.api_htmlentities($_GET['session_id']).'&group_id='.api_htmlentities($_GET['group_id']).'"></a></div>';
  427. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin()) { //only by professors if page is hidden
  428. $sql='SELECT * FROM '.$tbl_wiki.' WHERE '.$groupfilter.$condition_session.' AND user_id="'.Database::escape_string($_GET['user_id']).'"';
  429. } else {
  430. $sql='SELECT * FROM '.$tbl_wiki.' WHERE '.$groupfilter.$condition_session.' AND user_id="'.Database::escape_string($_GET['user_id']).'" AND visibility=1';
  431. }
  432. $allpages=Database::query($sql);
  433. //show table
  434. if (Database::num_rows($allpages) > 0) {
  435. $row = array ();
  436. while ($obj = Database::fetch_object($allpages)) {
  437. //get author
  438. $userinfo=Database::get_user_info_from_id($obj->user_id);
  439. //get time
  440. $year = substr($obj->dtime, 0, 4);
  441. $month = substr($obj->dtime, 5, 2);
  442. $day = substr($obj->dtime, 8, 2);
  443. $hours = substr($obj->dtime, 11,2);
  444. $minutes = substr($obj->dtime, 14,2);
  445. $seconds = substr($obj->dtime, 17,2);
  446. //get type assignment icon
  447. if ($obj->assignment==1) {
  448. $ShowAssignment=Display::return_icon('wiki_assignment.png', get_lang('AssignmentDescExtra'),'',22);
  449. } elseif ($obj->assignment==2) {
  450. $ShowAssignment=Display::return_icon('wiki_work.png', get_lang('AssignmentWork'),'',22);
  451. } elseif ($obj->assignment==0) {
  452. $ShowAssignment='<img src="../img/px_transparent.gif" />';
  453. }
  454. $row = array ();
  455. $row[] = $year.'-'.$month.'-'.$day.' '.$hours.":".$minutes.":".$seconds;
  456. $row[] =$ShowAssignment;
  457. $row[] = '<a href="'.api_get_self().'?cidReq='.$_course['id'].'&action=showpage&title='.api_htmlentities(urlencode($obj->reflink)).'&view='.$obj->id.'&session_id='.api_htmlentities(urlencode($_GET['$session_id'])).'&group_id='.api_htmlentities(urlencode($_GET['group_id'])).'">'.api_htmlentities($obj->title).'</a>';
  458. $row[] =Security::remove_XSS($obj->version);
  459. $row[] =Security::remove_XSS($obj->comment);
  460. //$row[] = api_strlen($obj->comment)>30 ? Security::remove_XSS(api_substr($obj->comment,0,30)).'...' : Security::remove_XSS($obj->comment);
  461. $row[] =Security::remove_XSS($obj->progress).' %';
  462. $row[] =Security::remove_XSS($obj->score);
  463. //if(api_is_allowed_to_edit() || api_is_platform_admin())
  464. //{
  465. //$row[] =Security::remove_XSS($obj->user_ip);
  466. //}
  467. $rows[] = $row;
  468. }
  469. $table = new SortableTableFromArrayConfig($rows,2,10,'UsersContributions_table','','','ASC');
  470. $table->set_additional_parameters(array('cidReq' =>Security::remove_XSS($_GET['cidReq']),'action'=>Security::remove_XSS($_GET['action']),'user_id'=>Security::remove_XSS($_GET['user_id']),'session_id'=>Security::remove_XSS($_GET['session_id']),'group_id'=>Security::remove_XSS($_GET['group_id'])));
  471. $table->set_header(0,get_lang('Date'), true, array ('style' => 'width:200px;'));
  472. $table->set_header(1,get_lang('Type'), true, array ('style' => 'width:30px;'));
  473. $table->set_header(2,get_lang('Title'), true, array ('style' => 'width:200px;'));
  474. $table->set_header(3,get_lang('Version'), true, array ('style' => 'width:30px;'));
  475. $table->set_header(4,get_lang('Comment'), true, array ('style' => 'width:200px;'));
  476. $table->set_header(5,get_lang('Progress'), true, array ('style' => 'width:30px;'));
  477. $table->set_header(6,get_lang('Rating'), true, array ('style' => 'width:30px;'));
  478. //if(api_is_allowed_to_edit() || api_is_platform_admin())
  479. //{
  480. //$table->set_header(7,get_lang('IP'), true, array ('style' => 'width:30px;'));
  481. //}
  482. $table->display();
  483. }
  484. }
  485. /////////////////////// Most changed pages /////////////////////// Juan Carlos Raña Trabado
  486. if ($_GET['action']=='mostchanged') {
  487. echo '<div class="actions">'.get_lang('MostChangedPages').'</div>';
  488. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin()) { //only by professors if page is hidden
  489. $sql='SELECT *, MAX(version) AS MAX FROM '.$tbl_wiki.' WHERE '.$groupfilter.$condition_session.' GROUP BY reflink';
  490. } else {
  491. $sql='SELECT *, MAX(version) AS MAX FROM '.$tbl_wiki.' WHERE '.$groupfilter.$condition_session.' AND visibility=1 GROUP BY reflink';
  492. }
  493. $allpages=Database::query($sql);
  494. //show table
  495. if (Database::num_rows($allpages) > 0) {
  496. $row = array ();
  497. while ($obj = Database::fetch_object($allpages)) {
  498. //get type assignment icon
  499. if ($obj->assignment==1) {
  500. $ShowAssignment=Display::return_icon('wiki_assignment.png', get_lang('AssignmentDesc'),'',22);
  501. } elseif ($obj->assignment==2) {
  502. $ShowAssignment=Display::return_icon('wiki_work.png', get_lang('AssignmentWork'),'',22);
  503. } elseif ($obj->assignment==0) {
  504. $ShowAssignment='<img src="../img/px_transparent.gif" />';
  505. }
  506. $row = array ();
  507. $row[] =$ShowAssignment;
  508. $row[] = '<a href="'.api_get_self().'?cidReq='.$_course['id'].'&action=showpage&title='.api_htmlentities(urlencode($obj->reflink)).'&session_id='.api_htmlentities($_GET['session_id']).'&group_id='.api_htmlentities($_GET['group_id']).'">'.api_htmlentities($obj->title).'</a>';
  509. $row[] = $obj->MAX;
  510. $rows[] = $row;
  511. }
  512. $table = new SortableTableFromArrayConfig($rows,2,10,'MostChangedPages_table','','','DESC');
  513. $table->set_additional_parameters(array('cidReq' =>Security::remove_XSS($_GET['cidReq']),'action'=>Security::remove_XSS($_GET['action']),'session_id'=>Security::remove_XSS($_GET['session_id']),'group_id'=>Security::remove_XSS($_GET['group_id'])));
  514. $table->set_header(0,get_lang('Type'), true, array ('style' => 'width:30px;'));
  515. $table->set_header(1,get_lang('Title'), true);
  516. $table->set_header(2,get_lang('Changes'), true);
  517. $table->display();
  518. }
  519. }
  520. /////////////////////// Most visited pages /////////////////////// Juan Carlos Raña Trabado
  521. if ($_GET['action']=='mvisited') {
  522. echo '<div class="actions">'.get_lang('MostVisitedPages').'</div>';
  523. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin()) { //only by professors if page is hidden
  524. $sql='SELECT *, SUM(hits) AS tsum FROM '.$tbl_wiki.' WHERE '.$groupfilter.$condition_session.' GROUP BY reflink';
  525. } else {
  526. $sql='SELECT *, SUM(hits) AS tsum FROM '.$tbl_wiki.' WHERE '.$groupfilter.$condition_session.' AND visibility=1 GROUP BY reflink';
  527. }
  528. $allpages=Database::query($sql);
  529. //show table
  530. if (Database::num_rows($allpages) > 0) {
  531. $row = array ();
  532. while ($obj = Database::fetch_object($allpages)) {
  533. //get type assignment icon
  534. if ($obj->assignment==1) {
  535. $ShowAssignment=Display::return_icon('wiki_assignment.png', get_lang('AssignmentDesc'),'',22);
  536. } elseif ($obj->assignment==2) {
  537. $ShowAssignment=$ShowAssignment=Display::return_icon('wiki_work.png', get_lang('AssignmentWork'),'',22);
  538. } elseif ($obj->assignment==0) {
  539. $ShowAssignment='<img src="../img/px_transparent.gif" />';
  540. }
  541. $row = array ();
  542. $row[] =$ShowAssignment;
  543. $row[] = '<a href="'.api_get_self().'?cidReq='.$_course['id'].'&action=showpage&title='.api_htmlentities(urlencode($obj->reflink)).'&session_id='.api_htmlentities($_GET['session_id']).'&group_id='.api_htmlentities($_GET['group_id']).'">'.api_htmlentities($obj->title).'</a>';
  544. $row[] = $obj->tsum;
  545. $rows[] = $row;
  546. }
  547. $table = new SortableTableFromArrayConfig($rows,2,10,'MostVisitedPages_table','','','DESC');
  548. $table->set_additional_parameters(array('cidReq' =>Security::remove_XSS($_GET['cidReq']),'action'=>Security::remove_XSS($_GET['action']),'session_id'=>Security::remove_XSS($_GET['session_id']),'group_id'=>Security::remove_XSS($_GET['group_id'])));
  549. $table->set_header(0,get_lang('Type'), true, array ('style' => 'width:30px;'));
  550. $table->set_header(1,get_lang('Title'), true);
  551. $table->set_header(2,get_lang('Visits'), true);
  552. $table->display();
  553. }
  554. }
  555. /////////////////////// Wanted pages /////////////////////// Juan Carlos Raña Trabado
  556. if ($_GET['action']=='wanted') {
  557. echo '<div class="actions">'.get_lang('WantedPages').'</div>';
  558. $pages = array();
  559. $refs = array();
  560. $sort_wanted=array();
  561. //get name pages
  562. $sql='SELECT * FROM '.$tbl_wiki.' WHERE '.$groupfilter.$condition_session.' GROUP BY reflink ORDER BY reflink ASC';
  563. $allpages=Database::query($sql);
  564. while ($row=Database::fetch_array($allpages)) {
  565. $pages[] = $row['reflink'];
  566. }
  567. //get name refs in last pages and make a unique list
  568. //$sql='SELECT * FROM '.$tbl_wiki.' s1 WHERE id=(SELECT MAX(s2.id) FROM '.$tbl_wiki.' s2 WHERE s1.reflink = s2.reflink AND '.$groupfilter.')'; //old version TODO: Replace by the bottom line
  569. $sql='SELECT * FROM '.$tbl_wiki.', '.$tbl_wiki_conf.' WHERE visibility=1 AND '.$tbl_wiki_conf.'.page_id='.$tbl_wiki.'.page_id AND '.$tbl_wiki.'.'.$groupfilter.$condition_session; // new version
  570. $allpages=Database::query($sql);
  571. while ($row=Database::fetch_array($allpages)) {
  572. //$row['linksto']= str_replace("\n".$row["reflink"]."\n", "\n", $row["linksto"]); //remove self reference. TODO: check
  573. $rf = explode(" ", trim($row["linksto"]));//wanted pages without /n only blank " "
  574. $refs = array_unique($rf);
  575. }
  576. //sort linksto. Find linksto into reflink. If not found ->page is wanted
  577. natcasesort($refs);
  578. echo '<ul>';
  579. foreach ($refs as $v) {
  580. if (!in_array($v, $pages)) {
  581. if (trim($v)!="") {
  582. echo '<li><a href="'.api_get_path(WEB_PATH).'main/wiki/index.php?cidReq=&action=addnew&title='.api_htmlentities(urlencode(str_replace('_',' ',$v))).'&session_id='.api_htmlentities($_GET['session_id']).'&group_id='.api_htmlentities($_GET['group_id']).'" class="new_wiki_link">'.api_htmlentities(str_replace('_',' ',$v)).'</a></li>';
  583. }
  584. }
  585. }
  586. echo '</ul>';
  587. }
  588. /////////////////////// Orphaned pages /////////////////////// Juan Carlos Raña Trabado
  589. if ($_GET['action']=='orphaned') {
  590. echo '<div class="actions">'.get_lang('OrphanedPages').'</div>';
  591. $pages = array();
  592. $refs = array();
  593. $orphaned = array();
  594. //get name pages
  595. $sql='SELECT * FROM '.$tbl_wiki.' WHERE '.$groupfilter.$condition_session.' GROUP BY reflink ORDER BY reflink ASC';
  596. $allpages=Database::query($sql);
  597. while ($row=Database::fetch_array($allpages)) {
  598. $pages[] = $row['reflink'];
  599. }
  600. //get name refs in last pages and make a unique list
  601. //$sql='SELECT * FROM '.$tbl_wiki.' s1 WHERE id=(SELECT MAX(s2.id) FROM '.$tbl_wiki.' s2 WHERE s1.reflink = s2.reflink AND '.$groupfilter.')'; //old version TODO: Replace by the bottom line
  602. $sql='SELECT * FROM '.$tbl_wiki.', '.$tbl_wiki_conf.' WHERE '.$tbl_wiki_conf.'.page_id='.$tbl_wiki.'.page_id AND '.$tbl_wiki.'.'.$groupfilter.$condition_session.' '; // new version
  603. $allpages=Database::query($sql);
  604. while ($row=Database::fetch_array($allpages)) {
  605. //$row['linksto']= str_replace("\n".$row["reflink"]."\n", "\n", $row["linksto"]); //remove self reference. TODO: check
  606. $rf = explode(" ", trim($row["linksto"])); //fix replace explode("\n", trim($row["linksto"])) with explode(" ", trim($row["linksto"]))
  607. $refs = array_merge($refs, $rf);
  608. if ($n++ > 299) {
  609. $refs = array_unique($refs);
  610. $n=0;
  611. } // (clean-up only every 300th loop). Thanks to Erfurt Wiki
  612. }
  613. //search each name of list linksto into list reflink
  614. foreach ($pages as $v) {
  615. if (!in_array($v, $refs)) {
  616. $orphaned[] = $v;
  617. }
  618. }
  619. //change reflink by title
  620. foreach ($orphaned as $vshow) {
  621. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin()) { //only by professors if page is hidden
  622. $sql='SELECT * FROM '.$tbl_wiki.' WHERE '.$groupfilter.$condition_session.' AND reflink="'.Database::escape_string($vshow).'" GROUP BY reflink';
  623. } else {
  624. $sql='SELECT * FROM '.$tbl_wiki.' WHERE '.$groupfilter.$condition_session.' AND reflink="'.Database::escape_string($vshow).'" AND visibility=1 GROUP BY reflink';
  625. }
  626. $allpages=Database::query($sql);
  627. echo '<ul>';
  628. while ($row=Database::fetch_array($allpages)) {
  629. //fix assignment icon
  630. if ($row['assignment']==1) {
  631. $ShowAssignment=Display::return_icon('wiki_assignment.png','','',22);
  632. } elseif ($row['assignment']==2) {
  633. $ShowAssignment=Display::return_icon('wiki_work.png','','',22);
  634. } elseif ($row['assignment']==0) {
  635. $ShowAssignment='<img src="../img/px_transparent.gif" />';
  636. }
  637. echo '<li>'.$ShowAssignment.'<a href="'.api_get_self().'?cidReq='.$_course['id'].'&action=showpage&title='.api_htmlentities(urlencode($row['reflink'])).'&session_id='.api_htmlentities($_GET['session_id']).'&group_id='.api_htmlentities($_GET['group_id']).'">'.api_htmlentities($row['title']).'</a></li>';
  638. }
  639. echo '</ul>';
  640. }
  641. }
  642. /////////////////////// delete current page /////////////////////// Juan Carlos Raña Trabado
  643. if ($_GET['action']=='delete') {
  644. if (!$_GET['title']) {
  645. Display::display_error_message(get_lang('MustSelectPage'));
  646. exit;
  647. }
  648. echo '<div style="overflow:hidden">';
  649. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin()) {
  650. echo '<div id="wikititle">'.get_lang('DeletePageHistory').'</div>';
  651. if ($page=="index") {
  652. Display::display_warning_message(get_lang('WarningDeleteMainPage'),false);
  653. }
  654. $message = get_lang('ConfirmDeletePage')."</p>"."<p>"."<a href=\"index.php\">".get_lang("No")."</a>"."&nbsp;&nbsp;|&nbsp;&nbsp;"."<a href=\"".api_get_self()."?action=delete&amp;title=".api_htmlentities(urlencode($page))."&amp;delete=yes\">".get_lang("Yes")."</a>"."</p>";
  655. if (!isset ($_GET['delete'])) {
  656. Display::display_warning_message($message,false);
  657. }
  658. if ($_GET['delete'] == 'yes') {
  659. $sql='DELETE '.$tbl_wiki_discuss.' FROM '.$tbl_wiki.', '.$tbl_wiki_discuss.' WHERE '.$tbl_wiki.'.reflink="'.Database::escape_string($page).'" AND '.$tbl_wiki.'.'.$groupfilter.' AND '.$tbl_wiki.'.session_id='.$session_id.' AND '.$tbl_wiki_discuss.'.publication_id='.$tbl_wiki.'.id';
  660. Database::query($sql);
  661. $sql='DELETE '.$tbl_wiki_mailcue.' FROM '.$tbl_wiki.', '.$tbl_wiki_mailcue.' WHERE '.$tbl_wiki.'.reflink="'.Database::escape_string($page).'" AND '.$tbl_wiki.'.'.$groupfilter.' AND '.$tbl_wiki.'.session_id='.$session_id.' AND '.$tbl_wiki_mailcue.'.id='.$tbl_wiki.'.id';
  662. Database::query($sql);
  663. $sql='DELETE FROM '.$tbl_wiki.' WHERE reflink="'.Database::escape_string($page).'" AND '.$groupfilter.$condition_session.'';
  664. Database::query($sql);
  665. check_emailcue(0, 'E');
  666. Display::display_confirmation_message(get_lang('WikiPageDeleted'));
  667. }
  668. } else {
  669. Display::display_normal_message(get_lang("OnlyAdminDeletePageWiki"));
  670. }
  671. echo '</div>';
  672. }
  673. /////////////////////// delete all wiki /////////////////////// Juan Carlos Raña Trabado
  674. if ($_GET['action']=='deletewiki') {
  675. echo '<div class="actions">'.get_lang('DeleteWiki').'</div>';
  676. echo '<div style="overflow:hidden">';
  677. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin()) {
  678. $message = get_lang('ConfirmDeleteWiki');
  679. $message .= '<p>
  680. <a href="index.php">'.get_lang('No').'</a>
  681. &nbsp;&nbsp;|&nbsp;&nbsp;
  682. <a href="'.api_get_self().'?action=deletewiki&amp;delete=yes">'.get_lang('Yes').'</a>
  683. </p>';
  684. if (!isset($_GET['delete'])) {
  685. Display::display_warning_message($message,false);
  686. }
  687. } else {
  688. Display::display_normal_message(get_lang("OnlyAdminDeleteWiki"));
  689. }
  690. echo '</div>';
  691. }
  692. /////////////////////// search wiki pages ///////////////////////
  693. if ($_GET['action']=='searchpages') {
  694. echo '<div class="actions">'.get_lang('SearchPages').'</div>';
  695. echo '<div style="overflow:hidden">';
  696. if ($_GET['mode_table']) {
  697. if (! $_GET['SearchPages_table_page_nr']) {
  698. $_GET['search_term']=$_POST['search_term'];
  699. $_GET['search_content']=$_POST['search_content'];
  700. }
  701. display_wiki_search_results(api_htmlentities($_GET['search_term']),api_htmlentities($_GET['search_content']));
  702. } else {
  703. // initiate the object
  704. $form = new FormValidator('wiki_search','post', api_get_self().'?cidReq='.api_htmlentities($_GET['cidReq']).'&action='.api_htmlentities($_GET['action']).'&session_id='.api_htmlentities($_GET['session_id']).'&group_id='.api_htmlentities($_GET['group_id']).'&mode_table=yes1&search_term='.api_htmlentities($_GET['search_term']).'&search_content='.api_htmlentities($_GET['search_content']));
  705. // settting the form elements
  706. $form->addElement('text', 'search_term', get_lang('SearchTerm'),'class="input_titles" id="search_title"');
  707. $form->addElement('checkbox', 'search_content', null, get_lang('AlsoSearchContent'));
  708. $form->addElement('style_submit_button', 'SubmitWikiSearch', get_lang('Search'), 'class="search"');
  709. // setting the rules
  710. $form->addRule('search_term', '<span class="required">'.get_lang('ThisFieldIsRequired').'</span>', 'required');
  711. $form->addRule('search_term', get_lang('TooShort'),'minlength',3); //TODO: before fixing the pagination rules worked, not now
  712. if ($form->validate()) {
  713. $form->display();
  714. $values = $form->exportValues();
  715. display_wiki_search_results($values['search_term'], $values['search_content']);
  716. } else {
  717. $form->display();
  718. }
  719. }
  720. echo '</div>';
  721. }
  722. /////////////////////// What links here. Show pages that have linked this page /////////////////////// Juan Carlos Raña Trabado
  723. if ($_GET['action']=='links') {
  724. if (!$_GET['title']) {
  725. Display::display_error_message(get_lang("MustSelectPage"));
  726. } else {
  727. $sql='SELECT * FROM '.$tbl_wiki.' WHERE reflink="'.Database::escape_string($page).'" AND '.$groupfilter.$condition_session.'';
  728. $result=Database::query($sql);
  729. $row=Database::fetch_array($result);
  730. //get type assignment icon
  731. if ($row['assignment']==1) {
  732. $ShowAssignment=Display::return_icon('wiki_assignment.png', get_lang('AssignmentDesc'),'',22);
  733. } elseif ($row['assignment']==2) {
  734. $ShowAssignment=Display::return_icon('wiki_work.png', get_lang('AssignmentWork'),'',22);
  735. } elseif ($row['assignment']==0) {
  736. $ShowAssignment='<img src="../img/px_transparent.gif" />';
  737. }
  738. //fix Title to reflink (link Main Page)
  739. if ($page==get_lang('DefaultTitle')) {
  740. $page='index';
  741. }
  742. echo '<div id="wikititle">';
  743. echo get_lang('LinksPagesFrom').': '.$ShowAssignment.' <a href="'.api_get_self().'?cidReq='.$_course['id'].'&action=showpage&title='.api_htmlentities(urlencode($page)).'&session_id='.api_htmlentities($_GET['session_id']).'&group_id='.api_htmlentities($_GET['group_id']).'">'.api_htmlentities($row['title']).'</a>';
  744. echo '</div>';
  745. //fix index to title Main page into linksto
  746. if ($page=='index') {
  747. $page=str_replace(' ','_',get_lang('DefaultTitle'));
  748. }
  749. //table
  750. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin()) { //only by professors if page is hidden
  751. $sql="SELECT * FROM ".$tbl_wiki.", ".$tbl_wiki_conf." WHERE linksto LIKE '%".Database::escape_string($page)." %' AND ".$tbl_wiki_conf.".page_id=".$tbl_wiki.".page_id AND ".$tbl_wiki.".".$groupfilter.$condition_session.""; //add blank space after like '%" " %' to identify each word. // new version
  752. } else {
  753. $sql="SELECT * FROM ".$tbl_wiki.", ".$tbl_wiki_conf." WHERE visibility=1 AND linksto LIKE '%".Database::escape_string($page)." %' AND ".$tbl_wiki_conf.".page_id=".$tbl_wiki.".page_id AND ".$tbl_wiki.".".$groupfilter.$condition_session.""; //add blank space after like '%" " %' to identify each word // new version
  754. }
  755. $allpages=Database::query($sql);
  756. //show table
  757. if (Database::num_rows($allpages) > 0) {
  758. $row = array ();
  759. while ($obj = Database::fetch_object($allpages)) {
  760. //get author
  761. $userinfo=Database::get_user_info_from_id($obj->user_id);
  762. //get time
  763. $year = substr($obj->dtime, 0, 4);
  764. $month = substr($obj->dtime, 5, 2);
  765. $day = substr($obj->dtime, 8, 2);
  766. $hours = substr($obj->dtime, 11,2);
  767. $minutes = substr($obj->dtime, 14,2);
  768. $seconds = substr($obj->dtime, 17,2);
  769. //get type assignment icon
  770. if ($obj->assignment==1) {
  771. $ShowAssignment=Display::return_icon('wiki_assignment.png', get_lang('AssignmentDesc'),'',22);
  772. } elseif ($obj->assignment==2) {
  773. $ShowAssignment=Display::return_icon('wiki_work.png', get_lang('AssignmentWork'),'',22);
  774. } elseif ($obj->assignment==0) {
  775. $ShowAssignment='<img src="../img/px_transparent.gif" />';
  776. }
  777. $row = array ();
  778. $row[] =$ShowAssignment;
  779. $row[] = '<a href="'.api_get_self().'?cidReq='.$_course['id'].'&action=showpage&title='.api_htmlentities(urlencode($obj->reflink)).'&session_id='.api_htmlentities($_GET['session_id']).'&group_id='.api_htmlentities($_GET['group_id']).'">'.api_htmlentities($obj->title).'</a>';
  780. $row[] = $obj->user_id <>0 ? '<a href="../user/userInfo.php?uInfo='.$userinfo['user_id'].'">'.api_htmlentities(api_get_person_name($userinfo['firstname'], $userinfo['lastname'])).'</a>' : get_lang('Anonymous').' ('.$obj->user_ip.')';
  781. $row[] = $year.'-'.$month.'-'.$day.' '.$hours.":".$minutes.":".$seconds;
  782. $rows[] = $row;
  783. }
  784. $table = new SortableTableFromArrayConfig($rows,1,10,'AllPages_table','','','ASC');
  785. $table->set_additional_parameters(array('cidReq' =>Security::remove_XSS($_GET['cidReq']),'action'=>Security::remove_XSS($_GET['action']),'group_id'=>Security::remove_XSS($_GET['group_id'])));
  786. $table->set_header(0,get_lang('Type'), true, array ('style' => 'width:30px;'));
  787. $table->set_header(1,get_lang('Title'), true);
  788. $table->set_header(2,get_lang('Author'), true);
  789. $table->set_header(3,get_lang('Date'), true);
  790. $table->display();
  791. }
  792. }
  793. }
  794. /////////////////////// adding a new page ///////////////////////
  795. // Display the form for adding a new wiki page
  796. if ($_GET['action']=='addnew') {
  797. if (api_get_session_id()!=0 && api_is_allowed_to_session_edit(false,true)==false) {
  798. api_not_allowed();
  799. }
  800. echo '<div class="actions">'.get_lang('AddNew').'</div>';
  801. echo '<br/>';
  802. //first, check if page index was created. chektitle=false
  803. if (checktitle('index')) {
  804. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin() || GroupManager :: is_user_in_group($_user['user_id'],$_SESSION['_gid'])) {
  805. Display::display_normal_message(get_lang('GoAndEditMainPage'));
  806. } else {
  807. return Display::display_normal_message(get_lang('WikiStandBy'));
  808. }
  809. } elseif (check_addnewpagelock()==0 && (api_is_allowed_to_edit(false,true)==false || api_is_platform_admin()==false)) {
  810. Display::display_error_message(get_lang('AddPagesLocked'));
  811. } else {
  812. if(api_is_allowed_to_edit(false,true) || api_is_platform_admin() || GroupManager :: is_user_in_group($_user['user_id'],$_SESSION['_gid']) || Security::remove_XSS($_GET['group_id'])==0) {
  813. display_new_wiki_form();
  814. } else {
  815. Display::display_normal_message(get_lang('OnlyAddPagesGroupMembers'));
  816. }
  817. }
  818. }
  819. /////////////////////// show home page ///////////////////////
  820. if (!$_GET['action'] OR $_GET['action']=='show' AND !isset($_POST['SaveWikiNew'])) {
  821. display_wiki_entry($newtitle);
  822. }
  823. /////////////////////// show current page ///////////////////////
  824. if ($_GET['action']=='showpage' AND !isset($_POST['SaveWikiNew'])) {
  825. if ($_GET['title']) {
  826. display_wiki_entry($newtitle);
  827. } else {
  828. Display::display_error_message(get_lang('MustSelectPage'));
  829. }
  830. }
  831. /////////////////////// edit current page ///////////////////////
  832. if ($_GET['action']=='edit') {
  833. if (api_get_session_id()!=0 && api_is_allowed_to_session_edit(false,true)==false) {
  834. api_not_allowed();
  835. }
  836. $_clean['group_id']=(int)$_SESSION['_gid'];
  837. $sql='SELECT * FROM '.$tbl_wiki.', '.$tbl_wiki_conf.' WHERE '.$tbl_wiki_conf.'.page_id='.$tbl_wiki.'.page_id AND '.$tbl_wiki.'.reflink="'.Database::escape_string($page).'" AND '.$tbl_wiki.'.'.$groupfilter.$condition_session.' ORDER BY id DESC';
  838. $result=Database::query($sql);
  839. $row=Database::fetch_array($result); // we do not need a while loop since we are always displaying the last version
  840. if ($row['content']=='' AND $row['title']=='' AND $page=='') {
  841. Display::display_error_message(get_lang('MustSelectPage'));
  842. exit;
  843. } elseif ($row['content']=='' AND $row['title']=='' AND $page=='index') {
  844. //Table structure for better export to pdf
  845. $default_table_for_content_Start='<table align="center" border="0"><tr><td align="center">';
  846. $default_table_for_content_End='</td></tr></table>';
  847. $content=$default_table_for_content_Start.sprintf(get_lang('DefaultContent'),api_get_path(WEB_IMG_PATH)).$default_table_for_content_End;
  848. $title=get_lang('DefaultTitle');
  849. $page_id=0;
  850. } else {
  851. $content=$row['content'];
  852. $title=$row['title'];
  853. $page_id=$row['page_id'];
  854. }
  855. //Only teachers and platform admin can edit the index page. Only teachers and platform admin can edit an assignment teacher. And users in groups
  856. if (($row['reflink']=='index' || $row['reflink']=='' || $row['assignment']==1) && (!api_is_allowed_to_edit(false,true) && intval($_GET['group_id'])==0)) {
  857. Display::display_error_message(get_lang('OnlyEditPagesCourseManager'));
  858. } else {
  859. $PassEdit=false;
  860. //check if is a wiki group
  861. if ($_clean['group_id']!=0) {
  862. //Only teacher, platform admin and group members can edit a wiki group
  863. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin() || GroupManager :: is_user_in_group($_user['user_id'],intval($_GET['group_id']))) {
  864. $PassEdit=true;
  865. } else {
  866. Display::display_normal_message(get_lang('OnlyEditPagesGroupMembers'));
  867. }
  868. } else {
  869. $PassEdit=true;
  870. }
  871. // check if is a assignment
  872. if ($row['assignment']==1) {
  873. Display::display_normal_message(get_lang('EditAssignmentWarning'));
  874. $icon_assignment=Display::return_icon('wiki_assignment.png', get_lang('AssignmentDescExtra'),'',22);
  875. } elseif ($row['assignment']==2) {
  876. $icon_assignment=Display::return_icon('wiki_work.png', get_lang('AssignmentWorkExtra'),'',22);
  877. if ((api_get_user_id()==$row['user_id'])==false) {
  878. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin()) {
  879. $PassEdit=true;
  880. } else {
  881. Display::display_warning_message(get_lang('LockByTeacher'));
  882. $PassEdit=false;
  883. }
  884. } else {
  885. $PassEdit=true;
  886. }
  887. }
  888. if ($PassEdit) { //show editor if edit is allowed
  889. if ($row['editlock']==1 && (api_is_allowed_to_edit(false,true)==false || api_is_platform_admin()==false)) {
  890. Display::display_normal_message(get_lang('PageLockedExtra'));
  891. } else {
  892. //check tasks
  893. if (!empty($row['startdate_assig']) && $row['startdate_assig']!='0000-00-00 00:00:00' && time()<strtotime($row['startdate_assig'])) {
  894. $message=get_lang('TheTaskDoesNotBeginUntil').': '.api_get_local_time($row['startdate_assig'], null, date_default_timezone_get());
  895. Display::display_warning_message($message);
  896. if (!api_is_allowed_to_edit(false,true)) {
  897. exit;
  898. }
  899. }
  900. //
  901. if (!empty($row['enddate_assig']) && $row['enddate_assig']!='0000-00-00 00:00:00' && time()>strtotime($row['enddate_assig']) && $row['enddate_assig']!='0000-00-00 00:00:00' && $row['delayedsubmit']==0) {
  902. $message=get_lang('TheDeadlineHasBeenCompleted').': '.api_get_local_time($row['enddate_assig'], null, date_default_timezone_get());
  903. Display::display_warning_message($message);
  904. if (!api_is_allowed_to_edit(false,true)) {
  905. exit;
  906. }
  907. }
  908. //
  909. if (!empty($row['max_version']) && $row['version']>=$row['max_version']) {
  910. $message=get_lang('HasReachedMaxiNumVersions');
  911. Display::display_warning_message($message);
  912. if (!api_is_allowed_to_edit(false,true)) {
  913. exit;
  914. }
  915. }
  916. //
  917. if (!empty($row['max_text']) && $row['max_text']<=word_count($row['content'])) {
  918. $message=get_lang('HasReachedMaxNumWords');
  919. Display::display_warning_message($message);
  920. if (!api_is_allowed_to_edit(false,true)) {
  921. exit;
  922. }
  923. }
  924. ////
  925. if (!empty($row['task'])) {
  926. //previous change 0 by text
  927. if ($row['startdate_assig']=='0000-00-00 00:00:00') {
  928. $message_task_startdate=get_lang('No');
  929. } else {
  930. $message_task_startdate=api_get_local_time($row['startdate_assig'], null, date_default_timezone_get());
  931. }
  932. if ($row['enddate_assig']=='0000-00-00 00:00:00') {
  933. $message_task_enddate=get_lang('No');
  934. } else {
  935. $message_task_endate=api_get_local_time($row['enddate_assig'], null, date_default_timezone_get());
  936. }
  937. if ($row['delayedsubmit']==0) {
  938. $message_task_delayedsubmit=get_lang('No');
  939. } else {
  940. $message_task_delayedsubmit=get_lang('Yes');
  941. }
  942. if ($row['max_version']==0) {
  943. $message_task_max_version=get_lang('No');
  944. } else {
  945. $message_task_max_version=$row['max_version'];
  946. }
  947. if ($row['max_text']==0) {
  948. $message_task_max_text=get_lang('No');
  949. } else {
  950. $message_task_max_text=$row['max_text'];
  951. }
  952. //comp message
  953. $message_task='<b>'.get_lang('DescriptionOfTheTask').'</b><p>'.$row['task'].'</p><hr>';
  954. $message_task.='<p>'.get_lang('StartDate').': '.$message_task_startdate.'</p>';
  955. $message_task.='<p>'.get_lang('EndDate').': '.$message_task_enddate;
  956. $message_task.=' ('.get_lang('AllowLaterSends').') '.$message_task_delayedsubmit.'</p>';
  957. $message_task.='<p>'.get_lang('OtherSettings').': '.get_lang('NMaxVersion').': '.$message_task_max_version;
  958. $message_task.=' '.get_lang('NMaxWords').': '.$message_task_max_text;
  959. //display message
  960. Display::display_normal_message($message_task,false);
  961. }
  962. if ($row['progress']==$row['fprogress1'] && !empty($row['fprogress1'])) {
  963. $feedback_message='<b>'.get_lang('Feedback').'</b><p>'.api_htmlentities($row['feedback1']).'</p>';
  964. Display::display_normal_message($feedback_message, false);
  965. } elseif ($row['progress']==$row['fprogress2'] && !empty($row['fprogress2'])) {
  966. $feedback_message='<b>'.get_lang('Feedback').'</b><p>'.api_htmlentities($row['feedback2']).'</p>';
  967. Display::display_normal_message($feedback_message, false);
  968. } elseif ($row['progress']==$row['fprogress3'] && !empty($row['fprogress3'])) {
  969. $feedback_message='<b>'.get_lang('Feedback').'</b><p>'.api_htmlentities($row['feedback3']).'</p>';
  970. Display::display_normal_message($feedback_message, false);
  971. }
  972. //previous checking for concurrent editions
  973. if ($row['is_editing']==0) {
  974. echo '<div style="z-index:0">';
  975. Display::display_normal_message(get_lang('WarningMaxEditingTime'));
  976. echo '</div>';
  977. $time_edit = date("Y-m-d H:i:s");
  978. $sql='UPDATE '.$tbl_wiki.' SET is_editing="'.$_user['user_id'].'", time_edit="'.$time_edit.'" WHERE id="'.$row['id'].'"';
  979. Database::query($sql);
  980. } elseif ($row['is_editing']!=$_user['user_id']) {
  981. $timestamp_edit=strtotime($row['time_edit']);
  982. $time_editing=time()-$timestamp_edit;
  983. $max_edit_time=1200; // 20 minutes
  984. $rest_time=$max_edit_time-$time_editing;
  985. $userinfo=Database::get_user_info_from_id($row['is_editing']);
  986. $is_being_edited= get_lang('ThisPageisBeginEditedBy').' <a href=../user/userInfo.php?uInfo='.$userinfo['user_id'].'>'.api_htmlentities(api_get_person_name($userinfo['firstname'], $userinfo['lastname'])).'</a>. '.get_lang('ThisPageisBeginEditedTryLater').' '.date( "i",$rest_time).' '.get_lang('MinMinutes').'';
  987. Display::display_normal_message($is_being_edited, false);
  988. exit;
  989. }
  990. //form
  991. echo '<form name="form1" method="post" action="'.api_get_self().'?action=showpage&amp;title='.api_htmlentities(urlencode($page)).'&session_id='.api_htmlentities($_GET['session_id']).'&group_id='.api_htmlentities($_GET['group_id']).'">';
  992. echo '<div id="wikititle" >';
  993. echo '<div style="width:70%;float:left;">'.$icon_assignment.str_repeat('&nbsp;',3).api_htmlentities($title).'</div>';
  994. if ((api_is_allowed_to_edit(false,true) || api_is_platform_admin()) && $row['reflink']!='index') {
  995. echo'<a href="javascript://" onclick="advanced_parameters()" ><span id="plus_minus" style="float:right">&nbsp;'.Display::return_icon('div_show.gif',get_lang('Show'),array('style'=>'vertical-align:middle')).'&nbsp;'.get_lang('AdvancedParameters').'</span></a>';
  996. echo '<div id="options" style="display:none; margin: 20px;" >';
  997. //task
  998. echo '<div>&nbsp;</div><input type="checkbox" value="1" name="checktask" onclick="javascript: if(this.checked){document.getElementById(\'option4\').style.display=\'block\';}else{document.getElementById(\'option4\').style.display=\'none\';}"/>&nbsp;'.Display::return_icon('wiki_task.png', get_lang('DefineTask'),'',22).' '.get_lang('DescriptionOfTheTask').'';
  999. echo '&nbsp;&nbsp;&nbsp;<span id="msg_error4" style="display:none;color:red"></span>';
  1000. echo '<div id="option4" style="padding:4px; margin:5px; border:1px dotted; display:none;">';
  1001. echo '<table border="0" style="font-weight:normal">';
  1002. echo '<tr>';
  1003. echo '<td>'.get_lang('DescriptionOfTheTask').'</td>';
  1004. echo '</tr>';
  1005. echo '<tr>';
  1006. echo '<td>'.api_disp_html_area('task', $row['task'], '', '', null, array('ToolbarSet' => 'wiki_task', 'Width' => '585', 'Height' => '200')).'</td>';
  1007. echo '</tr>';
  1008. echo '</table>';
  1009. echo '</div>';
  1010. //feedback
  1011. echo '<div>&nbsp;</div><input type="checkbox" value="1" name="checkfeedback" onclick="javascript: if(this.checked){document.getElementById(\'option2\').style.display=\'block\';}else{document.getElementById(\'option2\').style.display=\'none\';}"/>&nbsp;'.get_lang('AddFeedback').'';
  1012. echo '&nbsp;&nbsp;&nbsp;<span id="msg_error2" style="display:none;color:red"></span>';
  1013. echo '<div id="option2" style="padding:4px; margin:5px; border:1px dotted; display:none;">';
  1014. echo '<table border="0" style="font-weight:normal" align="center">';
  1015. echo '<tr>';
  1016. echo '<td colspan="2">'.get_lang('Feedback1').'</td>';
  1017. echo '<td colspan="2">'.get_lang('Feedback2').'</td>';
  1018. echo '<td colspan="2">'.get_lang('Feedback3').'</td>';
  1019. echo '</tr>';
  1020. echo '<tr>';
  1021. echo '<td colspan="2"><textarea name="feedback1" cols="21" rows="4" >'.api_htmlentities($row['feedback1']).'</textarea></td>';
  1022. echo '<td colspan="2"><textarea name="feedback2" cols="21" rows="4" >'.api_htmlentities($row['feedback2']).'</textarea></td>';
  1023. echo '<td colspan="2"><textarea name="feedback3" cols="21" rows="4" >'.api_htmlentities($row['feedback3']).'</textarea></td>';
  1024. echo '</tr>';
  1025. echo '<tr>';
  1026. echo '<td>'.get_lang('FProgress').':</td>';
  1027. echo '<td><select name="fprogress1">';
  1028. echo '<option value="'.api_htmlentities($row['fprogress1']).'" selected>'.api_htmlentities($row['fprogress1']).'</option>';
  1029. echo '<option value="10">10</option>
  1030. <option value="20">20</option>
  1031. <option value="30">30</option>
  1032. <option value="40">40</option>
  1033. <option value="50">50</option>
  1034. <option value="60">60</option>
  1035. <option value="70">70</option>
  1036. <option value="80">80</option>
  1037. <option value="90">90</option>
  1038. <option value="100">100</option>
  1039. </select> %</td>';
  1040. echo '<td>'.get_lang('FProgress').':</td>';
  1041. echo '<td><select name="fprogress2">';
  1042. echo '<option value="'.api_htmlentities($row['fprogress2']).'" selected>'.api_htmlentities($row['fprogress2']).'</option>';;
  1043. echo '<option value="10">10</option>
  1044. <option value="20">20</option>
  1045. <option value="30">30</option>
  1046. <option value="40">40</option>
  1047. <option value="50">50</option>
  1048. <option value="60">60</option>
  1049. <option value="70">70</option>
  1050. <option value="80">80</option>
  1051. <option value="90">90</option>
  1052. <option value="100">100</option>
  1053. </select> %</td>';
  1054. echo '<td>'.get_lang('FProgress').':</td>';
  1055. echo '<td><select name="fprogress3">';
  1056. echo '<option value="'.api_htmlentities($row['fprogress3']).'" selected>'.api_htmlentities($row['fprogress3']).'</option>';
  1057. echo '<option value="10">10</option>
  1058. <option value="20">20</option>
  1059. <option value="30">30</option>
  1060. <option value="40">40</option>
  1061. <option value="50">50</option>
  1062. <option value="60">60</option>
  1063. <option value="70">70</option>
  1064. <option value="80">80</option>
  1065. <option value="90">90</option>
  1066. <option value="100">100</option>
  1067. </select> %</td>';
  1068. echo '</tr>';
  1069. echo '</table>';
  1070. echo '</div>';
  1071. //time limit
  1072. echo '<div>&nbsp;</div><input type="checkbox" value="1" name="checktimelimit" onclick="javascript: if(this.checked){document.getElementById(\'option1\').style.display=\'block\'; $pepe=\'a\';}else{document.getElementById(\'option1\').style.display=\'none\';}"/>&nbsp;'.get_lang('PutATimeLimit').'';
  1073. echo '&nbsp;&nbsp;&nbsp;<span id="msg_error1" style="display:none;color:red"></span>';
  1074. echo '<div id="option1" style="padding:4px; margin:5px; border:1px dotted; display:none;">';
  1075. echo '<table width="100%" border="0" style="font-weight:normal">';
  1076. echo '<tr>';
  1077. echo '<td align="right" width="150">'.get_lang('StartDate').':</td>';
  1078. echo '<td>';
  1079. if ($row['startdate_assig']=='0000-00-00 00:00:00') {
  1080. echo draw_date_picker('startdate_assig').' <input type="checkbox" name="initstartdate" value="1"> '.get_lang('Yes').'/'.get_lang('No').'';
  1081. } else {
  1082. echo draw_date_picker('startdate_assig', $row['startdate_assig']).' <input type="checkbox" name="initstartdate" value="1">'.get_lang('Yes').'/'.get_lang('No').'';
  1083. }
  1084. echo '</td>';
  1085. echo '</tr>';
  1086. echo '<tr>';
  1087. echo '<td align="right" width="150">'.get_lang("EndDate").':</td>';
  1088. echo '<td>';
  1089. if ($row['enddate_assig']=='0000-00-00 00:00:00') {
  1090. echo draw_date_picker('enddate_assig').' <input type="checkbox" name="initenddate" value="1"> '.get_lang('Yes').'/'.get_lang('No').'';
  1091. } else {
  1092. echo draw_date_picker('enddate_assig', $row['enddate_assig']).' <input type="checkbox" name="initenddate" value="1"> '.get_lang('Yes').'/'.get_lang('No').'';
  1093. }
  1094. echo '</td>';
  1095. echo '</tr>';
  1096. echo '<tr>';
  1097. echo '<td align="right">'.get_lang('AllowLaterSends').':</td>';
  1098. if ($row['delayedsubmit']==1) {
  1099. $check_uncheck='checked';
  1100. }
  1101. echo '<td><input type="checkbox" name="delayedsubmit" value="1" '.$check_uncheck.'></td>';
  1102. echo '</tr>';
  1103. echo'</table>';
  1104. echo '</div>';
  1105. //other limit
  1106. echo '<div>&nbsp;</div><input type="checkbox" value="1" name="checkotherlimit" onclick="javascript: if(this.checked){document.getElementById(\'option3\').style.display=\'block\';}else{document.getElementById(\'option3\').style.display=\'none\';}"/>&nbsp;'.get_lang('OtherSettings').'';
  1107. echo '&nbsp;&nbsp;&nbsp;<span id="msg_error3" style="display:none;color:red"></span>';
  1108. echo '<div id="option3" style="padding:4px; margin:5px; border:1px dotted; display:none;">';
  1109. echo '<div style="font-weight:normal"; align="center">'.get_lang('NMaxWords').':&nbsp;<input type="text" name="max_text" size="3" value="'.$row['max_text'].'">&nbsp;&nbsp;'.get_lang('NMaxVersion').':&nbsp;<input type="text" name="max_version" size="3" value="'.$row['max_version'].'"></div>';
  1110. echo '</div>';
  1111. //
  1112. echo '</div>';
  1113. }
  1114. echo '</div>';
  1115. echo '<div id="wikicontent">';
  1116. echo '<input type="hidden" name="page_id" value="'.$page_id.'">';
  1117. echo '<input type="hidden" name="reflink" value="'.api_htmlentities($page).'">';
  1118. echo '<input type="hidden" name="title" value="'.api_htmlentities($title).'">';
  1119. api_disp_html_area('content', $content, '', '', null, api_is_allowed_to_edit(null,true)
  1120. ? array('ToolbarSet' => 'Wiki', 'Width' => '100%', 'Height' => '400')
  1121. : array('ToolbarSet' => 'WikiStudent', 'Width' => '100%', 'Height' => '400', 'UserStatus' => 'student')
  1122. );
  1123. echo '<br/>';
  1124. echo '<br/>';
  1125. //if(api_is_allowed_to_edit() || api_is_platform_admin()) //off for now
  1126. //{
  1127. echo get_lang('Comments').':&nbsp;&nbsp;<input type="text" name="comment" size="40">&nbsp;&nbsp;&nbsp;';
  1128. //}
  1129. echo '<INPUT TYPE="hidden" NAME="assignment" VALUE="'.$row['assignment'].'"/>';
  1130. echo '<INPUT TYPE="hidden" NAME="version" VALUE="'.$row['version'].'"/>';
  1131. //hack date for edit
  1132. echo '<INPUT TYPE="hidden" NAME="startdate_assig" VALUE="'.$row['startdate_assig'].'"/>';
  1133. echo '<INPUT TYPE="hidden" NAME="enddate_assig" VALUE="'.$row['enddate_assig'].'"/>';
  1134. //
  1135. echo get_lang('Progress').':&nbsp;&nbsp;<select name="progress" id="progress">';
  1136. echo '<option value="'.api_htmlentities($row['progress']).'" selected>'.api_htmlentities($row['progress']).'</option>';
  1137. echo '<option value="10">10</option>
  1138. <option value="20">20</option>
  1139. <option value="30">30</option>
  1140. <option value="40">40</option>
  1141. <option value="50">50</option>
  1142. <option value="60">60</option>
  1143. <option value="70">70</option>
  1144. <option value="80">80</option>
  1145. <option value="90">90</option>
  1146. <option value="100">100</option>
  1147. </select> %';
  1148. echo '<br/><br/>';
  1149. echo '<input type="hidden" name="wpost_id" value="'.md5(uniqid(rand(), true)).'">';//prevent double post
  1150. echo '<button class="save" type="submit" name="SaveWikiChange">'.get_lang('Save').'</button>';//for save button Don't change name (see fckeditor/editor/plugins/customizations/fckplugin_compressed.js and fckplugin.js
  1151. echo '</div>';
  1152. echo '</form>';
  1153. }
  1154. }
  1155. }
  1156. }
  1157. /////////////////////// page history ///////////////////////
  1158. if ($_GET['action']=='history' or $_POST['HistoryDifferences']) {
  1159. if (!$_GET['title']) {
  1160. Display::display_error_message(get_lang("MustSelectPage"));
  1161. exit;
  1162. }
  1163. echo '<div style="overflow:hidden">';
  1164. $_clean['group_id']=(int)$_SESSION['_gid'];
  1165. //First, see the property visibility that is at the last register and therefore we should select descending order. But to give ownership to each record, this is no longer necessary except for the title. TODO: check this
  1166. $sql='SELECT * FROM '.$tbl_wiki.'WHERE reflink="'.Database::escape_string($page).'" AND '.$groupfilter.$condition_session.' ORDER BY id DESC';
  1167. $result=Database::query($sql);
  1168. while ($row=Database::fetch_array($result)) {
  1169. $KeyVisibility=$row['visibility'];
  1170. $KeyAssignment=$row['assignment'];
  1171. $KeyTitle=$row['title'];
  1172. $KeyUserId=$row['user_id'];
  1173. }
  1174. if ($KeyAssignment==1) {
  1175. $icon_assignment=Display::return_icon('wiki_assignment.png', get_lang('AssignmentDescExtra'),'',22);
  1176. } elseif($KeyAssignment==2) {
  1177. $icon_assignment=Display::return_icon('wiki_work.png', get_lang('AssignmentWorkExtra'),'',22);
  1178. }
  1179. //Second, show
  1180. //if the page is hidden and is a job only sees its author and professor
  1181. if($KeyVisibility==1 || api_is_allowed_to_edit(false,true) || api_is_platform_admin() || ($KeyAssignment==2 && $KeyVisibility==0 && (api_get_user_id()==$KeyUserId))) {
  1182. // We show the complete history
  1183. if (!$_POST['HistoryDifferences'] && !$_POST['HistoryDifferences2']) {
  1184. $sql='SELECT * FROM '.$tbl_wiki.'WHERE reflink="'.Database::escape_string($page).'" AND '.$groupfilter.$condition_session.' ORDER BY id DESC';
  1185. $result=Database::query($sql);
  1186. $title = $_GET['title'];
  1187. $group_id = $_GET['group_id'];
  1188. echo '<div id="wikititle">';
  1189. echo $icon_assignment.'&nbsp;&nbsp;&nbsp;'.api_htmlentities($KeyTitle);
  1190. echo '</div>';
  1191. echo '<div id="wikicontent">';
  1192. echo '<form id="differences" method="POST" action="index.php?cidReq='.$_course['id'].'&action=history&title='.api_htmlentities(urlencode($title)).'&session_id='.api_htmlentities($session_id).'&group_id='.api_htmlentities($group_id).'">';
  1193. echo '<ul style="list-style-type: none;">';
  1194. echo '<br/>';
  1195. echo '<button class="search" type="submit" name="HistoryDifferences" value="HistoryDifferences">'.get_lang('ShowDifferences').' '.get_lang('LinesDiff').'</button>';
  1196. echo '<button class="search" type="submit" name="HistoryDifferences2" value="HistoryDifferences2">'.get_lang('ShowDifferences').' '.get_lang('WordsDiff').'</button>';
  1197. echo '<br/><br/>';
  1198. $counter=0;
  1199. $total_versions=Database::num_rows($result);
  1200. while ($row=Database::fetch_array($result)) {
  1201. $userinfo=Database::get_user_info_from_id($row['user_id']);
  1202. echo '<li style="margin-bottom: 5px;">';
  1203. ($counter==0) ? $oldstyle='style="visibility: hidden;"':$oldstyle='';
  1204. ($counter==0) ? $newchecked=' checked':$newchecked='';
  1205. ($counter==$total_versions-1) ? $newstyle='style="visibility: hidden;"':$newstyle='';
  1206. ($counter==1) ? $oldchecked=' checked':$oldchecked='';
  1207. echo '<input name="old" value="'.$row['id'].'" type="radio" '.$oldstyle.' '.$oldchecked.'/> ';
  1208. echo '<input name="new" value="'.$row['id'].'" type="radio" '.$newstyle.' '.$newchecked.'/> ';
  1209. echo '<a href="'.api_get_self().'?action=showpage&amp;title='.api_htmlentities(urlencode($page)).'&amp;view='.$row['id'].'">';
  1210. echo '<a href="'.api_get_self().'?cidReq='.$_course['id'].'&action=showpage&amp;title='.api_htmlentities(urlencode($page)).'&amp;view='.$row['id'].'&session_id='.$session_id.'&group_id='.$group_id.'">';
  1211. echo api_get_local_time($row['dtime'], null, date_default_timezone_get());
  1212. echo '</a>';
  1213. echo ' ('.get_lang('Version').' '.$row['version'].')';
  1214. echo ' '.get_lang('By').' ';
  1215. if ($row['user_id']<>0) {
  1216. echo '<a href="../user/userInfo.php?uInfo='.$userinfo['user_id'].'">'.api_htmlentities(api_get_person_name($userinfo['firstname'], $userinfo['lastname'])).'</a>';
  1217. } else {
  1218. echo get_lang('Anonymous').' ('.api_htmlentities($row[user_ip]).')';
  1219. }
  1220. echo ' ( '.get_lang('Progress').': '.api_htmlentities($row['progress']).'%, ';
  1221. $comment=$row['comment'];
  1222. if (!empty($comment)) {
  1223. echo get_lang('Comments').': '.api_htmlentities(api_substr($row['comment'],0,100));
  1224. if (api_strlen($row['comment'])>100) {
  1225. echo '... ';
  1226. }
  1227. } else {
  1228. echo get_lang('Comments').': ---';
  1229. }
  1230. echo ' ) </li>';
  1231. $counter++;
  1232. } //end while
  1233. echo '<br/>';
  1234. echo '<button class="search" type="submit" name="HistoryDifferences" value="HistoryDifferences">'.get_lang('ShowDifferences').' '.get_lang('LinesDiff').'</button>';
  1235. echo '<button class="search" type="submit" name="HistoryDifferences2" value="HistoryDifferences2">'.get_lang('ShowDifferences').' '.get_lang('WordsDiff').'</button>';
  1236. echo '</ul></form></div>';
  1237. } else { // We show the differences between two versions
  1238. $sql_old="SELECT * FROM $tbl_wiki WHERE id='".Database::escape_string($_POST['old'])."'";
  1239. $result_old=Database::query($sql_old);
  1240. $version_old=Database::fetch_array($result_old);
  1241. $sql_new="SELECT * FROM $tbl_wiki WHERE id='".Database::escape_string($_POST['new'])."'";
  1242. $result_new=Database::query($sql_new);
  1243. $version_new=Database::fetch_array($result_new);
  1244. if (isset($_POST['HistoryDifferences'])) {
  1245. include('diff.inc.php');
  1246. //title
  1247. echo '<div id="wikititle">'.api_htmlentities($version_new['title']).' <font size="-2"><i>('.get_lang('DifferencesNew').'</i> <font style="background-color:#aaaaaa">'.$version_new['dtime'].'</font> <i>'.get_lang('DifferencesOld').'</i> <font style="background-color:#aaaaaa">'.$version_old['dtime'].'</font>) '.get_lang('Legend').': <span class="diffAdded" >'.get_lang(WikiDiffAddedLine).'</span> <span class="diffDeleted" >'.get_lang(WikiDiffDeletedLine).'</span> <span class="diffMoved" >'.get_lang(WikiDiffMovedLine).'</span></font></div>';
  1248. }
  1249. if (isset($_POST['HistoryDifferences2'])) {
  1250. // including global PEAR diff libraries
  1251. require_once 'Text/Diff.php';
  1252. require_once 'Text/Diff/Renderer/inline.php';
  1253. //title
  1254. echo '<div id="wikititle">'.api_htmlentities($version_new['title']).' <font size="-2"><i>('.get_lang('DifferencesNew').'</i> <font style="background-color:#aaaaaa">'.$version_new['dtime'].'</font> <i>'.get_lang('DifferencesOld').'</i> <font style="background-color:#aaaaaa">'.$version_old['dtime'].'</font>) '.get_lang('Legend').': <span class="diffAddedTex" >'.get_lang(WikiDiffAddedTex).'</span> <span class="diffDeletedTex" >'.get_lang(WikiDiffDeletedTex).'</span></font></div>';
  1255. }
  1256. echo '<div class="diff"><br /><br />';
  1257. if (isset($_POST['HistoryDifferences'])) {
  1258. echo '<table>'.diff( $version_old['content'], $version_new['content'], true, 'format_table_line' ).'</table>'; // format_line mode is better for words
  1259. echo '</div>';
  1260. echo '<br />';
  1261. echo '<strong>'.get_lang('Legend').'</strong><div class="diff">' . "\n";
  1262. echo '<table><tr>';
  1263. echo '<td>';
  1264. echo '</td><td>';
  1265. echo '<span class="diffEqual" >'.get_lang('WikiDiffUnchangedLine').'</span><br />';
  1266. echo '<span class="diffAdded" >'.get_lang('WikiDiffAddedLine').'</span><br />';
  1267. echo '<span class="diffDeleted" >'.get_lang('WikiDiffDeletedLine').'</span><br />';
  1268. echo '<span class="diffMoved" >'.get_lang('WikiDiffMovedLine').'</span><br />';
  1269. echo '</td>';
  1270. echo '</tr></table>';
  1271. echo '</div>';
  1272. }
  1273. if (isset($_POST['HistoryDifferences2'])) {
  1274. $lines1 = array(strip_tags($version_old['content'])); //without <> tags
  1275. $lines2 = array(strip_tags($version_new['content'])); //without <> tags
  1276. $diff = new Text_Diff($lines1, $lines2);
  1277. $renderer = new Text_Diff_Renderer_inline();
  1278. echo '<style>del{background:#fcc}ins{background:#cfc}</style>'.$renderer->render($diff); // Code inline
  1279. //echo '<div class="diffEqual">'.html_entity_decode($renderer->render($diff)).'</div>'; // Html inline. By now, turned off by problems in comparing pages separated by more than one version
  1280. echo '</div>';
  1281. echo '<br />';
  1282. echo '<strong>'.get_lang('Legend').'</strong><div class="diff">' . "\n";
  1283. echo '<table><tr>';
  1284. echo '<td>';
  1285. echo '</td><td>';
  1286. echo '<span class="diffAddedTex" >'.get_lang('WikiDiffAddedTex').'</span><br />';
  1287. echo '<span class="diffDeletedTex" >'.get_lang('WikiDiffDeletedTex').'</span><br />';
  1288. echo '</td>';
  1289. echo '</tr></table>';
  1290. echo '</div>';
  1291. }
  1292. }
  1293. }
  1294. echo '</div>';
  1295. }
  1296. /////////////////////// recent changes ///////////////////////
  1297. //
  1298. //rss feed. TODO:
  1299. //
  1300. if ($_GET['action']=='recentchanges') {
  1301. $_clean['group_id']=(int)$_SESSION['_gid'];
  1302. if ( api_is_allowed_to_session_edit(false,true) ) {
  1303. if (check_notify_all()==1) {
  1304. $notify_all= Display::return_icon('messagebox_info.png', get_lang('NotifyByEmail'),'',22).' '.get_lang('NotNotifyChanges');
  1305. $lock_unlock_notify_all='unlocknotifyall';
  1306. } else {
  1307. $notify_all=Display::return_icon('mail.png', get_lang('CancelNotifyByEmail'),'',22).' '.get_lang('NotifyChanges');
  1308. $lock_unlock_notify_all='locknotifyall';
  1309. }
  1310. }
  1311. echo '<div class="actions"><span style="float: right;">';
  1312. echo '<a href="index.php?action=recentchanges&amp;actionpage='.$lock_unlock_notify_all.'&amp;title='.api_htmlentities(urlencode($page)).'">'.$notify_all.'</a>';
  1313. echo '</span>'.get_lang('RecentChanges').'</div>';
  1314. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin()) { //only by professors if page is hidden
  1315. //$sql='SELECT * FROM '.$tbl_wiki.' WHERE '.$groupfilter.' ORDER BY dtime DESC'; // old version TODO: Replace by the bottom line
  1316. $sql='SELECT * FROM '.$tbl_wiki.', '.$tbl_wiki_conf.' WHERE '.$tbl_wiki_conf.'.page_id='.$tbl_wiki.'.page_id AND '.$tbl_wiki.'.'.$groupfilter.$condition_session.' ORDER BY dtime DESC'; // new version
  1317. } else {
  1318. $sql='SELECT * FROM '.$tbl_wiki.' WHERE '.$groupfilter.$condition_session.' AND visibility=1 ORDER BY dtime DESC'; // old version TODO: Replace by the bottom line
  1319. //$sql='SELECT * FROM '.$tbl_wiki.', '.$tbl_wiki_conf.' WHERE '.$tbl_wiki_conf.'.page_id='.$tbl_wiki.'.page_id AND visibility=1 AND '.$tbl_wiki.'.'.$groupfilter.' ORDER BY dtime DESC'; // new version
  1320. }
  1321. $allpages=Database::query($sql);
  1322. //show table
  1323. if (Database::num_rows($allpages) > 0) {
  1324. $row = array ();
  1325. while ($obj = Database::fetch_object($allpages)) {
  1326. //get author
  1327. $userinfo=Database::get_user_info_from_id($obj->user_id);
  1328. //get type assignment icon
  1329. if ($obj->assignment==1) {
  1330. $ShowAssignment=Display::return_icon('wiki_assignment.png', get_lang('AssignmentDesc'),'',22);
  1331. } elseif ($obj->assignment==2) {
  1332. $ShowAssignment=Display::return_icon('wiki_work.png', get_lang('AssignmentWork'),'',22);
  1333. } elseif ($obj->assignment==0) {
  1334. $ShowAssignment='<img src="../img/px_transparent.gif" />';
  1335. }
  1336. //get icon task
  1337. if (!empty($obj->task)) {
  1338. $icon_task=Display::return_icon('wiki_task.png', get_lang('StandardTask'),'',22);
  1339. } else {
  1340. $icon_task='<img src="../img/px_transparent.gif" />';
  1341. }
  1342. $row = array ();
  1343. $row[] = api_get_local_time($obj->dtime, null, date_default_timezone_get());
  1344. $row[] = $ShowAssignment.$icon_task;
  1345. $row[] = '<a href="'.api_get_self().'?cidReq='.$_course['id'].'&action=showpage&title='.api_htmlentities(urlencode($obj->reflink)).'&amp;view='.$obj->id.'&session_id='.api_htmlentities($_GET['session_id']).'&group_id='.api_htmlentities($_GET['group_id']).'">'.api_htmlentities($obj->title).'</a>';
  1346. $row[] = $obj->version>1 ? get_lang('EditedBy') : get_lang('AddedBy');
  1347. $row[] = $obj->user_id <> 0 ? '<a href="../user/userInfo.php?uInfo='.$userinfo['user_id'].'">'.api_htmlentities(api_get_person_name($userinfo['firstname'], $userinfo['lastname'])).'</a>' : get_lang('Anonymous').' ('.api_htmlentities($obj->user_ip).')';
  1348. $rows[] = $row;
  1349. }
  1350. $table = new SortableTableFromArrayConfig($rows,0,10,'RecentPages_table','','','DESC');
  1351. $table->set_additional_parameters(array('cidReq' =>Security::remove_XSS($_GET['cidReq']),'action'=>Security::remove_XSS($_GET['action']),'session_id'=>Security::remove_XSS($_GET['session_id']),'group_id'=>Security::remove_XSS($_GET['group_id'])));
  1352. $table->set_header(0,get_lang('Date'), true, array ('style' => 'width:200px;'));
  1353. $table->set_header(1,get_lang('Type'), true, array ('style' => 'width:30px;'));
  1354. $table->set_header(2,get_lang('Title'), true);
  1355. $table->set_header(3,get_lang('Actions'), true, array ('style' => 'width:80px;'));
  1356. $table->set_header(4,get_lang('Author'), true);
  1357. $table->display();
  1358. }
  1359. }
  1360. /////////////////////// all pages ///////////////////////
  1361. if ($_GET['action']=='allpages') {
  1362. echo '<div class="actions">'.get_lang('AllPages').'</div>';
  1363. $_clean['group_id']=(int)$_SESSION['_gid'];
  1364. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin()) { //only by professors if page is hidden
  1365. //$sql='SELECT * FROM '.$tbl_wiki.' s1 WHERE id=(SELECT MAX(s2.id) FROM '.$tbl_wiki.' s2 WHERE s1.reflink = s2.reflink AND '.$groupfilter.')'; // warning don't use group by reflink because don't return the last version// old version TODO: Replace by the bottom line
  1366. $sql='SELECT * FROM '.$tbl_wiki.', '.$tbl_wiki_conf.' WHERE '.$tbl_wiki_conf.'.page_id='.$tbl_wiki.'.page_id AND '.$tbl_wiki.'.'.$groupfilter.' AND '.$tbl_wiki.'.session_id="'.$session_id.'" GROUP BY '.$tbl_wiki.'.page_id'; // new version
  1367. } else {
  1368. //$sql='SELECT * FROM '.$tbl_wiki.' s1 WHERE visibility=1 AND id=(SELECT MAX(s2.id) FROM '.$tbl_wiki.' s2 WHERE s1.reflink = s2.reflink AND '.$groupfilter.')'; // warning don't use group by reflink because don't return the last version // old version TODO: Replace by the bottom line
  1369. $sql='SELECT * FROM '.$tbl_wiki.', '.$tbl_wiki_conf.' WHERE visibility=1 AND '.$tbl_wiki_conf.'.page_id='.$tbl_wiki.'.page_id AND '.$tbl_wiki.'.'.$groupfilter.' AND '.$tbl_wiki.'.session_id="'.$session_id.'" GROUP BY '.$tbl_wiki.'.page_id'; // new version
  1370. }
  1371. $allpages=Database::query($sql);
  1372. //show table
  1373. if (Database::num_rows($allpages) > 0) {
  1374. $row = array ();
  1375. while ($obj = Database::fetch_object($allpages)) {
  1376. //get author
  1377. $userinfo=Database::get_user_info_from_id($obj->user_id);
  1378. //get type assignment icon
  1379. if ($obj->assignment==1) {
  1380. $ShowAssignment=Display::return_icon('wiki_assignment.png', get_lang('AssignmentDesc'),'',22);
  1381. } elseif ($obj->assignment==2) {
  1382. $ShowAssignment=Display::return_icon('wiki_work.png', get_lang('AssignmentWork'),'',22);
  1383. } elseif ($obj->assignment==0) {
  1384. $ShowAssignment='<img src="../img/px_transparent.gif" />';
  1385. }
  1386. //get icon task
  1387. if (!empty($obj->task)) {
  1388. $icon_task=Display::return_icon('wiki_task.png', get_lang('StandardTask'),'',22);
  1389. } else {
  1390. $icon_task='<img src="../img/px_transparent.gif" />';
  1391. }
  1392. $row = array ();
  1393. $row[] =$ShowAssignment.$icon_task;
  1394. $row[] = '<a href="'.api_get_self().'?cidReq='.$_course['id'].'&action=showpage&title='.api_htmlentities(urlencode($obj->reflink)).'&session_id='.api_htmlentities($_GET['session_id']).'&group_id='.api_htmlentities($_GET['group_id']).'">'.api_htmlentities($obj->title).'</a>';
  1395. $row[] = $obj->user_id <>0 ? '<a href="../user/userInfo.php?uInfo='.$userinfo['user_id'].'">'.api_htmlentities(api_get_person_name($userinfo['firstname'], $userinfo['lastname'])).'</a>' : get_lang('Anonymous').' ('.api_htmlentities($obj->user_ip).')';
  1396. $row[] = api_get_local_time($obj->dtime, null, date_default_timezone_get());
  1397. if (api_is_allowed_to_edit(false,true)|| api_is_platform_admin()) {
  1398. $showdelete=' <a href="'.api_get_self().'?cidReq='.$_course['id'].'&action=delete&title='.api_htmlentities(urlencode($obj->reflink)).'&session_id='.api_htmlentities($_GET['session_id']).'&group_id='.api_htmlentities($_GET['group_id']).'">'.Display::return_icon('delete.png', get_lang('Delete'),'',22);
  1399. }
  1400. if (api_is_allowed_to_session_edit(false,true) ) {
  1401. $row[] = '<a href="'.api_get_self().'?cidReq='.$_course['id'].'&action=edit&title='.api_htmlentities(urlencode($obj->reflink)).'&session_id='.api_htmlentities($_GET['session_id']).'&group_id='.api_htmlentities($_GET['group_id']).'">'.Display::return_icon('edit.png', get_lang('EditPage'),'',22).'</a> <a href="'.api_get_self().'?cidReq='.$_course['id'].'&action=discuss&title='.api_htmlentities(urlencode($obj->reflink)).'&group_id='.api_htmlentities($_GET['group_id']).'">'.Display::return_icon('discuss.png', get_lang('Discuss'),'',22).'</a> <a href="'.api_get_self().'?cidReq='.$_course['id'].'&action=history&title='.api_htmlentities(urlencode($obj->reflink)).'&session_id='.api_htmlentities($_GET['session_id']).'&group_id='.api_htmlentities($_GET['group_id']).'">'.Display::return_icon('history.png', get_lang('History'),'',22).'</a> <a href="'.api_get_self().'?cidReq='.$_course['id'].'&action=links&title='.api_htmlentities(urlencode($obj->reflink)).'&session_id='.api_htmlentities($_GET['session_id']).'&group_id='.api_htmlentities($_GET['group_id']).'">'.Display::return_icon('what_link_here.png', get_lang('LinksPages'),'',22).'</a>'.$showdelete;
  1402. }
  1403. $rows[] = $row;
  1404. }
  1405. $table = new SortableTableFromArrayConfig($rows,1,10,'AllPages_table','','','ASC');
  1406. $table->set_additional_parameters(array('cidReq' =>Security::remove_XSS($_GET['cidReq']),'action'=>Security::remove_XSS($_GET['action']),'group_id'=>Security::remove_XSS($_GET['group_id'])));
  1407. $table->set_header(0,get_lang('Type'), true, array ('style' => 'width:30px;'));
  1408. $table->set_header(1,get_lang('Title'), true);
  1409. $table->set_header(2,get_lang('Author').' ('.get_lang('LastVersion').')', true);
  1410. $table->set_header(3,get_lang('Date').' ('.get_lang('LastVersion').')', true);
  1411. if (api_is_allowed_to_session_edit(false,true) ) {
  1412. $table->set_header(4,get_lang('Actions'), true, array ('style' => 'width:130px;'));
  1413. }
  1414. $table->display();
  1415. }
  1416. }
  1417. /////////////////////// discuss pages ///////////////////////
  1418. if ($_GET['action']=='discuss') {
  1419. if (api_get_session_id()!=0 && api_is_allowed_to_session_edit(false,true)==false) {
  1420. api_not_allowed();
  1421. }
  1422. if (!$_GET['title']) {
  1423. Display::display_error_message(get_lang("MustSelectPage"));
  1424. exit;
  1425. }
  1426. //first extract the date of last version
  1427. $sql='SELECT * FROM '.$tbl_wiki.'WHERE reflink="'.Database::escape_string($page).'" AND '.$groupfilter.$condition_session.' ORDER BY id DESC';
  1428. $result=Database::query($sql);
  1429. $row=Database::fetch_array($result);
  1430. $lastversiondate=api_get_local_time($row['dtime'], null, date_default_timezone_get());
  1431. $lastuserinfo=Database::get_user_info_from_id($row['user_id']);
  1432. //select page to discuss
  1433. $sql='SELECT * FROM '.$tbl_wiki.'WHERE reflink="'.Database::escape_string($page).'" AND '.$groupfilter.$condition_session.' ORDER BY id ASC';
  1434. $result=Database::query($sql);
  1435. $row=Database::fetch_array($result);
  1436. $id=$row['id'];
  1437. $firstuserid=$row['user_id'];
  1438. //mode assignment: previous to show page type
  1439. if ($row['assignment']==1) {
  1440. $icon_assignment=Display::return_icon('wiki_assignment.png', get_lang('AssignmentDescExtra'),'',22);
  1441. } elseif($row['assignment']==2) {
  1442. $icon_assignment=Display::return_icon('wiki_work.png', get_lang('AssignmentWorkExtra'),'',22);
  1443. }
  1444. //Show title and form to discuss if page exist
  1445. if ($id!='') {
  1446. //Show discussion to students if isn't hidden. Show page to all teachers if is hidden. Mode assignments: If is hidden, show pages to student only if student is the author
  1447. if ($row['visibility_disc']==1 || api_is_allowed_to_edit(false,true) || api_is_platform_admin() || ($row['assignment']==2 && $row['visibility_disc']==0 && (api_get_user_id()==$row['user_id']))) {
  1448. echo '<div id="wikititle">';
  1449. // discussion action: protecting (locking) the discussion
  1450. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin()) {
  1451. if (check_addlock_discuss()==1) {
  1452. $addlock_disc= Display::return_icon('unlock.png', get_lang('UnlockDiscussExtra'),'',22);
  1453. $lock_unlock_disc='unlockdisc';
  1454. } else {
  1455. $addlock_disc= Display::return_icon('lock.png', get_lang('LockDiscussExtra'),'',22);
  1456. $lock_unlock_disc='lockdisc';
  1457. }
  1458. }
  1459. echo '<span style="float:right">';
  1460. echo '<a href="index.php?action=discuss&amp;actionpage='.$lock_unlock_disc.'&amp;title='.api_htmlentities(urlencode($page)).'">'.$addlock_disc.'</a>';
  1461. echo '</span>';
  1462. // discussion action: visibility. Show discussion to students if isn't hidden. Show page to all teachers if is hidden.
  1463. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin()) {
  1464. if (check_visibility_discuss()==1) {
  1465. /// TODO: Fix Mode assignments: If is hidden, show discussion to student only if student is the author
  1466. //if(($row['assignment']==2 && $row['visibility_disc']==0 && (api_get_user_id()==$row['user_id']))==false)
  1467. //{
  1468. //$visibility_disc= '<img src="../img/wiki/invisible.gif" title="'.get_lang('HideDiscussExtra').'" alt="'.get_lang('HideDiscussExtra').'" />';
  1469. //}
  1470. $visibility_disc= Display::return_icon('visible.png', get_lang('ShowDiscussExtra'),'',22);
  1471. $hide_show_disc='hidedisc';
  1472. } else {
  1473. $visibility_disc= Display::return_icon('invisible.png', get_lang('HideDiscussExtra'),'',22);
  1474. $hide_show_disc='showdisc';
  1475. }
  1476. }
  1477. echo '<span style="float:right">';
  1478. echo '<a href="index.php?action=discuss&amp;actionpage='.$hide_show_disc.'&amp;title='.api_htmlentities(urlencode($page)).'">'.$visibility_disc.'</a>';
  1479. echo '</span>';
  1480. //discussion action: check add rating lock. Show/Hide list to rating for all student
  1481. if (api_is_allowed_to_edit(false,true) || api_is_platform_admin()) {
  1482. if (check_ratinglock_discuss()==1) {
  1483. $ratinglock_disc= Display::return_icon('star.png', get_lang('UnlockRatingDiscussExtra'),'',22);
  1484. $lock_unlock_rating_disc='unlockrating';
  1485. } else {
  1486. $ratinglock_disc= Display::return_icon('star_na.png', get_lang('LockRatingDiscussExtra'),'',22);
  1487. $lock_unlock_rating_disc='lockrating';
  1488. }
  1489. }
  1490. echo '<span style="float:right">';
  1491. echo '<a href="index.php?action=discuss&amp;actionpage='.$lock_unlock_rating_disc.'&amp;title='.api_htmlentities(urlencode($page)).'">'.$ratinglock_disc.'</a>';
  1492. echo '</span>';
  1493. //discussion action: email notification
  1494. if (check_notify_discuss($page)==1) {
  1495. $notify_disc= Display::return_icon('messagebox_info.png', get_lang('NotifyDiscussByEmail'),'',22);
  1496. $lock_unlock_notify_disc='unlocknotifydisc';
  1497. } else {
  1498. $notify_disc= Display::return_icon('mail.png', get_lang('CancelNotifyDiscussByEmail'),'',22);
  1499. $lock_unlock_notify_disc='locknotifydisc';
  1500. }
  1501. echo '<span style="float:right">';
  1502. echo '<a href="index.php?action=discuss&amp;actionpage='.$lock_unlock_notify_disc.'&amp;title='.api_htmlentities(urlencode($page)).'">'.$notify_disc.'</a>';
  1503. echo '</span>';
  1504. echo $icon_assignment.'&nbsp;&nbsp;&nbsp;'.api_htmlentities($row['title']);
  1505. echo ' ('.get_lang('MostRecentVersionBy').' <a href="../user/userInfo.php?uInfo='.$lastuserinfo['user_id'].'">'.api_htmlentities(api_get_person_name($lastuserinfo['firstname'], $lastuserinfo['lastname'])).'</a> '.$lastversiondate.$countWPost.')'.$avg_WPost_score.' '; //TODO: read average score
  1506. echo '</div>';
  1507. if ($row['addlock_disc']==1 || api_is_allowed_to_edit(false,true) || api_is_platform_admin()) { //show comments but students can't add theirs
  1508. ?>
  1509. <form name="form1" method="post" action="">
  1510. <table>
  1511. <tr>
  1512. <td valign="top" ><?php echo get_lang('Comments');?>:</td>
  1513. <?php echo '<input type="hidden" name="wpost_id" value="'.md5(uniqid(rand(), true)).'">';//prevent double post ?>
  1514. <td><textarea name="comment" cols="80" rows="5" id="comment"></textarea></td>
  1515. </tr>
  1516. <tr>
  1517. <?php
  1518. //check if rating is allowed
  1519. if ($row['ratinglock_disc']==1 || api_is_allowed_to_edit(false,true) || api_is_platform_admin()) {
  1520. ?>
  1521. <td><?php echo get_lang('Rating');?>: </td>
  1522. <td valign="top"><select name="rating" id="rating">
  1523. <option value="-" selected>-</option>
  1524. <option value="0">0</option>
  1525. <option value="1">1</option>
  1526. <option value="2">2</option>
  1527. <option value="3">3</option>
  1528. <option value="4">4</option>
  1529. <option value="5">5</option>
  1530. <option value="6">6</option>
  1531. <option value="7">7</option>
  1532. <option value="8">8</option>
  1533. <option value="9">9</option>
  1534. <option value="10">10</option>
  1535. </select></td>
  1536. <?php
  1537. } else {
  1538. echo '<input type=hidden name="rating" value="-">';// must pass a default value to avoid rate automatically
  1539. }
  1540. ?>
  1541. </tr>
  1542. <tr>
  1543. <td>&nbsp;</td>
  1544. <td> <?php echo '<button class="save" type="submit" name="Submit"> '.get_lang('Send').'</button>'; ?></td>
  1545. </tr>
  1546. </table>
  1547. </form>
  1548. <?php
  1549. if (isset($_POST['Submit']) && double_post($_POST['wpost_id'])) {
  1550. $dtime = date( "Y-m-d H:i:s" );
  1551. $message_author=api_get_user_id();
  1552. $sql="INSERT INTO $tbl_wiki_discuss (publication_id, userc_id, comment, p_score, dtime) VALUES ('".$id."','".$message_author."','".Database::escape_string($_POST['comment'])."','".Database::escape_string($_POST['rating'])."','".$dtime."')";
  1553. $result=Database::query($sql) or die(Database::error());
  1554. check_emailcue($id, 'D', $dtime, $message_author);
  1555. }
  1556. }//end discuss lock
  1557. echo '<hr noshade size="1">';
  1558. $user_table = Database :: get_main_table(TABLE_MAIN_USER);
  1559. $sql="SELECT * FROM $tbl_wiki_discuss reviews, $user_table user WHERE reviews.publication_id='".$id."' AND user.user_id='".$firstuserid."' ORDER BY id DESC";
  1560. $result=Database::query($sql) or die(Database::error());
  1561. $countWPost = Database::num_rows($result);
  1562. echo get_lang('NumComments').": ".$countWPost; //comment's numbers
  1563. $sql="SELECT SUM(p_score) as sumWPost FROM $tbl_wiki_discuss WHERE publication_id='".$id."' AND NOT p_score='-' ORDER BY id DESC";
  1564. $result2=Database::query($sql) or die(Database::error());
  1565. $row2=Database::fetch_array($result2);
  1566. $sql="SELECT * FROM $tbl_wiki_discuss WHERE publication_id='".$id."' AND NOT p_score='-'";
  1567. $result3=Database::query($sql) or die(Database::error());
  1568. $countWPost_score= Database::num_rows($result3);
  1569. echo ' - '.get_lang('NumCommentsScore').': '.$countWPost_score;//
  1570. if ($countWPost_score!=0) {
  1571. $avg_WPost_score = round($row2['sumWPost'] / $countWPost_score,2).' / 10';
  1572. } else {
  1573. $avg_WPost_score = $countWPost_score;
  1574. }
  1575. echo ' - '.get_lang('RatingMedia').': '.$avg_WPost_score; // average rating
  1576. $sql='UPDATE '.$tbl_wiki.' SET score="'.Database::escape_string($avg_WPost_score).'" WHERE reflink="'.Database::escape_string($page).'" AND '.$groupfilter.$condition_session; // check if work ok. TODO:
  1577. Database::query($sql);
  1578. echo '<hr noshade size="1">';
  1579. //echo '<div style="overflow:auto; height:170px;">';
  1580. while ($row=Database::fetch_array($result)) {
  1581. $userinfo=Database::get_user_info_from_id($row['userc_id']);
  1582. if (($userinfo['status'])=="5") {
  1583. $author_status=get_lang('Student');
  1584. } else {
  1585. $author_status=get_lang('Teacher');
  1586. }
  1587. require_once api_get_path(INCLUDE_PATH).'/lib/usermanager.lib.php';
  1588. $user_id=$row['userc_id'];
  1589. $name = api_get_person_name($userinfo['firstname'], $userinfo['lastname']);
  1590. $attrb=array();
  1591. if ($user_id<>0) {
  1592. $image_path = UserManager::get_user_picture_path_by_id($user_id,'web',false, true);
  1593. $image_repository = $image_path['dir'];
  1594. $existing_image = $image_path['file'];
  1595. $author_photo= '<img src="'.$image_repository.$existing_image.'" alt="'.api_htmlentities($name).'" width="40" height="50" align="top" title="'.api_htmlentities($name).'" />';
  1596. } else {
  1597. $author_photo= '<img src="'.api_get_path(WEB_CODE_PATH)."img/unknown.jpg".'" alt="'.api_htmlentities($name).'" width="40" height="50" align="top" title="'.api_htmlentities($name).'" />';
  1598. }
  1599. //stars
  1600. $p_score=$row['p_score'];
  1601. switch ($p_score) {
  1602. case 0:
  1603. $imagerating='<img src="../img/rating/stars_0.gif"/>';
  1604. break;
  1605. case 1:
  1606. $imagerating='<img src="../img/rating/stars_5.gif"/>';
  1607. break;
  1608. case 2:
  1609. $imagerating='<img src="../img/rating/stars_10.gif"/>';
  1610. break;
  1611. case 3:
  1612. $imagerating='<img src="../img/rating/stars_15.gif"/>';
  1613. break;
  1614. case 4:
  1615. $imagerating='<img src="../img/rating/stars_20.gif"/>';
  1616. break;
  1617. case 5:
  1618. $imagerating='<img src="../img/rating/stars_25.gif"/>';
  1619. break;
  1620. case 6:
  1621. $imagerating='<img src="../img/rating/stars_30.gif"/>';
  1622. break;
  1623. case 7:
  1624. $imagerating='<img src="../img/rating/stars_35.gif"/>';
  1625. break;
  1626. case 8:
  1627. $imagerating='<img src="../img/rating/stars_40.gif"/>';
  1628. break;
  1629. case 9:
  1630. $imagerating='<img src="../img/rating/stars_45.gif"/>';
  1631. break;
  1632. case 10:
  1633. $imagerating='<img src="../img/rating/stars_50.gif"/>';
  1634. break;
  1635. }
  1636. echo '<p><table>';
  1637. echo '<tr>';
  1638. echo '<td rowspan="2">'.$author_photo.'</td>';
  1639. echo '<td style=" color:#999999"><a href="../user/userInfo.php?uInfo='.$userinfo['user_id'].'">'.api_htmlentities(api_get_person_name($userinfo['firstname'], $userinfo['lastname'])).'</a> ('.$author_status.') '.api_get_local_time($row['dtime'], null, date_default_timezone_get()).' - '.get_lang('Rating').': '.$row['p_score'].' '.$imagerating.' </td>';
  1640. echo '</tr>';
  1641. echo '<tr>';
  1642. echo '<td>'.api_htmlentities($row['comment']).'</td>';
  1643. echo '</tr>';
  1644. echo "</table>";
  1645. echo '<hr noshade size="1">';
  1646. }
  1647. } else {
  1648. Display::display_warning_message(get_lang('LockByTeacher'),false);
  1649. }
  1650. } else {
  1651. Display::display_normal_message(get_lang('DiscussNotAvailable'));
  1652. }
  1653. }
  1654. echo "</div>"; // echo "<div id='mainwiki'>";
  1655. echo "</div>"; // echo "<div id='wikiwrapper'>";
  1656. /*
  1657. FOOTER
  1658. */
  1659. Display::display_footer();