MDL-30989 portfolio: updated portfolio phpdocs.

This commit is contained in:
Rossiani Wijaya 2012-01-30 15:37:46 +08:00
parent 216f6d8e9d
commit 93dd2725e8
11 changed files with 1889 additions and 1517 deletions

View File

@ -1,86 +1,74 @@
<?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/>.
/**
* Moodle - Modular Object-Oriented Dynamic Learning Environment
* http://moodle.org
* Copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com
* This file contains the base classes that are extended to create portfolio export functionality.
*
* This program 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 2 of the License, or
* (at your option) any later version.
* For places in moodle that want to
* add export functionality to subclass from {@link http://docs.moodle.org/dev/Adding_a_Portfolio_Button_to_a_page}
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*
* @package core
* @subpackage portfolio
* @author Penny Leach <penny@catalyst.net.nz>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL
* @copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com
*
* This file contains the base classes for places in moodle that want to
* add export functionality to subclass from.
* See http://docs.moodle.org/dev/Adding_a_Portfolio_Button_to_a_page
* @package core_portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>, Martin Dougiamas
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* base class for callers
*
* See http://docs.moodle.org/dev/Adding_a_Portfolio_Button_to_a_page
* {@see also portfolio_module_caller_base}
*/
* Base class for callers
*
* {@link See http://docs.moodle.org/dev/Adding_a_Portfolio_Button_to_a_page}
* {@see also portfolio_module_caller_base}
*
* @package core_portfolio
* @category portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
abstract class portfolio_caller_base {
/**
* stdclass object
* course that was active during the caller
*/
/** @var stdClass course active during the call */
protected $course;
/**
* named array of export config
* use{@link set_export_config} and {@link get_export_config} to access
*/
/** @var array configuration used for export. Use {@see set_export_config} and {@see get_export_config} to access */
protected $exportconfig = array();
/**
* stdclass object
* user currently exporting content
*/
/** @var stdclass user currently exporting content */
protected $user;
/**
* a reference to the exporter object
*/
/** @var stdClass a reference to the exporter object */
protected $exporter;
/**
* this can be overridden in subclasses constructors if they want
*/
/** @var array can be optionally overridden by subclass constructors */
protected $supportedformats;
/**
* set this for single file exports
*/
/** @var stored_file single file exports configuration*/
protected $singlefile;
/**
* set this for multi file exports
*/
/** @var stored_file|object set this for multi file exports */
protected $multifiles;
/**
* set this for generated-file exports
*/
/** @var string set this for generated-file exports */
protected $intendedmimetype;
/**
* Create portfolio_caller object
*
* @param array $callbackargs argument properties
*/
public function __construct($callbackargs) {
$expected = call_user_func(array(get_class($this), 'expected_callbackargs'));
foreach ($expected as $key => $required) {
@ -96,51 +84,49 @@ abstract class portfolio_caller_base {
}
/**
* if this caller wants any additional config items
* they should be defined here.
*
* @param array $mform moodleform object (passed by reference) to add elements to
* @param object $instance subclass of portfolio_plugin_base
* @param integer $userid id of user exporting content
*/
* If this caller wants any additional config items,
* they should be defined here.
*
* @param moodleform $mform passed by reference, add elements to it.
* @param portfolio_plugin_base $instance subclass of portfolio_plugin_base
*/
public function export_config_form(&$mform, $instance) {}
/**
* whether this caller wants any additional
* config during export (eg options or metadata)
*
* @return boolean
*/
* Whether this caller wants any additional
* config during export (eg options or metadata)
*
* @return bool
*/
public function has_export_config() {
return false;
}
/**
* just like the moodle form validation function
* this is passed in the data array from the form
* and if a non empty array is returned, form processing will stop.
*
* @param array $data data from form.
* @return array keyvalue pairs - form element => error string
*/
* Just like the moodle form validation function,
* this is passed in the data array from the form
* and if a non empty array is returned, form processing will stop.
*
* @param array $data data from form.
*/
public function export_config_validation($data) {}
/**
* how long does this reasonably expect to take..
* should we offer the user the option to wait..
* this is deliberately nonstatic so it can take filesize into account
* the portfolio plugin can override this.
* (so for example even if a huge file is being sent,
* the download portfolio plugin doesn't care )
*
* @return string (see PORTFOLIO_TIME_* constants)
*/
* How long does this reasonably expect to take..
* Should we offer the user the option to wait..?
* This is deliberately nonstatic so it can take filesize into account
* the portfolio plugin can override this.
* (so for example even if a huge file is being sent,
* the download portfolio plugin doesn't care )
*/
public abstract function expected_time();
/**
* helper method to calculate expected time for multi or single file exports
*/
* Helper method to calculate expected time for multi or single file exports
*
* @return string file time expectation
*/
public function expected_time_file() {
if ($this->multifiles) {
return portfolio_expected_time_file($this->multifiles);
@ -152,25 +138,20 @@ abstract class portfolio_caller_base {
}
/**
* used for displaying the navigation during the export screens.
*
* this function must be implemented, but can really return anything.
* an Exporting.. string will be added on the end.
* @return array of $extranav and $cm
*
* to pass to build_navigation
*
*/
* Function to build navigation
*/
public abstract function get_navigation();
/**
*
*/
* Helper function to get sha1
*/
public abstract function get_sha1();
/**
* helper function to calculate the sha1 for multi or single file exports
*/
* Helper function to calculate the sha1 for multi or single file exports
*
* @return string sha1 file exports
*/
public function get_sha1_file() {
if (empty($this->singlefile) && empty($this->multifiles)) {
throw new portfolio_caller_exception('invalidsha1file', 'portfolio', $this->get_return_url());
@ -186,11 +167,15 @@ abstract class portfolio_caller_base {
return sha1(implode('', $sha1s));
}
/*
* generic getter for properties belonging to this instance
* <b>outside</b> the subclasses
* like name, visible etc.
*/
/**
* Generic getter for properties belonging to this instance
* <b>outside</b> the subclasses
* like name, visible etc.
*
* @param string $field property's name
* @return mixed
* @throws portfolio_export_exception
*/
public function get($field) {
if (property_exists($this, $field)) {
return $this->{$field};
@ -200,11 +185,15 @@ abstract class portfolio_caller_base {
}
/**
* generic setter for properties belonging to this instance
* <b>outside</b> the subclass
* like name, visible, etc.
*
*/
* Generic setter for properties belonging to this instance
* <b>outside</b> the subclass
* like name, visible, etc.
*
* @param string $field property's name
* @param mixed $value property's value
* @return bool
* @throws moodle_exception
*/
public final function set($field, &$value) {
if (property_exists($this, $field)) {
$this->{$field} =& $value;
@ -216,12 +205,12 @@ abstract class portfolio_caller_base {
}
/**
* stores the config generated at export time.
* subclasses can retrieve values using
* {@link get_export_config}
*
* @param array $config formdata
*/
* Stores the config generated at export time.
* Subclasses can retrieve values using
* {@see get_export_config}
*
* @param array $config formdata
*/
public final function set_export_config($config) {
$allowed = array_merge(
array('wait', 'hidewait', 'format', 'hideformat'),
@ -237,11 +226,12 @@ abstract class portfolio_caller_base {
}
/**
* returns a particular export config value.
* subclasses shouldn't need to override this
*
* @param string key the config item to fetch
*/
* Returns a particular export config value.
* Subclasses shouldn't need to override this
*
* @param string $key the config item to fetch
* @return null|mixed of export configuration
*/
public final function get_export_config($key) {
$allowed = array_merge(
array('wait', 'hidewait', 'format', 'hideformat'),
@ -258,47 +248,47 @@ abstract class portfolio_caller_base {
}
/**
* Similar to the other allowed_config functions
* if you need export config, you must provide
* a list of what the fields are.
*
* even if you want to store stuff during export
* without displaying a form to the user,
* you can use this.
*
* @return array array of allowed keys
*/
* Similar to the other allowed_config functions
* if you need export config, you must provide
* a list of what the fields are.
* Even if you want to store stuff during export
* without displaying a form to the user,
* you can use this.
*
* @return array array of allowed keys
*/
public function get_allowed_export_config() {
return array();
}
/**
* after the user submits their config
* they're given a confirm screen
* summarising what they've chosen.
*
* this function should return a table of nice strings => values
* of what they've chosen
* to be displayed in a table.
*
* @return array array of config items.
*/
* After the user submits their config,
* they're given a confirm screen
* summarising what they've chosen.
* This function should return a table of nice strings => values
* of what they've chosen
* to be displayed in a table.
*
* @return bool
*/
public function get_export_summary() {
return false;
}
/**
* called before the portfolio plugin gets control
* this function should copy all the files it wants to
* the temporary directory, using {@see copy_existing_file}
* or {@see write_new_file}
*/
* Called before the portfolio plugin gets control.
* This function should copy all the files it wants to
* the temporary directory, using {@see copy_existing_file}
* or {@see write_new_file}
*/
public abstract function prepare_package();
/**
* helper function to copy files into the temp area
* for single or multi file exports.
*/
* Helper function to copy files into the temp area
* for single or multi file exports.
*
* @return stored_file|bool
*/
public function prepare_package_file() {
if (empty($this->singlefile) && empty($this->multifiles)) {
throw new portfolio_caller_exception('invalidpreparepackagefile', 'portfolio', $this->get_return_url());
@ -312,15 +302,10 @@ abstract class portfolio_caller_base {
}
/**
* array of formats this caller supports
* the intersection of what this function returns
* and what the selected portfolio plugin supports
* will be used
* use the constants PORTFOLIO_FORMAT_*
*
* @return array list of formats
*
*/
* Array of formats this caller supports.
*
* @return array list of formats
*/
public final function supported_formats() {
$basic = $this->base_supported_formats();
if (empty($this->supportedformats)) {
@ -334,45 +319,51 @@ abstract class portfolio_caller_base {
return portfolio_most_specific_formats($specific, $basic);
}
/**
* Base supported formats
*
* @throws coding_exception
*/
public static function base_supported_formats() {
throw new coding_exception('base_supported_formats() method needs to be overridden in each subclass of portfolio_caller_base');
}
/**
* this is the "return to where you were" url
*
* @return string url
*/
* This is the "return to where you were" url
*/
public abstract function get_return_url();
/**
* callback to do whatever capability checks required
* in the caller (called during the export process
*/
* Callback to do whatever capability checks required
* in the caller (called during the export process
*/
public abstract function check_permissions();
/**
* nice name to display to the user about this caller location
*/
* Clean name to display to the user about this caller location
*/
public static function display_name() {
throw new coding_exception('display_name() method needs to be overridden in each subclass of portfolio_caller_base');
}
/**
* return a string to put at the header summarising this export
* by default, just the display name (usually just 'assignment' or something unhelpful
*
* @return string
*/
* Return a string to put at the header summarising this export.
* By default, it just display the name (usually just 'assignment' or something unhelpful
*
* @return string
*/
public function heading_summary() {
return get_string('exportingcontentfrom', 'portfolio', $this->display_name());
}
/**
* Load data
*/
public abstract function load_data();
/**
* set up the required files for this export.
* this supports either passing files directly
* Set up the required files for this export.
* This supports either passing files directly
* or passing area arguments directly through
* to the files api using file_storage::get_area_files
*
@ -381,12 +372,7 @@ abstract class portfolio_caller_base {
* - single stored_file object
* - array of file ids or stored_file objects
* - null
* @param int $contextid (optional), passed to {@link see file_storage::get_area_files}
* @param string $component (optional), passed to {@link see file_storage::get_area_files}
* @param string $filearea (optional), passed to {@link see file_storage::get_area_files}
* @param int $itemid (optional), passed to {@link see file_storage::get_area_files}
* @param string $sort (optional), passed to {@link see file_storage::get_area_files}
* @param bool $includedirs (optional), passed to {@link see file_storage::get_area_files}
* @return void
*/
public function set_file_and_format_data($ids=null /* ..pass arguments to area files here. */) {
$args = func_get_args();
@ -426,10 +412,12 @@ abstract class portfolio_caller_base {
}
/**
* the button-location always knows best
* The button-location always knows best
* what the formats are... so it should be trusted.
*
* @todo MDL-31298 - re-analyze set_formats_from_button comment
* @param array $formats array of PORTFOLIO_FORMAT_XX
* @return void
*/
public function set_formats_from_button($formats) {
$base = $this->base_supported_formats();
@ -445,12 +433,11 @@ abstract class portfolio_caller_base {
}
/**
* adds a new format to the list of supported formats.
* handles removing conflicting and less specific
* Adds a new format to the list of supported formats.
* This functions also handles removing conflicting and less specific
* formats at the same time.
*
* @param string $format one of PORTFOLIO_FORMAT_XX
*
* @return void
*/
protected function add_format($format) {
@ -460,6 +447,11 @@ abstract class portfolio_caller_base {
$this->supportedformats = portfolio_most_specific_formats(array($format), $this->supportedformats);
}
/**
* Gets mimetype
*
* @return string
*/
public function get_mimetype() {
if ($this->singlefile instanceof stored_file) {
return $this->singlefile->get_mimetype();
@ -469,15 +461,13 @@ abstract class portfolio_caller_base {
}
/**
* array of arguments the caller expects to be passed through to it
* this must be keyed on the argument name, and the array value is a boolean,
* Array of arguments the caller expects to be passed through to it.
* This must be keyed on the argument name, and the array value is a boolean,
* whether it is required, or just optional
* eg array(
* id => true,
* somethingelse => false,
* somethingelse => false
* )
*
* @return array
*/
public static function expected_callbackargs() {
throw new coding_exception('expected_callbackargs() method needs to be overridden in each subclass of portfolio_caller_base');
@ -485,66 +475,68 @@ abstract class portfolio_caller_base {
/**
* return the context for this export. used for $PAGE->set_context
* Return the context for this export. used for $PAGE->set_context
*
* @return stdclass
* @param moodle_page $PAGE global page object
*/
public abstract function set_context($PAGE);
}
/**
* base class for module callers
* this just implements a few of the abstract functions
* from portfolio_caller_base so that caller authors
* don't need to.
*
* See http://docs.moodle.org/dev/Adding_a_Portfolio_Button_to_a_page
* {@see also portfolio_caller_base}
*/
* Base class for module callers.
* This just implements a few of the abstract functions
* from portfolio_caller_base so that caller authors
* don't need to.
* {@link http://docs.moodle.org/dev/Adding_a_Portfolio_Button_to_a_page}
* {@see also portfolio_caller_base}
*
* @package core_portfolio
* @category portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
abstract class portfolio_module_caller_base extends portfolio_caller_base {
/**
* coursemodule object
* set this in the constructor like
* $this->cm = get_coursemodule_from_instance('forum', $this->forum->id);
*/
/** @var object coursemodule object. set this in the constructor like $this->cm = get_coursemodule_from_instance('forum', $this->forum->id); */
protected $cm;
/**
*
* int cmid
*/
/** @var int cmid */
protected $id;
/**
* stdclass course object
*/
/** @var stdclass course object */
protected $course;
/**
* navigation passed to print_header
* override this to do something more specific than the module view page
*/
* Navigation passed to print_header.
* Override this to do something more specific than the module view page
*
* @return array
*/
public function get_navigation() {
$extranav = array('name' => $this->cm->name, 'link' => $this->get_return_url());
return array($extranav, $this->cm);
}
/**
* the url to return to after export or on cancel
* defaults to the module 'view' page
* override this if it's deeper inside the module
*/
* The url to return to after export or on cancel.
* Defaults value is set to the module 'view' page.
* Override this if it's deeper inside the module.
*
* @return string
*/
public function get_return_url() {
global $CFG;
return $CFG->wwwroot . '/mod/' . $this->cm->modname . '/view.php?id=' . $this->cm->id;
}
/**
* override the parent get function
* to make sure when we're asked for a course
* we retrieve the object from the database as needed
*/
* Override the parent get function
* to make sure when we're asked for a course,
* We retrieve the object from the database as needed.
*
* @param string $key the name of get function
* @return stdClass
*/
public function get($key) {
if ($key != 'course') {
return parent::get($key);
@ -557,16 +549,20 @@ abstract class portfolio_module_caller_base extends portfolio_caller_base {
}
/**
* return a string to put at the header summarising this export
* by default, just the display name and the module instance name
* override this to do something more specific
*/
* Return a string to put at the header summarising this export.
* by default, this function just display the name and module instance name.
* Override this to do something more specific
*
* @return string
*/
public function heading_summary() {
return get_string('exportingcontentfrom', 'portfolio', $this->display_name() . ': ' . $this->cm->name);
}
/**
* overridden to return the course module context
* Overridden to return the course module context
*
* @param moodle_page $PAGE global PAGE
*/
public function set_context($PAGE) {
$PAGE->set_cm($this->cm);

View File

@ -1,222 +1,202 @@
<?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/>.
/**
* Moodle - Modular Object-Oriented Dynamic Learning Environment
* http://moodle.org
* Copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com
*
* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*
* @package core
* @subpackage portfolio
* @author Penny Leach <penny@catalyst.net.nz>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL
* @copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com
*
* This file contains all the defined constants to do with portfolios.
*
* @package core_portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>, Martin Dougiamas
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
// ************************************************** //
// EXPORT STAGE CONSTANTS
// ************************************************** //
//EXPORT STAGE CONSTANTS
/**
* display a form to the user
* this one might not be used if neither
* the plugin, or the caller has any config.
*/
* PORTFOLIO_STAGE_CONFIG - display a form to the user this one might not be
* used if neither the plugin, or the caller has any config.
*/
define('PORTFOLIO_STAGE_CONFIG', 1);
/**
* summarise the form and ask for confirmation
* if we skipped PORTFOLIO_STAGE_CONFIG,
* just confirm the send.
*/
* PORTFOLIO_STAGE_CONFIRM - summarise the form and ask for confirmation
* if we skipped PORTFOLIO_STAGE_CONFIG,
* just confirm the send.
*/
define('PORTFOLIO_STAGE_CONFIRM', 2);
/**
* either queue the event and skip to PORTFOLIO_STAGE_FINISHED
* or continue to PORTFOLIO_STAGE_PACKAGE
*/
* PORTFOLIO_STAGE_QUEUEORWAIT - either queue the event and skip to PORTFOLIO_STAGE_FINISHED
*/
define('PORTFOLIO_STAGE_QUEUEORWAIT', 3);
/**
* package up the various bits
* during this stage both the caller
* and the plugin get their package methods called
*/
* PORTFOLIO_STAGE_PACKAGE - package up the various bits during this stage both the caller
* and the plugin get their package methods called
*/
define('PORTFOLIO_STAGE_PACKAGE', 4);
/*
* the portfolio plugin must send the file
*/
/**
* PORTFOLIO_STAGE_SEND - the portfolio plugin must send the file
*/
define('PORTFOLIO_STAGE_SEND', 5);
/**
* cleanup the temporary area
*/
* PORTFOLIO_STAGE_CLEANUP - cleanup the temporary area
*/
define('PORTFOLIO_STAGE_CLEANUP', 6);
/**
* display the "finished notification"
*/
* PORTFOLIO_STAGE_FINISHED - display the "finished notification"
*/
define('PORTFOLIO_STAGE_FINISHED', 7);
// ************************************************** //
// EXPORT FORMAT CONSTANTS
// these should always correspond to a string
// in the portfolio module, called format_{$value}
// ************************************************** //
// These should always correspond to a string in the portfolio module, called format_{$value}
/**
* file - the most basic fallback format.
* this should always be supported
* in remote system.s
*/
* PORTFOLIO_FORMAT_FILE - the most basic fallback format. this should always be supported
* in remote system.s
*/
define('PORTFOLIO_FORMAT_FILE', 'file');
/**
* moodle backup - the plugin needs to be able to write a complete backup
* the caller need to be able to export the particular XML bits to insert
* into moodle.xml (?and the file bits if necessary)
*/
* PORTFOLIO_FORMAT_MBKP - the plugin needs to be able to write a complete backup
* the caller need to be able to export the particular XML bits to insert
* into moodle.xml (?and the file bits if necessary)
*/
define('PORTFOLIO_FORMAT_MBKP', 'mbkp');
/**
* richhtml - like html but with attachments.
*/
* PORTFOLIO_FORMAT_RICHHTML - like html but with attachments.
*/
define('PORTFOLIO_FORMAT_RICHHTML', 'richhtml');
/**
* plainhtml - a single html representation - no attachments
*/
* PORTFOLIO_FORMAT_PLAINHTML - a single html representation - no attachments
*/
define('PORTFOLIO_FORMAT_PLAINHTML', 'plainhtml');
/**
* image - subtype of file
*/
* PORTFOLIO_FORMAT_IMAGE - subtype of file
*/
define('PORTFOLIO_FORMAT_IMAGE', 'image');
/**
* video - subtype of file
*/
* PORTFOLIO_FORMAT_VIDEO - subtype of file
*/
define('PORTFOLIO_FORMAT_VIDEO', 'video');
/**
* text - subtype of file
*/
* PORTFOLIO_FORMAT_TEXT - subtype of file
*/
define('PORTFOLIO_FORMAT_TEXT', 'text');
/**
* pdf - subtype of file
*/
* PORTFOLIO_FORMAT_PDF - subtype of file
*/
define('PORTFOLIO_FORMAT_PDF', 'pdf');
/**
* document - subtype of file
*/
* PORTFOLIO_FORMAT_DOCUMENT - subtype of file
*/
define('PORTFOLIO_FORMAT_DOCUMENT', 'document');
/**
* document - subtype of file
*/
* PORTFOLIO_FORMAT_SPREADSHEET - subtype of file
*/
define('PORTFOLIO_FORMAT_SPREADSHEET', 'spreadsheet');
/**
* document - subtype of file
*/
* PORTFOLIO_FORMAT_PRESENTATION - subtype of file
*/
define('PORTFOLIO_FORMAT_PRESENTATION', 'presentation');
/**
* abstract - just used to say, "we support all these"
* PORTFOLIO_FORMAT_RICH - just used to say, "we support all these"
*/
define('PORTFOLIO_FORMAT_RICH', 'rich');
/**
* leap2a http://wiki.cetis.ac.uk/LEAP_2.0
* supported by mahara and and others
* PORTFOLIO_FORMAT_LEAP2A - supported by mahara and and others {http://wiki.cetis.ac.uk/LEAP_2.0}
*/
define('PORTFOLIO_FORMAT_LEAP2A', 'leap2a');
// ************************************************** //
// EXPORT TIME LEVELS
// these should correspond to a string
// in the portfolio module, called time_{$value}
// ************************************************** //
// EXPORT TIME LEVELS
// These should correspond to a string in the portfolio module, called time_{$value}
/**
* no delay. don't even offer the user the option
* of not waiting for the transfer
*/
* PORTFOLIO_TIME_LOW - no delay. don't even offer the user the option
* of not waiting for the transfer
*/
define('PORTFOLIO_TIME_LOW', 'low');
/**
* a small delay. user can still easily opt to
* watch this transfer and wait.
*/
* PORTFOLIO_TIME_MODERATE - a small delay. user can still easily opt to
* watch this transfer and wait.
*/
define('PORTFOLIO_TIME_MODERATE', 'moderate');
/**
* slow. the user really should not be given the option
* to choose this.
*/
* PORTFOLIO_TIME_HIGH - slow. the user really should not be given the option
* to choose this.
*/
define('PORTFOLIO_TIME_HIGH', 'high');
/**
* very slow, or immediate transfers not supported
*/
* PORTFOLIO_TIME_FORCEQUEUE - very slow, or immediate transfers not supported
*/
define('PORTFOLIO_TIME_FORCEQUEUE', 'queue');
// ************************************************** //
// BUTTON FORMATS
// available ways to add the portfolio export to a page
// ************************************************** //
// BUTTON FORMATS
// Available ways to add the portfolio export to a page
/**
* a whole form, containing a drop down menu (where necessary)
* and a submit button
*/
* PORTFOLIO_ADD_FULL_FORM - a whole form, containing a drop down menu (where necessary)
* and a submit button
*/
define('PORTFOLIO_ADD_FULL_FORM', 1);
/**
* a whole form, containing a drop down menu (where necessary)
* but has an icon instead of a button to submit
*/
* PORTFOLIO_ADD_ICON_FORM - a whole form, containing a drop down menu (where necessary)
* but has an icon instead of a button to submit
*/
define('PORTFOLIO_ADD_ICON_FORM', 2);
/**
* just an icon with a link around it (yuk, as will result in a long url
* only use where necessary)
*/
* PORTFOLIO_ADD_ICON_LINK - just an icon with a link around it (yuk, as will result in a long url
* only use where necessary)
*/
define('PORTFOLIO_ADD_ICON_LINK', 3);
/**
* just some text with a link around it (yuk, as will result in a long url
* only use where necessary)
*/
* PORTFOLIO_ADD_TEXT_LINK - just some text with a link around it (yuk, as will result in a long url
* only use where necessary)
*/
define('PORTFOLIO_ADD_TEXT_LINK', 4);
/**
* hacky way to turn the button class into a url to redirect to
* this replaces the old portfolio_fake_add_url function
* PORTFOLIO_ADD_FAKE_URL - hacky way to turn the button class into a url to redirect to
* this replaces the old portfolio_fake_add_url function
*/
define('PORTFOLIO_ADD_FAKE_URL', 5);

View File

@ -1,52 +1,59 @@
<?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/>.
/**
* Moodle - Modular Object-Oriented Dynamic Learning Environment
* http://moodle.org
* Copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com
*
* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*
* @package core
* @subpackage portfolio
* @author Penny Leach <penny@catalyst.net.nz>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL
* @copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com
*
* This file contains all the portfolio exception classes.
*
* @package core_portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>, Martin Dougiamas
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* top level portfolio exception.
* sometimes caught and rethrown as {@see portfolio_export_exception}
*/
* Top level portfolio exception.
* Sometimes caught and re-thrown as {@see portfolio_export_exception}
*
* @package core_portfolio
* @category portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_exception extends moodle_exception {}
/**
* exception to throw during an export - will clean up session and tempdata
*/
* Exception to throw during an export - will clean up session and tempdata
*
* @package core_portfolio
* @category portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_export_exception extends portfolio_exception {
/**
* constructor.
* @param object $exporter instance of portfolio_exporter (will handle null case)
* @param string $errorcode language string key
* @param string $module language string module (optional, defaults to moodle)
* @param string $continue url to continue to (optional, defaults to wwwroot)
* @param mixed $a language string data (optional, defaults to null)
*/
* Constructor.
*
* @param portfolio_exporter $exporter instance of portfolio_exporter (will handle null case)
* @param string $errorcode language string key
* @param string $module language string module (optional, defaults to moodle)
* @param string $continue url to continue to (optional, defaults to wwwroot)
* @param object $a language string data (optional, defaults to null)
*/
public function __construct($exporter, $errorcode, $module=null, $continue=null, $a=null) {
global $CFG;
// This static variable is necessary because sometimes the code below
@ -82,23 +89,43 @@ class portfolio_export_exception extends portfolio_exception {
}
/**
* exception for callers to throw when they have a problem.
* usually caught and rethrown as {@see portfolio_export_exception}
*/
* Exception for callers to throw when they have a problem.
* Usually caught and rethrown as {@see portfolio_export_exception}
*
* @package core_portfolio
* @category portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_caller_exception extends portfolio_exception {}
/**
* exception for portfolio plugins to throw when they have a problem.
* usually caught and rethrown as {@see portfolio_export_exception}
*/
* Exception for portfolio plugins to throw when they have a problem.
* Usually caught and rethrown as {@see portfolio_export_exception}
*
* @package core_portfolio
* @category portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_plugin_exception extends portfolio_exception {}
/**
* exception for interacting with the button class
*/
* Exception for interacting with the button class
*
* @package core_portfolio
* @category portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_button_exception extends portfolio_exception {}
/**
* leap2a exception - for invalid api calls
* Leap2a exception - for invalid api calls
*
* @package core_portfolio
* @category portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_format_leap2a_exception extends portfolio_exception {}

View File

@ -1,137 +1,121 @@
<?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/>.
/**
* Moodle - Modular Object-Oriented Dynamic Learning Environment
* http://moodle.org
* Copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com
*
* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*
* @package core
* @subpackage portfolio
* @author Penny Leach <penny@catalyst.net.nz>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL
* @copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com
*
* This file contains the class definition for the exporter object.
*
* @package core_portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>
* Martin Dougiamas <http://dougiamas.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* The class that handles the various stages of the actual export
* and the communication between the caller and the portfolio plugin.
* this is stored in the database between page requests in serialized base64 encoded form
* also contains helper methods for the plugin and caller to use (at the end of the file)
* {@see get_base_filearea} - where to write files to
* {@see write_new_file} - write some content to a file in the export filearea
* {@see copy_existing_file} - copy an existing file into the export filearea
* {@see get_tempfiles} - return list of all files in the export filearea
*/
* The class that handles the various stages of the actual export
* and the communication between the caller and the portfolio plugin.
* this is stored in the database between page requests in serialized base64 encoded form
* also contains helper methods for the plugin and caller to use (at the end of the file)
* {@see get_base_filearea} - where to write files to
* {@see write_new_file} - write some content to a file in the export filearea
* {@see copy_existing_file} - copy an existing file into the export filearea
* {@see get_tempfiles} - return list of all files in the export filearea
*
* @package core_portfolio
* @category portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>
* Martin Dougiamas <http://dougiamas.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_exporter {
/**
* the caller object used during the export
*/
/** @var portfolio_caller_base the caller object used during the export */
private $caller;
/** the portfolio plugin instanced used during the export
*/
/** @var portfolio_plugin_base the portfolio plugin instanced used during the export */
private $instance;
/**
* if there has been no config form displayed to the user
*/
/** @var bool if there has been no config form displayed to the user */
private $noexportconfig;
/**
* the user currently exporting content
* always $USER, but more conveniently placed here
*/
* @var stdClass the user currently exporting content always $USER,
* but more conveniently placed here
*/
private $user;
/** the file to include that contains the class defintion
* of the portfolio instance plugin
* used to re-waken the object after sleep
*/
/**
* @var string the file to include that contains the class defintion of
* the portfolio instance plugin used to re-waken the object after sleep
*/
public $instancefile;
/**
* the file to include that contains the class definition
* of the caller object
* used to re-waken the object after sleep
*/
* @var string the file to include that contains the class definition of
* the caller object used to re-waken the object after sleep
*/
public $callerfile;
/**
* the current stage of the export
*/
/** @var int the current stage of the export */
private $stage;
/**
* whether something (usually the portfolio plugin)
* has forced queuing
*/
/** @var bool whether something (usually the portfolio plugin) has forced queuing */
private $forcequeue;
/**
* id of this export
* matches record in portfolio_tempdata table
* and used for itemid for file storage.
*/
* @var int id of this export matches record in portfolio_tempdata table
* and used for itemid for file storage.
*/
private $id;
/**
* array of stages that have had the portfolio plugin already steal control from them
*/
/** @var array of stages that have had the portfolio plugin already steal control from them */
private $alreadystolen;
/**
* files that the exporter has written to this temp area
* keep track of this in case of duplicates within one export
* see MDL-16390
*/
* @var stored_file files that the exporter has written to this temp area keep track of
* this in case of duplicates within one export see MDL-16390
*/
private $newfilehashes;
/**
* selected exportformat
* this is also set in export_config in the portfolio and caller classes
*/
* @var string selected exportformat this is also set in
* export_config in the portfolio and caller classes
*/
private $format;
/**
* queued - this is set after the event is triggered
*/
/** @var bool queued - this is set after the event is triggered */
private $queued = false;
/**
* expiry time - set the first time the object is saved out
*/
/** @var int expiry time - set the first time the object is saved out */
private $expirytime;
/**
* deleted - this is set during the cleanup routine
* so that subsequent save() calls can detect it
* @var bool deleted - this is set during the cleanup routine so
* that subsequent save() calls can detect it
*/
private $deleted = false;
/**
* construct a new exporter for use
*
* @param portfolio_plugin_base subclass $instance portfolio instance (passed by reference)
* @param portfolio_caller_base subclass $caller portfolio caller (passed by reference)
* @param string $callerfile path to callerfile (relative to dataroot)
*/
* Construct a new exporter for use
*
* @param portfolio_plugin_base $instance portfolio instance (passed by reference)
* @param portfolio_caller_base $caller portfolio caller (passed by reference)
* @param string $callerfile path to callerfile (relative to dataroot)
*/
public function __construct(&$instance, &$caller, $callerfile) {
$this->instance =& $instance;
$this->caller =& $caller;
@ -146,11 +130,13 @@ class portfolio_exporter {
$this->newfilehashes = array();
}
/*
* generic getter for properties belonging to this instance
* <b>outside</b> the subclasses
* like name, visible etc.
*/
/**
* Generic getter for properties belonging to this instance
* <b>outside</b> the subclasses like name, visible etc.
*
* @param string $field property's name
* @return portfolio_format|mixed
*/
public function get($field) {
if ($field == 'format') {
return portfolio_format_object($this->format);
@ -165,10 +151,14 @@ class portfolio_exporter {
}
/**
* generic setter for properties belonging to this instance
* <b>outside</b> the subclass
* like name, visible, etc.
*/
* Generic setter for properties belonging to this instance
* <b>outside</b> the subclass like name, visible, etc.
*
* @param string $field property's name
* @param mixed $value property's value
* @return bool
* @throws portfolio_export_exception
*/
public function set($field, &$value) {
if (property_exists($this, $field)) {
$this->{$field} =& $value;
@ -185,23 +175,22 @@ class portfolio_exporter {
}
/**
* sets this export to force queued
* sometimes plugins need to set this randomly
* if an external system changes its mind
* about what's supported
*/
* Sets this export to force queued.
* Sometimes plugins need to set this randomly
* if an external system changes its mind
* about what's supported
*/
public function set_forcequeue() {
$this->forcequeue = true;
}
/**
* process the given stage calling whatever functions are necessary
*
* @param int $stage (see PORTFOLIO_STAGE_* constants)
* @param boolean $alreadystolen used to avoid letting plugins steal control twice.
*
* @return boolean whether or not to process the next stage. this is important as the function is called recursively.
*/
* Process the given stage calling whatever functions are necessary
*
* @param int $stage (see PORTFOLIO_STAGE_* constants)
* @param bool $alreadystolen used to avoid letting plugins steal control twice.
* @return bool whether or not to process the next stage. this is important as the function is called recursively.
*/
public function process_stage($stage, $alreadystolen=false) {
$this->set('stage', $stage);
if ($alreadystolen) {
@ -259,28 +248,28 @@ class portfolio_exporter {
}
/**
* helper function to return the portfolio instance
*
* @return portfolio_plugin_base subclass
*/
* Helper function to return the portfolio instance
*
* @return portfolio_plugin_base subclass
*/
public function instance() {
return $this->instance;
}
/**
* helper function to return the caller object
*
* @return portfolio_caller_base subclass
*/
* Helper function to return the caller object
*
* @return portfolio_caller_base subclass
*/
public function caller() {
return $this->caller;
}
/**
* processes the 'config' stage of the export
*
* @return boolean whether or not to process the next stage. this is important as the control function is called recursively.
*/
* Processes the 'config' stage of the export
*
* @return bool whether or not to process the next stage. this is important as the control function is called recursively.
*/
public function process_stage_config() {
global $OUTPUT, $CFG;
$pluginobj = $callerobj = null;
@ -368,10 +357,10 @@ class portfolio_exporter {
}
/**
* processes the 'confirm' stage of the export
*
* @return boolean whether or not to process the next stage. this is important as the control function is called recursively.
*/
* Processes the 'confirm' stage of the export
*
* @return bool whether or not to process the next stage. this is important as the control function is called recursively.
*/
public function process_stage_confirm() {
global $CFG, $DB, $OUTPUT;
@ -433,10 +422,10 @@ class portfolio_exporter {
}
/**
* processes the 'queueornext' stage of the export
*
* @return boolean whether or not to process the next stage. this is important as the control function is called recursively.
*/
* Processes the 'queueornext' stage of the export
*
* @return bool whether or not to process the next stage. this is important as the control function is called recursively.
*/
public function process_stage_queueorwait() {
$wait = $this->instance->get_export_config('wait');
if (empty($wait)) {
@ -448,10 +437,11 @@ class portfolio_exporter {
}
/**
* processes the 'package' stage of the export
*
* @return boolean whether or not to process the next stage. this is important as the control function is called recursively.
*/
* Processes the 'package' stage of the export
*
* @return bool whether or not to process the next stage. this is important as the control function is called recursively.
* @throws portfolio_export_exception
*/
public function process_stage_package() {
// now we've agreed on a format,
// the caller is given control to package it up however it wants
@ -477,12 +467,12 @@ class portfolio_exporter {
}
/**
* processes the 'cleanup' stage of the export
*
* @param boolean $pullok normally cleanup is deferred for pull plugins until after the file is requested from portfolio/file.php
* if you want to clean up earlier, pass true here (defaults to false)
* @return boolean whether or not to process the next stage. this is important as the control function is called recursively.
*/
* Processes the 'cleanup' stage of the export
*
* @param bool $pullok normally cleanup is deferred for pull plugins until after the file is requested from portfolio/file.php
* if you want to clean up earlier, pass true here (defaults to false)
* @return bool whether or not to process the next stage. this is important as the control function is called recursively.
*/
public function process_stage_cleanup($pullok=false) {
global $CFG, $DB;
@ -501,10 +491,10 @@ class portfolio_exporter {
}
/**
* processes the 'send' stage of the export
*
* @return boolean whether or not to process the next stage. this is important as the control function is called recursively.
*/
* Processes the 'send' stage of the export
*
* @return bool whether or not to process the next stage. this is important as the control function is called recursively.
*/
public function process_stage_send() {
// send the file
try {
@ -523,10 +513,11 @@ class portfolio_exporter {
}
/**
* log the transfer
* this should only be called after the file has been sent
* either via push, or sent from a pull request.
*/
* Log the transfer
*
* this should only be called after the file has been sent
* either via push, or sent from a pull request.
*/
public function log_transfer() {
global $DB;
$l = array(
@ -544,8 +535,10 @@ class portfolio_exporter {
}
/**
* in some cases (mahara) we need to update this after the log has been done
* In some cases (mahara) we need to update this after the log has been done
* because of MDL-20872
*
* @param string $url link to be recorded to portfolio log
*/
public function update_log_url($url) {
global $DB;
@ -553,10 +546,11 @@ class portfolio_exporter {
}
/**
* processes the 'finish' stage of the export
*
* @return boolean whether or not to process the next stage. this is important as the control function is called recursively.
*/
* Processes the 'finish' stage of the export
*
* @param bool $queued let the process to be queued
* @return bool whether or not to process the next stage. this is important as the control function is called recursively.
*/
public function process_stage_finished($queued=false) {
global $OUTPUT;
$returnurl = $this->caller->get_return_url();
@ -578,10 +572,12 @@ class portfolio_exporter {
/**
* local print header function to be reused across the export
*
* @param string $headerstring full language string
*/
* Local print header function to be reused across the export
*
* @param string $headingstr full language string
* @param bool $summary (optional) to print summary, default is set to true
* @return void
*/
public function print_header($headingstr, $summary=true) {
global $OUTPUT, $PAGE;
$titlestr = get_string('exporting', 'portfolio');
@ -609,9 +605,13 @@ class portfolio_exporter {
}
/**
* cancels a potfolio request and cleans up the tempdata
* and redirects the user back to where they started
*/
* Cancels a potfolio request and cleans up the tempdata
* and redirects the user back to where they started
*
* @param bool $logreturn options to return to porfolio log or caller return page
* @return void
* @uses exit
*/
public function cancel_request($logreturn=false) {
global $CFG;
if (!isset($this)) {
@ -626,8 +626,10 @@ class portfolio_exporter {
}
/**
* writes out the contents of this object and all its data to the portfolio_tempdata table and sets the 'id' field.
*/
* Writes out the contents of this object and all its data to the portfolio_tempdata table and sets the 'id' field.
*
* @return void
*/
public function save() {
global $DB;
if (empty($this->id)) {
@ -654,13 +656,12 @@ class portfolio_exporter {
}
/**
* rewakens the data from the database given the id
* makes sure to load the required files with the class definitions
*
* @param int $id id of data
*
* @return portfolio_exporter
*/
* Rewakens the data from the database given the id.
* Makes sure to load the required files with the class definitions
*
* @param int $id id of data
* @return portfolio_exporter
*/
public static function rewaken_object($id) {
global $DB, $CFG;
require_once($CFG->libdir . '/filelib.php');
@ -692,12 +693,13 @@ class portfolio_exporter {
}
/**
* helper function to create the beginnings of a file_record object
* to create a new file in the portfolio_temporary working directory
* use {@see write_new_file} or {@see copy_existing_file} externally
*
* @param string $name filename of new record
*/
* Helper function to create the beginnings of a file_record object
* to create a new file in the portfolio_temporary working directory.
* Use {@see write_new_file} or {@see copy_existing_file} externally
*
* @param string $name filename of new record
* @return object
*/
private function new_file_record_base($name) {
return (object)array_merge($this->get_base_filearea(), array(
'filepath' => '/',
@ -706,15 +708,12 @@ class portfolio_exporter {
}
/**
* verifies a rewoken object
*
* checks to make sure it belongs to the same user and session as is currently in use.
*
* @param boolean $readonly if we're reawakening this for a user to just display in the log view, don't verify the sessionkey
* when continuing transfers, you must pass false here.
*
* @throws portfolio_exception
*/
* Verifies a rewoken object.
* Checks to make sure it belongs to the same user and session as is currently in use.
*
* @param bool $readonly if we're reawakening this for a user to just display in the log view, don't verify the sessionkey
* @throws portfolio_exception
*/
public function verify_rewaken($readonly=false) {
global $USER, $CFG;
if ($this->get('user')->id != $USER->id) { // make sure it belongs to the right user
@ -735,13 +734,13 @@ class portfolio_exporter {
}
}
/**
* copies a file from somewhere else in moodle
* to the portfolio temporary working directory
* associated with this export
*
* @param $oldfile stored_file object
* @return stored_file new file object
*/
* Copies a file from somewhere else in moodle
* to the portfolio temporary working directory
* associated with this export
*
* @param stored_file $oldfile existing stored file object
* @return stored_file|bool new file object
*/
public function copy_existing_file($oldfile) {
if (array_key_exists($oldfile->get_contenthash(), $this->newfilehashes)) {
return $this->newfilehashes[$oldfile->get_contenthash()];
@ -761,15 +760,15 @@ class portfolio_exporter {
}
/**
* writes out some content to a file in the
* portfolio temporary working directory
* associated with this export
*
* @param string $content content to write
* @param string $name filename to use
* @param bool $maifest whether this is the main file or an secondary file (eg attachment)
* @return stored_file new file object
*/
* Writes out some content to a file
* in the portfolio temporary working directory
* associated with this export.
*
* @param string $content content to write
* @param string $name filename to use
* @param bool $manifest whether this is the main file or an secondary file (eg attachment)
* @return stored_file
*/
public function write_new_file($content, $name, $manifest=true) {
$fs = get_file_storage();
$file_record = $this->new_file_record_base($name);
@ -780,13 +779,12 @@ class portfolio_exporter {
}
/**
* zips all files in the temporary directory
*
* @param string $filename name of resulting zipfile (optional, defaults to portfolio-export.zip
* @param string $filepath subpath in the filearea (optional, defaults to final)
*
* @return stored_file resulting stored_file object
*/
* Zips all files in the temporary directory
*
* @param string $filename name of resulting zipfile (optional, defaults to portfolio-export.zip)
* @param string $filepath subpath in the filearea (optional, defaults to final)
* @return stored_file|bool resulting stored_file object, or false
*/
public function zip_tempfiles($filename='portfolio-export.zip', $filepath='/final/') {
$zipper = new zip_packer();
@ -799,12 +797,13 @@ class portfolio_exporter {
}
/**
* returns an arary of files in the temporary working directory
* for this export
* always use this instead of the files api directly
*
* @return array of stored_file objects keyed by name
*/
* Returns an arary of files in the temporary working directory
* for this export.
* Always use this instead of the files api directly
*
* @param string $skipfile name of the file to be skipped
* @return array of stored_file objects keyed by name
*/
public function get_tempfiles($skipfile='portfolio-export.zip') {
$fs = get_file_storage();
$files = $fs->get_area_files(SYSCONTEXTID, 'portfolio', 'exporter', $this->id, '', false);
@ -822,14 +821,14 @@ class portfolio_exporter {
}
/**
* returns the context, filearea, and itemid
* parts of a filearea (not filepath) to be used by
* plugins if they want to do things like zip up the contents of
* the temp area to here, or something that can't be done just using
* write_new_file, copy_existing_file or get_tempfiles
*
* @return array contextid, filearea, itemid are the keys.
*/
* Returns the context, filearea, and itemid.
* Parts of a filearea (not filepath) to be used by
* plugins if they want to do things like zip up the contents of
* the temp area to here, or something that can't be done just using
* write_new_file, copy_existing_file or get_tempfiles
*
* @return array contextid, filearea, itemid are the keys.
*/
public function get_base_filearea() {
return array(
'contextid' => SYSCONTEXTID,
@ -839,11 +838,13 @@ class portfolio_exporter {
);
}
/** wrapper function to print a friendly error to users
*
* this is generally caused by them hitting an expired transfer
* through the usage of the backbutton
*/
/**
* Wrapper function to print a friendly error to users
* This is generally caused by them hitting an expired transfer
* through the usage of the backbutton
*
* @uses exit
*/
public static function print_expired_export() {
global $CFG, $OUTPUT, $PAGE;
$title = get_string('exportexpired', 'portfolio');
@ -857,6 +858,13 @@ class portfolio_exporter {
exit;
}
/**
* Wrapper function to print a friendly error to users
*
* @param stdClass $log portfolio_log object
* @param portfolio_plugin_base $instance portfolio instance
* @uses exit
*/
public static function print_cleaned_export($log, $instance=null) {
global $CFG, $OUTPUT, $PAGE;
if (empty($instance) || !$instance instanceof portfolio_plugin_base) {
@ -874,6 +882,13 @@ class portfolio_exporter {
exit;
}
/**
* Wrapper function to print continue and/or return link
*
* @param string $returnurl link to previos page
* @param string $continueurl continue to next page
* @param array $extras (optional) other links to be display.
*/
public static function print_finish_info($returnurl, $continueurl, $extras=null) {
if ($returnurl) {
echo '<a href="' . $returnurl . '">' . get_string('returntowhereyouwere', 'portfolio') . '</a><br />';

View File

@ -1,75 +1,90 @@
<?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/>.
/**
* Moodle - Modular Object-Oriented Dynamic Learning Environment
* http://moodle.org
* Copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com
*
* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*
* @package core
* @subpackage portfolio
* @author Penny Leach <penny@catalyst.net.nz>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL
* @copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com
*
* This file contains all the class definitions of the export formats.
* They are implemented in php classes rather than just a simpler hash
* Because it provides an easy way to do subtyping using php inheritance.
*
* @package core_portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>,
* Martin Dougiamas <http://dougiamas.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* base class to inherit from
* do not use this anywhere in supported_formats
* Base class to inherit from.
* Do not use this anywhere in supported_formats
*
* @package core_portfolio
* @category portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>,
* Martin Dougiamas <http://dougiamas.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*
*/
abstract class portfolio_format {
/**
* array of mimetypes this format supports
* Array of mimetypes this format supports
*
* @throws coding_exception
*/
public static function mimetypes() {
throw new coding_exception('mimetypes() method needs to be overridden in each subclass of portfolio_format');
}
/**
* for multipart formats, eg html with attachments,
* we need to have a directory to place associated files in
* inside the zip file. this is the name of that directory
* For multipart formats, eg html with attachments,
* we need to have a directory to place associated files from
* inside the zip file. This is the name of that directory
*
* @throws coding_exception
*/
public static function get_file_directory() {
throw new coding_exception('get_file_directory() method needs to be overridden in each subclass of portfolio_format');
}
/**
* given a file, return a snippet of markup in whatever format
* Given a file, return a snippet of markup in whatever format
* to link to that file.
* usually involves the path given by {@link get_file_directory}
* this is not supported in subclasses of portfolio_format_file
* Usually involves the path given by {@see get_file_directory}.
* This is not supported in subclasses of portfolio_format_file
* since they're all just single files.
*
* @param stored_file $file
* @param array $options array of options to pass. can contain:
* @param stored_file $file file information object
* @param array $options array of options to pass. can contain:
* attributes => hash of existing html attributes (eg title, height, width, etc)
* and whatever the sub class adds into this list
*
* @return string some html or xml or whatever
* @throws coding_exception
*/
public static function file_output($file, $options=null) {
throw new coding_exception('file_output() method needs to be overridden in each subclass of portfolio_format');
}
/**
* Create portfolio tag
*
* @param stored_file $file file information object
* @param string $path file path
* @param array $attributes portfolio attributes
* @return string
*/
public static function make_tag($file, $path, $attributes) {
$srcattr = 'href';
$tag = 'a';
@ -97,23 +112,21 @@ abstract class portfolio_format {
}
/**
* whether this format conflicts with the given format
* this is used for the case where an export location
* Whether this format conflicts with the given format.
* This is used for the case where an export location
* "generally" supports something like FORMAT_PLAINHTML
* but then in a specific export case, must add attachments
* which means that FORMAT_RICHHTML is supported in that case
* but then in a specific export case, must add attachments,
* which means that FORMAT_RICHHTML is supported in that case,
* which implies removing support for FORMAT_PLAINHTML.
* Note that conflicts don't have to be bi-directional
* (eg FORMAT_PLAINHTML conflicts with FORMAT_RICHHTML
* but not the other way around) and things within the class hierarchy
* are resolved automatically anyway.
*
* This is really just between subclasses of format_rich
* and subclasses of format_file.
*
* @param string $format one of the FORMAT_XX constants
*
* @return boolean
* @return bool
*/
public static function conflicts($format) {
return false;
@ -121,34 +134,86 @@ abstract class portfolio_format {
}
/**
* the most basic type - pretty much everything is a subtype
*/
* The most basic type - pretty much everything is a subtype
*
* @package core_portfolio
* @category portfolio
* @copyright 2009 Penny Leach <penny@catalyst.net.nz>, Martin Dougiamas
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_format_file extends portfolio_format {
/**
* Array of mimetypes this format supports
*
* @return array
*/
public static function mimetypes() {
return array();
}
/**
* For multipart formats, eg html with attachments,
* we need to have a directory to place associated files from
* inside the zip file. This is the name of that directory
*
* @return bool
*/
public static function get_file_directory() {
return false;
}
/**
* Given a file, return a snippet of markup in whatever format
* to link to that file.
* Usually involves the path given by {@see get_file_directory}.
* This is not supported in subclasses of portfolio_format_file
* since they're all just single files.
*
* @param stored_file $file informations object
* @param array $options array of options to pass. can contain:
* attributes => hash of existing html attributes (eg title, height, width, etc)
*/
public static function file_output($file, $options=null) {
throw new portfolio_exception('fileoutputnotsupported', 'portfolio');
}
}
/**
* image format, subtype of file.
*/
* Image format, subtype of file.
*
* @package core_portfolio
* @category portfolio
* @copyright 2009 Penny Leach
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_format_image extends portfolio_format_file {
/**
* return all mimetypes that use image.gif (eg all images)
* Return all mimetypes that use image.gif (eg all images)
*
* @return string
*/
public static function mimetypes() {
return mimeinfo_from_icon('type', 'image', true);
}
/**
* Whether this format conflicts with the given format.
* This is used for the case where an export location
* "generally" supports something like FORMAT_PLAINHTML
* but then in a specific export case, must add attachments,
* which means that FORMAT_RICHHTML is supported in that case,
* which implies removing support for FORMAT_PLAINHTML.
* Note that conflicts don't have to be bi-directional
* (eg FORMAT_PLAINHTML conflicts with FORMAT_RICHHTML
* but not the other way around) and things within the class hierarchy
* are resolved automatically anyway.
* This is really just between subclasses of format_rich
* and subclasses of format_file.
*
* @param string $format one of the FORMAT_XX constants
* @return bool
*/
public static function conflicts($format) {
return ($format == PORTFOLIO_FORMAT_RICHHTML
|| $format == PORTFOLIO_FORMAT_PLAINHTML);
@ -156,16 +221,42 @@ class portfolio_format_image extends portfolio_format_file {
}
/**
* html format - could be used for an external cms or something
*
* in case we want to be really specific.
*/
* HTML format
* Could be used for an external cms or something in case we want to be really specific.
*
* @package core_portfolio
* @category portfolio
* @copyright 2008 Penny Leach
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_format_plainhtml extends portfolio_format_file {
/**
* Return html mimetype
*
* @return array
*/
public static function mimetypes() {
return array('text/html');
}
/**
* Whether this format conflicts with the given format.
* This is used for the case where an export location
* "generally" supports something like FORMAT_PLAINHTML
* but then in a specific export case, must add attachments,
* which means that FORMAT_RICHHTML is supported in that case,
* which implies removing support for FORMAT_PLAINHTML.
* Note that conflicts don't have to be bi-directional
* (eg FORMAT_PLAINHTML conflicts with FORMAT_RICHHTML
* but not the other way around) and things within the class hierarchy
* are resolved automatically anyway.
* This is really just between subclasses of format_rich
* and subclasses of format_file.
*
* @param string $format one of the FORMAT_XX constants
* @return bool
*/
public static function conflicts($format) {
return ($format == PORTFOLIO_FORMAT_RICHHTML
|| $format == PORTFOLIO_FORMAT_FILE);
@ -173,11 +264,21 @@ class portfolio_format_plainhtml extends portfolio_format_file {
}
/**
* video format, subtype of file.
*
* for portfolio plugins that support videos specifically
*/
* Video format
* For portfolio plugins that support videos specifically
*
* @package core_portfolio
* @category portfolio
* @copyright 2008 Penny Leach
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_format_video extends portfolio_format_file {
/**
* Return video mimetypes
*
* @return array
*/
public static function mimetypes() {
return array_merge(
mimeinfo_from_icon('type', 'video', true),
@ -187,14 +288,43 @@ class portfolio_format_video extends portfolio_format_file {
}
/**
* class for plain text format.. not sure why we would need this yet
* but since resource module wants to export it... we can
*/
* Class for plain text format.
* Not sure why we would need this yet,
* but since resource module wants to export it... we can
*
* @package core_portfolio
* @category portfolio
* @copyright 2008 Penny Leach
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_format_text extends portfolio_format_file {
/**
* Return plain text mimetypes
*
* @return array
*/
public static function mimetypes() {
return array('text/plain');
}
/**
* Whether this format conflicts with the given format.
* This is used for the case where an export location
* "generally" supports something like FORMAT_PLAINHTML
* but then in a specific export case, must add attachments,
* which means that FORMAT_RICHHTML is supported in that case,
* which implies removing support for FORMAT_PLAINHTML.
* Note that conflicts don't have to be bi-directional
* (eg FORMAT_PLAINHTML conflicts with FORMAT_RICHHTML
* but not the other way around) and things within the class hierarchy
* are resolved automatically anyway.
* This is really just between subclasses of format_rich
* and subclasses of format_file.
*
* @param string $format one of the FORMAT_XX constants
* @return bool
*/
public static function conflicts($format ) {
return ($format == PORTFOLIO_FORMAT_PLAINHTML
|| $format == PORTFOLIO_FORMAT_RICHHTML);
@ -202,11 +332,21 @@ class portfolio_format_text extends portfolio_format_file {
}
/**
* base class for rich formats.
* these are multipart - eg things with attachments
* Base class for rich formats.
* These are multipart - eg things with attachments
*
* @package core_portfolio
* @category portfolio
* @copyright 2009 Penny Leach
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
abstract class portfolio_format_rich extends portfolio_format {
/**
* Return rich text mimetypes
*
* @return array
*/
public static function mimetypes() {
return array();
}
@ -214,13 +354,40 @@ abstract class portfolio_format_rich extends portfolio_format {
}
/**
* most commonly used rich format - richhtml - html with attachments
* Richhtml - html with attachments.
* The most commonly used rich format
* eg inline images
*
* @package core_portfolio
* @category portfolio
* @copyright 2009 Penny Leach
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_format_richhtml extends portfolio_format_rich {
/**
* For multipart formats, eg html with attachments,
* we need to have a directory to place associated files from
* inside the zip file. this is the name of that directory
*
* @return string
*/
public static function get_file_directory() {
return 'site_files/';
}
/**
* Given a file, return a snippet of markup in whatever format
* to link to that file.
* Usually involves the path given by {@see get_file_directory}.
* This is not supported in subclasses of portfolio_format_file
* since they're all just single files.
*
* @param stored_file $file information for existing file
* @param array $options array of options to pass. can contain:
* attributes => hash of existing html attributes (eg title, height, width, etc)
* @return string
*/
public static function file_output($file, $options=null) {
$path = self::get_file_directory() . $file->get_filename();
$attributes = array();
@ -229,28 +396,68 @@ class portfolio_format_richhtml extends portfolio_format_rich {
}
return self::make_tag($file, $path, $attributes);
}
/**
* Whether this format conflicts with the given format.
* This is used for the case where an export location
* "generally" supports something like FORMAT_PLAINHTML
* but then in a specific export case, must add attachments,
* which means that FORMAT_RICHHTML is supported in that case,
* which implies removing support for FORMAT_PLAINHTML.
* Note that conflicts don't have to be bi-directional
* (eg FORMAT_PLAINHTML conflicts with FORMAT_RICHHTML
* but not the other way around) and things within the class hierarchy
* are resolved automatically anyway.
* This is really just between subclasses of format_rich
* and subclasses of format_file.
*
* @todo MDL-31305 - revisit the conflict with file, since we zip here
* @param string $format one of the FORMAT_XX constants
* @return bool
*/
public static function conflicts($format) { // TODO revisit the conflict with file, since we zip here
return ($format == PORTFOLIO_FORMAT_PLAINHTML || $format == PORTFOLIO_FORMAT_FILE);
}
}
/**
* Class used for leap2a format
*
* @package core_portfolio
* @category portfolio
* @copyright 2009 Penny Leach
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_format_leap2a extends portfolio_format_rich {
/**
* For multipart formats, eg html with attachments,
* we need to have a directory to place associated files from
* inside the zip file. this is the name of that directory
*
* @return string
*/
public static function get_file_directory() {
return 'files/';
}
/**
* Return the file prefix
*
* @return string
*/
public static function file_id_prefix() {
return 'storedfile';
}
/**
* return the link to a file
* Return the link to a file
*
* @param stored_file $file
* @param array $options can contain the same as normal, with the addition of:
* entry => whether the file is a LEAP2A entry or just a bundled file (default true)
* @param stored_file $file information for existing file
* @param array $options array of options to pass. can contain:
* attributes => hash of existing html attributes (eg title, height, width, etc)
* @return string
*/
public static function file_output($file, $options=null) {
$id = '';
@ -273,6 +480,12 @@ class portfolio_format_leap2a extends portfolio_format_rich {
return self::make_tag($file, $path, $attributes);
}
/**
* Generate portfolio_format_leap2a
*
* @param stdclass $user user information object
* @return portfolio_format_leap2a_writer
*/
public static function leap2a_writer(stdclass $user=null) {
global $CFG;
if (empty($user)) {
@ -283,35 +496,58 @@ class portfolio_format_leap2a extends portfolio_format_rich {
return new portfolio_format_leap2a_writer($user);
}
/**
* Return the manifest name
*
* @return string
*/
public static function manifest_name() {
return 'leap2a.xml';
}
}
/**
* later.... a moodle plugin might support this.
* it's commented out in portfolio_supported_formats so cannot currently be used.
*/
// later.... a moodle plugin might support this.
// it's commented out in portfolio_supported_formats so cannot currently be used.
//class portfolio_format_mbkp extends portfolio_format_rich {}
/**
* 'PDF format', subtype of file.
*
* for portfolio plugins that support PDFs specifically
*/
* 'PDF format', subtype of file.
* For portfolio plugins that support PDFs specifically.
*
* @package core_portfolio
* @category portfolio
* @copyright 2009 Dan Poltawski
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_format_pdf extends portfolio_format_file {
/**
* Return pdf mimetypes
*
* @return array
*/
public static function mimetypes() {
return array('application/pdf');
}
}
/**
* 'Document format', subtype of file.
*
* for portfolio plugins that support documents specifically
*/
* 'Document format', subtype of file.
* For portfolio plugins that support documents specifically.
*
* @package core_portfolio
* @category portfolio
* @copyright 2009 Dan Poltawski
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_format_document extends portfolio_format_file {
/**
* Return documents mimetypes
*
* @return array of documents mimetypes
*/
public static function mimetypes() {
return array_merge(
array('text/plain', 'text/rtf'),
@ -323,11 +559,21 @@ class portfolio_format_document extends portfolio_format_file {
}
/**
* 'Spreadsheet format', subtype of file.
*
* for portfolio plugins that support spreadsheets specifically
*/
* 'Spreadsheet format', subtype of file.
* For portfolio plugins that support spreadsheets specifically.
*
* @package core_portfolio
* @category portfolio
* @copyright 2009 Dan Poltawski
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_format_spreadsheet extends portfolio_format_file {
/**
* Return spreadsheet spreadsheet mimetypes
*
* @return array of documents mimetypes
*/
public static function mimetypes() {
return array_merge(
mimeinfo_from_icon('type', 'excel', true),
@ -338,11 +584,21 @@ class portfolio_format_spreadsheet extends portfolio_format_file {
}
/**
* 'Presentation format', subtype of file.
*
* for portfolio plugins that support presentation specifically
*/
* 'Presentation format', subtype of file.
* For portfolio plugins that support presentation specifically.
*
* @package core_portfolio
* @category portfolio
* @copyright 2009 Dan Poltawski
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_format_presentation extends portfolio_format_file {
/**
* Return presentation documents mimetypes
*
* @return array presentation document mimetypes
*/
public static function mimetypes() {
return mimeinfo_from_icon('type', 'powerpoint', true);
}

View File

@ -1,37 +1,33 @@
<?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/>.
/**
* Moodle - Modular Object-Oriented Dynamic Learning Environment
* http://moodle.org
* Copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com
*
* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*
* @package core
* @subpackage portfolio
* @author Penny Leach <penny@liip.ch>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL
* @copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com
*
* This file contains the LEAP2a writer used by portfolio_format_leap2a
*
* @package core_portfolio
* @copyright 2009 Penny Leach (penny@liip.ch), Martin Dougiamas
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*
*/
defined('MOODLE_INTERNAL') || die();
/**
* object to encapsulate the writing of leap2a.
* should be used like:
*
* Object to encapsulate the writing of leap2a.
* Should be used like:
* $writer = portfolio_format_leap2a::leap2a_writer($USER);
* $entry = new portfolio_format_leap2a_entry('forumpost6', $title, 'leap2', 'somecontent')
* $entry->add_link('something', 'has_part')->add_link('somethingelse', 'has_part');
@ -39,26 +35,34 @@ defined('MOODLE_INTERNAL') || die();
* $writer->add_entry($entry);
* $xmlstr = $writer->to_xml();
*
* @TODO find a way to ensure that all referenced files are included
* @todo MDL-31287 - find a way to ensure that all referenced files are included
* @package core_portfolio
* @category portfolio
* @copyright 2009 Penny Leach
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_format_leap2a_writer {
/** the domdocument object used to create elements */
/** @var DomDocument the domdocument object used to create elements */
private $dom;
/** the top level feed element */
/** @var DOMElement the top level feed element */
private $feed;
/** the user exporting data */
/** @var stdClass the user exporting data */
private $user;
/** the id of the feed - this is unique to the user and date and used for portfolio ns as well as feed id */
/** @var string the id of the feed - this is unique to the user and date and used for portfolio ns as well as feed id */
private $id;
/** the entries for the feed - keyed on id */
/** @var array the entries for the feed - keyed on id */
private $entries = array();
/**
* constructor - usually generated from portfolio_format_leap2a::leap2a_writer($USER);
* Constructor - usually generated from portfolio_format_leap2a::leap2a_writer($USER);
*
* @todo MDL-31302 - add exporter and format
* @param stdclass $user the user exporting (almost always $USER)
*
*/
public function __construct(stdclass $user) { // todo something else - exporter, format, etc
global $CFG;
@ -98,9 +102,10 @@ class portfolio_format_leap2a_writer {
}
/**
* adds a entry to the feed ready to be exported
* Adds a entry to the feed ready to be exported
*
* @param portfolio_format_leap2a_entry $entry the entry to add
* @param portfolio_format_leap2a_entry $entry new feed entry to add
* @return portfolio_format_leap2a_entry
*/
public function add_entry(portfolio_format_leap2a_entry $entry) {
if (array_key_exists($entry->id, $this->entries)) {
@ -113,11 +118,11 @@ class portfolio_format_leap2a_writer {
}
/**
* make an entry that has previously been added into the feed into a selection.
* Select an entry that has previously been added into the feed
*
* @param mixed $selectionentry the entry to make a selection (id or entry object)
* @param portfolio_format_leap2a_entry|string $selectionentry the entry to make a selection (id or entry object)
* @param array $ids array of ids this selection includes
* @param string $selectiontype http://wiki.cetis.ac.uk/2009-03/LEAP2A_categories/selection_type
* @param string $selectiontype for selection type, see: http://wiki.cetis.ac.uk/2009-03/LEAP2A_categories/selection_type
*/
public function make_selection($selectionentry, $ids, $selectiontype) {
$selectionid = null;
@ -144,9 +149,9 @@ class portfolio_format_leap2a_writer {
}
/**
* helper function to link some stored_files into the feed and link them to a particular entry
* Helper function to link some stored_files into the feed and link them to a particular entry
*
* @param portfolio_format_leap2a_entry $entry the entry to link the files into
* @param portfolio_format_leap2a_entry $entry feed object
* @param array $files array of stored_files to link
*/
public function link_files($entry, $files) {
@ -159,7 +164,7 @@ class portfolio_format_leap2a_writer {
}
/**
* validate the feed and all entries
* Validate the feed and all entries
*/
private function validate() {
foreach ($this->entries as $entry) {
@ -183,10 +188,10 @@ class portfolio_format_leap2a_writer {
}
/**
* return the entire feed as a string
* calls validate() first on everything
* Return the entire feed as a string.
* Then, it calls for validation
*
* @return string
* @return string feeds' content in xml
*/
public function to_xml() {
$this->validate();
@ -199,45 +204,57 @@ class portfolio_format_leap2a_writer {
}
/**
* this class represents a single leap2a entry.
* you can create these directly and then add them to the main leap feed object
* This class represents a single leap2a entry.
* You can create these directly and then add them to the main leap feed object
*
* @package core_portfolio
* @category portfolio
* @copyright 2009 Penny Leach
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_format_leap2a_entry {
/** entry id - something like forumpost6, must be unique to the feed **/
/** @var string entry id - something like forumpost6, must be unique to the feed */
public $id;
/** title of the entry **/
/** @var string title of the entry */
public $title;
/** leap2a entry type **/
/** @var string leap2a entry type */
public $type;
/** optional author (only if different to feed author) **/
/** @var string optional author (only if different to feed author) */
public $author;
/** summary - for split long content **/
/** @var string summary - for split long content */
public $summary;
/** main content of the entry. can be html,text,or xhtml. for a stored_file, use portfolio_format_leap2a_file **/
/** @var mixed main content of the entry. can be html,text,or xhtml. for a stored_file, use portfolio_format_leap2a_file **/
public $content;
/** updated date - unix timestamp */
/** @var int updated date - unix timestamp */
public $updated;
/** published date (ctime) - unix timestamp */
/** @var int published date (ctime) - unix timestamp */
public $published;
/** the required fields for a leap2a entry */
/** @var array the required fields for a leap2a entry */
private $requiredfields = array( 'id', 'title', 'type');
/** extra fields which usually should be set (except author) but are not required */
/** @var array extra fields which usually should be set (except author) but are not required */
private $optionalfields = array('author', 'updated', 'published', 'content', 'summary');
/** links from this entry to other entries */
/** @var array links from this entry to other entries */
public $links = array();
/** attachments to this entry */
/** @var array attachments to this entry */
public $attachments = array();
/** categories for this entry */
/** @var array categories for this entry */
private $categories = array();
/**
* constructor. All arguments are required (and will be validated)
* Constructor. All arguments are required (and will be validated)
* http://wiki.cetis.ac.uk/2009-03/LEAP2A_types
*
* @param string $id unique id of this entry.
@ -256,8 +273,12 @@ class portfolio_format_leap2a_entry {
}
/**
* override __set to do proper dispatching for different things
* only allows the optional and required leap2a entry fields to be set
* Override __set to do proper dispatching for different things.
* Only allows the optional and required leap2a entry fields to be set
*
* @param string $field property's name
* @param mixed $value property's value
* @return mixed
*/
public function __set($field, $value) {
// detect the case where content is being set to be a file directly
@ -272,9 +293,11 @@ class portfolio_format_leap2a_entry {
/**
* validate this entry.
* at the moment this just makes sure required fields exist
* Validate this entry.
* At the moment this just makes sure required fields exist
* but it could also check things against a list, for example
*
* @todo MDL-31303 - add category with a scheme 'selection_type'
*/
public function validate() {
foreach ($this->requiredfields as $key) {
@ -291,17 +314,17 @@ class portfolio_format_leap2a_entry {
}
/**
* add a link from this entry to another one
* these will be collated at the end of the export (during to_xml)
* Add a link from this entry to another one.
* These will be collated at the end of the export (during to_xml)
* and validated at that point. This function does no validation
* http://wiki.cetis.ac.uk/2009-03/LEAP2A_relationships
* {@link http://wiki.cetis.ac.uk/2009-03/LEAP2A_relationships}
*
* @param mixed $otherentry portfolio_format_leap2a_entry or its id
* @param portfolio_format_leap2a_entry|string $otherentry portfolio_format_leap2a_entry or its id
* @param string $reltype (no leap2: ns required)
*
* @return the current entry object. This is so that these calls can be chained
* eg $entry->add_link('something6', 'has_part')->add_link('something7', 'has_part');
*
* @param string $displayorder (optional)
* @return portfolio_format_leap2a_entry the current entry object. This is so that these calls can be chained
* eg $entry->add_link('something6', 'has_part')->add_link('something7',
* 'has_part');
*/
public function add_link($otherentry, $reltype, $displayorder=null) {
if ($otherentry instanceof portfolio_format_leap2a_entry) {
@ -321,15 +344,14 @@ class portfolio_format_leap2a_entry {
}
/**
* add a category to this entry
* http://wiki.cetis.ac.uk/2009-03/LEAP2A_categories
* Add a category to this entry
* {@link http://wiki.cetis.ac.uk/2009-03/LEAP2A_categories}
* "tags" should just pass a term here and no scheme or label.
* They will be automatically normalised if they have spaces.
*
* @param string $term eg 'Offline'
* @param string $scheme (optional) eg resource_type
* @param string $label (optional) eg File
*
* "tags" should just pass a term here and no scheme or label.
* they will be automatically normalised if they have spaces.
*/
public function add_category($term, $scheme=null, $label=null) {
// "normalise" terms and set their label if they have spaces
@ -351,8 +373,8 @@ class portfolio_format_leap2a_entry {
* This is handled by the main writer object.
*
* @param DomDocument $dom use this to create elements
*
* @return DomElement
* @param stdClass $feedauthor object of author(user) info
* @return DOMDocument
*/
public function to_dom(DomDocument $dom, $feedauthor) {
$entry = $dom->createElement('entry');
@ -413,16 +435,16 @@ class portfolio_format_leap2a_entry {
}
/**
* try to load whatever is in $content into xhtml and add it to the dom.
* failing that, load the html, escape it, and set it as the body of the tag
* either way it sets the type attribute of the top level element
* moodle should always provide xhtml content, but user-defined content can't be trusted
* Try to load whatever is in $content into xhtml and add it to the dom.
* Failing that, load the html, escape it, and set it as the body of the tag.
* Either way it sets the type attribute of the top level element.
* Moodle should always provide xhtml content, but user-defined content can't be trusted
*
* @todo MDL-31304 - convert <html><body> </body></html> to xml
* @param DomDocument $dom the dom doc to use
* @param string $tagname usually 'content' or 'summary'
* @param string $content the content to use, either xhtml or html.
*
* @return DomElement
* @return DomDocument
*/
private function create_xhtmlish_element(DomDocument $dom, $tagname, $content) {
$topel = $dom->createElement($tagname);
@ -455,22 +477,29 @@ class portfolio_format_leap2a_entry {
}
/**
* hook function for subclasses to add extra links (like for files)
* Hook function for subclasses to add extra links (like for files)
*/
protected function add_extra_links() {}
}
/**
* subclass of entry, purely for dealing with files
* Subclass of entry, purely for dealing with files
*
* @package core_portfolio
* @category portfolio
* @copyright 2009 Penny Leach
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_format_leap2a_file extends portfolio_format_leap2a_entry {
/** @var file_stored for the dealing file */
protected $referencedfile;
/**
* overridden constructor to set up the file.
* Overridden constructor to set up the file.
*
* @param string $title title of the entry
* @param stored_file $file file storage instance
*/
public function __construct($title, stored_file $file) {
$id = portfolio_format_leap2a::file_id_prefix() . $file->get_id();
@ -482,7 +511,10 @@ class portfolio_format_leap2a_file extends portfolio_format_leap2a_entry {
}
/**
* implement the hook to add extra links to attach the file in an enclosure
* Implement the hook to add extra links to attach the file in an enclosure
*
* @param DomDocument $dom feed object
* @param DomDocument $entry feed added link
*/
protected function add_extra_links($dom, $entry) {
$link = $dom->createElement('link');

View File

@ -1,29 +1,26 @@
<?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/>.
/**
* Moodle - Modular Object-Oriented Dynamic Learning Environment
* http://moodle.org
* Copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com
*
* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*
* @package core
* @subpackage portfolio
* @author Penny Leach <penny@catalyst.net.nz>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL
* @copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com
*
* This file contains all the form definitions used by the portfolio code.
*
* @package core_portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>,
* Martin Dougiamas (http://dougiamas.com)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
@ -32,17 +29,24 @@ defined('MOODLE_INTERNAL') || die();
require_once ($CFG->libdir.'/formslib.php');
/**
* During-export config form.
*
* This is the form that is actually used while exporting.
* Plugins and callers don't get to define their own class
* as we have to handle form elements from both places
* See the docs here for more information:
* http://docs.moodle.org/dev/Writing_a_Portfolio_Plugin#has_export_config
* http://docs.moodle.org/dev/Adding_a_Portfolio_Button_to_a_page#has_export_config
*/
* During-export config form.
* This is the form that is actually used while exporting.
* Plugins and callers don't get to define their own class
* as we have to handle form elements from both places
* See the docs here for more information:
* http://docs.moodle.org/dev/Writing_a_Portfolio_Plugin#has_export_config
* http://docs.moodle.org/dev/Adding_a_Portfolio_Button_to_a_page#has_export_config
*
* @package core_portfolio
* @category portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
final class portfolio_export_form extends moodleform {
/**
* prepare form
*/
public function definition() {
$mform =& $this->_form;
@ -96,6 +100,12 @@ final class portfolio_export_form extends moodleform {
$this->add_action_buttons(true, get_string('next'));
}
/**
* Validate portfolio export form
*
* @param stdClass $data portfolio information from form data
* @return array
*/
public function validation($data) {
$errors = array();
@ -117,20 +127,36 @@ final class portfolio_export_form extends moodleform {
}
/**
* Admin config form
*
* This form is extendable by plugins who want the admin to be able to configure more than just the name of the instance.
* This is NOT done by subclassing this class, see the docs for portfolio_plugin_base for more information:
* http://docs.moodle.org/dev/Writing_a_Portfolio_Plugin#has_admin_config
*/
* Admin config form.
* This form is extendable by plugins who want the admin to be able to configure more than just the name of the instance.
* This is NOT done by subclassing this class, see the docs for portfolio_plugin_base for more information:
* {@link http://docs.moodle.org/dev/Writing_a_Portfolio_Plugin#has_admin_config}
*
* @package core_portfolio
* @category portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
final class portfolio_admin_form extends moodleform {
/** @var object to hold porfolio instance configuration */
protected $instance;
/** @var string plugin name*/
protected $plugin;
/** @var string portfolio plugin name*/
protected $portfolio;
/** @var string plugin availability*/
protected $action;
/** @var int portfolio plugin visibility*/
protected $visible;
/**
* prepare form
*/
public function definition() {
global $CFG;
$this->plugin = $this->_customdata['plugin'];
@ -194,6 +220,12 @@ final class portfolio_admin_form extends moodleform {
$this->add_action_buttons(true, get_string('save', 'portfolio'));
}
/**
* Validate admin config form
*
* @param stdObject $data form data
* @return array
*/
public function validation($data) {
global $DB;
@ -217,18 +249,28 @@ final class portfolio_admin_form extends moodleform {
}
/**
* User config form.
*
* This is the form for letting the user configure an instance of a plugin.
* In order to extend this, you don't subclass this in the plugin..
* see the docs in portfolio_plugin_base for more information:
* http://docs.moodle.org/dev/Writing_a_Portfolio_Plugin#has_user_config
*/
* User config form.
* This is the form for letting the user configure an instance of a plugin.
* In order to extend this, you don't subclass this in the plugin..
* see the docs in portfolio_plugin_base for more information:
* {@link http://docs.moodle.org/dev/Writing_a_Portfolio_Plugin#has_user_config}
*
* @package core_portfolio
* @category portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
final class portfolio_user_form extends moodleform {
/** @var object user porfolio instance */
protected $instance;
/** @var int hold user id */
protected $userid;
/**
* prepare form
*/
public function definition() {
$this->instance = $this->_customdata['instance'];
$this->userid = $this->_customdata['userid'];
@ -246,6 +288,11 @@ final class portfolio_user_form extends moodleform {
$this->add_action_buttons(true, get_string('save', 'portfolio'));
}
/**
* User user config form.
*
* @param stdClass $data form data
*/
public function validation($data) {
$errors = $this->instance->user_config_validation($data);
@ -255,15 +302,23 @@ final class portfolio_user_form extends moodleform {
/**
* Form that just contains the dropdown menu of available instances
*
* This is not used by portfolio_add_button, but on the first step of the export
* if the plugin instance has not yet been selected.
*/
* Form that just contains the dropdown menu of available instances.
* This is not used by portfolio_add_button, but on the first step of the export,
* if the plugin instance has not yet been selected.
*
* @package core_portfolio
* @category portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class portfolio_instance_select extends moodleform {
/** @var portfolio_caller_base plugin instance */
private $caller;
/**
* The required basic elements to the form.
*/
function definition() {
$this->caller = $this->_customdata['caller'];
$options = $this->_customdata['options'];

File diff suppressed because it is too large Load Diff

View File

@ -16,17 +16,18 @@
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* This file contains all global functions to do with manipulating portfolios
* everything else that is logically namespaced by class is in its own file
* This file contains all global functions to do with manipulating portfolios.
*
* Everything else that is logically namespaced by class is in its own file
* in lib/portfolio/ directory.
*
* Major Contributors
* - Penny Leach <penny@catalyst.net.nz>
*
* @package core
* @subpackage portfolio
* @package core_portfolio
* @category portfolio
* @copyright 1999 onwards Martin Dougiamas {@link http://moodle.com}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
@ -52,54 +53,63 @@ require_once($CFG->libdir . '/portfolio/caller.php');
/**
* use this to add a portfolio button or icon or form to a page
*
* Use this to add a portfolio button or icon or form to a page.
* These class methods do not check permissions. the caller must check permissions first.
* Later, during the export process, the caller class is instantiated and the check_permissions method is called
* If you are exporting a single file, you should always call set_format_by_file($file)
*
* This class can be used like this:
* <code>
* $button = new portfolio_add_button();
* $button->set_callback_options('name_of_caller_class', array('id' => 6), '/your/mod/lib.php');
* $button->render(PORTFOLIO_ADD_FULL_FORM, get_string('addeverythingtoportfolio', 'yourmodule'));
* </code>
*
* or like this:
* <code>
* $button = new portfolio_add_button(array('callbackclass' => 'name_of_caller_class', 'callbackargs' => array('id' => 6), 'callbackfile' => '/your/mod/lib.php'));
* $somehtml .= $button->to_html(PORTFOLIO_ADD_TEXT_LINK);
* </code>
*{@link http://docs.moodle.org/dev/Adding_a_Portfolio_Button_to_a_page} for more information
*
* See {@link http://docs.moodle.org/dev/Adding_a_Portfolio_Button_to_a_page} for more information
*
* @package moodlecore
* @subpackage portfolio
* @package core_portfolio
* @category portfolio
* @copyright 1999 onwards Martin Dougiamas {@link http://moodle.com}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
*/
class portfolio_add_button {
/** @var string the name of the callback functions */
private $callbackclass;
/** @var array can be an array of arguments to pass back to the callback functions (passed by reference)*/
private $callbackargs;
/** @var string caller file */
private $callbackfile;
/** @var array array of more specific formats (eg based on mime detection) */
private $formats;
/** @var array array of portfolio instances */
private $instances;
private $file; // for single-file exports
private $intendedmimetype; // for writing specific types of files
/** @var stored_file for single-file exports */
private $file;
/** @var string for writing specific types of files*/
private $intendedmimetype;
/**
* constructor. either pass the options here or set them using the helper methods.
* generally the code will be clearer if you use the helper methods.
*
* @param array $options keyed array of options:
* key 'callbackclass': name of the caller class (eg forum_portfolio_caller')
* key 'callbackargs': the array of callback arguments your caller class wants passed to it in the constructor
* key 'callbackfile': the file containing the class definition of your caller class.
* See set_callback_options for more information on these three.
* key 'formats': an array of PORTFOLIO_FORMATS this caller will support
* See set_formats or set_format_by_file for more information on this.
*/
* Constructor. Either pass the options here or set them using the helper methods.
* Generally the code will be clearer if you use the helper methods.
*
* @param array $options keyed array of options:
* key 'callbackclass': name of the caller class (eg forum_portfolio_caller')
* key 'callbackargs': the array of callback arguments your caller class wants passed to it in the constructor
* key 'callbackfile': the file containing the class definition of your caller class.
* See set_callback_options for more information on these three.
* key 'formats': an array of PORTFOLIO_FORMATS this caller will support
* See set_formats or set_format_by_file for more information on this.
*/
public function __construct($options=null) {
global $SESSION, $CFG;
@ -120,19 +130,21 @@ class portfolio_add_button {
}
}
/*
* @param string $class name of the class containing the callback functions
* activity modules should ALWAYS use their name_portfolio_caller
* other locations must use something unique
* @param mixed $argarray this can be an array or hash of arguments to pass
* back to the callback functions (passed by reference)
* these MUST be primatives to be added as hidden form fields.
* and the values get cleaned to PARAM_ALPHAEXT or PARAM_NUMBER or PARAM_PATH
* @param string $file this can be autodetected if it's in the same file as your caller,
* but often, the caller is a script.php and the class in a lib.php
* so you can pass it here if necessary.
* this path should be relative (ie, not include) dirroot, eg '/mod/forum/lib.php'
*/
/**
* Function to set the callback options
*
* @param string $class Name of the class containing the callback functions
* activity modules should ALWAYS use their name_portfolio_caller
* other locations must use something unique
* @param array $argarray This can be an array or hash of arguments to pass
* back to the callback functions (passed by reference)
* these MUST be primatives to be added as hidden form fields.
* and the values get cleaned to PARAM_ALPHAEXT or PARAM_NUMBER or PARAM_PATH
* @param string $file This can be autodetected if it's in the same file as your caller,
* but often, the caller is a script.php and the class in a lib.php
* so you can pass it here if necessary.
* This path should be relative (ie, not include) dirroot, eg '/mod/forum/lib.php'
*/
public function set_callback_options($class, array $argarray, $file=null) {
global $CFG;
if (empty($file)) {
@ -161,19 +173,19 @@ class portfolio_add_button {
$this->callbackargs = $argarray;
}
/*
* sets the available export formats for this content
* this function will also poll the static function in the caller class
* and make sure we're not overriding a format that has nothing to do with mimetypes
* eg if you pass IMAGE here but the caller can export LEAP2A it will keep LEAP2A as well.
* see portfolio_most_specific_formats for more information
*
* @param array $formats if the calling code knows better than the static method on the calling class (base_supported_formats)
* eg, if it's going to be a single file, or if you know it's HTML, you can pass it here instead
* this is almost always the case so you should always use this.
* {@see portfolio_format_from_mimetype} for how to get the appropriate formats to pass here for uploaded files.
* or just call set_format_by_file instead
*/
/**
* Sets the available export formats for this content.
* This function will also poll the static function in the caller class
* and make sure we're not overriding a format that has nothing to do with mimetypes.
* Eg: if you pass IMAGE here but the caller can export LEAP2A it will keep LEAP2A as well.
* {@see portfolio_most_specific_formats for more information}
*
* @param array $formats if the calling code knows better than the static method on the calling class (base_supported_formats).
* Eg: if it's going to be a single file, or if you know it's HTML, you can pass it here instead.
* This is almost always the case so it should be use all the times
* {@see portfolio_format_from_mimetype} for how to get the appropriate formats to pass here for uploaded files.
* or just call set_format_by_file instead
*/
public function set_formats($formats=null) {
if (is_string($formats)) {
$formats = array($formats);
@ -189,7 +201,7 @@ class portfolio_add_button {
}
/**
* reset formats to the default
* Reset formats to the default,
* which is usually what base_supported_formats returns
*/
public function reset_formats() {
@ -198,13 +210,13 @@ class portfolio_add_button {
/**
* if we already know we have exactly one file,
* If we already know we have exactly one file,
* bypass set_formats and just pass the file
* so we can detect the formats by mimetype.
*
* @param stored_file $file file to set the format from
* @param mixed $extraformats any additional formats other than by mimetype
* eg leap2a etc
* @param stored_file $file file to set the format from
* @param array $extraformats any additional formats other than by mimetype
* eg leap2a etc
*/
public function set_format_by_file(stored_file $file, $extraformats=null) {
$this->file = $file;
@ -218,12 +230,12 @@ class portfolio_add_button {
}
/**
* correllary to set_format_by_file, but this is used when we don't yet have a stored_file
* Correllary this is use to set_format_by_file, but it is also used when there is no stored_file and
* when we're writing out a new type of file (like csv or pdf)
*
* @param string $extn the file extension we intend to generate
* @param mixed $extraformats any additional formats other than by mimetype
* eg leap2a etc
* @param array $extraformats any additional formats other than by mimetype
* eg leap2a etc
*/
public function set_format_by_intended_file($extn, $extraformats=null) {
$mimetype = mimeinfo('type', 'something. ' . $extn);
@ -237,28 +249,29 @@ class portfolio_add_button {
$this->set_formats(array_merge(array($fileformat), $extraformats));
}
/*
* echo the form/button/icon/text link to the page
*
* @param int $format format to display the button or form or icon or link.
* See constants PORTFOLIO_ADD_XXX for more info.
* optional, defaults to PORTFOLIO_ADD_FULL_FORM
* @param str $addstr string to use for the button or icon alt text or link text.
* this is whole string, not key. optional, defaults to 'Export to portfolio';
*/
/**
* Echo the form/button/icon/text link to the page
*
* @param int $format format to display the button or form or icon or link.
* See constants PORTFOLIO_ADD_XXX for more info.
* optional, defaults to PORTFOLIO_ADD_FULL_FORM
* @param string $addstr string to use for the button or icon alt text or link text.
* this is whole string, not key. optional, defaults to 'Export to portfolio';
*/
public function render($format=null, $addstr=null) {
echo $this->to_html($format, $addstr);
}
/*
* returns the form/button/icon/text link as html
*
* @param int $format format to display the button or form or icon or link.
* See constants PORTFOLIO_ADD_XXX for more info.
* optional, defaults to PORTFOLIO_ADD_FULL_FORM
* @param str $addstr string to use for the button or icon alt text or link text.
* this is whole string, not key. optional, defaults to 'Add to portfolio';
*/
/**
* Returns the form/button/icon/text link as html
*
* @param int $format format to display the button or form or icon or link.
* See constants PORTFOLIO_ADD_XXX for more info.
* Optional, defaults to PORTFOLIO_ADD_FULL_FORM
* @param string $addstr string to use for the button or icon alt text or link text.
* This is whole string, not key. optional, defaults to 'Add to portfolio';
* @return void|string
*/
public function to_html($format=null, $addstr=null) {
global $CFG, $COURSE, $OUTPUT, $USER;
if (!$this->is_renderable()) {
@ -366,10 +379,12 @@ class portfolio_add_button {
}
/**
* does some internal checks
* these are not errors, just situations
* where it's not appropriate to add the button
*/
* Perform some internal checks.
* These are not errors, just situations
* where it's not appropriate to add the button
*
* @return bool
*/
private function is_renderable() {
global $CFG;
if (empty($CFG->enableportfolios)) {
@ -388,6 +403,7 @@ class portfolio_add_button {
/**
* Getter for $format property
*
* @return array
*/
public function get_formats() {
@ -396,6 +412,7 @@ class portfolio_add_button {
/**
* Getter for $callbackargs property
*
* @return array
*/
public function get_callbackargs() {
@ -404,7 +421,8 @@ class portfolio_add_button {
/**
* Getter for $callbackfile property
* @return array
*
* @return string
*/
public function get_callbackfile() {
return $this->callbackfile;
@ -412,7 +430,8 @@ class portfolio_add_button {
/**
* Getter for $callbackclass property
* @return array
*
* @return string
*/
public function get_callbackclass() {
return $this->callbackclass;
@ -420,18 +439,17 @@ class portfolio_add_button {
}
/**
* returns a drop menu with a list of available instances.
*
* @param array $instances array of portfolio plugin instance objects - the instances to put in the menu
* @param array $callerformats array of PORTFOLIO_FORMAT_XXX constants - the formats the caller supports (this is used to filter plugins)
* @param array $callbackclass the callback class name - used for debugging only for when there are no common formats
* @param mimetype $mimetype if we already know we have exactly one file, or are going to write one, pass it here to do mime filtering.
* @param string $selectname the name of the select element. Optional, defaults to instance.
* @param boolean $return whether to print or return the output. Optional, defaults to print.
* @param booealn $returnarray if returning, whether to return the HTML or the array of options. Optional, defaults to HTML.
*
* @return string the html, from <select> to </select> inclusive.
*/
* Returns a drop menu with a list of available instances.
*
* @param array $instances array of portfolio plugin instance objects - the instances to put in the menu
* @param array $callerformats array of PORTFOLIO_FORMAT_XXX constants - the formats the caller supports (this is used to filter plugins)
* @param string $callbackclass the callback class name - used for debugging only for when there are no common formats
* @param string $mimetype if we already know we have exactly one file, or are going to write one, pass it here to do mime filtering.
* @param string $selectname the name of the select element. Optional, defaults to instance.
* @param bool $return whether to print or return the output. Optional, defaults to print.
* @param bool $returnarray if returning, whether to return the HTML or the array of options. Optional, defaults to HTML.
* @return void|array|string the html, from <select> to </select> inclusive.
*/
function portfolio_instance_select($instances, $callerformats, $callbackclass, $mimetype=null, $selectname='instance', $return=false, $returnarray=false) {
global $CFG, $USER;
@ -489,15 +507,13 @@ function portfolio_instance_select($instances, $callerformats, $callbackclass, $
}
/**
* return all portfolio instances
*
* @todo check capabilities here - see MDL-15768
*
* @param boolean visibleonly Don't include hidden instances. Defaults to true and will be overridden to true if the next parameter is true
* @param boolean useronly Check the visibility preferences and permissions of the logged in user. Defaults to true.
*
* @return array of portfolio instances (full objects, not just database records)
*/
* Return all portfolio instances
*
* @todo MDL-15768 - check capabilities here
* @param bool $visibleonly Don't include hidden instances. Defaults to true and will be overridden to true if the next parameter is true
* @param bool $useronly Check the visibility preferences and permissions of the logged in user. Defaults to true.
* @return array of portfolio instances (full objects, not just database records)
*/
function portfolio_instances($visibleonly=true, $useronly=true) {
global $DB, $USER;
@ -526,14 +542,13 @@ function portfolio_instances($visibleonly=true, $useronly=true) {
}
/**
* Supported formats currently in use.
*
* Canonical place for a list of all formats
* that portfolio plugins and callers
* can use for exporting content
*
* @return keyed array of all the available export formats (constant => classname)
*/
* Supported formats currently in use.
* Canonical place for a list of all formats
* that portfolio plugins and callers
* can use for exporting content
*
* @return array keyed array of all the available export formats (constant => classname)
*/
function portfolio_supported_formats() {
return array(
PORTFOLIO_FORMAT_FILE => 'portfolio_format_file',
@ -553,19 +568,17 @@ function portfolio_supported_formats() {
}
/**
* Deduce export format from file mimetype
*
* This function returns the revelant portfolio export format
* which is used to determine which portfolio plugins can be used
* for exporting this content
* according to the given mime type
* this only works when exporting exactly <b>one</b> file, or generating a new one
* (like a pdf or csv export)
*
* @param string $mimetype (usually $file->get_mimetype())
*
* @return string the format constant (see PORTFOLIO_FORMAT_XXX constants)
*/
* Deduce export format from file mimetype
* This function returns the revelant portfolio export format
* which is used to determine which portfolio plugins can be used
* for exporting this content
* according to the given mime type
* this only works when exporting exactly <b>one</b> file, or generating a new one
* (like a pdf or csv export)
*
* @param string $mimetype (usually $file->get_mimetype())
* @return string the format constant (see PORTFOLIO_FORMAT_XXX constants)
*/
function portfolio_format_from_mimetype($mimetype) {
global $CFG;
static $alreadymatched;
@ -593,15 +606,15 @@ function portfolio_format_from_mimetype($mimetype) {
}
/**
* Intersection of plugin formats and caller formats
*
* Walks both the caller formats and portfolio plugin formats
* and looks for matches (walking the hierarchy as well)
* and returns the intersection
*
* @param array $callerformats formats the caller supports
* @param array $pluginformats formats the portfolio plugin supports
*/
* Intersection of plugin formats and caller formats.
* Walks both the caller formats and portfolio plugin formats
* and looks for matches (walking the hierarchy as well)
* and returns the intersection
*
* @param array $callerformats formats the caller supports
* @param array $pluginformats formats the portfolio plugin supports
* @return array
*/
function portfolio_supported_formats_intersect($callerformats, $pluginformats) {
global $CFG;
$allformats = portfolio_supported_formats();
@ -632,10 +645,9 @@ function portfolio_supported_formats_intersect($callerformats, $pluginformats) {
}
/**
* tiny helper to figure out whether a portfolio format is abstract
* Tiny helper to figure out whether a portfolio format is abstract
*
* @param string $format the format to test
*
* @retun bool
*/
function portfolio_format_is_abstract($format) {
@ -657,17 +669,16 @@ function portfolio_format_is_abstract($format) {
}
/**
* return the combination of the two arrays of formats with duplicates in terms of specificity removed
* and also removes conflicting formats
* use case: a module is exporting a single file, so the general formats would be FILE and MBKP
* while the specific formats would be the specific subclass of FILE based on mime (say IMAGE)
* and this function would return IMAGE and MBKP
*
* @param array $specificformats array of more specific formats (eg based on mime detection)
* @param array $generalformats array of more general formats (usually more supported)
*
* @return array merged formats with dups removed
*/
* Return the combination of the two arrays of formats with duplicates in terms of specificity removed
* and also removes conflicting formats.
* Use case: a module is exporting a single file, so the general formats would be FILE and MBKP
* while the specific formats would be the specific subclass of FILE based on mime (say IMAGE)
* and this function would return IMAGE and MBKP
*
* @param array $specificformats array of more specific formats (eg based on mime detection)
* @param array $generalformats array of more general formats (usually more supported)
* @return array merged formats with dups removed
*/
function portfolio_most_specific_formats($specificformats, $generalformats) {
global $CFG;
$allformats = portfolio_supported_formats();
@ -729,12 +740,11 @@ function portfolio_most_specific_formats($specificformats, $generalformats) {
}
/**
* helper function to return a format object from the constant
*
* @param string $name the constant PORTFOLIO_FORMAT_XXX
*
* @return portfolio_format object
*/
* Helper function to return a format object from the constant
*
* @param string $name the constant PORTFOLIO_FORMAT_XXX
* @return portfolio_format
*/
function portfolio_format_object($name) {
global $CFG;
require_once($CFG->libdir . '/portfolio/formats.php');
@ -743,15 +753,14 @@ function portfolio_format_object($name) {
}
/**
* helper function to return an instance of a plugin (with config loaded)
*
* @param int $instance id of instance
* @param array $record database row that corresponds to this instance
* this is passed to avoid unnecessary lookups
* Optional, and the record will be retrieved if null.
*
* @return subclass of portfolio_plugin_base
*/
* Helper function to return an instance of a plugin (with config loaded)
*
* @param int $instanceid id of instance
* @param object $record database row that corresponds to this instance
* this is passed to avoid unnecessary lookups
* Optional, and the record will be retrieved if null.
* @return object of portfolio_plugin_XXX
*/
function portfolio_instance($instanceid, $record=null) {
global $DB, $CFG;
@ -769,15 +778,15 @@ function portfolio_instance($instanceid, $record=null) {
}
/**
* Helper function to call a static function on a portfolio plugin class
*
* This will figure out the classname and require the right file and call the function.
* you can send a variable number of arguments to this function after the first two
* and they will be passed on to the function you wish to call.
*
* @param string $plugin name of plugin
* @param string $function function to call
*/
* Helper function to call a static function on a portfolio plugin class.
* This will figure out the classname and require the right file and call the function.
* You can send a variable number of arguments to this function after the first two
* and they will be passed on to the function you wish to call.
*
* @param string $plugin name of plugin
* @param string $function function to call
* @return mixed
*/
function portfolio_static_function($plugin, $function) {
global $CFG;
@ -804,13 +813,11 @@ function portfolio_static_function($plugin, $function) {
}
/**
* helper function to check all the plugins for sanity and set any insane ones to invisible.
*
* @param array $plugins to check (if null, defaults to all)
* one string will work too for a single plugin.
*
* @return array array of insane instances (keys= id, values = reasons (keys for plugin lang)
*/
* Helper function to check all the plugins for sanity and set any insane ones to invisible.
*
* @param array $plugins array of supported plugin types
* @return array array of insane instances (keys= id, values = reasons (keys for plugin lang)
*/
function portfolio_plugin_sanity_check($plugins=null) {
global $DB;
if (is_string($plugins)) {
@ -836,13 +843,11 @@ function portfolio_plugin_sanity_check($plugins=null) {
}
/**
* helper function to check all the instances for sanity and set any insane ones to invisible.
*
* @param array $instances to check (if null, defaults to all)
* one instance or id will work too
*
* @return array array of insane instances (keys= id, values = reasons (keys for plugin lang)
*/
* Helper function to check all the instances for sanity and set any insane ones to invisible.
*
* @param array $instances array of plugin instances
* @return array array of insane instances (keys= id, values = reasons (keys for plugin lang)
*/
function portfolio_instance_sanity_check($instances=null) {
global $DB;
if (empty($instances)) {
@ -877,12 +882,13 @@ function portfolio_instance_sanity_check($instances=null) {
}
/**
* helper function to display a table of plugins (or instances) and reasons for disabling
*
* @param array $insane array of insane plugins (key = plugin (or instance id), value = reason)
* @param array $instances if reporting instances rather than whole plugins, pass the array (key = id, value = object) here
*
*/
* Helper function to display a table of plugins (or instances) and reasons for disabling
*
* @param array $insane array of portfolio plugin
* @param array $instances if reporting instances rather than whole plugins, pass the array (key = id, value = object) here
* @param bool $return option to deliver the report in html format or print it out directly to the page.
* @return void|string of portfolio report in html table format
*/
function portfolio_report_insane($insane, $instances=false, $return=false) {
global $OUTPUT;
if (empty($insane)) {
@ -924,8 +930,11 @@ function portfolio_report_insane($insane, $instances=false, $return=false) {
/**
* event handler for the portfolio_send event
*/
* Event handler for the portfolio_send event
*
* @param int $eventdata event id
* @return bool
*/
function portfolio_handle_event($eventdata) {
global $CFG;
@ -939,11 +948,11 @@ function portfolio_handle_event($eventdata) {
}
/**
* main portfolio cronjob
* currently just cleans up expired transfer records.
*
* @todo add hooks in the plugins - either per instance or per plugin
*/
* Main portfolio cronjob.
* Currently just cleans up expired transfer records.
*
* @todo - MDL-15997 - Add hooks in the plugins - either per instance or per plugin
*/
function portfolio_cron() {
global $DB, $CFG;
@ -961,29 +970,24 @@ function portfolio_cron() {
}
/**
* helper function to rethrow a caught portfolio_exception as an export exception
*
* used because when a portfolio_export exception is thrown the export is cancelled
*
* Helper function to rethrow a caught portfolio_exception as an export exception.
* Used because when a portfolio_export exception is thrown the export is cancelled
* throws portfolio_export_exceptiog
*
* @param portfolio_exporter $exporter current exporter object
* @param exception $exception exception to rethrow
*
* @return void
* @param object $exception exception to rethrow
*/
function portfolio_export_rethrow_exception($exporter, $exception) {
throw new portfolio_export_exception($exporter, $exception->errorcode, $exception->module, $exception->link, $exception->a);
}
/**
* try and determine expected_time for purely file based exports
* or exports that might include large file attachments.
*
* @global object
* @param mixed $totest - either an array of stored_file objects or a single stored_file object
* @return constant PORTFOLIO_TIME_XXX
*/
* Try and determine expected_time for purely file based exports
* or exports that might include large file attachments.
*
* @param stored_file|array $totest - either an array of stored_file objects or a single stored_file object
* @return string PORTFOLIO_TIME_XXX
*/
function portfolio_expected_time_file($totest) {
global $CFG;
if ($totest instanceof stored_file) {
@ -1023,9 +1027,11 @@ function portfolio_expected_time_file($totest) {
/**
* the default filesizes and threshold information for file based transfers
* this shouldn't need to be used outside the admin pages and the portfolio code
*/
* The default filesizes and threshold information for file based transfers.
* This shouldn't need to be used outside the admin pages and the portfolio code
*
* @return array
*/
function portfolio_filesize_info() {
$filesizes = array();
$sizelist = array(10240, 51200, 102400, 512000, 1048576, 2097152, 5242880, 10485760, 20971520, 52428800);
@ -1040,13 +1046,12 @@ function portfolio_filesize_info() {
}
/**
* try and determine expected_time for purely database based exports
* or exports that might include large parts of a database
*
* @global object
* @param integer $recordcount - number of records trying to export
* @return constant PORTFOLIO_TIME_XXX
*/
* Try and determine expected_time for purely database based exports
* or exports that might include large parts of a database.
*
* @param int $recordcount number of records trying to export
* @return string PORTFOLIO_TIME_XXX
*/
function portfolio_expected_time_db($recordcount) {
global $CFG;
@ -1065,7 +1070,10 @@ function portfolio_expected_time_db($recordcount) {
}
/**
* @global object
* Function to send portfolio report to admins
*
* @param array $insane array of insane plugins
* @param array $instances (optional) if reporting instances rather than whole plugins
*/
function portfolio_insane_notify_admins($insane, $instances=false) {
@ -1121,6 +1129,12 @@ function portfolio_insane_notify_admins($insane, $instances=false) {
}
}
/**
* Setup page export
*
* @param moodle_page $PAGE global variable from page object
* @param portfolio_caller_base $caller plugin type caller
*/
function portfolio_export_pagesetup($PAGE, $caller) {
// set up the context so that build_navigation works nice
$caller->set_context($PAGE);
@ -1136,6 +1150,13 @@ function portfolio_export_pagesetup($PAGE, $caller) {
$PAGE->navbar->add(get_string('exporting', 'portfolio'));
}
/**
* Get export type id
*
* @param string $type plugin type
* @param int $userid the user to check for
* @return mixed|bool
*/
function portfolio_export_type_to_id($type, $userid) {
global $DB;
$sql = 'SELECT t.id FROM {portfolio_tempdata} t JOIN {portfolio_instance} i ON t.instance = i.id WHERE t.userid = ? AND i.plugin = ?';
@ -1143,14 +1164,13 @@ function portfolio_export_type_to_id($type, $userid) {
}
/**
* return a list of current exports for the given user
* this will not go through and call rewaken_object, because it's heavy
* it's really just used to figure out what exports are currently happening.
* this is useful for plugins that don't support multiple exports per session
* Return a list of current exports for the given user.
* This will not go through and call rewaken_object, because it's heavy.
* It's really just used to figure out what exports are currently happening.
* This is useful for plugins that don't support multiple exports per session
*
* @param int $userid the user to check for
* @param int $userid the user to check for
* @param string $type (optional) the portfolio plugin to filter by
*
* @return array
*/
function portfolio_existing_exports($userid, $type=null) {
@ -1168,6 +1188,9 @@ function portfolio_existing_exports($userid, $type=null) {
* Return an array of existing exports by type for a given user.
* This is much more lightweight than {@see existing_exports} because it only returns the types, rather than the whole serialised data
* so can be used for checking availability of multiple plugins at the same time.
*
* @param int $userid the user to check for
* @return array
*/
function portfolio_existing_exports_by_plugin($userid) {
global $DB;
@ -1177,8 +1200,7 @@ function portfolio_existing_exports_by_plugin($userid) {
}
/**
* Return default common options for {@link format_text()} when preparing a content to be exported
*
* Return default common options for {@link format_text()} when preparing a content to be exported.
* It is important not to apply filters and not to clean the HTML in format_text()
*
* @return stdClass
@ -1198,6 +1220,15 @@ function portfolio_format_text_options() {
/**
* callback function from {@link portfolio_rewrite_pluginfile_urls}
* looks through preg_replace matches and replaces content with whatever the active portfolio export format says
*
* @param int $contextid module context id
* @param string $component module name (eg:mod_assignment)
* @param string $filearea normal file_area arguments
* @param int $itemid component item id
* @param portfolio_format $format exporter format type
* @param array $options extra options to pass through to the file_output function in the format (optional)
* @param array $matches internal matching
* @return object|array|string
*/
function portfolio_rewrite_pluginfile_url_callback($contextid, $component, $filearea, $itemid, $format, $options, $matches) {
$matches = $matches[0]; // no internal matching
@ -1239,19 +1270,18 @@ function portfolio_rewrite_pluginfile_url_callback($contextid, $component, $file
/**
* go through all the @@PLUGINFILE@@ matches in some text,
* Go through all the @@PLUGINFILE@@ matches in some text,
* extract the file information and pass it back to the portfolio export format
* to regenerate the html to output
*
* @param string $text the text to search through
* @param int $contextid normal file_area arguments
* @param string $component
* @param string $filearea normal file_area arguments
* @param int $itemid normal file_area arguments
* @param portfolio_format $format the portfolio export format
* @param array $options extra options to pass through to the file_output function in the format (optional)
*
* @return string
* @param string $text the text to search through
* @param int $contextid normal file_area arguments
* @param string $component module name
* @param string $filearea normal file_area arguments
* @param int $itemid normal file_area arguments
* @param portfolio_format $format the portfolio export format
* @param array $options additional options to be included in the plugin file url (optional)
* @return mixed
*/
function portfolio_rewrite_pluginfile_urls($text, $contextid, $component, $filearea, $itemid, $format, $options=null) {
$pattern = '/(<[^<]*?="@@PLUGINFILE@@\/[^>]*?(?:\/>|>.*?<\/[^>]*?>))/';

View File

@ -1,29 +1,26 @@
<?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/>.
/**
* Moodle - Modular Object-Oriented Dynamic Learning Environment
* http://moodle.org
* Copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com
*
* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*
* @package moodle
* @subpackage portfolio
* @author Penny Leach <penny@catalyst.net.nz>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL
* @copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com
*
* This file is the main controller to do with the portfolio export wizard.
*
* @package core_portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>,
* Martin Dougiamas <http://dougiamas.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL
*/
require_once(dirname(dirname(__FILE__)) . '/config.php');

View File

@ -1,31 +1,28 @@
<?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/>.
/**
* Moodle - Modular Object-Oriented Dynamic Learning Environment
* http://moodle.org
* Copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com
*
* This program 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 2 of the License, or
* (at your option) any later version.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*
* @package moodle
* @subpackage portfolio
* @author Penny Leach <penny@catalyst.net.nz>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL
* @copyright (C) 1999 onwards Martin Dougiamas http://dougiamas.com
*
* For portfolio plugins that are 'pull' - ie, send the request and then wait
* for the remote system to request the file for moodle,
* this is the script that serves up the export file to them.
*
* @package core_portfolio
* @copyright 2008 Penny Leach <penny@catalyst.net.nz>,
* Martin Dougiamas <http://dougiamas.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
require_once(dirname(dirname(__FILE__)) . '/config.php');