Added the cloud file links feature to be able to add links to cloud hostings as if they were documents.
parent
a7a1cb02d7
commit
cbd785478c
@ -0,0 +1,45 @@ |
|||||||
|
<?php |
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
|
||||||
|
namespace Application\Migrations\Schema\V111; |
||||||
|
|
||||||
|
use Application\Migrations\AbstractMigrationChamilo, |
||||||
|
Doctrine\DBAL\Schema\Schema, |
||||||
|
Doctrine\DBAL\Types\Type; |
||||||
|
|
||||||
|
/** |
||||||
|
* Class Version20171127103000 |
||||||
|
* |
||||||
|
* Adding cloud files' link document type and enabling/disabling option |
||||||
|
* |
||||||
|
* @package Application\Migrations\Schema\V111 |
||||||
|
*/ |
||||||
|
class Version20171127103000 extends AbstractMigrationChamilo |
||||||
|
{ |
||||||
|
/** |
||||||
|
* @param \Doctrine\DBAL\Schema\Schema $schema |
||||||
|
*/ |
||||||
|
public function up(Schema $schema) |
||||||
|
{ |
||||||
|
$this->addSql("ALTER TABLE c_document CHANGE filetype filetype SET('file','folder','link');"); |
||||||
|
|
||||||
|
$this->addSql("INSERT INTO `settings_options` (`variable`, `value`, `display_text`) VALUES |
||||||
|
('enable_add_file_link', 'true', 'Yes'), |
||||||
|
('enable_add_file_link', 'false', 'No');"); |
||||||
|
|
||||||
|
$this->addSql("INSERT INTO `settings_current` |
||||||
|
(`variable`, `subkey`, `type`, `category`, `selected_value`, `title`, `comment`, `scope`, `subkeytext`, `access_url`, `access_url_changeable`, `access_url_locked`) |
||||||
|
VALUES ('enable_add_file_link', NULL, 'radio', 'Tools', 'false', 'enable_add_file_link_title', 'enable_add_file_link_comment', NULL, NULL, 1, 0, 0);"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* @param \Doctrine\DBAL\Schema\Schema $schema |
||||||
|
*/ |
||||||
|
public function down(Schema $schema) |
||||||
|
{ |
||||||
|
$this->addSql("ALTER TABLE c_document CHANGE filetype filetype SET('file','folder');"); |
||||||
|
|
||||||
|
$this->addSql("DELETE FROM `settings_options` WHERE `variable` = 'enable_add_file_link'"); |
||||||
|
$this->addSql("DELETE FROM `settings_current` WHERE `variable` = 'enable_add_file_link'"); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,182 @@ |
|||||||
|
<?php |
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
/** |
||||||
|
* This script allows to add cloud file links to the document structure |
||||||
|
* @package chamilo.document |
||||||
|
*/ |
||||||
|
/** |
||||||
|
* Code |
||||||
|
*/ |
||||||
|
|
||||||
|
// Including the global initialization file |
||||||
|
require_once '../inc/global.inc.php'; |
||||||
|
|
||||||
|
// Including additional libraries |
||||||
|
require_once '../inc/lib/document.lib.php'; |
||||||
|
require_once '../inc/lib/urlUtils.lib.php'; |
||||||
|
|
||||||
|
if (api_get_setting('enable_add_file_link') == 'false') { |
||||||
|
api_not_allowed(true); |
||||||
|
} |
||||||
|
|
||||||
|
$course_info = api_get_course_info(); |
||||||
|
|
||||||
|
if (empty($course_info)) { |
||||||
|
api_not_allowed(true); |
||||||
|
} |
||||||
|
|
||||||
|
$document_data = DocumentManager::get_document_data_by_id($_REQUEST['id'], api_get_course_id(), true); |
||||||
|
if (empty($document_data)) { |
||||||
|
$document_id = $parent_id = 0; |
||||||
|
$path = '/'; |
||||||
|
} else { |
||||||
|
if ($document_data['filetype'] == 'folder') { |
||||||
|
$document_id = $document_data['id']; |
||||||
|
$path = $document_data['path']."/"; |
||||||
|
$parent_id = DocumentManager::get_document_id(api_get_course_info(), dirname($path)); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$is_allowed_to_edit = api_is_allowed_to_edit(null, true); |
||||||
|
|
||||||
|
if (api_get_group_id()) { |
||||||
|
// If the group id is set, check if the user has the right to be here |
||||||
|
// Needed for group related stuff |
||||||
|
require_once api_get_path(LIBRARY_PATH).'groupmanager.lib.php'; |
||||||
|
// Get group info |
||||||
|
$group_properties = GroupManager::get_group_properties(api_get_group_id()); |
||||||
|
|
||||||
|
if ($is_allowed_to_edit || GroupManager::is_user_in_group($_user['user_id'], api_get_group_id())) { // Only courseadmin or group members allowed |
||||||
|
$to_group_id = api_get_group_id(); |
||||||
|
$req_gid = '&gidReq='.api_get_group_id(); |
||||||
|
$interbreadcrumb[] = array('url' => '../group/group_space.php?gidReq='.api_get_group_id(), 'name' => get_lang('GroupSpace')); |
||||||
|
} else { |
||||||
|
api_not_allowed(true); |
||||||
|
} |
||||||
|
} elseif ($is_allowed_to_edit || DocumentManager::is_my_shared_folder(api_get_user_id(), $path, api_get_session_id())) { |
||||||
|
// Admin for "regular" upload, no group documents. And check if is my shared folder |
||||||
|
$to_group_id = 0; |
||||||
|
$req_gid = ''; |
||||||
|
} else { // No course admin and no group member... |
||||||
|
api_not_allowed(true); |
||||||
|
} |
||||||
|
|
||||||
|
// Group docs can only be uploaded in the group directory |
||||||
|
if ($to_group_id != 0 && $path == '/') { |
||||||
|
$path = $group_properties['directory'] . "/"; |
||||||
|
} |
||||||
|
|
||||||
|
// Breadcrumbs |
||||||
|
if ($is_certificate_mode) { |
||||||
|
$interbreadcrumb[] = array('url' => '../gradebook/'.$_SESSION['gradebook_dest'], 'name' => get_lang('Gradebook')); |
||||||
|
} else { |
||||||
|
$interbreadcrumb[] = array('url' => './document.php?id='.$document_id.$req_gid, 'name'=> get_lang('Documents')); |
||||||
|
} |
||||||
|
|
||||||
|
// Interbreadcrumb for the current directory root path |
||||||
|
if (empty($document_data['parents'])) { |
||||||
|
// Hack in order to not add the document to the breadcrumb in case it is a link |
||||||
|
if ($document_data['filetype'] != 'link') { |
||||||
|
$interbreadcrumb[] = array('url' => '#', 'name' => $document_data['title']); |
||||||
|
} |
||||||
|
} else { |
||||||
|
foreach ($document_data['parents'] as $document_sub_data) { |
||||||
|
// Hack in order to not add the document to the breadcrumb in case it is a link |
||||||
|
if ($document_data['filetype'] != 'link') { |
||||||
|
$interbreadcrumb[] = array('url' => $document_sub_data['document_url'], 'name' => $document_sub_data['title']); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$this_section = SECTION_COURSES; |
||||||
|
|
||||||
|
$nameTools = get_lang('LinkAdd'); |
||||||
|
|
||||||
|
// Display the header |
||||||
|
Display::display_header($nameTools, 'Doc'); |
||||||
|
|
||||||
|
/* Here we do all the work */ |
||||||
|
|
||||||
|
// Actions |
||||||
|
echo '<div class="actions">'; |
||||||
|
// Link back to the documents overview |
||||||
|
if ($is_certificate_mode) { |
||||||
|
echo '<a href="document.php?id='.$document_id.'&selectcat=' . $selectcat.'">'.Display::return_icon('back.png', get_lang('BackTo').' '.get_lang('CertificateOverview'), '', ICON_SIZE_MEDIUM).'</a>'; |
||||||
|
} else { |
||||||
|
echo '<a href="document.php?id='.$document_id.'">'.Display::return_icon('back.png', get_lang('BackTo').' '.get_lang('DocumentsOverview'), '', ICON_SIZE_MEDIUM).'</a>'; |
||||||
|
} |
||||||
|
echo '</div>'; |
||||||
|
|
||||||
|
// Form to select directory |
||||||
|
$folders = DocumentManager::get_all_document_folders( |
||||||
|
$_course, |
||||||
|
$groupIid, |
||||||
|
$is_allowed_to_edit |
||||||
|
); |
||||||
|
if (!$is_certificate_mode) { |
||||||
|
echo DocumentManager::build_directory_selector( |
||||||
|
$folders, |
||||||
|
$document_id, |
||||||
|
(isset($group_properties['directory']) ? $group_properties['directory'] : array()) |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
$action = api_get_self().'?'.api_get_cidreq().'&id='.$document_id; |
||||||
|
|
||||||
|
// URLs in whitelist |
||||||
|
$urlWL = URLUtils::getFileHostingsWL(); |
||||||
|
sort($urlWL); |
||||||
|
$urlWLRegEx = '/(\/\/|\.)('.implode('|', $urlWL).')/i'; //Matches any of the whitelisted urls preceded by // or . |
||||||
|
$urlWLText = "\n\t* ".implode("\n\t* ", $urlWL); |
||||||
|
$urlWLHTML = "<ul><li>".implode("</li><li>", $urlWL)."</li></ul>"; |
||||||
|
|
||||||
|
$form = new FormValidator('upload', 'POST', $action, '', array('enctype' => 'multipart/form-data')); |
||||||
|
$form->addElement('hidden', 'linkid', $document_id); |
||||||
|
$form->addElement('hidden', 'curdirpath', $path); |
||||||
|
$form->addElement('text', 'name', get_lang('LinkName'), array('id' => 'name_link')); |
||||||
|
$form->addElement('text', 'url', get_lang('Url'), array('id' => 'url_link')); |
||||||
|
$form->addElement('static', 'info', '', '<span class="text-primary" data-toggle="tooltip" title="'.$urlWLHTML.'">'.get_lang('ValidDomainsList').' <span class="glyphicon glyphicon-question-sign"></span></span>'); |
||||||
|
$form->addButtonSend(get_lang('AddCloudLink'), 'submitDocument'); |
||||||
|
|
||||||
|
$form->addRule('name', get_lang('PleaseEnterCloudLinkName'), 'required', null, 'client'); |
||||||
|
$form->addRule('name', get_lang('PleaseEnterCloudLinkName'), 'required', null, 'server'); |
||||||
|
$form->addRule('url', get_lang('langGiveURL'), 'required', null, 'client'); |
||||||
|
$form->addRule('url', get_lang('langGiveURL'), 'required', null, 'server'); |
||||||
|
// Well formed url pattern (must have the protocol) |
||||||
|
$urlRegEx = URLUtils::getWellformedUrlRegex(); |
||||||
|
$form->addRule('url', get_lang('MalformedUrl'), 'regex', $urlRegEx, 'client'); |
||||||
|
$form->addRule('url', get_lang('MalformedUrl'), 'regex', $urlRegEx, 'server'); |
||||||
|
$form->addRule('url', get_lang('NotValidDomain').$urlWLText, 'regex', $urlWLRegEx, 'client'); |
||||||
|
$form->addRule('url', get_lang('NotValidDomain').$urlWLHTML, 'regex', $urlWLRegEx, 'server'); |
||||||
|
|
||||||
|
if ($form->validate()) { |
||||||
|
if (isset($_REQUEST['linkid'])) { |
||||||
|
$doc_id = DocumentManager::addCloudLink($course_info, $path, $_REQUEST['url'], $_REQUEST['name']); |
||||||
|
if ($doc_id) { |
||||||
|
Display::display_confirmation_message(get_lang('CloudLinkAdded') . '<br />', false); |
||||||
|
} else { |
||||||
|
if (DocumentManager::cloudLinkExists($course_info, $path, $_REQUEST['url'])) { |
||||||
|
Display::display_error_message(get_lang('UrlAlreadyExists'), false); |
||||||
|
} else { |
||||||
|
Display::display_error_message(get_lang('ErrorAddCloudLink'), false); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Add tooltip and correctly parse its inner HTML |
||||||
|
echo '<script> |
||||||
|
$(document).ready(function() { |
||||||
|
$("[data-toggle=\'tooltip\']").tooltip( |
||||||
|
{ |
||||||
|
content: |
||||||
|
function() { |
||||||
|
return $(this).attr("title"); |
||||||
|
} |
||||||
|
} |
||||||
|
); |
||||||
|
}); |
||||||
|
</script>'; |
||||||
|
|
||||||
|
echo $form->return_form(); |
||||||
|
Display::display_footer(); |
After Width: | Height: | Size: 927 B |
After Width: | Height: | Size: 997 B |
After Width: | Height: | Size: 927 B |
After Width: | Height: | Size: 997 B |
After Width: | Height: | Size: 1.6 KiB |
@ -0,0 +1,56 @@ |
|||||||
|
<?php |
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
|
||||||
|
/** |
||||||
|
* Class URLUtils |
||||||
|
* This class contains some utilities to work with urls |
||||||
|
* |
||||||
|
* @package chamilo.library |
||||||
|
*/ |
||||||
|
class URLUtils |
||||||
|
{ |
||||||
|
|
||||||
|
/** |
||||||
|
* Construct |
||||||
|
*/ |
||||||
|
private function __construct() |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Gets the wellformed URLs regular expression in order to use it on forms' verifications |
||||||
|
* |
||||||
|
* @author Aquilino Blanco Cores <aqblanco@gmail.com> |
||||||
|
* @return the wellformed URLs regular expressions string |
||||||
|
*/ |
||||||
|
public static function getWellformedUrlRegex() |
||||||
|
{ |
||||||
|
return '/\(?((http|https|ftp):\/\/)(?:((?:[^\W\s]|\.|-|[:]{1})+)@{1})?((?:www.)?(?:[^\W\s]|\.|-)+[\.][^\W\s]{2,4}|localhost(?=\/)|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?::(\d*))?([\/]?[^\s\?]*[\/]{1})*(?:\/?([^\s\n\?\[\]\{\}\#]*(?:(?=\.)){1}|[^\s\n\?\[\]\{\}\.\#]*)?([\.]{1}[^\s\?\#]*)?)?(?:\?{1}([^\s\n\#\[\]]*))?([\#][^\s\n]*)?\)?/i'; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Gets the files hosting sites' whitelist |
||||||
|
* |
||||||
|
* @author Aquilino Blanco Cores <aqblanco@gmail.com> |
||||||
|
* @return array the sites list. |
||||||
|
*/ |
||||||
|
public static function getFileHostingsWL() |
||||||
|
{ |
||||||
|
return array( |
||||||
|
"asuswebstorage.com", |
||||||
|
"dropbox.com", |
||||||
|
"dropboxusercontent.com", |
||||||
|
"fileserve.com", |
||||||
|
"drive.google.com", |
||||||
|
"icloud.com", |
||||||
|
"mediafire.com", |
||||||
|
"mega.nz", |
||||||
|
"onedrive.live.com", |
||||||
|
"slideshare.net", |
||||||
|
"scribd.com", |
||||||
|
"wetransfer.com", |
||||||
|
"box.com", |
||||||
|
"livefilestore.com" // OneDrive |
||||||
|
); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue