moodle/repository/lib.php

1489 lines
51 KiB
PHP
Raw Normal View History

<?php // $Id$
///////////////////////////////////////////////////////////////////////////
// //
// NOTICE OF COPYRIGHT //
// //
// Moodle - Modular Object-Oriented Dynamic Learning Environment //
// http://moodle.com //
// //
// Copyright (C) 2008 onwards Moodle Pty Ltd http://moodle.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: //
// //
// http://www.gnu.org/copyleft/gpl.html //
// //
///////////////////////////////////////////////////////////////////////////
/**
* This is the base class of the repository class
*
* To use repository plugin, you need to create a new folder under repository/, named as the remote
* repository, the subclass must be defined in the name
*
* class repository is an abstract class, some functions must be implemented in subclass.
*
* See an example of use of this library in repository/boxnet/repository.class.php
*
* A few notes :
* // options are stored as serialized format in database
* $options = array('api_key'=>'dmls97d8j3i9tn7av8y71m9eb55vrtj4',
* 'auth_token'=>'', 'path_root'=>'/');
* $repo = new repository_xxx($options);
* // print login page or a link to redirect to another page
* $repo->print_login();
* // call get_listing, and print result
* $repo->print_listing();
* // print a search box
* $repo->print_search();
*
* @version 1.0 dev
* @package repository
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
*/
2008-07-28 08:24:55 +00:00
require_once(dirname(dirname(__FILE__)) . '/config.php');
require_once(dirname(dirname(__FILE__)).'/lib/filelib.php');
require_once(dirname(dirname(__FILE__)).'/lib/formslib.php');
abstract class repository {
public $id;
public $context;
public $options;
/**
2008-08-28 06:39:09 +00:00
* 1. Initialize context and options
* 2. Accept necessary parameters
*
2008-08-28 06:15:19 +00:00
* @param integer $repositoryid
* @param integer $contextid
* @param array $options
*/
public function __construct($repositoryid, $contextid = SITEID, $options = array()){
$this->id = $repositoryid;
$this->context = get_context_instance_by_id($contextid);
$this->options = array();
if (is_array($options)) {
$options = array_merge($this->get_option(), $options);
} else {
$options = $this->get_option();
}
2008-08-14 09:39:39 +00:00
$this->options = array();
foreach ($options as $n => $v) {
$this->options[$n] = $v;
}
}
2008-08-28 06:15:19 +00:00
/**
2008-08-28 06:39:09 +00:00
* set options for repository instance
*
2008-08-28 06:15:19 +00:00
* @param string $name
2008-08-28 06:39:09 +00:00
* @param mixed $value
2008-08-28 06:15:19 +00:00
*/
public function __set($name, $value) {
$this->options[$name] = $value;
}
2008-08-28 06:15:19 +00:00
/**
2008-08-28 06:39:09 +00:00
* get options for repository instance
*
* @param string $name
* @return mixed
2008-08-28 06:15:19 +00:00
*/
public function __get($name) {
if (array_key_exists($name, $this->options)){
return $this->options[$name];
}
trigger_error('Undefined property: '.$name, E_USER_NOTICE);
return null;
}
2008-08-28 06:15:19 +00:00
/**
2008-08-28 06:39:09 +00:00
* test option name
*
* @param string name
2008-08-28 06:15:19 +00:00
*/
public function __isset($name) {
return isset($this->options[$name]);
}
2008-08-28 06:15:19 +00:00
/**
2008-08-28 06:39:09 +00:00
* Return the name of the repository class
2008-08-28 06:15:19 +00:00
* @return <type>
*/
public function __toString() {
return 'Repository class: '.__CLASS__;
}
/**
2008-08-28 06:39:09 +00:00
* Download a file from a given url
*
2008-08-28 06:15:19 +00:00
* @global object $CFG
* @param string $url the url of file
* @param string $file save location
2008-08-28 06:39:09 +00:00
* @return string the location of the file
2008-08-14 09:39:39 +00:00
* @see curl package
*/
public function get_file($url, $file = '') {
global $CFG;
if (!file_exists($CFG->dataroot.'/temp/download')) {
mkdir($CFG->dataroot.'/temp/download/', 0777, true);
}
if(is_dir($CFG->dataroot.'/temp/download')) {
$dir = $CFG->dataroot.'/temp/download/';
}
if(empty($file)) {
$file = uniqid('repo').'_'.time().'.tmp';
}
if(file_exists($dir.$file)){
$file = uniqid('m').$file;
}
$fp = fopen($dir.$file, 'w');
$c = new curl;
$c->download(array(
array('url'=>$url, 'file'=>$fp)
));
return $dir.$file;
}
/**
* Print a list or return string
*
* @param string $list
2008-08-28 06:39:09 +00:00
* @param boolean $print false, return html, otherwise, print it directly
2008-08-28 06:15:19 +00:00
* @return <type>
*/
public function print_listing($listing = array(), $print=true) {
2008-06-30 07:10:13 +00:00
if(empty($listing)){
$listing = $this->get_listing();
}
if (empty($listing)) {
$str = '';
} else {
$count = 0;
$str = '<table>';
foreach ($listing as $v){
$str .= '<tr id="entry_'.$count.'">';
$str .= '<td><input type="checkbox" /></td>';
$str .= '<td>'.$v['name'].'</td>';
$str .= '<td>'.$v['size'].'</td>';
$str .= '<td>'.$v['date'].'</td>';
$str .= '</tr>';
$count++;
}
2008-06-27 06:26:36 +00:00
$str .= '</table>';
}
if ($print){
echo $str;
return null;
} else {
return $str;
}
}
/**
2008-08-28 06:39:09 +00:00
* Provide repository instance information for Ajax
2008-08-28 06:15:19 +00:00
* @global object $CFG
* @return object
*/
2008-08-14 09:39:39 +00:00
final public function ajax_info() {
global $CFG;
$repo = new stdclass;
$repo->id = $this->id;
$repo->name = $this->options['name'];
$repo->type = $this->options['type'];
$repo->icon = $CFG->wwwroot.'/repository/'.$repo->type.'/icon.png';
return $repo;
}
2008-08-14 09:39:39 +00:00
/**
* Create an instance for this plug-in
2008-08-28 06:15:19 +00:00
* @global object $CFG
* @global object $DB
* @param string $type the type of the repository
* @param integer $userid the user id
* @param object $context the context
* @param array $params the options for this instance
* @return <type>
2008-08-14 09:39:39 +00:00
*/
final public static function create($type, $userid, $context, $params) {
global $CFG, $DB;
$params = (array)$params;
require_once($CFG->dirroot . '/repository/'. $type . '/repository.class.php');
$classname = 'repository_' . $type;
if ($repo = $DB->get_record('repository', array('type'=>$type))) {
$record = new stdclass;
$record->name = $params['name'];
$record->typeid = $repo->id;
$record->timecreated = time();
$record->timemodified = time();
$record->contextid = $context->id;
$record->userid = $userid;
$id = $DB->insert_record('repository_instances', $record);
if (call_user_func($classname . '::has_admin_config')) {
$configs = call_user_func($classname . '::get_option_names');
$options = array();
foreach ($configs as $config) {
$options[$config] = $params[$config];
}
}
if (!empty($id)) {
unset($options['name']);
$instance = repository_get_instance($id);
$instance->set_option($options);
return $id;
} else {
return null;
2008-08-14 09:39:39 +00:00
}
} else {
return null;
}
}
2008-08-28 06:15:19 +00:00
/**
* delete a repository instance
2008-08-28 06:15:19 +00:00
* @global object $DB
* @return <type>
*/
2008-08-14 09:39:39 +00:00
final public function delete(){
global $DB;
$DB->delete_records('repository_instances', array('id'=>$this->id));
return true;
}
2008-08-28 06:15:19 +00:00
/**
* Hide/Show a repository
2008-08-28 06:15:19 +00:00
* @global object $DB
* @param string $hide
* @return <type>
*/
2008-08-14 09:39:39 +00:00
final public function hide($hide = 'toggle'){
global $DB;
if ($entry = $DB->get_record('repository', array('id'=>$this->id))) {
if ($hide === 'toggle' ) {
if (!empty($entry->visible)) {
$entry->visible = 0;
} else {
$entry->visible = 1;
}
} else {
if (!empty($hide)) {
$entry->visible = 0;
} else {
$entry->visible = 1;
}
}
return $DB->update_record('repository', $entry);
}
return false;
}
/**
* Cache login details for repositories
2008-08-28 06:15:19 +00:00
* @global object $DB
* @param string $username
* @param string $password
2008-08-28 06:15:19 +00:00
* @param integer $userid The id of specific user
* @return integer Id of the record
*/
public function store_login($username = '', $password = '', $userid = 1) {
global $DB;
$repository = new stdclass;
if (!empty($this->id)) {
$repository->id = $this->id;
2008-07-28 08:24:55 +00:00
} else {
$repository->userid = $userid;
$repository->repositorytype = $this->type;
$repository->contextid = $this->context->id;
2008-07-28 08:24:55 +00:00
}
if ($entry = $DB->get_record('repository', $repository)) {
$repository->id = $entry->id;
$repository->username = $username;
$repository->password = $password;
return $DB->update_record('repository', $repository);
} else {
$repository->username = $username;
$repository->password = $password;
return $DB->insert_record('repository', $repository);
}
}
/**
* Save settings for repository instance
2008-08-28 06:15:19 +00:00
* $repo->set_option(array('api_key'=>'f2188bde132', 'name'=>'dongsheng'));
* @global object $DB
* @param array $options settings
* @return int Id of the record
*/
public function set_option($options = array()){
global $DB;
if (!empty($options['name'])) {
$r = new object();
$r->id = $this->id;
$r->name = $options['name'];
$DB->update_record('repository_instances', $r);
unset($options['name']);
}
foreach ($options as $name=>$value) {
if ($id = $DB->get_field('repository_instance_config', 'id', array('name'=>$name, 'instanceid'=>$this->id))) {
if ($value===null) {
return $DB->delete_records('repository_instance_config', array('name'=>$name, 'instanceid'=>$this->id));
} else {
return $DB->set_field('repository_instance_config', 'value', $value, array('id'=>$id));
}
} else {
if ($value===null) {
return true;
}
$config = new object();
$config->instanceid = $this->id;
$config->name = $name;
$config->value = $value;
return $DB->insert_record('repository_instance_config', $config);
}
}
return true;
}
/**
* Get settings for repository instance
2008-08-28 06:15:19 +00:00
* @global object $DB
* @param <type> $config
* @return array Settings
*/
public function get_option($config = ''){
global $DB;
$entries = $DB->get_records('repository_instance_config', array('instanceid'=>$this->id));
$ret = array();
if (empty($entries)) {
return $ret;
}
foreach($entries as $entry){
$ret[$entry->name] = $entry->value;
}
if (!empty($config)) {
return $ret[$config];
} else {
return $ret;
}
}
/**
* Given a path, and perhaps a search, get a list of files.
*
* The format of the returned array must be:
* array(
* 'path' => (string) path for the current folder
* 'dynload' => (bool) use dynamic loading,
* 'manage' => (string) link to file manager,
* 'nologin' => (bool) requires login,
* 'upload' => array( // upload manager
* 'name' => (string) label of the form element,
* 'id' => (string) id of the form element
* ),
* 'list' => array(
* array( // file
* 'title' => (string) file name,
2008-08-22 06:06:02 +00:00
* 'date' => (string) file last modification time, usually userdate(...),
* 'size' => (int) file size,
2008-08-22 06:06:02 +00:00
* 'thumbnail' => (string) url to thumbnail for the file,
* 'source' => plugin-dependent unique path to the file (id, url, path, etc.),
* 'url'=> the accessible url of file
* ),
2008-08-22 06:06:02 +00:00
* array( // folder - same as file, but no 'source'.
* 'title' => (string) folder name,
* 'path' => (string) path to this folder
2008-08-22 06:06:02 +00:00
* 'date' => (string) folder last modification time, usually userdate(...),
* 'size' => 0,
2008-08-22 06:06:02 +00:00
* 'thumbnail' => (string) url to thumbnail for the folder,
* 'children' => array( // an empty folder needs to have 'children' defined, but empty.
* // content (files and folders)
* )
* ),
* )
* )
*
* @param string $parent The parent path, this parameter can
* a folder name, or a identification of folder
* @param string $search The text will be searched.
* @return array the list of files, including meta infomation
*/
abstract public function get_listing($parent = '/', $search = '');
/**
* Show the login screen, if required
* This is an abstract function, it must be overriden.
*/
abstract public function print_login();
/**
* Show the search screen, if required
* @return null
*/
abstract public function print_search();
2008-08-28 06:15:19 +00:00
/**
* TODO: write comment
* @return <type>
*/
public static function has_admin_config() {
return false;
}
/**
* Defines operations that happen occasionally on cron
2008-08-28 06:15:19 +00:00
* @return <type>
*/
public function cron() {
return true;
2008-06-30 05:24:00 +00:00
}
}
/**
* exception class for repository api
*/
class repository_exception extends moodle_exception {
2008-06-30 05:24:00 +00:00
}
2008-08-07 08:36:12 +00:00
/**
* Return repository instances
2008-08-28 06:15:19 +00:00
* @global object $DB
* @global object $CFG
* @global object $USER
* @param object $context
* @param integer $userid
* @param boolean $visible if visible == true, return visible instances only,
* otherwise, return all instances
* @return array repository instances
*/
function repository_get_instances($context, $userid = null, $visible = true){
global $DB, $CFG, $USER;
$params = array();
$sql = 'SELECT i.*, r.type AS repositorytype, r.visible FROM {repository} r, {repository_instances} i WHERE ';
$sql .= 'i.typeid = r.id AND ';
if (!empty($userid) && is_numeric($userid)) {
$sql .= ' (i.userid = 0 or i.userid = ?) AND ';
$params[] = $userid;
}
if($context->id == SYSCONTEXTID) {
$sql .= ' (i.contextid = ?)';
$params[] = SYSCONTEXTID;
} else {
$sql .= ' (i.contextid = ? or i.contextid = ?)';
$params[] = SYSCONTEXTID;
$params[] = $context->id;
}
if($visible == true) {
$sql .= ' AND (r.visible = 1)';
}
if(!$repos = $DB->get_records_sql($sql, $params)) {
$repos = array();
}
$ret = array();
foreach($repos as $repo) {
require_once($CFG->dirroot . '/repository/'. $repo->repositorytype
. '/repository.class.php');
$options['visible'] = $repo->visible;
$options['name'] = $repo->name;
$options['type'] = $repo->repositorytype;
$options['typeid'] = $repo->typeid;
$classname = 'repository_' . $repo->repositorytype;
$ret[] = new $classname($repo->id, $repo->contextid, $options);
}
return $ret;
}
2008-08-07 08:36:12 +00:00
/**
* Get single repository instance
2008-08-28 06:15:19 +00:00
* @global object $DB
* @global object $CFG
* @param integer $id repository id
* @return object repository instance
*/
function repository_get_instance($id){
2008-07-28 08:24:55 +00:00
global $DB, $CFG;
$sql = 'SELECT i.*, r.type AS repositorytype, r.visible FROM {repository} r, {repository_instances} i WHERE ';
$sql .= 'i.typeid = r.id AND ';
$sql .= 'i.id = '.$id;
2008-07-28 08:24:55 +00:00
if(!$instance = $DB->get_record_sql($sql)) {
2008-07-28 08:24:55 +00:00
return false;
}
require_once($CFG->dirroot . '/repository/'. $instance->repositorytype
2008-07-28 08:24:55 +00:00
. '/repository.class.php');
$classname = 'repository_' . $instance->repositorytype;
$options['typeid'] = $instance->typeid;
$options['type'] = $instance->repositorytype;
$options['name'] = $instance->name;
return new $classname($instance->id, $instance->contextid, $options);
2008-07-28 08:24:55 +00:00
}
2008-08-28 06:15:19 +00:00
/**
* TODO: write documentation
* @global <type> $CFG
* @param <type> $plugin
* @param <type> $function
* @return <type>
*/
function repository_static_function($plugin, $function) {
global $CFG;
$pname = null;
if (is_object($plugin) || is_array($plugin)) {
$plugin = (object)$plugin;
$pname = $plugin->name;
} else {
$pname = $plugin;
}
$args = func_get_args();
if (count($args) <= 2) {
$args = array();
}
else {
array_shift($args);
array_shift($args);
}
require_once($CFG->dirroot . '/repository/' . $plugin . '/repository.class.php');
return call_user_func_array(array('repository_' . $plugin, $function), $args);
}
/**
* Move file from download folder to file pool using FILE API
2008-08-14 09:39:39 +00:00
* @TODO Need review
2008-08-28 06:15:19 +00:00
* @global object $DB
* @global object $CFG
* @global object $USER
* @param string $path file path in download folder
* @param string $name file name
* @param integer $itemid item id to identify a file in filepool
* @param string $filearea file area
* @param string $filepath filepath in file area
* @return array information of file in file pool
*/
function repository_move_to_filepool($path, $name, $itemid, $filearea = 'user_draft') {
global $DB, $CFG, $USER;
$context = get_context_instance(CONTEXT_USER, $USER->id);
$entry = new object();
$entry->filearea = $filearea;
$entry->contextid = $context->id;
$entry->filename = $name;
$entry->filepath = '/'.uniqid().'/';
$entry->timecreated = time();
$entry->timemodified = time();
if(is_numeric($itemid)) {
$entry->itemid = $itemid;
} else {
$entry->itemid = 0;
}
$entry->mimetype = mimeinfo('type', $path);
$entry->userid = $USER->id;
$fs = get_file_storage();
$browser = get_file_browser();
if ($file = $fs->create_file_from_pathname($entry, $path)) {
$delete = unlink($path);
$ret = $browser->get_file_info($context, $file->get_filearea(), $file->get_itemid(), $file->get_filepath(), $file->get_filename());
if(!empty($ret)){
return array('url'=>$ret->get_url(),'id'=>$file->get_itemid(), 'file'=>$file->get_filename());
} else {
return null;
}
} else {
return null;
}
}
2008-09-01 08:19:28 +00:00
/**
* Save file to local filesystem pool
* @param string $elname name of element
* @param int $contextid
* @param string $filearea
* @param string $filepath
* @param string $filename - use specified filename, if not specified name of uploaded file used
* @param bool $override override file if exists
* @param int $userid
* @return mixed stored_file object or false if error; may throw exception if duplicate found
*/
function repository_store_to_filepool($elname, $filearea='user_draft', $filepath='/') {
global $USER;
if (!isset($_FILES[$elname])) {
return false;
}
$filename = $_FILES[$elname]['name'];
$context = get_context_instance(CONTEXT_USER, $USER->id);
$itemid = (int)substr(hexdec(uniqid()), 0, 9)+rand(1,100);
$fs = get_file_storage();
$browser = get_file_browser();
if ($file = $fs->get_file($context->id, $filearea, $itemid, $filepath, $filename)) {
if ($override) {
$file->delete();
} else {
return false;
}
}
$file_record = new object();
$file_record->contextid = $context->id;
$file_record->filearea = $filearea;
$file_record->itemid = $itemid;
$file_record->filepath = $filepath;
$file_record->filename = $filename;
$file_record->userid = $USER->id;
$file = $fs->create_file_from_pathname($file_record, $_FILES[$elname]['tmp_name']);
$info = $browser->get_file_info($context, $file->get_filearea(), $file->get_itemid(), $file->get_filepath(), $file->get_filename());
$ret = array('url'=>$info->get_url(),'id'=>$itemid, 'file'=>$file->get_filename());
return $ret;
}
/**
* Return javascript to create file picker to browse repositories
2008-08-28 06:15:19 +00:00
* @global object $CFG
* @global object $USER
* @param object $context the context
* @return array
*/
function repository_get_client($context){
global $CFG, $USER;
$suffix = uniqid();
$sesskey = sesskey();
$strsaveas = get_string('saveas', 'repository').': ';
2008-08-20 04:53:42 +00:00
$stradd = get_string('add', 'repository');
$strback = get_string('back', 'repository');
$strclose = get_string('close', 'repository');
2008-09-01 06:05:54 +00:00
$strcopying = get_string('copying', 'repository');
$strdownbtn = get_string('getfile', 'repository');
$strdownload = get_string('downloadsucc', 'repository');
2008-08-20 04:53:42 +00:00
$strdate = get_string('date', 'repository').': ';
$strerror = get_string('error', 'repository');
2008-09-01 08:48:32 +00:00
$strfilenotnull = get_string('filenotnull', 'repository');
2008-08-20 04:53:42 +00:00
$strinvalidjson = get_string('invalidjson', 'repository');
$strlistview = get_string('listview', 'repository');
$strlogout = get_string('logout', 'repository');
$strloading = get_string('loading', 'repository');
$strthumbview = get_string('thumbview', 'repository');
$strtitle = get_string('title', 'repository');
$strmgr = get_string('manageurl', 'repository');
$strnoenter = get_string('noenter', 'repository');
2008-08-20 04:53:42 +00:00
$strsave = get_string('save', 'repository');
$strsaved = get_string('saved', 'repository');
$strsaving = get_string('saving', 'repository');
$strsize = get_string('size', 'repository').': ';
$strsync = get_string('sync', 'repository');
$strsearch = get_string('search', 'repository');
$strsearching = get_string('searching', 'repository');
2008-08-20 04:53:42 +00:00
$strsubmit = get_string('submit', 'repository');
$strpreview = get_string('preview', 'repository');
2008-08-20 04:53:42 +00:00
$strupload = get_string('upload', 'repository');
$struploading = get_string('uploading', 'repository');
$css = <<<EOD
2008-08-21 02:46:22 +00:00
<style type="text/css">
#list-$suffix{line-height: 1.5em}
#list-$suffix a{ padding: 3px }
#list-$suffix li a:hover{ background: gray; color:white; }
#repo-list-$suffix .repo-name{}
#repo-list-$suffix li{margin-bottom: 1em}
#paging-$suffix{margin:10px 5px; clear:both;}
#paging-$suffix a{padding: 4px;border: 1px solid #CCC}
#path-$suffix{margin: 4px;border-bottom: 1px dotted gray;}
#path-$suffix a{padding: 4px;}
2008-08-21 02:46:22 +00:00
#panel-$suffix{padding:0;margin:0; text-align:left;}
#rename-form{text-align:center}
#rename-form p{margin: 1em;}
2008-08-21 02:46:22 +00:00
p.upload{text-align:right;margin: 5px}
p.upload a{font-size: 14px;background: #ccc;color:black;padding: 3px}
p.upload a:hover {background: grey;color:white}
.file_name{color:green;}
.file_date{color:blue}
.file_size{color:gray}
.grid{width:80px; float:left;text-align:center;}
.grid div{width: 80px; overflow: hidden}
.grid .label{height: 36px}
2008-08-21 02:46:22 +00:00
.repo-opt{font-size: 10px;}
</style>
<style type="text/css">
@import "$CFG->wwwroot/lib/yui/reset-fonts-grids/reset-fonts-grids.css";
@import "$CFG->wwwroot/lib/yui/reset/reset-min.css";
@import "$CFG->wwwroot/lib/yui/resize/assets/skins/sam/resize.css";
@import "$CFG->wwwroot/lib/yui/container/assets/skins/sam/container.css";
@import "$CFG->wwwroot/lib/yui/layout/assets/skins/sam/layout.css";
@import "$CFG->wwwroot/lib/yui/button/assets/skins/sam/button.css";
@import "$CFG->wwwroot/lib/yui/assets/skins/sam/treeview.css";
</style>
EOD;
$js = <<<EOD
2008-08-21 02:46:22 +00:00
<script type="text/javascript" src="$CFG->wwwroot/lib/yui/yahoo-dom-event/yahoo-dom-event.js"></script>
<script type="text/javascript" src="$CFG->wwwroot/lib/yui/element/element-beta-min.js"></script>
<script type="text/javascript" src="$CFG->wwwroot/lib/yui/treeview/treeview-min.js"></script>
<script type="text/javascript" src="$CFG->wwwroot/lib/yui/dragdrop/dragdrop-min.js"></script>
<script type="text/javascript" src="$CFG->wwwroot/lib/yui/container/container-min.js"></script>
<script type="text/javascript" src="$CFG->wwwroot/lib/yui/resize/resize-beta-min.js"></script>
<script type="text/javascript" src="$CFG->wwwroot/lib/yui/layout/layout-beta-min.js"></script>
<script type="text/javascript" src="$CFG->wwwroot/lib/yui/connection/connection-min.js"></script>
<script type="text/javascript" src="$CFG->wwwroot/lib/yui/json/json-min.js"></script>
<script type="text/javascript" src="$CFG->wwwroot/lib/yui/button/button-min.js"></script>
<script type="text/javascript" src="$CFG->wwwroot/lib/yui/selector/selector-beta-min.js"></script>
<script type="text/javascript">
//<![CDATA[
2008-08-21 02:46:22 +00:00
var repository_client_$suffix = (function() {
// private static field
var dver = '1.0';
// private static methods
function alert_version(){
alert(dver);
}
function _client(){
// public varible
this.name = 'repository_client_$suffix';
// private varible
var Dom = YAHOO.util.Dom, Event = YAHOO.util.Event, layout = null, resize = null;
var IE_QUIRKS = (YAHOO.env.ua.ie && document.compatMode == "BackCompat");
var IE_SYNC = (YAHOO.env.ua.ie == 6 || (YAHOO.env.ua.ie == 7 && IE_QUIRKS));
var PANEL_BODY_PADDING = (10*2);
var btn_list = {label: '$strlistview', value: 'l', checked: true, onclick: {fn: _client.viewlist}};
var btn_thumb = {label: '$strthumbview', value: 't', onclick: {fn: _client.viewthumb}};
var repo_list = null;
var resize = null;
var panel = new YAHOO.widget.Panel('file-picker-$suffix', {
draggable: true,
close: true,
modal: true,
underlay: 'none',
width: '510px',
zindex: 666666,
xy: [50, Dom.getDocumentScrollTop()+20]
});
// construct code section
{
panel.setHeader('$strtitle');
panel.setBody('<div id="layout-$suffix"></div>');
panel.beforeRenderEvent.subscribe(function() {
Event.onAvailable('layout-$suffix', function() {
layout = new YAHOO.widget.Layout('layout-$suffix', {
height: 400, width: 490,
units: [
{position: 'top', height: 32, resize: false,
2008-08-21 02:46:22 +00:00
body:'<div class="yui-buttongroup" id="repo-viewbar-$suffix"></div>', gutter: '2'},
{position: 'left', width: 150, resize: true,
2008-08-21 02:46:22 +00:00
body:'<ul id="repo-list-$suffix"></ul>', gutter: '0 5 0 2', minWidth: 150, maxWidth: 300 },
{position: 'center', body: '<div id="panel-$suffix"></div>',
2008-08-21 02:46:22 +00:00
scroll: true, gutter: '0 2 0 0' }
]
});
2008-08-21 02:46:22 +00:00
layout.render();
});
});
resize = new YAHOO.util.Resize('file-picker-$suffix', {
handles: ['br'],
autoRatio: true,
status: true,
minWidth: 380,
minHeight: 400
});
resize.on('resize', function(args) {
var panelHeight = args.height;
var headerHeight = this.header.offsetHeight; // Content + Padding + Border
var bodyHeight = (panelHeight - headerHeight);
var bodyContentHeight = (IE_QUIRKS) ? bodyHeight : bodyHeight - PANEL_BODY_PADDING;
Dom.setStyle(this.body, 'height', bodyContentHeight + 'px');
if (IE_SYNC) {
this.sizeUnderlay();
this.syncIframe();
}
2008-08-21 02:46:22 +00:00
layout.set('height', bodyContentHeight);
layout.set('width', (args.width - PANEL_BODY_PADDING));
layout.resize();
}, panel, true);
_client.viewbar = new YAHOO.widget.ButtonGroup({
id: 'btngroup-$suffix',
name: 'buttons',
disabled: true,
container: 'repo-viewbar-$suffix'
});
}
// public method
this.show = function(){
panel.show();
}
this.hide = function(){
panel.hide();
}
this.create_picker = function(){
// display UI
panel.render();
_client.viewbar.addButtons([btn_list, btn_thumb]);
// init repository list
repo_list = new YAHOO.util.Element('repo-list-$suffix');
repo_list.on('contentReady', function(e){
for(var i=0; i<_client.repos.length; i++) {
var repo = _client.repos[i];
var li = document.createElement('li');
2008-08-21 02:46:22 +00:00
li.id = 'repo-$suffix-'+repo.id;
var icon = document.createElement('img');
icon.src = repo.icon;
icon.width = '16';
icon.height = '16';
li.appendChild(icon);
var link = document.createElement('a');
link.href = '###';
link.id = 'repo-call-$suffix-'+repo.id;
link.innerHTML = ' '+repo.name;
link.className = 'repo-name';
link.onclick = function(){
var re = /repo-call-$suffix-(\d+)/i;
var id = this.id.match(re);
repository_client_$suffix.req(id[1], '', 0);
2008-08-21 02:46:22 +00:00
}
li.appendChild(link);
var opt = document.createElement('div');
opt.id = 'repo-opt-$suffix-'+repo.id;
li.appendChild(opt);
this.appendChild(li);
repo = null;
2008-08-06 03:26:57 +00:00
}
2008-08-21 02:46:22 +00:00
});
}
}
// public static varible
_client.repos = [];
_client.repositoryid = 0;
// _client.ds save all data received from server side
_client.ds = null;
2008-08-21 02:46:22 +00:00
_client.viewmode = 0;
_client.viewbar =null;
// public static mehtod
_client.postdata = function(obj) {
var str = '';
for(k in obj) {
if(obj[k] instanceof Array) {
for(i in obj[k]) {
str += (encodeURIComponent(k) +'[]='+encodeURIComponent(obj[k][i]));
str += '&';
}
2008-08-21 02:46:22 +00:00
} else {
str += encodeURIComponent(k) +'='+encodeURIComponent(obj[k]);
str += '&';
}
2008-08-21 02:46:22 +00:00
}
return str;
}
2008-09-01 06:05:54 +00:00
_client.loading = function(type, name){
2008-08-21 02:46:22 +00:00
var panel = new YAHOO.util.Element('panel-$suffix');
panel.get('element').innerHTML = '';
var content = document.createElement('div');
2008-09-01 06:05:54 +00:00
content.style.textAlign='center';
var para = document.createElement('P');
var img = document.createElement('IMG');
if(type=='load'){
img.src = '$CFG->pixpath/i/loading.gif';
para.innerHTML = '$strloading';
}else{
img.src = '$CFG->pixpath/i/progressbar.gif';
para.innerHTML = '$strcopying '+name;
}
content.appendChild(para);
content.appendChild(img);
//content.innerHTML = '';
2008-08-21 02:46:22 +00:00
panel.get('element').appendChild(content);
}
_client.rename = function(oldname, url, icon){
2008-08-21 02:46:22 +00:00
var panel = new YAHOO.util.Element('panel-$suffix');
var html = '<div id="rename-form">';
html += '<p><img src="'+icon+'" /></p>';
html += '<p><label for="newname-$suffix">$strsaveas</label>';
html += '<input type="text" id="newname-$suffix" value="'+oldname+'" /></p>';
/**
html += '<p><label for="syncfile-$suffix">$strsync</label> ';
html += '<input type="checkbox" id="syncfile-$suffix" /></p>';
*/
html += '<p><input type="hidden" id="fileurl-$suffix" value="'+url+'" />';
2008-08-21 02:46:22 +00:00
html += '<a href="###" onclick="repository_client_$suffix.viewfiles()">$strback</a> ';
2008-08-21 06:13:27 +00:00
html += '<input type="button" onclick="repository_client_$suffix.download()" value="$strdownbtn" />';
html += '<input type="button" onclick="repository_client_$suffix.hide()" value="Cancle" /></p>';
2008-08-21 02:46:22 +00:00
html += '</div>';
panel.get('element').innerHTML = html;
}
_client.print_login = function(){
var panel = new YAHOO.util.Element('panel-$suffix');
var data = _client.ds.login;
var str = '';
for(var k in data){
str += '<p>';
var lable_id = '';
var field_id = '';
var field_value = '';
if(data[k].id){
lable_id = ' for="'+data[k].id+'"';
field_id = ' id="'+data[k].id+'"';
}
2008-08-21 02:46:22 +00:00
if (data[k].label) {
str += '<label'+lable_id+'>'+data[k].label+'</label>';
}
2008-08-21 02:46:22 +00:00
if(data[k].value){
field_value = ' value="'+data[k].value+'"';
}
2008-08-21 02:46:22 +00:00
str += '<input type="'+data[k].type+'"'+' name="'+data[k].name+'"'+field_id+field_value+' />';
str += '</p>';
}
str += '<p><input type="button" onclick="repository_client_$suffix.login()" value="$strsubmit" /></p>';
panel.get('element').innerHTML = str;
}
2008-08-21 02:46:22 +00:00
_client.viewfiles = function(){
if(_client.viewmode) {
_client.viewthumb();
} else {
_client.viewlist();
}
}
_client.navbar = function(){
var panel = new YAHOO.util.Element('panel-$suffix');
panel.get('element').innerHTML = _client.uploadcontrol();
panel.get('element').innerHTML += _client.makepage();
_client.makepath();
2008-08-21 02:46:22 +00:00
}
// TODO
// Improve CSS
_client.viewthumb = function(ds){
_client.viewmode = 1;
2008-08-21 02:46:22 +00:00
var panel = new YAHOO.util.Element('panel-$suffix');
_client.viewbar.check(1);
var list = null;
var args = arguments.length;
if(args == 1){
list = ds;
} else {
// from button
list = _client.ds.list;
}
_client.navbar();
var count = 0;
2008-08-21 02:46:22 +00:00
for(k in list){
var el = document.createElement('div');
el.className='grid';
var frame = document.createElement('DIV');
frame.style.textAlign='center';
2008-08-21 02:46:22 +00:00
var img = document.createElement('img');
img.src = list[k].thumbnail;
var link = document.createElement('A');
link.href='###';
link.id = 'img-id-'+String(count);
link.appendChild(img);
frame.appendChild(link);
2008-08-21 02:46:22 +00:00
var title = document.createElement('div');
if(list[k].children){
title.innerHTML = '<i><u>'+list[k].title+'</i></u>';
} else {
if(list[k].url)
title.innerHTML = '<p><a target="_blank" href="'+list[k].url+'">$strpreview</a></p>';
title.innerHTML += list[k].title;
}
title.className = 'label';
el.appendChild(frame);
2008-08-21 02:46:22 +00:00
el.appendChild(title);
panel.get('element').appendChild(el);
if(list[k].children){
var el = new YAHOO.util.Element(link.id);
el.ds = list[k].children;
el.on('click', function(){
if(_client.ds.dynload){
// TODO: get file list dymanically
}else{
_client.viewthumb(this.ds);
}
});
} else {
var el = new YAHOO.util.Element(link.id);
el.title = list[k].title;
el.value = list[k].source;
el.icon = list[k].thumbnail;
el.on('click', function(){
repository_client_$suffix.rename(this.title, this.value, this.icon);
});
}
count++;
2008-08-21 02:46:22 +00:00
}
}
_client.buildtree = function(node, level){
if(node.children){
node.title = '<i><u>'+node.title+'</u></i>';
}
var info = {label:node.title, title:"$strdate"+node.date+' '+'$strsize'+node.size};
var tmpNode = new YAHOO.widget.TextNode(info, level, false);
2008-08-21 02:46:22 +00:00
var tooltip = new YAHOO.widget.Tooltip(tmpNode.labelElId, {
context:tmpNode.labelElId, text:info.title});
tmpNode.filename = node.title;
tmpNode.value = node.source;
tmpNode.icon = node.thumbnail;
2008-08-21 02:46:22 +00:00
if(node.children){
tmpNode.isLeaf = false;
if (node.path) {
tmpNode.path = node.path;
} else {
tmpNode.path = '';
}
2008-08-21 02:46:22 +00:00
for(var c in node.children){
_client.buildtree(node.children[c], tmpNode);
}
2008-08-21 02:46:22 +00:00
} else {
tmpNode.isLeaf = true;
tmpNode.onLabelClick = function() {
repository_client_$suffix.rename(this.filename, this.value, this.icon);
}
2008-08-21 02:46:22 +00:00
}
}
_client.dynload = function (node, fnLoadComplete){
var callback = {
success: function(o) {
try {
var json = YAHOO.lang.JSON.parse(o.responseText);
} catch(e) {
2008-08-20 04:53:42 +00:00
alert('$strinvalidjson - '+o.responseText);
}
2008-08-20 03:47:05 +00:00
for(k in json.list){
_client.buildtree(json.list[k], node);
}
o.argument.fnLoadComplete();
},
failure:function(oResponse){
2008-08-20 04:53:42 +00:00
alert('$strerror');
oResponse.argument.fnLoadComplete();
},
argument:{"node":node, "fnLoadComplete": fnLoadComplete},
timeout:600
}
var params = [];
params['p']=node.path;
params['env']=_client.env;
params['sesskey']='$sesskey';
params['ctx_id']=$context->id;
params['repo_id']=_client.repositoryid;
var trans = YAHOO.util.Connect.asyncRequest('POST',
'$CFG->wwwroot/repository/ws.php?action=list', callback, _client.postdata(params));
}
2008-08-21 02:46:22 +00:00
_client.viewlist = function(){
_client.viewmode = 0;
2008-08-21 02:46:22 +00:00
var panel = new YAHOO.util.Element('panel-$suffix');
_client.viewbar.check(0);
list = _client.ds.list;
_client.navbar();
panel.get('element').innerHTML += '<div id="treediv"></div>';
2008-08-21 02:46:22 +00:00
var tree = new YAHOO.widget.TreeView('treediv');
if(_client.ds.dynload) {
tree.setDynamicLoad(_client.dynload, 1);
} else {
}
for(k in list){
_client.buildtree(list[k], tree.getRoot());
}
tree.draw();
}
_client.upload = function(){
var u = _client.ds.upload;
var aform = document.getElementById(u.id);
var parent = document.getElementById(u.id+'_div');
2008-09-01 08:48:32 +00:00
var d = document.getElementById(_client.ds.upload.id+'-file');
if(d.value!='' && d.value!=null){
var container = document.createElement('DIV');
container.id = u.id+'_loading';
container.style.textAlign='center';
var img = document.createElement('IMG');
img.src = '$CFG->pixpath/i/progressbar.gif';
var para = document.createElement('p');
para.innerHTML = '$struploading';
container.appendChild(para);
container.appendChild(img);
parent.appendChild(container);
YAHOO.util.Connect.setForm(aform, true, true);
var trans = YAHOO.util.Connect.asyncRequest('POST',
'$CFG->wwwroot/repository/ws.php?action=upload&sesskey=$sesskey&ctx_id=$context->id&repo_id='
+_client.repositoryid,
_client.upload_cb);
}else{
alert('$strfilenotnull');
}
2008-08-21 02:46:22 +00:00
}
_client.upload_cb = {
upload: function(o){
2008-09-01 08:19:28 +00:00
try {
var ret = YAHOO.lang.JSON.parse(o.responseText);
} catch(e) {
alert('$strinvalidjson - '+o.responseText);
}
if(ret && ret.e){
var panel = new YAHOO.util.Element('panel-$suffix');
panel.get('element').innerHTML = ret.e;
return;
}
if(ret){
alert('$strsaved');
repository_client_$suffix.end(ret);
}else{
alert('$strinvalidjson');
}
2008-08-21 02:46:22 +00:00
}
}
_client.uploadcontrol = function() {
var str = '';
if(_client.ds.upload){
str += '<div id="'+_client.ds.upload.id+'_div">';
str += '<form id="'+_client.ds.upload.id+'" onsubmit="return false">';
2008-09-01 08:19:28 +00:00
str += '<label for="'+_client.ds.upload.id+'-file">'+_client.ds.upload.label+'</label>';
str += '<input type="file" id="'+_client.ds.upload.id+'-file" name="repo_upload_file" />';
2008-08-21 02:46:22 +00:00
str += '<p class="upload"><a href="###" onclick="return repository_client_$suffix.upload();">$strupload</a></p>';
str += '</form>';
str += '</div>';
}
return str;
}
_client.makepage = function(){
var str = '';
if(_client.ds.pages){
str += '<div id="paging-$suffix">';
for(var i = 1; i <= _client.ds.pages; i++) {
str += '<a onclick="repository_client_$suffix.req('+_client.repositoryid+', '+i+', 0)" href="###">';
str += String(i);
str += '</a> ';
}
2008-08-21 02:46:22 +00:00
str += '</div>';
}
return str;
}
_client.makepath = function(){
if(_client.viewmode == 0) {
return;
}
var panel = new YAHOO.util.Element('panel-$suffix');
var p = _client.ds.path;
if(p && p.length!=0){
var oDiv = document.createElement('DIV');
oDiv.id = "path-$suffix";
panel.get('element').appendChild(oDiv);
for(var i = 0; i < _client.ds.path.length; i++) {
var link = document.createElement('A');
link.href = "###";
link.innerHTML = _client.ds.path[i].name;
link.id = 'path-'+i+'-el';
var sep = document.createElement('SPAN');
sep.innerHTML = '/';
oDiv.appendChild(link);
oDiv.appendChild(sep);
var el = new YAHOO.util.Element(link.id);
el.id = _client.repositoryid;
el.path = _client.ds.path[i].path;
el.on('click', function(){
repository_client_$suffix.req(this.id, this.path, 0);
});
}
}
}
2008-08-21 02:46:22 +00:00
// send download request
_client.download = function(){
var title = document.getElementById('newname-$suffix').value;
var file = document.getElementById('fileurl-$suffix').value;
2008-09-01 06:05:54 +00:00
_client.loading('download', title);
var params = [];
params['env']=_client.env;
params['file']=file;
params['title']=title;
params['sesskey']='$sesskey';
params['ctx_id']=$context->id;
params['repo_id']=_client.repositoryid;
var trans = YAHOO.util.Connect.asyncRequest('POST',
'$CFG->wwwroot/repository/ws.php?action=download', _client.dlfile, _client.postdata(params));
2008-08-21 02:46:22 +00:00
}
// send login request
_client.login = function(){
var params = [];
2008-08-21 02:46:22 +00:00
var data = _client.ds.login;
for (var k in data) {
var el = document.getElementsByName(data[k].name)[0];
params[data[k].name] = '';
if(el.type == 'checkbox') {
params[data[k].name] = el.checked;
} else {
params[data[k].name] = el.value;
}
2008-08-21 02:46:22 +00:00
}
params['env'] = _client.env;
params['ctx_id'] = $context->id;
params['sesskey']= '$sesskey';
2008-09-01 06:05:54 +00:00
_client.loading('load');
var trans = YAHOO.util.Connect.asyncRequest('POST',
'$CFG->wwwroot/repository/ws.php?action=sign', _client.callback, _client.postdata(params));
2008-08-21 02:46:22 +00:00
}
_client.end = function(str){
if(_client.env=='form'){
_client.target.value = str['id'];
}else{
_client.target.value = str['url'];
}
_client.formcallback(str['file']);
2008-08-21 02:46:22 +00:00
_client.instance.hide();
_client.viewfiles();
}
_client.hide = function(){
_client.instance.hide();
_client.viewfiles();
}
2008-08-21 02:46:22 +00:00
_client.callback = {
success: function(o) {
var panel = new YAHOO.util.Element('panel-$suffix');
try {
var ret = YAHOO.lang.JSON.parse(o.responseText);
} catch(e) {
alert('$strinvalidjson - '+o.responseText);
};
if(ret && ret.e){
2008-08-21 02:46:22 +00:00
panel.get('element').innerHTML = ret.e;
return;
}
2008-08-21 02:46:22 +00:00
_client.ds = ret;
var oDiv = document.getElementById('repo-opt-$suffix-'
+_client.repositoryid);
oDiv.innerHTML = '';
var search = null;
var logout = null;
var mgr = null;
if(_client.ds && _client.ds.login){
2008-08-21 02:46:22 +00:00
_client.print_login();
} else if(_client.ds.list) {
if(_client.viewmode) {
_client.viewthumb();
} else {
_client.viewlist();
}
2008-08-21 02:46:22 +00:00
search = document.createElement('a');
search.href = '###';
search.innerHTML = '$strsearch ';
search.id = 'repo-search-$suffix-'+_client.repositoryid;
search.onclick = function() {
var re = /repo-search-$suffix-(\d+)/i;
var id = this.id.match(re);
repository_client_$suffix.search(id[1]);
}
2008-08-21 02:46:22 +00:00
logout = document.createElement('a');
logout.href = '###';
logout.innerHTML = '$strlogout';
logout.id = 'repo-logout-$suffix-'+_client.repositoryid;
logout.onclick = function() {
var re = /repo-logout-$suffix-(\d+)/i;
var id = this.id.match(re);
var oDiv = document.getElementById('repo-opt-$suffix-'+id[1]);
2008-08-20 07:51:42 +00:00
oDiv.innerHTML = '';
2008-08-21 06:13:27 +00:00
_client.ds = null;
2008-08-21 02:46:22 +00:00
repository_client_$suffix.req(id[1], 1, 1);
}
2008-08-21 02:46:22 +00:00
if(_client.ds.manage){
mgr = document.createElement('A');
mgr.innerHTML = '$strmgr ';
mgr.href = _client.ds.manage;
mgr.id = 'repo-mgr-$suffix-'+_client.repositoryid;
mgr.target = "_blank";
}
oDiv.appendChild(search);
if(mgr != null) {
oDiv.appendChild(mgr);
}
if(_client.ds.nologin != true){
oDiv.appendChild(logout);
}
}
2008-08-21 02:46:22 +00:00
}
}
_client.dlfile = {
success: function(o) {
var panel = new YAHOO.util.Element('panel-$suffix');
try {
var ret = YAHOO.lang.JSON.parse(o.responseText);
} catch(e) {
alert('$strinvalidjson - '+o.responseText);
}
if(ret && ret.e){
2008-08-21 02:46:22 +00:00
panel.get('element').innerHTML = ret.e;
return;
}
if(ret){
repository_client_$suffix.end(ret);
}else{
alert('$strinvalidjson');
}
2008-08-21 02:46:22 +00:00
}
}
// request file list or login
_client.req = function(id, path, reset) {
_client.viewbar.set('disabled', false);
2008-09-01 06:05:54 +00:00
_client.loading('load');
2008-08-21 02:46:22 +00:00
_client.repositoryid = id;
2008-08-21 06:13:27 +00:00
if (reset == 1) {
action = 'logout';
} else {
action = 'list';
}
var params = [];
params['p'] = path;
params['reset']=reset;
params['env']=_client.env;
params['action']=action;
params['sesskey']='$sesskey';
params['ctx_id']=$context->id;
params['repo_id']=id;
var trans = YAHOO.util.Connect.asyncRequest('POST', '$CFG->wwwroot/repository/ws.php?action='+action, _client.callback, _client.postdata(params));
2008-08-21 02:46:22 +00:00
}
_client.search = function(id){
var data = window.prompt("$strsearching");
if(data == '') {
alert('$strnoenter');
return;
}
_client.viewbar.set('disabled', false);
2008-09-01 06:05:54 +00:00
_client.loading('load');
var params = [];
params['s']=data;
params['env']=_client.env;
params['sesskey']='$sesskey';
params['ctx_id']=$context->id;
params['repo_id']=id;
var trans = YAHOO.util.Connect.asyncRequest('POST', '$CFG->wwwroot/repository/ws.php?action=search', _client.callback, _client.postdata(params));
2008-08-21 02:46:22 +00:00
}
return _client;
})();
EOD;
$repos = repository_get_instances($context);
foreach($repos as $repo) {
$js .= "\r\n";
$js .= 'repository_client_'.$suffix.'.repos.push('.json_encode($repo->ajax_info()).');'."\n";
}
$js .= "\r\n";
$js .= <<<EOD
2008-08-21 06:13:27 +00:00
function openpicker_$suffix(params) {
if(!repository_client_$suffix.instance) {
repository_client_$suffix.env = params.env;
repository_client_$suffix.target = params.target;
if(params.type){
repository_client_$suffix.filetype = params.filetype;
} else {
repository_client_$suffix.filetype = 'all';
}
2008-08-21 06:13:27 +00:00
repository_client_$suffix.instance = new repository_client_$suffix();
repository_client_$suffix.instance.create_picker();
if(params.callback){
repository_client_$suffix.formcallback = params.callback;
} else {
2008-08-21 06:13:27 +00:00
repository_client_$suffix.formcallback = function(){};
}
2008-08-21 06:13:27 +00:00
} else {
repository_client_$suffix.instance.show();
}
2008-08-21 06:13:27 +00:00
}
//]]>
</script>
EOD;
return array('css'=>$css, 'js'=>$js, 'suffix'=>$suffix);
}
2008-08-28 06:15:19 +00:00
/**
* TODO: write comment
*/
final class repository_admin_form extends moodleform {
protected $instance;
protected $plugin;
2008-08-28 06:15:19 +00:00
/**
* TODO: write comment
* @global <type> $CFG
*/
public function definition() {
global $CFG;
// type of plugin, string
$this->plugin = $this->_customdata['plugin'];
$this->typeid = $this->_customdata['typeid'];
$this->instance = (isset($this->_customdata['instance'])
&& is_subclass_of($this->_customdata['instance'], 'repository'))
? $this->_customdata['instance'] : null;
$mform =& $this->_form;
$strrequired = get_string('required');
$mform->addElement('hidden', 'edit', ($this->instance) ? $this->instance->id : 0);
$mform->addElement('hidden', 'new', $this->plugin);
$mform->addElement('hidden', 'plugin', $this->plugin);
$mform->addElement('hidden', 'typeid', $this->typeid);
$mform->addElement('text', 'name', get_string('name'), 'maxlength="100" size="30"');
$mform->addRule('name', $strrequired, 'required', null, 'client');
// let the plugin add the fields they want (either statically or not)
if (repository_static_function($this->plugin, 'has_admin_config')) {
if (!$this->instance) {
$result = repository_static_function($this->plugin, 'admin_config_form', $mform);
} else {
$result = $this->instance->admin_config_form($mform);
}
}
// and set the data if we have some.
if ($this->instance) {
$data = array();
$data['name'] = $this->instance->name;
foreach ($this->instance->get_option_names() as $config) {
if (!empty($this->instance->$config)) {
$data[$config] = $this->instance->$config;
} else {
$data[$config] = '';
}
}
$this->set_data($data);
}
$this->add_action_buttons(true, get_string('submit'));
}
2008-08-28 06:15:19 +00:00
/**
* TODO: write comment
* @global <type> $DB
* @param <type> $data
* @return <type>
*/
public function validation($data) {
global $DB;
$errors = array();
if ($DB->count_records('repository_instances', array('name' => $data['name'], 'typeid' => $data['typeid'])) > 1) {
$errors = array('name' => get_string('err_uniquename', 'repository'));
}
$pluginerrors = array();
if ($this->instance) {
//$pluginerrors = $this->instance->admin_config_validation($data);
} else {
//$pluginerrors = repository_static_function($this->plugin, 'admin_config_validation', $data);
}
if (is_array($pluginerrors)) {
$errors = array_merge($errors, $pluginerrors);
}
return $errors;
}
}