. /** * Atto admin setting stuff. * * @package editor_atto * @copyright 2014 Jerome Mouneyrac * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); /** * Admin setting for toolbar. * * @package editor_atto * @copyright 2014 Frédéric Massart * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class editor_atto_toolbar_setting extends admin_setting_configtextarea { /** * Validate data. * * This ensures that: * - Plugins are only used once, * - Group names are unique, * - Lines match: group = plugin[, plugin[, plugin ...]], * - There are some groups and plugins defined, * - The plugins used are installed. * * @param string $data * @return mixed True on success, else error message. */ public function validate($data) { $result = parent::validate($data); if ($result !== true) { return $result; } $lines = explode("\n", $data); $groups = array(); $plugins = array(); foreach ($lines as $line) { if (!trim($line)) { continue; } $matches = array(); if (!preg_match('/^\s*([a-z0-9]+)\s*=\s*([a-z0-9]+(\s*,\s*[a-z0-9]+)*)+\s*$/', $line, $matches)) { $result = get_string('errorcannotparseline', 'editor_atto', $line); break; } $group = $matches[1]; if (isset($groups[$group])) { $result = get_string('errorgroupisusedtwice', 'editor_atto', $group); break; } $groups[$group] = true; $lineplugins = array_map('trim', explode(',', $matches[2])); foreach ($lineplugins as $plugin) { if (isset($plugins[$plugin])) { $result = get_string('errorpluginisusedtwice', 'editor_atto', $plugin); break 2; } else if (!core_component::get_component_directory('atto_' . $plugin)) { $result = get_string('errorpluginnotfound', 'editor_atto', $plugin); break 2; } $plugins[$plugin] = true; } } // We did not find any groups or plugins. if (empty($groups) || empty($plugins)) { $result = get_string('errornopluginsorgroupsfound', 'editor_atto'); } return $result; } } /** * Special class for Atto plugins administration. * * @package editor_atto * @copyright 2014 Jerome Mouneyrac * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class editor_atto_subplugins_setting extends admin_setting { /** * Constructor. */ public function __construct() { $this->nosave = true; parent::__construct('attosubplugins', get_string('subplugintype_atto_plural', 'editor_atto'), '', ''); } /** * Returns current value of this setting. * Always returns true, does nothing. * * @return true */ public function get_setting() { return true; } /** * Returns default setting if exists. * Always returns true, does nothing. * * @return true */ public function get_defaultsetting() { return true; } /** * Store new setting. * Always returns '', does not write anything. * * @param string $data string or array, must not be NULL. * @return string Always returns ''. */ public function write_setting($data) { // Do not write any setting. return ''; } /** * Checks if $query is one of the available subplugins. * * @param string $query The string to search for. * @return bool Returns true if found, false if not. */ public function is_related($query) { if (parent::is_related($query)) { return true; } $subplugins = core_component::get_plugin_list('atto'); foreach ($subplugins as $name => $dir) { if (stripos($name, $query) !== false) { return true; } $namestr = get_string('pluginname', 'atto_' . $name); if (strpos(core_text::strtolower($namestr), core_text::strtolower($query)) !== false) { return true; } } return false; } /** * Builds the XHTML to display the control. * * @param mixed $data Unused. * @param string $query * @return string highlight. */ public function output_html($data, $query = '') { global $CFG, $OUTPUT, $PAGE; require_once($CFG->libdir . "/editorlib.php"); require_once(__DIR__ . '/lib.php'); $pluginmanager = core_plugin_manager::instance(); // Display strings. $strtoolbarconfig = get_string('toolbarconfig', 'editor_atto'); $strname = get_string('name'); $strsettings = get_string('settings'); $struninstall = get_string('uninstallplugin', 'core_admin'); $strversion = get_string('version'); $subplugins = core_component::get_plugin_list('atto'); $return = $OUTPUT->heading(get_string('subplugintype_atto_plural', 'editor_atto'), 3, 'main', true); $return .= $OUTPUT->box_start('generalbox attosubplugins'); $table = new html_table(); $table->head = array($strname, $strversion, $strtoolbarconfig, $strsettings, $struninstall); $table->align = array('left', 'left', 'center', 'center', 'center', 'center'); $table->data = array(); $table->attributes['class'] = 'admintable generaltable'; // Iterate through subplugins. foreach ($subplugins as $name => $dir) { $namestr = get_string('pluginname', 'atto_' . $name); $version = get_config('atto_' . $name, 'version'); if ($version === false) { $version = ''; } $plugininfo = $pluginmanager->get_plugin_info('atto_' . $name); $toolbarconfig = $name; $displayname = $namestr; // Check if there is an icon in the atto plugin pix/ folder. if ($PAGE->theme->resolve_image_location('icon', 'atto_' . $name, false)) { $icon = $OUTPUT->pix_icon('icon', '', 'atto_' . $name, array('class' => 'icon pluginicon')); } else { // No icon found. $icon = $OUTPUT->pix_icon('spacer', '', 'moodle', array('class' => 'icon pluginicon noicon')); } $displayname = $icon . $displayname; // Add settings link. if (!$version) { $settings = ''; } else if ($url = $plugininfo->get_settings_url()) { $settings = html_writer::link($url, $strsettings); } else { $settings = ''; } // Add uninstall info. $uninstall = ''; if ($uninstallurl = core_plugin_manager::instance()->get_uninstall_url('atto_' . $name, 'manage')) { $uninstall = html_writer::link($uninstallurl, $struninstall); } // Add a row to the table. $row = new html_table_row(array($displayname, $version, $toolbarconfig, $settings, $uninstall)); $table->data[] = $row; } $return .= html_writer::table($table); $return .= html_writer::tag('p', get_string('tablenosave', 'admin')); $return .= $OUTPUT->box_end(); return highlight($query, $return); } }