16a34ae189
This change moves all operations which deal with the fetching/updating, or setting of files from the file_storage class into a new file_system class. A new file_system can be specified in the config.php and used to replace all relevant methods in order to move the file system component to an alternative solution.
156 lines
5.6 KiB
PHP
156 lines
5.6 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/>.
|
|
|
|
/**
|
|
* Blackboard V5 and V6 question importer.
|
|
*
|
|
* @package qformat_blackboard_six
|
|
* @copyright 2012 Jean-Michel Vedrine
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
|
|
defined('MOODLE_INTERNAL') || die();
|
|
|
|
/**
|
|
* Base class question import format for zip files with images
|
|
*
|
|
* @package qformat_blackboard_six
|
|
* @copyright 2012 Jean-Michel Vedrine
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
class qformat_blackboard_six_base extends qformat_based_on_xml {
|
|
/** @var string path to path to root of image tree in unzipped archive. */
|
|
public $filebase = '';
|
|
/** @var string path to the temporary directory. */
|
|
public $tempdir = '';
|
|
|
|
/**
|
|
* This plugin provide import
|
|
* @return bool true
|
|
*/
|
|
public function provide_import() {
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Check if the given file is capable of being imported by this plugin.
|
|
* As {@link file_storage::mimetype()} may use finfo PHP extension if available,
|
|
* the value returned by $file->get_mimetype for a .dat file is not the same on all servers.
|
|
* So we must made 2 checks to verify if the plugin can import the file.
|
|
* @param stored_file $file the file to check
|
|
* @return bool whether this plugin can import the file
|
|
*/
|
|
public function can_import_file($file) {
|
|
$mimetypes = array(
|
|
mimeinfo('type', '.dat'),
|
|
mimeinfo('type', '.zip')
|
|
);
|
|
return in_array($file->get_mimetype(), $mimetypes) || in_array(mimeinfo('type', $file->get_filename()), $mimetypes);
|
|
}
|
|
|
|
public function mime_type() {
|
|
return mimeinfo('type', '.zip');
|
|
}
|
|
|
|
/**
|
|
* Does any post-processing that may be desired
|
|
* Clean the temporary directory if a zip file was imported
|
|
* @return bool success
|
|
*/
|
|
public function importpostprocess() {
|
|
if ($this->tempdir != '') {
|
|
fulldelete($this->tempdir);
|
|
}
|
|
return true;
|
|
}
|
|
/**
|
|
* Set the path to the root of images tree
|
|
* @param string $path path to images root
|
|
*/
|
|
public function set_filebase($path) {
|
|
$this->filebase = $path;
|
|
}
|
|
|
|
/**
|
|
* Store an image file in a draft filearea
|
|
* @param array $text, if itemid element don't exists it will be created
|
|
* @param string $tempdir path to root of image tree
|
|
* @param string $filepathinsidetempdir path to image in the tree
|
|
* @param string $filename image's name
|
|
* @return string new name of the image as it was stored
|
|
*/
|
|
protected function store_file_for_text_field(&$text, $tempdir, $filepathinsidetempdir, $filename) {
|
|
global $USER;
|
|
$fs = get_file_storage();
|
|
if (empty($text['itemid'])) {
|
|
$text['itemid'] = file_get_unused_draft_itemid();
|
|
}
|
|
// As question file areas don't support subdirs,
|
|
// convert path to filename.
|
|
// So that images with same name can be imported.
|
|
$newfilename = clean_param(str_replace('/', '__', $filepathinsidetempdir . '__' . $filename), PARAM_FILE);
|
|
$filerecord = array(
|
|
'contextid' => context_user::instance($USER->id)->id,
|
|
'component' => 'user',
|
|
'filearea' => 'draft',
|
|
'itemid' => $text['itemid'],
|
|
'filepath' => '/',
|
|
'filename' => $newfilename,
|
|
);
|
|
$fs->create_file_from_pathname($filerecord, $tempdir . '/' . $filepathinsidetempdir . '/' . $filename);
|
|
return $newfilename;
|
|
}
|
|
|
|
/**
|
|
* Given an HTML text with references to images files,
|
|
* store all images in a draft filearea,
|
|
* and return an array with all urls in text recoded,
|
|
* format set to FORMAT_HTML, and itemid set to filearea itemid
|
|
* @param string $text text to parse and recode
|
|
* @return array with keys text, format, itemid.
|
|
*/
|
|
public function text_field($text) {
|
|
$data = array();
|
|
// Step one, find all file refs then add to array.
|
|
preg_match_all('|<img[^>]+src="([^"]*)"|i', $text, $out); // Find all src refs.
|
|
$filepaths = array();
|
|
foreach ($out[1] as $path) {
|
|
$fullpath = $this->filebase . '/' . $path;
|
|
|
|
if (is_readable($fullpath) && !in_array($path, $filepaths)) {
|
|
$dirpath = dirname($path);
|
|
$filename = basename($path);
|
|
$newfilename = $this->store_file_for_text_field($data, $this->filebase, $dirpath, $filename);
|
|
$text = preg_replace("|{$path}|", "@@PLUGINFILE@@/" . $newfilename, $text);
|
|
$filepaths[] = $path;
|
|
}
|
|
|
|
}
|
|
$data['text'] = $text;
|
|
$data['format'] = FORMAT_HTML;
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* Same as text_field but text is cleaned.
|
|
* @param string $text text to parse and recode
|
|
* @return array with keys text, format, itemid.
|
|
*/
|
|
public function cleaned_text_field($text) {
|
|
return $this->text_field($this->cleaninput($text));
|
|
}
|
|
}
|