moodle/mod/book/lib.php

452 lines
12 KiB
PHP

<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Book module core interaction API
*
* @package mod_book
* @copyright 2004-2011 Petr Skoda {@link http://skodak.org}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die;
/**
* Returns list of available numbering types
* @return array
*/
function book_get_numbering_types() {
global $CFG; // required for the include
require_once(dirname(__FILE__).'/locallib.php');
return array (
BOOK_NUM_NONE => get_string('numbering0', 'mod_book'),
BOOK_NUM_NUMBERS => get_string('numbering1', 'mod_book'),
BOOK_NUM_BULLETS => get_string('numbering2', 'mod_book'),
BOOK_NUM_INDENTED => get_string('numbering3', 'mod_book')
);
}
/**
* Returns all other caps used in module
* @return array
*/
function book_get_extra_capabilities() {
// used for group-members-only
return array('moodle/site:accessallgroups');
}
/**
* Add book instance.
*
* @param stdClass $data
* @param stdClass $mform
* @return int new book instance id
*/
function book_add_instance($data, $mform) {
global $DB;
$data->timecreated = time();
$data->timemodified = $data->timecreated;
if (!isset($data->customtitles)) {
$data->customtitles = 0;
}
return $DB->insert_record('book', $data);
}
/**
* Update book instance.
*
* @param stdClass $data
* @param stdClass $mform
* @return bool true
*/
function book_update_instance($data, $mform) {
global $DB;
$data->timemodified = time();
$data->id = $data->instance;
if (!isset($data->customtitles)) {
$data->customtitles = 0;
}
$DB->update_record('book', $data);
$book = $DB->get_record('book', array('id'=>$data->id));
$DB->set_field('book', 'revision', $book->revision+1, array('id'=>$book->id));
return true;
}
/**
* Delete book instance by activity id
*
* @param int $id
* @return bool success
*/
function book_delete_instance($id) {
global $DB;
if (!$book = $DB->get_record('book', array('id'=>$id))) {
return false;
}
$DB->delete_records('book_chapters', array('bookid'=>$book->id));
$DB->delete_records('book', array('id'=>$book->id));
return true;
}
/**
* Return use outline
*
* @param stdClass $course
* @param stdClass $user
* @param stdClass $mod
* @param object $book
* @return object|null
*/
function book_user_outline($course, $user, $mod, $book) {
global $DB;
if ($logs = $DB->get_records('log', array('userid'=>$user->id, 'module'=>'book',
'action'=>'view', 'info'=>$book->id), 'time ASC')) {
$numviews = count($logs);
$lastlog = array_pop($logs);
$result = new stdClass();
$result->info = get_string('numviews', '', $numviews);
$result->time = $lastlog->time;
return $result;
}
return null;
}
/**
* Print a detailed representation of what a user has done with
* a given particular instance of this module, for user activity reports.
*
* @param stdClass $course
* @param stdClass $user
* @param stdClass $mod
* @param stdClass $book
* @return bool
*/
function book_user_complete($course, $user, $mod, $book) {
return true;
}
/**
* Given a course and a time, this module should find recent activity
* that has occurred in book activities and print it out.
*
* @param stdClass $course
* @param bool $viewfullnames
* @param int $timestart
* @return bool true if there was output, or false is there was none
*/
function book_print_recent_activity($course, $viewfullnames, $timestart) {
return false; // True if anything was printed, otherwise false
}
/**
* No cron in book.
*
* @return bool
*/
function book_cron () {
return true;
}
/**
* No grading in book.
*
* @param int $bookid
* @return null
*/
function book_grades($bookid) {
return null;
}
/**
* This function returns if a scale is being used by one book
* it it has support for grading and scales. Commented code should be
* modified if necessary. See book, glossary or journal modules
* as reference.
*
* @param int $bookid
* @param int $scaleid
* @return boolean True if the scale is used by any journal
*/
function book_scale_used($bookid, $scaleid) {
return false;
}
/**
* Checks if scale is being used by any instance of book
*
* This is used to find out if scale used anywhere
*
* @param int $scaleid
* @return bool true if the scale is used by any book
*/
function book_scale_used_anywhere($scaleid) {
return false;
}
/**
* Return read actions.
* @return array
*/
function book_get_view_actions() {
global $CFG; // necessary for includes
$return = array('view', 'view all');
$plugins = get_plugin_list('booktool');
foreach ($plugins as $plugin => $dir) {
if (file_exists("$dir/lib.php")) {
require_once("$dir/lib.php");
}
$function = 'booktool_'.$plugin.'_get_view_actions';
if (function_exists($function)) {
if ($actions = $function()) {
$return = array_merge($return, $actions);
}
}
}
return $return;
}
/**
* Return write actions.
* @return array
*/
function book_get_post_actions() {
global $CFG; // necessary for includes
$return = array('update');
$plugins = get_plugin_list('booktool');
foreach ($plugins as $plugin => $dir) {
if (file_exists("$dir/lib.php")) {
require_once("$dir/lib.php");
}
$function = 'booktool_'.$plugin.'_get_post_actions';
if (function_exists($function)) {
if ($actions = $function()) {
$return = array_merge($return, $actions);
}
}
}
return $return;
}
/**
* Supported features
*
* @param string $feature FEATURE_xx constant for requested feature
* @return mixed True if module supports feature, false if not, null if doesn't know
*/
function book_supports($feature) {
switch($feature) {
case FEATURE_MOD_ARCHETYPE: return MOD_ARCHETYPE_RESOURCE;
case FEATURE_GROUPS: return false;
case FEATURE_GROUPINGS: return false;
case FEATURE_GROUPMEMBERSONLY: return true;
case FEATURE_MOD_INTRO: return true;
case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
case FEATURE_GRADE_HAS_GRADE: return false;
case FEATURE_GRADE_OUTCOMES: return false;
case FEATURE_BACKUP_MOODLE2: return true;
case FEATURE_SHOW_DESCRIPTION: return true;
default: return null;
}
}
/**
* Adds module specific settings to the settings block
*
* @param settings_navigation $settingsnav The settings navigation object
* @param navigation_node $booknode The node to add module settings to
* @return void
*/
function book_extend_settings_navigation(settings_navigation $settingsnav, navigation_node $booknode) {
global $USER, $PAGE;
$plugins = get_plugin_list('booktool');
foreach ($plugins as $plugin => $dir) {
if (file_exists("$dir/lib.php")) {
require_once("$dir/lib.php");
}
$function = 'booktool_'.$plugin.'_extend_settings_navigation';
if (function_exists($function)) {
$function($settingsnav, $booknode);
}
}
$params = $PAGE->url->params();
if (!empty($params['id']) and !empty($params['chapterid']) and has_capability('mod/book:edit', $PAGE->cm->context)) {
if (!empty($USER->editing)) {
$string = get_string("turneditingoff");
$edit = '0';
} else {
$string = get_string("turneditingon");
$edit = '1';
}
$url = new moodle_url('/mod/book/view.php', array('id'=>$params['id'], 'chapterid'=>$params['chapterid'], 'edit'=>$edit, 'sesskey'=>sesskey()));
$booknode->add($string, $url, navigation_node::TYPE_SETTING);
}
}
/**
* Lists all browsable file areas
* @param object $course
* @param object $cm
* @param object $context
* @return array
*/
function book_get_file_areas($course, $cm, $context) {
$areas = array();
$areas['chapter'] = get_string('chapters', 'mod_book');
return $areas;
}
/**
* File browsing support for book module chapter area.
* @param object $browser
* @param object $areas
* @param object $course
* @param object $cm
* @param object $context
* @param string $filearea
* @param int $itemid
* @param string $filepath
* @param string $filename
* @return object file_info instance or null if not found
*/
function book_get_file_info($browser, $areas, $course, $cm, $context, $filearea, $itemid, $filepath, $filename) {
global $CFG, $DB;
// note: 'intro' area is handled in file_browser automatically
if (!has_capability('mod/book:read', $context)) {
return null;
}
if ($filearea !== 'chapter') {
return null;
}
require_once(dirname(__FILE__).'/locallib.php');
if (is_null($itemid)) {
return new book_file_info($browser, $course, $cm, $context, $areas, $filearea);
}
$fs = get_file_storage();
$filepath = is_null($filepath) ? '/' : $filepath;
$filename = is_null($filename) ? '.' : $filename;
if (!$storedfile = $fs->get_file($context->id, 'mod_book', $filearea, $itemid, $filepath, $filename)) {
return null;
}
// modifications may be tricky - may cause caching problems
$canwrite = has_capability('mod/book:edit', $context);
$chaptername = $DB->get_field('book_chapters', 'title', array('bookid'=>$cm->instance, 'id'=>$itemid));
$chaptername = format_string($chaptername, true, array('context'=>$context));
$urlbase = $CFG->wwwroot.'/pluginfile.php';
return new file_info_stored($browser, $context, $storedfile, $urlbase, $chaptername, true, true, $canwrite, false);
}
/**
* Serves the book attachments. Implements needed access control ;-)
*
* @param stdClass $course course object
* @param cm_info $cm course module object
* @param context $context context object
* @param string $filearea file area
* @param array $args extra arguments
* @param bool $forcedownload whether or not force download
* @param array $options additional options affecting the file serving
* @return bool false if file not found, does not return if found - just send the file
*/
function book_pluginfile($course, $cm, $context, $filearea, $args, $forcedownload, array $options=array()) {
global $DB;
if ($context->contextlevel != CONTEXT_MODULE) {
return false;
}
require_course_login($course, true, $cm);
if ($filearea !== 'chapter') {
return false;
}
if (!has_capability('mod/book:read', $context)) {
return false;
}
$chid = (int)array_shift($args);
if (!$book = $DB->get_record('book', array('id'=>$cm->instance))) {
return false;
}
if (!$chapter = $DB->get_record('book_chapters', array('id'=>$chid, 'bookid'=>$book->id))) {
return false;
}
if ($chapter->hidden and !has_capability('mod/book:viewhiddenchapters', $context)) {
return false;
}
$fs = get_file_storage();
$relativepath = implode('/', $args);
$fullpath = "/$context->id/mod_book/chapter/$chid/$relativepath";
if (!$file = $fs->get_file_by_hash(sha1($fullpath)) or $file->is_directory()) {
return false;
}
// finally send the file
send_stored_file($file, 360, 0, $forcedownload, $options);
}
/**
* Return a list of page types
*
* @param string $pagetype current page type
* @param stdClass $parentcontext Block's parent context
* @param stdClass $currentcontext Current context of block
* @return array
*/
function book_page_type_list($pagetype, $parentcontext, $currentcontext) {
$module_pagetype = array('mod-book-*'=>get_string('page-mod-book-x', 'mod_book'));
return $module_pagetype;
}