Hi,
I'm using Essential (version 2.7) theme in moodle. In settings section, I'd like to use html editor with the option to upload images. My solution:
In settings.php file:
global $CFG;
require_once($CFG->dirroot.'/local/icsbcn/lib/admin_setting_confightmleditor_icsbcn.class.php');
$setting = new admin_setting_confightmleditor_icsbcn($name, $title, $description, $default);
In admin_setting_confightmleditor_icsbcn.class.php file:
<?php
global $CFG;
require_once($CFG->libdir.'/adminlib.php');
require_once($CFG->libdir.'/filelib.php');
/**
* General text area with html editor.
*/
class admin_setting_confightmleditor_icsbcn extends admin_setting_configtext {
private $rows;
private $cols;
private $options;
/**
* @param string $name
* @param string $visiblename
* @param string $description
* @param mixed $defaultsetting string or array
* @param mixed $paramtype
*/
public function __construct($name, $visiblename, $description, $defaultsetting, $paramtype=PARAM_RAW, $cols='60', $rows='8') {
$this->rows = $rows;
$this->cols = $cols;
parent::__construct($name, $visiblename, $description, $defaultsetting, $paramtype);
editors_head_setup();
}
private function get_options() {
global $USER;
$ctx = context_user::instance($USER->id);
$default = array();
$default['noclean'] = false;
$default['context'] = $ctx;
$default['maxbytes'] = 0;
$default['maxfiles'] = -1;
$default['forcehttps'] = false;
$default['subdirs'] = false;
$default['changeformat'] = 0;
$default['areamaxbytes'] = FILE_AREA_MAX_BYTES_UNLIMITED;
$default['return_types'] = (FILE_INTERNAL | FILE_EXTERNAL);
return $default;
}
/**
* Returns an XHTML string for the editor
*
* @param string $data
* @param string $query
* @return string XHTML string for the editor
*/
public function output_html($data, $query='') {
global $USER;
$default = $this->get_defaultsetting();
$defaultinfo = $default;
if (!is_null($default) and $default !== '') {
$defaultinfo = "\n".$default;
}
$ctx = context_user::instance($USER->id);
$editor = editors_get_preferred_editor(FORMAT_HTML);
$options = $this->get_options();
$draftitemid = file_get_unused_draft_itemid();
$component = is_null($this->plugin) ? 'core' : $this->plugin;
$data = file_prepare_draft_area($draftitemid, $options['context']->id, $component, $this->get_full_name().'_draftitemid', $draftitemid, $options, $data);
$fpoptions = array();
$args = new stdClass();
// need these three to filter repositories list
$args->accepted_types = array('web_image');
$args->return_types = $options['return_types'];
$args->context = $ctx;
$args->env = 'filepicker';
// advimage plugin
$image_options = initialise_filepicker($args);
$image_options->context = $ctx;
$image_options->client_id = uniqid();
$image_options->maxbytes = $options['maxbytes'];
$image_options->areamaxbytes = $options['areamaxbytes'];
$image_options->env = 'editor';
$image_options->itemid = $draftitemid;
// moodlemedia plugin
$args->accepted_types = array('video', 'audio');
$media_options = initialise_filepicker($args);
$media_options->context = $ctx;
$media_options->client_id = uniqid();
$media_options->maxbytes = $options['maxbytes'];
$media_options->areamaxbytes = $options['areamaxbytes'];
$media_options->env = 'editor';
$media_options->itemid = $draftitemid;
// advlink plugin
$args->accepted_types = '*';
$link_options = initialise_filepicker($args);
$link_options->context = $ctx;
$link_options->client_id = uniqid();
$link_options->maxbytes = $options['maxbytes'];
$link_options->areamaxbytes = $options['areamaxbytes'];
$link_options->env = 'editor';
$link_options->itemid = $draftitemid;
$fpoptions['image'] = $image_options;
$fpoptions['media'] = $media_options;
$fpoptions['link'] = $link_options;
$editor->use_editor($this->get_id(), $options, $fpoptions);
return format_admin_setting($this, $this->visiblename,
'<div class="form-textarea"><textarea rows="'. $this->rows .'" cols="'. $this->cols .'" id="'. $this->get_id() .'" name="'. $this->get_full_name() .'" spellcheck="true">'. s($data) .'</textarea></div>
<input value="'.$draftitemid.'" name="'.$this->get_full_name().'_draftitemid" type="hidden" />',
$this->description, true, '', $defaultinfo, $query);
}
public function write_setting($data) {
global $CFG;
if ($this->paramtype === PARAM_INT and $data === '') {
// do not complain if '' used instead of 0
$data = 0;
}
// $data is a string
$validated = $this->validate($data);
if ($validated !== true) {
return $validated;
}
$options = $this->get_options();
$fs = get_file_storage();
$component = is_null($this->plugin) ? 'core' : $this->plugin;
$wwwroot = $CFG->wwwroot;
if ($options['forcehttps']) {
$wwwroot = str_replace('http://', 'https://', $wwwroot);
}
$draftitemid = $_REQUEST[$this->get_full_name().'_draftitemid'];
$draftfiles = $fs->get_area_files($options['context']->id, 'user', 'draft', $draftitemid, 'id');
foreach ($draftfiles as $file) {
if (!$file->is_directory()) {
$strToSearch = "$wwwroot/draftfile.php/".$options['context']->id."/user/draft/$draftitemid/".$file->get_filename();
if (stripos($data, $strToSearch) !== false) {
$file_record = array(
'contextid' => context_system::instance()->id,
'component' => $component,
'filearea' => 'icsbcnmarketingimages',
'itemid' => 0,
'timemodified' => time()
);
$newfile = $fs->create_file_from_storedfile($file_record, $file);
$url = moodle_url::make_pluginfile_url($newfile->get_contextid(), $newfile->get_component(), $newfile->get_filearea(), $newfile->get_itemid(), $newfile->get_filepath(), $newfile->get_filename());
$data = str_ireplace($strToSearch, $url, $data);
}
}
}
return ($this->config_write($this->name, $data) ? '' : get_string('errorsetting', 'admin'));
}
}
In theme/icsbcn/lib.php:
I added these lines in function theme_icsbcn_pluginfile:
else if ($filearea === 'icsbcnmarketingimages') {
return $theme->setting_file_serve($filearea, $args, $forcedownload, $options);
}
Best regards!
Iban Cardona.