diff --git a/mod/wiki/create.php b/mod/wiki/create.php index a89b46bef1f..f6873b2778c 100644 --- a/mod/wiki/create.php +++ b/mod/wiki/create.php @@ -15,9 +15,8 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . - require_once('../../config.php'); -require_once(dirname(__FILE__).'/create_form.php'); +require_once(dirname(__FILE__) . '/create_form.php'); require_once($CFG->dirroot . '/mod/wiki/lib.php'); require_once($CFG->dirroot . '/mod/wiki/locallib.php'); require_once($CFG->dirroot . '/mod/wiki/pagelib.php'); @@ -29,11 +28,11 @@ require_once($CFG->dirroot . '/mod/wiki/pagelib.php'); // page editing page. $action = optional_param('action', 'new', PARAM_TEXT); // The title of the new page, can be empty -$title = optional_param('title', '', PARAM_TEXT); -$swid = optional_param('swid', 0, PARAM_INT); -$wid = optional_param('wid', 0, PARAM_INT); -$gid = optional_param('gid', 0, PARAM_INT); -$uid = optional_param('uid', 0, PARAM_INT); +$title = optional_param('title', '', PARAM_TEXT); +$wid = optional_param('wid', 0, PARAM_INT); +$swid = optional_param('swid', 0, PARAM_INT); +$gid = optional_param('gid', 0, PARAM_INT); +$uid = optional_param('uid', 0, PARAM_INT); // 'create' action must be submitted by moodle form // so sesskey must be checked @@ -43,22 +42,20 @@ if ($action == 'create') { } } -$swiki = null; +if (!empty($swid)) { + $subwiki = wiki_get_subwiki($swid); -if (!empty($wid)) { - // @TODO: Check for capabilities - if (!$swid = wiki_add_subwiki($wid, $gid, $uid)) { - print_error('invalidwikiid'); + if (!$wiki = wiki_get_wiki($subwiki->wikiid)) { + print_error('invalidwikiid', 'wiki'); } -} +} else { + $subwiki = wiki_get_subwiki_by_group($wid, $gid, $uid); -if (!$subwiki = wiki_get_subwiki($swid)) { - print_error('invalidswid', 'wiki'); -} + if (!$wiki = wiki_get_wiki($wid)) { + print_error('invalidwikiid', 'wiki'); + } -if (!$wiki = wiki_get_wiki($subwiki->wikiid)) { - print_error('invalidwikiid', 'wiki'); } if (!$cm = get_coursemodule_from_instance('wiki', $wiki->id)) { @@ -71,12 +68,18 @@ if (!$course = get_course_by_id($cm->course)) { require_course_login($course->id, true, $cm); -add_to_log($course->id, 'createpage', 'createpage', 'view.php?id='.$cm->id, $wiki->id); +add_to_log($course->id, 'createpage', 'createpage', 'view.php?id=' . $cm->id, $wiki->id); $wikipage = new page_wiki_create($wiki, $subwiki, $cm); -$wikipage->set_gid($gid); -$wikipage->set_swid($swid); +if (!empty($swid)) { + $wikipage->set_gid($subwiki->groupid); + $wikipage->set_uid($subwiki->userid); +} else { + $wikipage->set_gid($gid); + $wikipage->set_uid($uid); +} + if (!empty($title)) { $wikipage->set_title($title); } else { diff --git a/mod/wiki/locallib.php b/mod/wiki/locallib.php index e9e32ccd458..688ba0ba72b 100644 --- a/mod/wiki/locallib.php +++ b/mod/wiki/locallib.php @@ -197,13 +197,6 @@ function wiki_get_version($versionid) { */ function wiki_get_first_page($subwikid, $module = null) { global $DB, $USER; - // TODO: - // not sure if we should use current userid - - $extra = ''; - if ($module && $module->wikimode == 'individual') { - $extra = ' AND p.userid=' . $USER->id; - } $sql = 'SELECT p.* ' . 'FROM {wiki} w, {wiki_subwikis} s, {wiki_pages} p ' . @@ -211,7 +204,6 @@ function wiki_get_first_page($subwikid, $module = null) { 's.wikiid = w.id AND ' . 'w.firstpagetitle = p.title AND ' . 'p.subwikiid = s.id'; - $sql .= $extra; return $DB->get_record_sql($sql, array($subwikid)); } diff --git a/mod/wiki/pagelib.php b/mod/wiki/pagelib.php index ef3e21ac55e..891212c0300 100644 --- a/mod/wiki/pagelib.php +++ b/mod/wiki/pagelib.php @@ -64,6 +64,10 @@ abstract class page_wiki { */ protected $gid; + /** + * @var int Current user ID + */ + protected $uid; /** * @var array The tabs set used in wiki module */ @@ -194,6 +198,14 @@ abstract class page_wiki { $this->gid = $gid; } + /** + * Method to set current user id + * @param int $uid Current user id + */ + function set_uid($uid) { + $this->uid = $uid; + } + /** * Method to set the URL of the page. * This method must be overwritten by every type of page. @@ -346,7 +358,7 @@ class page_wiki_edit extends page_wiki { global $CFG, $PAGE; parent::__construct($wiki, $subwiki, $cm); self::$attachmentoptions = array( - 'subdirs' => false, + 'subdirs' => false, 'maxfiles' => -1, 'maxbytes' => $CFG->maxbytes, 'accepted_types'=>'*' @@ -522,7 +534,7 @@ class page_wiki_edit extends page_wiki { $data->newcontentformat = FORMAT_HTML; $data = file_prepare_standard_editor($data, 'newcontent', page_wiki_edit::$attachmentoptions, $context, 'wiki_attachments', $this->subwiki->id); break; - default: + default: //$draftitemid = file_get_submitted_draft_itemid('attachments'); //file_prepare_draft_area($draftitemid, $context->id, 'wiki_attachments', $this->subwiki->id); //$data->attachments = $draftitemid; @@ -872,10 +884,11 @@ class page_wiki_create extends page_wiki { } function set_action($action) { + global $PAGE; $this->action = $action; require_once(dirname(__FILE__) . '/create_form.php'); - $url = new moodle_url('/mod/wiki/create.php', array('action' => 'create', 'swid' => $this->swid)); + $url = new moodle_url('/mod/wiki/create.php', array('action' => 'create', 'wid' => $PAGE->activityrecord->id, 'gid' => $this->gid, 'uid' => $this->uid)); $formats = wiki_get_formats(); $options = array('formats' => $formats); if ($this->title != get_string('newpage', 'wiki')) { @@ -894,7 +907,6 @@ class page_wiki_create extends page_wiki { global $PAGE; $context = get_context_instance(CONTEXT_MODULE, $PAGE->cm->id); - $wiki = wiki_get_wiki($this->swid); // @TODO: Change this to has_capability and show an alternative interface. require_capability('mod/wiki:createpage', $context, NULL, true, 'nocreatepermission', 'wiki'); @@ -909,8 +921,12 @@ class page_wiki_create extends page_wiki { } function create_page() { - global $USER, $CFG; + global $USER, $CFG, $PAGE; $data = $this->mform->get_data(); + if (empty($this->subwiki)){ + $swid = wiki_add_subwiki($PAGE->activityrecord->id, $this->gid, $this->uid); + $this->subwiki = wiki_get_subwiki($swid); + } $id = wiki_create_page($this->subwiki->id, $data->pagetitle, $data->pageformat, $USER->id); redirect($CFG->wwwroot . '/mod/wiki/edit.php?pageid=' . $id); } diff --git a/mod/wiki/renderer.php b/mod/wiki/renderer.php index 5dffcbc37af..9b326974a0d 100644 --- a/mod/wiki/renderer.php +++ b/mod/wiki/renderer.php @@ -36,7 +36,7 @@ class mod_wiki_renderer extends plugin_renderer_base { // @TODO: Fix call to wiki_get_subwiki_by_group $gid = groups_get_activity_group($this->page->cm); - $gid = !empty($gid)?$gid:0; + $gid = !empty($gid) ? $gid : 0; if (!$subwiki = wiki_get_subwiki_by_group($this->page->cm->instance, $gid)) { return false; } @@ -314,20 +314,17 @@ class mod_wiki_renderer extends plugin_renderer_base { // Only people with these capabilities can view all wikis if ($view && $manage) { // @TODO: Print here a combo that contains all users. - $subwikis = wiki_get_subwikis($wiki->id); + $users = get_enrolled_users($context); $options = array(); - foreach ($subwikis as $subwiki) { - if ($subwiki->userid == 0) { - continue; - } - $user = user_get_users_by_id(array($subwiki->userid)); - $options[$subwiki->id] = fullname($user[$subwiki->userid]); + foreach ($users as $user) { + $options[$user->id] = fullname($user); } echo $this->output->container_start('wiki_right'); - $url = $CFG->wwwroot . '/mod/wiki/view.php?pageid=' . $page->id; - $name = 'swid'; - $selected = $page->subwikiid; + $params = array('wid' => $wiki->id, 'title' => $page->title); + $url = new moodle_url('/mod/wiki/view.php', $params); + $name = 'uid'; + $selected = $subwiki->userid; echo $this->output->single_select($url, $name, $options, $selected); echo $this->output->container_end(); } @@ -340,7 +337,7 @@ class mod_wiki_renderer extends plugin_renderer_base { if ($wiki->wikimode == 'collaborative') { // We need to print a select to choose a course group - $params = 'pageid=' . $page->id; + $params = 'wid=' . $wiki->id . '&title=' . urlencode($page->title); echo $this->output->container_start('wiki_right'); groups_print_activity_menu($cm, $CFG->wwwroot . '/mod/wiki/view.php?' . $params); @@ -348,10 +345,41 @@ class mod_wiki_renderer extends plugin_renderer_base { return; } else if ($wiki->wikimode == 'individual') { // @TODO: Print here a combo that contains all users of that subwiki. + $view = has_capability('mod/wiki:viewpage', $context, $USER); + $manage = has_capability('mod/wiki:managewiki', $context, $USER); + + // Only people with these capabilities can view all wikis + if ($view && $manage) { + $users = get_enrolled_users($context); + $options = array(); + foreach ($users as $user) { + $groups = groups_get_all_groups($cm->course, $user->id); + if (!empty($groups)) { + foreach ($groups as $group) { + $options[$group->id][$group->name][$group->id . '-' . $user->id] = fullname($user); + } + } else { + $name = get_string('notingroup', 'wiki'); + $options[0][$name]['0' . '-' . $user->id] = fullname($user); + } + } + } else { + $group = groups_get_group($subwiki->groupid); + $users = groups_get_members($subwiki->groupid); + foreach ($users as $user) { + $options[$group->id][$group->name][$group->id . '-' . $user->id] = fullname($user); + } + } echo $this->output->container_start('wiki_right'); - echo "TODO: Print here a combo to choose user wiki from that subwiki"; + $params = array('wid' => $wiki->id, 'title' => $page->title); + $url = new moodle_url('/mod/wiki/view.php', $params); + $name = 'groupanduser'; + $selected = $subwiki->groupid . '-' . $subwiki->userid; + echo $this->output->single_select($url, $name, $options, $selected); echo $this->output->container_end(); + return; + } else { // error return; @@ -359,8 +387,7 @@ class mod_wiki_renderer extends plugin_renderer_base { CASE VISIBLEGROUPS: if ($wiki->wikimode == 'collaborative') { // We need to print a select to choose a course group - - $params = 'pageid=' . $page->id; + $params = 'wid=' . $wiki->id . '&title=' . urlencode($page->title); echo $this->output->container_start('wiki_right'); groups_print_activity_menu($cm, $CFG->wwwroot . '/mod/wiki/view.php?' . $params); @@ -368,10 +395,28 @@ class mod_wiki_renderer extends plugin_renderer_base { return; } else if ($wiki->wikimode == 'individual') { - // @TODO: Print here a combo that contains all users of that wiki grouped by group. + $users = get_enrolled_users($context); + $options = array(); + foreach ($users as $user) { + $groups = groups_get_all_groups($cm->course, $user->id); + if (!empty($groups)) { + foreach ($groups as $group) { + $options[$group->id][$group->name][$group->id . '-' . $user->id] = fullname($user); + } + } else { + $name = get_string('notingroup', 'wiki'); + $options[0][$name]['0' . '-' . $user->id] = fullname($user); + } + } + echo $this->output->container_start('wiki_right'); - echo "TODO: Print here a combo to choose user wiki from that wiki"; + $params = array('wid' => $wiki->id, 'title' => $page->title); + $url = new moodle_url('/mod/wiki/view.php', $params); + $name = 'groupanduser'; + $selected = $subwiki->groupid . '-' . $subwiki->userid; + echo $this->output->single_select($url, $name, $options, $selected); echo $this->output->container_end(); + return; } else { @@ -393,10 +438,10 @@ class mod_wiki_renderer extends plugin_renderer_base { $items[] = get_string($opt, 'wiki'); } $selectoptions = array(); - foreach ($items as $key=>$item) { - $selectoptions[$key+1] = $item; + foreach ($items as $key => $item) { + $selectoptions[$key + 1] = $item; } - $select = new single_select(new moodle_url('/mod/wiki/map.php', array('pageid'=>$pageid)), 'option', $selectoptions, $currentselect); + $select = new single_select(new moodle_url('/mod/wiki/map.php', array('pageid' => $pageid)), 'option', $selectoptions, $currentselect); $select->label = get_string('mapmenu', 'wiki') . ': '; return $this->output->container($this->output->render($select), 'midpad'); } diff --git a/mod/wiki/view.php b/mod/wiki/view.php index ad6f359e9e4..7397a379861 100644 --- a/mod/wiki/view.php +++ b/mod/wiki/view.php @@ -36,15 +36,20 @@ require_once($CFG->dirroot . '/mod/wiki/lib.php'); require_once($CFG->dirroot . '/mod/wiki/locallib.php'); require_once($CFG->dirroot . '/mod/wiki/pagelib.php'); -$currentgroup = optional_param('group', 0, PARAM_INT); // Group ID -$userid = optional_param('userid', 0, PARAM_INT); // User ID -$title = optional_param('title', '', PARAM_TEXT); // Page Title -$action = optional_param('action', '', PARAM_ALPHA); -$id = optional_param('id', 0, PARAM_INT); // Course Module ID -$swid = optional_param('swid', 0, PARAM_INT); // Subwiki ID +$id = optional_param('id', 0, PARAM_INT); // Course Module ID + $pageid = optional_param('pageid', 0, PARAM_INT); // Page ID -$wid = optional_param('wid', 0, PARAM_INT); // Wiki ID -$edit = optional_param('edit', -1, PARAM_BOOL); + +$wid = optional_param('wid', 0, PARAM_INT); // Wiki ID +$title = optional_param('title', '', PARAM_TEXT); // Page Title +$currentgroup = optional_param('group', 0, PARAM_INT); // Group ID +$userid = optional_param('uid', 0, PARAM_INT); // User ID +$groupanduser = optional_param('groupanduser', 0, PARAM_TEXT); + +$edit = optional_param('edit', -1, PARAM_BOOL); + +$action = optional_param('action', '', PARAM_ALPHA); +$swid = optional_param('swid', 0, PARAM_INT); // Subwiki ID /* * Case 0: @@ -78,38 +83,26 @@ if ($id) { // Getting current group id $currentgroup = groups_get_activity_group($cm); - $currentgroup = !empty($currentgroup)?$currentgroup:0; + $currentgroup = !empty($currentgroup) ? $currentgroup : 0; // Getting current user id - if ($wiki->wikimode == 'individual'){ - if (empty($userid)){ - $userid = $USER->id; - } + if ($wiki->wikimode == 'individual') { + $userid = $USER->id; } else { $userid = 0; } - $subwiki = wiki_get_subwiki_by_group($wiki->id, $currentgroup, $userid); - $page = null; - if (!empty($subwiki)){ - $page = wiki_get_first_page($subwiki->id, $wiki); - } - if (!empty($page)){ - $pageid = $page->id; - } else { - // the first page doesn't exist, create first page automatically - // Then redirct to editing page - $page = null; - $title = $wiki->firstpagetitle; - $default = $wiki->defaultformat; - if (empty($subwiki)) { - if (!$swid = wiki_add_subwiki($wiki->id, $currentgroup, $userid)) { - print_error('invalidwikiid'); - } - } else { - $swid = $subwiki->id; - } - $id = wiki_create_page($swid, $title, $default, $USER->id); - redirect($CFG->wwwroot . '/mod/wiki/edit.php?pageid=' . $id); + // Getting subwiki. If it does not exists, redirecting to create page + if (!$subwiki = wiki_get_subwiki_by_group($wiki->id, $currentgroup, $userid)) { + $params = array('wid' => $wiki->id, 'gid' => $currentgroup, 'uid' => $userid, 'title' => $wiki->firstpagetitle); + $url = new moodle_url('/mod/wiki/create.php', $params); + redirect($url); + } + + // Getting first page. If it does not exists, redirecting to create page + if (!$page = wiki_get_first_page($subwiki->id, $wiki)) { + $params = array('swid' => $wiki->id, 'title' => $wiki->firstpagetitle); + $url = new moodle_url('/mod/wiki/create.php', $params); + redirect($url); } /* @@ -117,12 +110,7 @@ if ($id) { * * A user wants to see a page. * - * If group is set, system must show the page with the same name from another group. - * In this case, is probable that there is no version of that page for the - * given group - * * URL Params: pageid -> page id - * group -> group id (optional) * */ } elseif ($pageid) { @@ -131,24 +119,9 @@ if ($id) { if (!$page = wiki_get_page($pageid)) { print_error('incorrectpageid', 'wiki'); } - if (!empty($swid)){ - // User wants to view another subwiki - if ($subwiki = wiki_get_subwiki($swid)){ - // Trying to get the same page but from another subwiki - if (!$page = wiki_get_page_by_title($swid, $page->title)) { - // That page does not exists - // Getting the first page of that wiki - $wiki = wiki_get_wiki($subwiki->wikiid); - if (!$page = wiki_get_page_by_title($swid, $wiki->firstpagetitle)){ - $url = new moodle_url('/mod/wiki/view.php', array('id'=>$subwiki->id)); - print_error('individualpagedoesnotexist', 'wiki', $url->out()); - } - } - } else { - print_error('incorrectsubwikiid', 'wiki'); - } - } else if (!$subwiki = wiki_get_subwiki($page->subwikiid)) { + // Checking subwiki + if (!$subwiki = wiki_get_subwiki($page->subwikiid)) { print_error('incorrectsubwikiid', 'wiki'); } @@ -167,53 +140,30 @@ if ($id) { print_error('coursemisconf'); } - // Switching to the correct page and subwiki if group param is present - if ($currentgroup = groups_get_activity_group($cm)) { - if ($subwiki->groupid != $currentgroup) { - - // Setting new subwiki instance - // @TODO: Fix call to wiki_get_subwiki_by_group - $subwiki = wiki_get_subwiki_by_group($wiki->id, $currentgroup); - - // Setting new page instance or page title - $title = $page->title; - if ($page = wiki_get_page_by_title($subwiki->id, $page->title)) { - unset($title); - } - } - } - /* * Case 2: * - * Trying to read a page by using subwiki->id and title. + * Trying to read a page from another group or user * * Page can exists or not. * * If it exists, page must be shown * * If it does not exists, system must ask for its creation * - * URL params: swid -> subwiki id - * title -> a page title + * URL params: wid -> subwiki id (required) + * title -> a page title (required) + * group -> group id (optional) + * uid -> user id (optional) + * groupanduser -> (optional) */ -} elseif ($swid && $title) { - - // Getting subwiki instance - if (!$subwiki = wiki_get_subwiki($swid)) { - print_error('incorrectsubwikiid', 'wiki'); - } - - // Checking is there is a page with this title - if ($page = wiki_get_page_by_title($swid, $title)) { - unset($title); - } +} elseif ($wid && $title) { // Setting wiki instance - if (!$wiki = wiki_get_wiki($subwiki->wikiid)) { + if (!$wiki = wiki_get_wiki($wid)) { print_error('incorrectwikiid', 'wiki'); } // Checking course module - if (!$cm = get_coursemodule_from_instance("wiki", $subwiki->wikiid)) { + if (!$cm = get_coursemodule_from_instance("wiki", $wiki->id)) { print_error('invalidcoursemodule'); } @@ -222,66 +172,97 @@ if ($id) { print_error('coursemisconf'); } - /* - * Case 3: - * - * A user switches group when is 'reading' a non-existent page. - * - * URL Params: wid -> wiki id - * title -> page title - * currentgroup -> group id - * - */ -} elseif ($wid && $title && $currentgroup) { - - // Checking wiki instance - if (!$wiki = wiki_get_wiki($wid)) { - print_error('incorrectwikiid', 'wiki'); + $groupmode = groups_get_activity_groupmode($cm); + if (empty($currentgroup)) { + $currentgroup = groups_get_activity_group($cm); + $currentgroup = !empty($currentgroup) ? $currentgroup : 0; } - // Checking subwiki instance - // @TODO: Fix call to wiki_get_subwiki_by_group - if (!$currentgroup = groups_get_activity_group($cm)){ - $currentgroup = 0; - } - if (!$subwiki = wiki_get_subwiki_by_group($wid, $currentgroup)) { - print_error('incorrectsubwikiid', 'wiki'); + if ($wiki->wikimode == 'individual' && ($groupmode == SEPARATEGROUPS || $groupmode == VISIBLEGROUPS)) { + list($gid, $uid) = explode('-', $groupanduser); + } else if ($wiki->wikimode == 'individual') { + $gid = 0; + $uid = $userid; + } else if ($groupmode == NOGROUPS) { + $gid = 0; + $uid = 0; + } else { + $gid = $currentgroup; + $uid = 0; } - // Checking page instance - if ($page = wiki_get_page_by_title($subwiki->id, $title)) { - unset($title); + // Getting subwiki instance. If it does not exists, redirect to create page + if (!$subwiki = wiki_get_subwiki_by_group($wiki->id, $gid, $uid)) { + $params = array('wid' => $wiki->id, 'gid' => $gid, 'uid' => $uid, 'title' => $title); + $url = new moodle_url('/mod/wiki/create.php', $params); + redirect($url); } - // Checking course instance - if (!$course = get_course_by_id($wiki->course)) { - print_error('coursemisconf'); + // Checking is there is a page with this title. If it does not exists, redirect to first page + if (!$page = wiki_get_page_by_title($subwiki->id, $title)) { + $params = array('wid' => $wiki->id, 'gid' => $gid, 'uid' => $uid, 'title' => $wiki->firstpagetitle); + $url = new moodle_url('/mod/wiki/view.php', $params); + redirect($url); } - // Checking course module instance - if (!$cm = get_coursemodule_from_instance("wiki", $wiki->id, $course->id)) { - print_error('invalidcoursemodule'); - } - - $subwiki = null; - $page = null; - - /* - * Case 4: - * - * Error. No more options - */ -} else { + // /* + // * Case 3: + // * + // * A user switches group when is 'reading' a non-existent page. + // * + // * URL Params: wid -> wiki id + // * title -> page title + // * currentgroup -> group id + // * + // */ + //} elseif ($wid && $title && $currentgroup) { + // + // // Checking wiki instance + // if (!$wiki = wiki_get_wiki($wid)) { + // print_error('incorrectwikiid', 'wiki'); + // } + // + // // Checking subwiki instance + // // @TODO: Fix call to wiki_get_subwiki_by_group + // if (!$currentgroup = groups_get_activity_group($cm)){ + // $currentgroup = 0; + // } + // if (!$subwiki = wiki_get_subwiki_by_group($wid, $currentgroup)) { + // print_error('incorrectsubwikiid', 'wiki'); + // } + // + // // Checking page instance + // if ($page = wiki_get_page_by_title($subwiki->id, $title)) { + // unset($title); + // } + // + // // Checking course instance + // if (!$course = get_course_by_id($wiki->course)) { + // print_error('coursemisconf'); + // } + // + // // Checking course module instance + // if (!$cm = get_coursemodule_from_instance("wiki", $wiki->id, $course->id)) { + // print_error('invalidcoursemodule'); + // } + // + // $subwiki = null; + // $page = null; + // + // /* + // * Case 4: + // * + // * Error. No more options + // */ + } else { print_error('incorrectparameters'); } - - require_course_login($course, true, $cm); $context = get_context_instance(CONTEXT_MODULE, $cm->id); require_capability('mod/wiki:viewpage', $context); -add_to_log($course->id, 'wiki', 'view', 'view.php?id='.$cm->id, $wiki->id); +add_to_log($course->id, 'wiki', 'view', 'view.php?id=' . $cm->id, $wiki->id); if (($edit != - 1) and $PAGE->user_allowed_editing()) { $USER->editing = $edit;