Admin MDL-23244 Portfolio/repo admin pages use nested forms, which are illegal HTML...
authorSam Marshall <s.marshall@open.ac.uk>
Mon, 8 Nov 2010 17:12:03 +0000 (17:12 +0000)
committerSam Marshall <s.marshall@open.ac.uk>
Mon, 8 Nov 2010 17:12:03 +0000 (17:12 +0000)
admin/portfolio.php
admin/repository.php
admin/settings/plugins.php
lang/en/portfolio.php
lang/en/repository.php
lib/adminlib.php

index 5cc5e77..791c79f 100644 (file)
@@ -11,7 +11,7 @@ $sure          = optional_param('sure', '', PARAM_ALPHA);
 
 $display = true; // fall through to normal display
 
-$pagename = 'portfoliocontroller';
+$pagename = 'manageportfolios';
 
 if ($action == 'edit') {
     $pagename = 'portfoliosettings' . $portfolio;
@@ -37,12 +37,21 @@ admin_externalpage_setup($pagename);
 
 require_capability('moodle/site:config', get_context_instance(CONTEXT_SYSTEM));
 
-$baseurl    = "$CFG->wwwroot/$CFG->admin/settings.php?section=manageportfolios";
+$baseurl    = "$CFG->wwwroot/$CFG->admin/portfolio.php";
 $sesskeyurl = "$CFG->wwwroot/$CFG->admin/portfolio.php?sesskey=" . sesskey();
 $configstr  = get_string('manageportfolios', 'portfolio');
 
 $return = true; // direct back to the main page
 
+/**
+ * Helper function that generates a moodle_url object
+ * relevant to the portfolio
+ */
+function portfolio_action_url($portfolio) {
+    global $baseurl;
+    return new moodle_url($baseurl, array('sesskey'=>sesskey(), 'pf'=>$portfolio));
+}
+
 if (($action == 'edit') || ($action == 'new')) {
     if (($action == 'edit')) {
         $instance = portfolio_instance($portfolio);
@@ -126,11 +135,113 @@ if (($action == 'edit') || ($action == 'new')) {
         echo $OUTPUT->confirm(get_string('sure', 'portfolio', $instance->get('name')), $sesskeyurl . '&pf='.$portfolio.'&action=delete&sure=yes', $baseurl);
         $return = false;
     }
+} else {
+    // If page is loaded directly
+    echo $OUTPUT->header();
+    echo $OUTPUT->heading(get_string('manageportfolios', 'portfolio'));
+
+    // Get strings that are used
+    $strshow = get_string('on', 'portfolio');
+    $strhide = get_string('off', 'portfolio');
+    $strdelete = get_string('disabledinstance', 'portfolio');
+    $strsettings = get_string('settings');
+
+    $actionchoicesforexisting = array(
+        'show' => $strshow,
+        'hide' => $strhide,
+        'delete' => $strdelete
+    );
+
+    $actionchoicesfornew = array(
+        'newon' => $strshow,
+        'newoff' => $strhide,
+        'delete' => $strdelete
+    );
+
+    $output = $OUTPUT->box_start('generalbox');
+
+    $plugins = get_plugin_list('portfolio');
+    $plugins = array_keys($plugins);
+    $instances = portfolio_instances(false, false);
+    $usedplugins = array();
+
+    // to avoid notifications being sent out while admin is editing the page
+    define('ADMIN_EDITING_PORTFOLIO', true);
+
+    $insane = portfolio_plugin_sanity_check($plugins);
+    $insaneinstances = portfolio_instance_sanity_check($instances);
+
+    $table = new html_table();
+    $table->head = array(get_string('plugin', 'portfolio'), '', '');
+    $table->data = array();
+
+    foreach ($instances as $i) {
+        $settings = '<a href="' . $sesskeyurl . '&amp;action=edit&amp;pf=' . $i->get('id') . '">' . $strsettings .'</a>';
+        // Set some commonly used variables
+        $pluginid = $i->get('id');
+        $plugin = $i->get('plugin');
+        $pluginname = $i->get('name');
+
+        // Check if the instance is misconfigured
+        if (array_key_exists($plugin, $insane) || array_key_exists($pluginid, $insaneinstances)) {
+            if (!empty($insane[$plugin])) {
+                $information = $insane[$plugin];
+            } else if (!empty($insaneinstances[$pluginid])) {
+                $information = $insaneinstances[$pluginid];
+            }
+            $table->data[] = array($pluginname, $strdelete  . " " . $OUTPUT->help_icon($information, 'portfolio_' .  $plugin), $settings);
+        } else {
+            if ($i->get('visible')) {
+                $currentaction = 'show';
+            } else {
+                $currentaction = 'hide';
+            }
+            $select = new single_select(portfolio_action_url($pluginid, 'pf'), 'action', $actionchoicesforexisting, $currentaction, null, 'applyto' . $pluginid);
+            $table->data[] = array($pluginname, $OUTPUT->render($select), $settings);
+        }
+        if (!in_array($plugin, $usedplugins)) {
+            $usedplugins[] = $plugin;
+        }
+    }
+
+    // Create insane plugin array
+    $insaneplugins = array();
+    if (!empty($plugins)) {
+        foreach ($plugins as $p) {
+            // Check if it can not have multiple instances and has already been used
+            if (!portfolio_static_function($p, 'allows_multiple_instances') && in_array($p, $usedplugins)) {
+                continue;
+            }
+
+            // Check if it is misconfigured - if so store in array then display later
+            if (array_key_exists($p, $insane)) {
+                $insaneplugins[] = $p;
+            } else {
+                $select = new single_select(portfolio_action_url($p, 'pf'), 'action', $actionchoicesfornew, 'delete', null, 'applyto' . $p);
+                $table->data[] = array(portfolio_static_function($p, 'get_name'), $OUTPUT->render($select), '');
+            }
+        }
+    }
+
+    // Loop through all the insane plugins
+    if (!empty($insaneplugins)) {
+        foreach ($insaneplugins as $p) {
+            $table->data[] = array(portfolio_static_function($p, 'get_name'), $strdelete . " " . $OUTPUT->help_icon($insane[$p], 'portfolio_' .  $p), '');
+        }
+    }
+
+    $output .= html_writer::table($table);
+
+    $output .= $OUTPUT->box_end();
+
+    echo $output;
+    $return = false;
 }
 
-if (!empty($return)) {
-    // normal display. fall through to here (don't call exit) if you want this to run
+if ($return) {
+    // Redirect to base
     redirect($baseurl);
 }
+
 echo $OUTPUT->footer();
 
index feed580..c3409a5 100644 (file)
@@ -10,7 +10,7 @@ $sure          = optional_param('sure', '', PARAM_ALPHA);
 
 $display = true; // fall through to normal display
 
-$pagename = 'repositorycontroller';
+$pagename = 'managerepositories';
 
 if ($action == 'edit') {
     $pagename = 'repositorysettings' . $repository;
@@ -36,12 +36,21 @@ require_capability('moodle/site:config', get_context_instance(CONTEXT_SYSTEM));
 admin_externalpage_setup($pagename);
 
 $sesskeyurl = $CFG->wwwroot.'/'.$CFG->admin.'/repository.php?sesskey=' . sesskey();
-$baseurl    = $CFG->wwwroot.'/'.$CFG->admin.'/settings.php?section=managerepositories';
+$baseurl    = $CFG->wwwroot.'/'.$CFG->admin.'/repository.php';
 
 $configstr  = get_string('manage', 'repository');
 
 $return = true;
 
+/**
+ * Helper function that generates a moodle_url object
+ * relevant to the repository
+ */
+function repository_action_url($repository) {
+    global $baseurl;
+    return new moodle_url($baseurl, array('sesskey'=>sesskey(), 'repos'=>$repository));
+}
+
 if (($action == 'edit') || ($action == 'new')) {
     $pluginname = '';
     if ($action == 'edit') {
@@ -193,9 +202,158 @@ if (($action == 'edit') || ($action == 'new')) {
 } else if ($action == 'movedown') {
     $repositorytype = repository::get_type_by_typename($repository);
     $repositorytype->move_order('down');
+} else {
+    // If page is loaded directly
+    echo $OUTPUT->header();
+    echo $OUTPUT->heading(get_string('manage', 'repository'));
+
+    // Get strings that are used
+    $strshow = get_string('on', 'repository');
+    $strhide = get_string('off', 'repository');
+    $strdelete = get_string('disabled', 'repository');
+
+    $actionchoicesforexisting = array(
+        'show' => $strshow,
+        'hide' => $strhide,
+        'delete' => $strdelete
+    );
+
+    $actionchoicesfornew = array(
+        'newon' => $strshow,
+        'newoff' => $strhide,
+        'delete' => $strdelete
+    );
+
+    $output = '';
+    $output .= $OUTPUT->box_start('generalbox');
+
+    // Set strings that are used multiple times
+    $settingsstr = get_string('settings');
+    $disablestr = get_string('disable');
+
+    // Table to list plug-ins
+    $table = new html_table();
+    $table->head = array(get_string('name'), get_string('isactive', 'repository'), get_string('order'), $settingsstr);
+    $table->align = array('left', 'center', 'center', 'center', 'center');
+    $table->data = array();
+
+    // Get list of used plug-ins
+    $instances = repository::get_types();
+    if (!empty($instances)) {
+        // Array to store plugins being used
+        $alreadyplugins = array();
+        $totalinstances = count($instances);
+        $updowncount = 1;
+        foreach ($instances as $i) {
+            $settings = '';
+            $typename = $i->get_typename();
+            // Display edit link only if you can config the type or if it has multiple instances (e.g. has instance config)
+            $typeoptionnames = repository::static_function($typename, 'get_type_option_names');
+            $instanceoptionnames = repository::static_function($typename, 'get_instance_option_names');
+
+            if (!empty($typeoptionnames) || !empty($instanceoptionnames)) {
+                // Calculate number of instances in order to display them for the Moodle administrator
+                if (!empty($instanceoptionnames)) {
+                    $params = array();
+                    $params['context'] = array(get_system_context());
+                    $params['onlyvisible'] = false;
+                    $params['type'] = $typename;
+                    $admininstancenumber = count(repository::static_function($typename, 'get_instances', $params));
+                    // site instances
+                    $admininstancenumbertext = get_string('instancesforsite', 'repository', $admininstancenumber);
+                    $params['context'] = array();
+                    $instances = repository::static_function($typename, 'get_instances', $params);
+                    $courseinstances = array();
+                    $userinstances = array();
+
+                    foreach ($instances as $instance) {
+                        if ($instance->context->contextlevel == CONTEXT_COURSE) {
+                            $courseinstances[] = $instance;
+                        } else if ($instance->context->contextlevel == CONTEXT_USER) {
+                            $userinstances[] = $instance;
+                        }
+                    }
+                    // course instances
+                    $instancenumber = count($courseinstances);
+                    $courseinstancenumbertext = get_string('instancesforcourses', 'repository', $instancenumber);
+
+                    // user private instances
+                    $instancenumber =  count($userinstances);
+                    $userinstancenumbertext = get_string('instancesforusers', 'repository', $instancenumber);
+                } else {
+                    $admininstancenumbertext = "";
+                    $courseinstancenumbertext = "";
+                    $userinstancenumbertext = "";
+                }
+
+                $settings .= '<a href="' . $sesskeyurl . '&amp;action=edit&amp;repos=' . $typename . '">' . $settingsstr .'</a>';
+
+                $settings .= $OUTPUT->container_start('mdl-left');
+                $settings .= '<br/>';
+                $settings .= $admininstancenumbertext;
+                $settings .= '<br/>';
+                $settings .= $courseinstancenumbertext;
+                $settings .= '<br/>';
+                $settings .= $userinstancenumbertext;
+                $settings .= $OUTPUT->container_end();
+            }
+            // Get the current visibility
+            if ($i->get_visible()) {
+                $currentaction = 'show';
+            } else {
+                $currentaction = 'hide';
+            }
+
+            $select = new single_select(repository_action_url($typename, 'repos'), 'action', $actionchoicesforexisting, $currentaction, null, 'applyto' . basename($typename));
+
+            // Display up/down link
+            $updown = '';
+            $spacer = $OUTPUT->spacer(array('height'=>15, 'width'=>15)); // should be done with CSS instead
+
+            if ($updowncount > 1) {
+                $updown .= "<a href=\"$sesskeyurl&amp;action=moveup&amp;repos=".$typename."\">";
+                $updown .= "<img src=\"" . $OUTPUT->pix_url('t/up') . "\" alt=\"up\" /></a>&nbsp;";
+            }
+            else {
+                $updown .= $spacer;
+            }
+            if ($updowncount < $totalinstances) {
+                $updown .= "<a href=\"$sesskeyurl&amp;action=movedown&amp;repos=".$typename."\">";
+                $updown .= "<img src=\"" . $OUTPUT->pix_url('t/down') . "\" alt=\"down\" /></a>";
+            }
+            else {
+                $updown .= $spacer;
+            }
+
+            $updowncount++;
+
+            $table->data[] = array($i->get_readablename(), $OUTPUT->render($select), $updown, $settings);
+
+            if (!in_array($typename, $alreadyplugins)) {
+                $alreadyplugins[] = $typename;
+            }
+        }
+    }
+
+    // Get all the plugins that exist on disk
+    $plugins = get_plugin_list('repository');
+    if (!empty($plugins)) {
+        foreach ($plugins as $plugin => $dir) {
+            // Check that it has not already been listed
+            if (!in_array($plugin, $alreadyplugins)) {
+                $select = new single_select(repository_action_url($plugin, 'repos'), 'action', $actionchoicesfornew, 'delete', null, 'applyto' . basename($plugin));
+                $table->data[] = array(get_string('pluginname', 'repository_'.$plugin), $OUTPUT->render($select), '', '');
+            }
+        }
+    }
+
+    $output .= html_writer::table($table);
+    $output .= $OUTPUT->box_end();
+    print $output;
+    $return = false;
 }
 
-if (!empty($return)) {
+if ($return) {
     redirect($baseurl);
 }
 echo $OUTPUT->footer();
index 6eb2d15..d107eca 100644 (file)
@@ -216,11 +216,13 @@ if ($hassiteconfig) {
 
     $ADMIN->add('modules', new admin_category('portfoliosettings', $catname, empty($CFG->enableportfolios)));
 
-    // jump through hoops to do what we want
-    $temp = new admin_settingpage('manageportfolios', get_string('manageportfolios', 'portfolio'));
-    $temp->add(new admin_setting_heading('manageportfolios', get_string('activeportfolios', 'portfolio'), ''));
-    $temp->add(new admin_setting_manageportfolio());
-    $temp->add(new admin_setting_heading('manageportfolioscommon', get_string('commonsettings', 'admin'), get_string('commonsettingsdesc', 'portfolio')));
+    // Add manage page (with table)
+    $temp = new admin_page_manageportfolios();
+    $ADMIN->add('portfoliosettings', $temp);
+
+    // Add common settings page
+    $temp = new admin_settingpage('manageportfolioscommon', get_string('commonportfoliosettings', 'portfolio'));
+    $temp->add(new admin_setting_heading('manageportfolioscommon', '', get_string('commonsettingsdesc', 'portfolio')));
     $fileinfo = portfolio_filesize_info(); // make sure this is defined in one place since its used inside portfolio too to detect insane settings
     $fileoptions = $fileinfo['options'];
     $temp->add(new admin_setting_configselect(
@@ -273,10 +275,13 @@ if ($hassiteconfig) {
     $managerepo = get_string('manage', 'repository');
     $url = $CFG->wwwroot.'/'.$CFG->admin.'/repository.php';
     $ADMIN->add('modules', new admin_category('repositorysettings', $catname));
-    $temp = new admin_settingpage('managerepositories', $managerepo);
-    $temp->add(new admin_setting_heading('managerepositories', get_string('activerepository', 'repository'), ''));
-    $temp->add(new admin_setting_managerepository());
-    $temp->add(new admin_setting_heading('managerepositoriescommonheading', get_string('commonsettings', 'admin'), ''));
+
+    // Add main page (with table)
+    $temp = new admin_page_managerepositories();
+    $ADMIN->add('repositorysettings', $temp);
+
+    // Add common settings page
+    $temp = new admin_settingpage('managerepositoriescommon', get_string('commonrepositorysettings', 'repository'));
     $temp->add(new admin_setting_configtext('repositorycacheexpire', get_string('cacheexpire', 'repository'), get_string('configcacheexpire', 'repository'), 120));
     $temp->add(new admin_setting_configcheckbox('repositoryallowexternallinks', get_string('allowexternallinks', 'repository'), get_string('configallowexternallinks', 'repository'), 1));
     $temp->add(new admin_setting_configcheckbox('legacyfilesinnewcourses', get_string('legacyfilesinnewcourses', 'admin'), get_string('legacyfilesinnewcourses_help', 'admin'), 0));
index f3172bc..0a1a65c 100644 (file)
@@ -34,6 +34,7 @@ $string['availableformats'] = 'Available export formats';
 $string['callbackclassinvalid'] = 'Callback class specified was invalid or not part of the portfolio_caller hierarchy';
 $string['callercouldnotpackage'] = 'Failed to package up your data for export: original error was {$a}';
 $string['cannotsetvisible'] = 'Cannot set this to visible - the plugin has been completely disabled because of a misconfiguration';
+$string['commonportfoliosettings'] = 'Common portfolio settings';
 $string['commonsettingsdesc'] = '<p>Whether a transfer is considered to take a \'Moderate\' or \'High\' amount of time changes whether the user is able to wait for the transfer to complete or not.</p><p>Sizes up to the \'Moderate\' threshold just happen immediately without the user being asked, and \'Moderate\' and \'High\' transfers mean they are offered the option but warned it might take some time.</p><p>Additionally, some portfolio plugins might ignore this option completely and force all transfers to be queued.</p>';
 $string['configexport'] = 'Configure exported data';
 $string['configplugin'] = 'Configure portfolio plugin';
index 62e8e61..526c095 100644 (file)
@@ -57,6 +57,7 @@ $string['cannotdownloaddir'] = 'Cannot download this folder';
 $string['cannotinitplugin'] = 'Call plugin_init failed';
 $string['cleancache'] = 'Clean my cache files';
 $string['close'] = 'Close';
+$string['commonrepositorysettings'] = 'Common repository settings';
 $string['configallowexternallinks'] = 'This option enables all users to choose whether or not external media is copied into Moodle or not. If this is off then media is always copied into Moodle (this is usually best for overall data integrity and security).  If this is on then users can choose each time they add media to a text.';
 $string['configcacheexpire'] = 'The amount of time that file listings are cached locally (in seconds) when browsing external repositories.';
 $string['configsaved'] = 'Configuration saved!';
index e762c5e..6c3d2e7 100644 (file)
@@ -4815,6 +4815,108 @@ class admin_page_manageqtypes extends admin_externalpage {
     }
 }
 
+class admin_page_manageportfolios extends admin_externalpage {
+    /**
+     * Calls parent::__construct with specific arguments
+     */
+    public function __construct() {
+        global $CFG;
+        parent::__construct('manageportfolios', get_string('manageportfolios', 'portfolio'),
+                "$CFG->wwwroot/$CFG->admin/portfolio.php");
+    }
+
+    /**
+     * Searches page for the specified string.
+     * @param string $query The string to search for
+     * @return bool True if it is found on this page
+     */
+    public function search($query) {
+        global $CFG;
+        if ($result = parent::search($query)) {
+            return $result;
+        }
+
+        $found = false;
+        $textlib = textlib_get_instance();
+        $portfolios = get_plugin_list('portfolio');
+        foreach ($portfolios as $p => $dir) {
+            if (strpos($p, $query) !== false) {
+                $found = true;
+                break;
+            }
+        }
+        if (!$found) {
+            foreach (portfolio_instances(false, false) as $instance) {
+                $title = $instance->get('name');
+                if (strpos($textlib->strtolower($title), $query) !== false) {
+                    $found = true;
+                    break;
+                }
+            }
+        }
+
+        if ($found) {
+            $result = new stdClass();
+            $result->page     = $this;
+            $result->settings = array();
+            return array($this->name => $result);
+        } else {
+            return array();
+        }
+    }
+}
+
+class admin_page_managerepositories extends admin_externalpage {
+    /**
+     * Calls parent::__construct with specific arguments
+     */
+    public function __construct() {
+        global $CFG;
+        parent::__construct('managerepositories', get_string('manage',
+                'repository'), "$CFG->wwwroot/$CFG->admin/repository.php");
+    }
+
+    /**
+     * Searches page for the specified string.
+     * @param string $query The string to search for
+     * @return bool True if it is found on this page
+     */
+    public function search($query) {
+        global $CFG;
+        if ($result = parent::search($query)) {
+            return $result;
+        }
+
+        $found = false;
+        $textlib = textlib_get_instance();
+        $repositories= get_plugin_list('repository');
+        foreach ($repositories as $p => $dir) {
+            if (strpos($p, $query) !== false) {
+                $found = true;
+                break;
+            }
+        }
+        if (!$found) {
+            foreach (repository::get_types() as $instance) {
+                $title = $instance->get_typename();
+                if (strpos($textlib->strtolower($title), $query) !== false) {
+                    $found = true;
+                    break;
+                }
+            }
+        }
+
+        if ($found) {
+            $result = new stdClass();
+            $result->page     = $this;
+            $result->settings = array();
+            return array($this->name => $result);
+        } else {
+            return array();
+        }
+    }
+}
+
 /**
  * Special class for authentication administration.
  *
@@ -5328,192 +5430,6 @@ class admin_page_managefilters extends admin_externalpage {
     }
 }
 
-/**
- *
- * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
- */
-class admin_setting_manageportfolio extends admin_setting {
-    private $baseurl;
-
-    public function __construct() {
-        global $CFG;
-        $this->nosave = true;
-        parent::__construct('manageportfolio', get_string('manageportfolios', 'portfolio'), '', '');
-        $this->baseurl = $CFG->wwwroot . '/' . $CFG->admin . '/portfolio.php?sesskey=' . sesskey();
-    }
-
-    /**
-     * Always returns true, does nothing
-     *
-     * @return true
-     */
-    public function get_setting() {
-        return true;
-    }
-
-    /**
-     * Always returns true, does nothing
-     *
-     * @return true
-     */
-    public function get_defaultsetting() {
-        return true;
-    }
-
-    /**
-     * Always returns '', does not write anything
-     *
-     * @return string Always returns ''
-     */
-    public function write_setting($data) {
-        return '';
-    }
-
-    /**
-     * Helper function that generates a moodle_url object
-     * relevant to the portfolio
-     */
-
-    function portfolio_action_url($portfolio) {
-        return new moodle_url($this->baseurl, array('sesskey'=>sesskey(), 'pf'=>$portfolio));
-    }
-
-    /**
-     * Searches the portfolio types for the specified type(string)
-     *
-     * @param string $query The string to search for
-     * @return bool true for found or related, false for not
-     */
-    public function is_related($query) {
-        if (parent::is_related($query)) {
-            return true;
-        }
-
-        $textlib = textlib_get_instance();
-        $portfolios = get_plugin_list('portfolio');
-        foreach ($portfolios as $p => $dir) {
-            if (strpos($p, $query) !== false) {
-                return true;
-            }
-        }
-        foreach (portfolio_instances(false, false) as $instance) {
-            $title = $instance->get('name');
-            if (strpos($textlib->strtolower($title), $query) !== false) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Builds XHTML to display the control
-     *
-     * @param string $data Unused
-     * @param string $query
-     * @return string XHTML to display the control
-     */
-    public function output_html($data, $query='') {
-        global $CFG, $OUTPUT;
-
-        // Get strings that are used
-        $strshow = get_string('on', 'portfolio');
-        $strhide = get_string('off', 'portfolio');
-        $strdelete = get_string('disabledinstance', 'portfolio');
-        $strsettings = get_string('settings');
-
-        $actionchoicesforexisting = array(
-            'show' => $strshow,
-            'hide' => $strhide,
-            'delete' => $strdelete
-        );
-
-        $actionchoicesfornew = array(
-            'newon' => $strshow,
-            'newoff' => $strhide,
-            'delete' => $strdelete
-        );
-
-        $output = $OUTPUT->box_start('generalbox');
-
-        $plugins = get_plugin_list('portfolio');
-        $plugins = array_keys($plugins);
-        $instances = portfolio_instances(false, false);
-        $usedplugins = array();
-
-        // to avoid notifications being sent out while admin is editing the page
-        define('ADMIN_EDITING_PORTFOLIO', true);
-
-        $insane = portfolio_plugin_sanity_check($plugins);
-        $insaneinstances = portfolio_instance_sanity_check($instances);
-
-        $table = new html_table();
-        $table->head = array(get_string('plugin', 'portfolio'), '', '');
-        $table->data = array();
-
-        foreach ($instances as $i) {
-            $settings = '<a href="' . $this->baseurl . '&amp;action=edit&amp;pf=' . $i->get('id') . '">' . $strsettings .'</a>';
-            // Set some commonly used variables
-            $pluginid = $i->get('id');
-            $plugin = $i->get('plugin');
-            $pluginname = $i->get('name');
-
-            // Check if the instance is misconfigured
-            if (array_key_exists($plugin, $insane) || array_key_exists($pluginid, $insaneinstances)) {
-                if (!empty($insane[$plugin])) {
-                    $information = $insane[$plugin];
-                } else if (!empty($insaneinstances[$pluginid])) {
-                    $information = $insaneinstances[$pluginid];
-                }
-                $table->data[] = array($pluginname, $strdelete  . " " . $OUTPUT->help_icon($information, 'portfolio_' .  $plugin), $settings);
-            } else {
-                if ($i->get('visible')) {
-                    $currentaction = 'show';
-                } else {
-                    $currentaction = 'hide';
-                }
-                $select = new single_select($this->portfolio_action_url($pluginid, 'pf'), 'action', $actionchoicesforexisting, $currentaction, null, 'applyto' . $pluginid);
-                $table->data[] = array($pluginname, $OUTPUT->render($select), $settings);
-            }
-            if (!in_array($plugin, $usedplugins)) {
-                $usedplugins[] = $plugin;
-            }
-        }
-
-        // Create insane plugin array
-        $insaneplugins = array();
-        if (!empty($plugins)) {
-            foreach ($plugins as $p) {
-                // Check if it can not have multiple instances and has already been used
-                if (!portfolio_static_function($p, 'allows_multiple_instances') && in_array($p, $usedplugins)) {
-                    continue;
-                }
-
-                // Check if it is misconfigured - if so store in array then display later
-                if (array_key_exists($p, $insane)) {
-                    $insaneplugins[] = $p;
-                } else {
-                    $select = new single_select($this->portfolio_action_url($p, 'pf'), 'action', $actionchoicesfornew, 'delete', null, 'applyto' . $p);
-                    $table->data[] = array(portfolio_static_function($p, 'get_name'), $OUTPUT->render($select), '');
-                }
-            }
-        }
-
-        // Loop through all the insane plugins
-        if (!empty($insaneplugins)) {
-            foreach ($insaneplugins as $p) {
-                $table->data[] = array(portfolio_static_function($p, 'get_name'), $strdelete . " " . $OUTPUT->help_icon($insane[$p], 'portfolio_' .  $p), '');
-            }
-        }
-
-        $output .= html_writer::table($table);
-
-        $output .= $OUTPUT->box_end();
-
-        return highlight($query, $output);
-    }
-
-}
-
 /**
  * Initialise admin page - this function does require login and permission
  * checks specified in page definition.