From a19f419db23c92893d8fbc68b0a37095bf2d8d85 Mon Sep 17 00:00:00 2001 From: tjhunt Date: Tue, 28 Jul 2009 09:59:21 +0000 Subject: [PATCH] blocks: MDL-19946 Block editing form must be displayed from the original URL, with properliy initialised $page --- blocks/edit.php | 148 --------- blocks/edit_form.php | 20 +- lib/blocklib.php | 741 +++++++++++++----------------------------- lib/deprecatedlib.php | 62 ++++ lib/pagelib.php | 6 +- 5 files changed, 302 insertions(+), 675 deletions(-) delete mode 100644 blocks/edit.php diff --git a/blocks/edit.php b/blocks/edit.php deleted file mode 100644 index 8a584c2b96..0000000000 --- a/blocks/edit.php +++ /dev/null @@ -1,148 +0,0 @@ -. - -/** - * This script is used to edit the settings for a block instance. - * - * It works with the {@link block_edit_form} class, or rather the particular - * subclass defined by this block, to do the editing. - * - * @package moodlecore - * @copyright 2009 Tim Hunt - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - -require_once(dirname(__FILE__) . '/../config.php'); -require_once($CFG->dirroot . '/blocks/edit_form.php'); - -$blockid = required_param('id', PARAM_INTEGER); -$pagecontextid = required_param('pagecontextid', PARAM_INTEGER); -$pagetype = required_param('pagetype', PARAM_ALPHANUMEXT); -$subpage = optional_param('subpage', null, PARAM_ALPHANUMEXT); -$returnurl = required_param('returnurl', PARAM_LOCALURL); - -$urlparams = array( - 'id' => $blockid, - 'pagecontextid' => $pagecontextid, - 'pagetype' => $pagetype, - 'returnurl' => $returnurl, -); -if ($subpage) { - $urlparams['subpage'] = $subpage; -} -$PAGE->set_url('blocks/edit.php', $urlparams); - -require_login(); - -$blockpage = new moodle_page(); -$blockpage->set_context(get_context_instance_by_id($pagecontextid)); -$blockpage->set_pagetype($pagetype); -$blockpage->set_subpage($subpage); -$url = new moodle_url($returnurl); -$blockpage->set_url($url->out(true), $url->params()); - -$block = block_load_for_page($blockid, $blockpage); - -if (!$block->user_can_edit()) { - throw new moodle_exception('nopermissions', '', $page->url->out(), get_string('editblock')); -} - -$PAGE->set_context($block->context); -$PAGE->set_generaltype('form'); - -$formfile = $CFG->dirroot . '/blocks/' . $block->name() . '/edit_form.php'; -if (is_readable($formfile)) { - require_once($formfile); - $classname = 'block_' . $block->name() . '_edit_form'; -} else { - $classname = 'block_edit_form'; -} -$mform = new $classname($block, $blockpage); - -$mform->set_data($block->instance); - -if ($mform->is_cancelled()) { - redirect($CFG->wwwroot . '/' . $returnurl); - -} else if ($data = $mform->get_data()) { - $bi = new stdClass; - $bi->id = $block->instance->id; - $bi->showinsubcontexts = $data->showinsubcontexts; - $bi->pagetypepattern = $data->pagetypepattern; - if (empty($data->subpagepattern) || $data->subpagepattern == '%@NULL@%') { - $bi->subpagepattern = null; - } else { - $bi->subpagepattern = $data->subpagepattern; - } - $bi->defaultregion = $data->defaultregion; - $bi->defaultweight = $data->defaultweight; - $DB->update_record('block_instances', $bi); - - $config = new stdClass; - foreach ($data as $configfield => $value) { - if (strpos($configfield, 'config_') !== 0) { - continue; - } - $field = substr($configfield, 7); - $config->$field = $value; - } - $block->instance_config_save($config); - - $bp = new stdClass; - $bp->visible = $data->visible; - $bp->region = $data->region; - $bp->weight = $data->weight; - $needbprecord = !$data->visible || $data->region != $data->defaultregion || - $data->weight != $data->defaultweight; - - if ($block->instance->blockpositionid && !$needbprecord) { - $DB->delete_records('block_positions', array('id' => $block->instance->blockpositionid)); - - } else if ($block->instance->blockpositionid && $needbprecord) { - $bp->id = $block->instance->blockpositionid; - $DB->update_record('block_positions', $bp); - - } else if ($needbprecord) { - $bp->blockinstanceid = $block->instance->id; - $bp->contextid = $blockpage->contextid; - $bp->pagetype = $blockpage->pagetype; - if ($blockpage->subpage) { - $bp->subpage = $blockpage->subpage; - } else { - $bp->subpage = null; - } - $DB->insert_record('block_positions', $bp); - } - - redirect($CFG->wwwroot . '/' . $returnurl); - -} else { - $strheading = get_string('editinga', $block->name()); - if (strpos($strheading, '[[') === 0) { - $strheading = get_string('blockconfiga', 'moodle', $block->get_title()); - } - -$PAGE->set_title($strheading); - $PAGE->set_heading($strheading); - - echo $OUTPUT->header(); - echo $OUTPUT->heading($strheading, 2); - - $mform->display(); - - echo $OUTPUT->footer(); -} \ No newline at end of file diff --git a/blocks/edit_form.php b/blocks/edit_form.php index 1de15d03d0..d8c8fcc3f6 100644 --- a/blocks/edit_form.php +++ b/blocks/edit_form.php @@ -47,11 +47,11 @@ class block_edit_form extends moodleform { */ public $page; - function __construct($block, $page) { + function __construct($actionurl, $block, $page) { global $CFG; $this->block = $block; $this->page = $page; - parent::moodleform(block_edit_url($block, $page)); + parent::moodleform($actionurl); } function definition() { @@ -85,18 +85,18 @@ class block_edit_form extends moodleform { $parentcontext = get_context_instance_by_id($this->block->instance->parentcontextid); $mform->addElement('static', 'contextname', get_string('thisblockbelongsto', 'block'), print_context_name($parentcontext)); - $mform->addElement('selectyesno', 'showinsubcontexts', get_string('appearsinsubcontexts', 'block')); + $mform->addElement('selectyesno', 'bui_showinsubcontexts', get_string('appearsinsubcontexts', 'block')); $pagetypeoptions = matching_page_type_patterns($this->page->pagetype); $pagetypeoptions = array_combine($pagetypeoptions, $pagetypeoptions); - $mform->addElement('select', 'pagetypepattern', get_string('pagetypes', 'block'), $pagetypeoptions); + $mform->addElement('select', 'bui_pagetypepattern', get_string('pagetypes', 'block'), $pagetypeoptions); if ($this->page->subpage) { $subpageoptions = array( '%@NULL@%' => get_string('anypagematchingtheabove', 'block'), $this->page->subpage => get_string('thisspecificpage', 'block', $this->page->subpage), ); - $mform->addElement('select', 'subpagepattern', get_string('subpages', 'block'), $subpageoptions); + $mform->addElement('select', 'bui_subpagepattern', get_string('subpages', 'block'), $subpageoptions); } $defaultregionoptions = $regionoptions; @@ -104,22 +104,22 @@ class block_edit_form extends moodleform { if (!array_key_exists($defaultregion, $defaultregionoptions)) { $defaultregionoptions[$defaultregion] = $defaultregion; } - $mform->addElement('select', 'defaultregion', get_string('defaultregion', 'block'), $defaultregionoptions); + $mform->addElement('select', 'bui_defaultregion', get_string('defaultregion', 'block'), $defaultregionoptions); - $mform->addElement('select', 'defaultweight', get_string('defaultweight', 'block'), $weightoptions); + $mform->addElement('select', 'bui_defaultweight', get_string('defaultweight', 'block'), $weightoptions); // Where this block is positioned on this page. $mform->addElement('header', 'whereheader', get_string('onthispage', 'block')); - $mform->addElement('selectyesno', 'visible', get_string('visible', 'block')); + $mform->addElement('selectyesno', 'bui_visible', get_string('visible', 'block')); $blockregion = $this->block->instance->region; if (!array_key_exists($blockregion, $regionoptions)) { $regionoptions[$blockregion] = $blockregion; } - $mform->addElement('select', 'region', get_string('region', 'block'), $regionoptions); + $mform->addElement('select', 'bui_region', get_string('region', 'block'), $regionoptions); - $mform->addElement('select', 'weight', get_string('weight', 'block'), $weightoptions); + $mform->addElement('select', 'bui_weight', get_string('weight', 'block'), $weightoptions); $this->add_action_buttons(); } diff --git a/lib/blocklib.php b/lib/blocklib.php index 82520e6b7c..a2d221e2f7 100644 --- a/lib/blocklib.php +++ b/lib/blocklib.php @@ -1,7 +1,7 @@ . /** * Block Class and Functions * - * This file defines the {@link block_manager} class, + * This file defines the {@link block_manager} class, * * @package moodlecore * @copyright 1999 onwards Martin Dougiamas http://dougiamas.com @@ -273,7 +273,7 @@ class block_manager { * output the blocks anyway, so we are not doing wasted effort.) * * @param string $region a block region that exists on this page. - * @param object $output a moodle_core_renderer. normally the global $OUTPUT. + * @param object $output a moodle_core_renderer. normally the global $OUTPUT. * @return boolean Whether there is anything in this region. */ public function region_has_content($region, $output) { @@ -570,7 +570,7 @@ class block_manager { } /** - * Find a given block by its instance id + * Find a given block by its instance id * * @param integer $instanceid * @return object @@ -701,7 +701,7 @@ class block_manager { /** * Ensure block instances exist for a given region - * + * * @param string $region Check for bi's with the instance with this name */ protected function ensure_instances_exist($region) { @@ -734,6 +734,224 @@ class block_manager { $this->visibleblockcontent[$region] = $contents; } } + +/// Process actions from the URL =============================================== + + /** + * Process any block actions that were specified in the URL. + * + * This can only be done given a valid $page object. + * + * @param moodle_page $page the page to add blocks to. + * @return boolean true if anything was done. False if not. + */ + public function process_url_actions() { + return $this->process_url_add() || $this->process_url_delete() || + $this->process_url_show_hide() || $this->process_url_edit(); + } + + /** + * Handle adding a block. + * @return boolean true if anything was done. False if not. + */ + public function process_url_add() { + $blocktype = optional_param('bui_addblock', null, PARAM_SAFEDIR); + if (!$blocktype) { + return false; + } + + confirm_sesskey(); + + if (!$page->user_is_editing() && !$this->page->user_can_edit_blocks()) { + throw new moodle_exception('nopermissions', '', $this->page->url->out(), get_string('addblock')); + } + + if (!array_key_exists($blocktype, $this->get_addable_blocks())) { + throw new moodle_exception('cannotaddthisblocktype', '', $this->page->url->out(), $blocktype); + } + + $this->add_block_at_end_of_default_region($blocktype); + + // If the page URL was a guses, it will contain the bui_... param, so we must make sure it is not there. + $this->page->ensure_param_not_in_url('bui_addblock'); + + return true; + } + + /** + * Handle deleting a block. + * @return boolean true if anything was done. False if not. + */ + public function process_url_delete() { + $blockid = optional_param('bui_deleteid', null, PARAM_INTEGER); + if (!$blockid) { + return false; + } + + confirm_sesskey(); + + $block = $this->page->blocks->find_instance($blockid); + + if (!$block->user_can_edit() || !$this->page->user_can_edit_blocks() || !$block->user_can_addto($page)) { + throw new moodle_exception('nopermissions', '', $this->page->url->out(), get_string('deleteablock')); + } + + blocks_delete_instance($block->instance); + + // If the page URL was a guses, it will contain the bui_... param, so we must make sure it is not there. + $this->page->ensure_param_not_in_url('bui_deleteid'); + + return true; + } + + /** + * Handle showing or hiding a block. + * @return boolean true if anything was done. False if not. + */ + public function process_url_show_hide() { + if ($blockid = optional_param('bui_hideid', null, PARAM_INTEGER)) { + $newvisibility = 0; + } else if ($blockid = optional_param('bui_showid', null, PARAM_INTEGER)) { + $newvisibility = 1; + } else { + return false; + } + + confirm_sesskey(); + + $block = $this->page->blocks->find_instance($blockid); + + if (!$block->user_can_edit() || !$this->page->user_can_edit_blocks()) { + throw new moodle_exception('nopermissions', '', $this->page->url->out(), get_string('hideshowblocks')); + } + + blocks_set_visibility($block->instance, $this->page, $newvisibility); + + // If the page URL was a guses, it will contain the bui_... param, so we must make sure it is not there. + $this->page->ensure_param_not_in_url('bui_hideid'); + $this->page->ensure_param_not_in_url('bui_showid'); + + return true; + } + + /** + * Handle showing/processing the submission from the block editing form. + * @return boolean true if the form was submitted and the new config saved. Does not + * return if the editing form was displayed. False otherwise. + */ + public function process_url_edit() { + global $CFG, $DB, $PAGE; + + $blockid = optional_param('bui_editid', null, PARAM_INTEGER); + if (!$blockid) { + return false; + } + + confirm_sesskey(); + require_once($CFG->dirroot . '/blocks/edit_form.php'); + + $block = $this->find_instance($blockid); + + if (!$block->user_can_edit() || !$this->page->user_can_edit_blocks()) { + throw new moodle_exception('nopermissions', '', $this->page->url->out(), get_string('editblock')); + } + + $editpage = new moodle_page(); + $editpage->set_generaltype('form'); + $editpage->set_course($this->page->course); + $editpage->set_context($this->page->context); + $editurlbase = str_replace($CFG->wwwroot . '/', '', $this->page->url->out(true)); + $editurlparams = $this->page->url->params(); + $editurlparams['bui_editid'] = $blockid; + $editpage->set_url($editurlbase, $editurlparams); + $editpage->_block_actions_done = true; + // At this point we are either going to redirect, or display the form, so + // overwrite global $PAGE ready for this. (Formslib refers to it.) + $PAGE = $editpage; + + $formfile = $CFG->dirroot . '/blocks/' . $block->name() . '/edit_form.php'; + if (is_readable($formfile)) { + require_once($formfile); + $classname = 'block_' . $block->name() . '_edit_form'; + } else { + $classname = 'block_edit_form'; + } + + $mform = new $classname($editpage->url, $block, $this->page); + $mform->set_data($block->instance); + + if ($mform->is_cancelled()) { + redirect($this->page->url); + + } else if ($data = $mform->get_data()) { + $bi = new stdClass; + $bi->id = $block->instance->id; + $bi->showinsubcontexts = $data->bui_showinsubcontexts; + $bi->pagetypepattern = $data->bui_pagetypepattern; + if (empty($data->bui_subpagepattern) || $data->bui_subpagepattern == '%@NULL@%') { + $bi->subpagepattern = null; + } else { + $bi->subpagepattern = $data->bui_subpagepattern; + } + $bi->defaultregion = $data->bui_defaultregion; + $bi->defaultweight = $data->bui_defaultweight; + $DB->update_record('block_instances', $bi); + + $config = clone($block->config); + foreach ($data as $configfield => $value) { + if (strpos($configfield, 'config_') !== 0) { + continue; + } + $field = substr($configfield, 7); + $config->$field = $value; + } + $block->instance_config_save($config); + + $bp = new stdClass; + $bp->visible = $data->bui_visible; + $bp->region = $data->bui_region; + $bp->weight = $data->bui_weight; + $needbprecord = !$data->bui_visible || $data->bui_region != $data->bui_defaultregion || + $data->bui_weight != $data->bui_defaultweight; + + if ($block->instance->blockpositionid && !$needbprecord) { + $DB->delete_records('block_positions', array('id' => $block->instance->blockpositionid)); + + } else if ($block->instance->blockpositionid && $needbprecord) { + $bp->id = $block->instance->blockpositionid; + $DB->update_record('block_positions', $bp); + + } else if ($needbprecord) { + $bp->blockinstanceid = $block->instance->id; + $bp->contextid = $this->page->contextid; + $bp->pagetype = $this->page->pagetype; + if ($this->page->subpage) { + $bp->subpage = $this->page->subpage; + } else { + $bp->subpage = null; + } + $DB->insert_record('block_positions', $bp); + } + + redirect($this->page->url); + + } else { + $strheading = get_string('editinga', $block->name()); + if (strpos($strheading, '[[') === 0) { + $strheading = get_string('blockconfiga', 'moodle', $block->get_title()); + } + + $editpage->set_title($strheading); + $editpage->set_heading($strheading); + + $output = $editpage->theme->get_renderer('core', $editpage); + echo $output->header(); + echo $output->heading($strheading, 2); + $mform->display(); + echo $output->footer(); + exit; + } + } } /// Helper functions for working with block classes ============================ @@ -959,7 +1177,7 @@ function block_edit_controls($block, $page) { } // Edit config icon - always show - needed for positioning UI. - $controls[] = array('url' => block_edit_url($block, $page)->out(), + $controls[] = array('url' => $actionurl . '&bui_editid=' . $block->instance->id, 'icon' => 't/edit', 'caption' => get_string('configuration')); // Delete icon. @@ -976,135 +1194,6 @@ function block_edit_controls($block, $page) { return $controls; } -/** - * Get the URL for editing a particular block instance. - * @param block_base $block a block object. - * @return moodle_url the url. - */ -function block_edit_url($block, $page) { - global $CFG; - $urlparams = array( - 'id' => $block->instance->id, - 'pagecontextid' => $page->context->id, - 'pagetype' => $page->pagetype, - 'returnurl' => $page->url->out_returnurl(), - ); - if ($page->subpage) { - $urlparams['subpage'] = $page->subpage; - } - return new moodle_url($CFG->wwwroot . '/blocks/edit.php', $urlparams); -} - -/** - * Process any block actions that were specified in the URL. - * - * This can only be done given a valid $page object. - * - * @param moodle_page $page the page to add blocks to. - * @return boolean true if anything was done. False if not. - */ -function block_process_url_actions($page) { - return block_process_url_add($page) || - block_process_url_delete($page) || - block_process_url_show_hide($page); -} - -/** - * Handle adding a block. - * @param moodle_page $page the page to add blocks to. - * @return boolean true if anything was done. False if not. - */ -function block_process_url_add($page) { - $blocktype = optional_param('bui_addblock', null, PARAM_SAFEDIR); - if (!$blocktype) { - return false; - } - - confirm_sesskey(); - - if (!$page->user_is_editing() && !$page->user_can_edit_blocks()) { - throw new moodle_exception('nopermissions', '', $page->url->out(), get_string('addblock')); - } - - if (!array_key_exists($blocktype, $page->blocks->get_addable_blocks())) { - throw new moodle_exception('cannotaddthisblocktype', '', $page->url->out(), $blocktype); - } - - $page->blocks->add_block_at_end_of_default_region($blocktype); - - // If the page URL was a guses, it will contain the bui_... param, so we must make sure it is not there. - $page->ensure_param_not_in_url('bui_addblock'); - - return true; -} - -/** - * Handle deleting a block. - * @param moodle_page $page the page to add blocks to. - * @return boolean true if anything was done. False if not. - */ -function block_process_url_delete($page) { - $blockid = optional_param('bui_deleteid', null, PARAM_INTEGER); - if (!$blockid) { - return false; - } - - confirm_sesskey(); - - $block = $page->blocks->find_instance($blockid); - - if (!$block->user_can_edit() || !$page->user_can_edit_blocks() || !$block->user_can_addto($page)) { - throw new moodle_exception('nopermissions', '', $page->url->out(), get_string('deleteablock')); - } - - blocks_delete_instance($block->instance); - - // If the page URL was a guses, it will contain the bui_... param, so we must make sure it is not there. - $page->ensure_param_not_in_url('bui_deleteid'); - - return true; -} - -/** - * Handle showing or hiding a block. - * @param moodle_page $page the page to add blocks to. - * @return boolean true if anything was done. False if not. - */ -function block_process_url_show_hide($page) { - if ($blockid = optional_param('bui_hideid', null, PARAM_INTEGER)) { - $newvisibility = 0; - } else if ($blockid = optional_param('bui_showid', null, PARAM_INTEGER)) { - $newvisibility = 1; - } else { - return false; - } - - confirm_sesskey(); - - $block = $page->blocks->find_instance($blockid); - - if (!$block->user_can_edit() || !$page->user_can_edit_blocks()) { - throw new moodle_exception('nopermissions', '', $page->url->out(), get_string('hideshowblocks')); - } - - blocks_set_visibility($block->instance, $page, $newvisibility); - - // If the page URL was a guses, it will contain the bui_... param, so we must make sure it is not there. - $page->ensure_param_not_in_url('bui_hideid'); - $page->ensure_param_not_in_url('bui_showid'); - - return true; -} - -///** -// * Handle deleting a block. -// * @param moodle_page $page the page to add blocks to. -// * @return boolean true if anything was done. False if not. -// */ -//function block_process_url_delete($page) { -// -//} - // Functions that have been deprecated by block_manager ======================= /** @@ -1341,384 +1430,6 @@ function blocks_find_block($blockid, $blocksarray) { return false; } -/** - * TODO Document this function, description - * - * @param object $page The page object - * @param object $blockmanager The block manager object - * @param string $blockaction One of [config, add, delete] - * @param int|object $instanceorid The instance id or a block_instance object - * @param bool $pinned - * @param bool $redirect To redirect or not to that is the question but you should stick with true - */ -function blocks_execute_action($page, &$blockmanager, $blockaction, $instanceorid, $pinned=false, $redirect=true) { - global $CFG, $USER, $DB; - - if (!in_array($blockaction, array('config', 'add', 'delete'))) { - throw new moodle_exception('Sorry, blocks editing is currently broken. Will be fixed. See MDL-19010.'); - } - - if (is_int($instanceorid)) { - $blockid = $instanceorid; - } else if (is_object($instanceorid)) { - $instance = $instanceorid; - } - - switch($blockaction) { - case 'config': - // First of all check to see if the block wants to be edited - if(!$instance->user_can_edit()) { - break; - } - - // Now get the title and AFTER that load up the instance - $blocktitle = $instance->get_title(); - - // Define the data we're going to silently include in the instance config form here, - // so we can strip them from the submitted data BEFORE serializing it. - $hiddendata = array( - 'sesskey' => sesskey(), - 'instanceid' => $instance->instance->id, - 'blockaction' => 'config' - ); - - // To this data, add anything the page itself needs to display - $hiddendata = $page->url->params($hiddendata); - - if ($data = data_submitted()) { - $remove = array_keys($hiddendata); - foreach($remove as $item) { - unset($data->$item); - } - $instance->instance_config_save($data); - redirect($page->url->out()); - - } else { - // We need to show the config screen, so we highjack the display logic and then die - $strheading = get_string('blockconfiga', 'moodle', $blocktitle); - $nav = build_navigation($strheading, $page->cm); - print_header($strheading, $strheading, $nav); - - echo '
'; /// Make CSS easier - - print_heading($strheading); - echo '
'; - echo '

'; - echo $page->url->hidden_params_out(array(), 0, $hiddendata); - echo '

'; - $instance->instance_config_print(); - echo '
'; - - echo '
'; - global $PAGE; - $PAGE->set_docs_path('blocks/' . $instance->name()); - print_footer(); - die; // Do not go on with the other page-related stuff - } - break; - case 'toggle': - if(empty($instance)) { - print_error('invalidblockinstance', '', '', $blockaction); - } - $instance->visible = ($instance->visible) ? 0 : 1; - if (!empty($pinned)) { - $DB->update_record('block_pinned_old', $instance); - } else { - $DB->update_record('block_instance_old', $instance); - } - break; - case 'delete': - if(empty($instance)) { - print_error('invalidblockinstance', '', '', $blockaction); - } - blocks_delete_instance($instance->instance, $pinned); - break; - case 'moveup': - if(empty($instance)) { - print_error('invalidblockinstance', '', '', $blockaction); - } - - if($instance->weight == 0) { - // The block is the first one, so a move "up" probably means it changes position - // Where is the instance going to be moved? - $newpos = $page->blocks_move_position($instance, BLOCK_MOVE_UP); - $newweight = (empty($blockmanager[$newpos]) ? 0 : max(array_keys($blockmanager[$newpos])) + 1); - - blocks_execute_repositioning($instance, $newpos, $newweight, $pinned); - } - else { - // The block is just moving upwards in the same position. - // This configuration will make sure that even if somehow the weights - // become not continuous, block move operations will eventually bring - // the situation back to normal without printing any warnings. - if(!empty($blockmanager[$instance->position][$instance->weight - 1])) { - $other = $blockmanager[$instance->position][$instance->weight - 1]; - } - if(!empty($other)) { - ++$other->weight; - if (!empty($pinned)) { - $DB->update_record('block_pinned_old', $other); - } else { - $DB->update_record('block_instance_old', $other); - } - } - --$instance->weight; - if (!empty($pinned)) { - $DB->update_record('block_pinned_old', $instance); - } else { - $DB->update_record('block_instance_old', $instance); - } - } - break; - case 'movedown': - if(empty($instance)) { - print_error('invalidblockinstance', '', '', $blockaction); - } - - if($instance->weight == max(array_keys($blockmanager[$instance->position]))) { - // The block is the last one, so a move "down" probably means it changes position - // Where is the instance going to be moved? - $newpos = $page->blocks_move_position($instance, BLOCK_MOVE_DOWN); - $newweight = (empty($blockmanager[$newpos]) ? 0 : max(array_keys($blockmanager[$newpos])) + 1); - - blocks_execute_repositioning($instance, $newpos, $newweight, $pinned); - } - else { - // The block is just moving downwards in the same position. - // This configuration will make sure that even if somehow the weights - // become not continuous, block move operations will eventually bring - // the situation back to normal without printing any warnings. - if(!empty($blockmanager[$instance->position][$instance->weight + 1])) { - $other = $blockmanager[$instance->position][$instance->weight + 1]; - } - if(!empty($other)) { - --$other->weight; - if (!empty($pinned)) { - $DB->update_record('block_pinned_old', $other); - } else { - $DB->update_record('block_instance_old', $other); - } - } - ++$instance->weight; - if (!empty($pinned)) { - $DB->update_record('block_pinned_old', $instance); - } else { - $DB->update_record('block_instance_old', $instance); - } - } - break; - case 'moveleft': - if(empty($instance)) { - print_error('invalidblockinstance', '', '', $blockaction); - } - - // Where is the instance going to be moved? - $newpos = $page->blocks_move_position($instance, BLOCK_MOVE_LEFT); - $newweight = (empty($blockmanager[$newpos]) ? 0 : max(array_keys($blockmanager[$newpos])) + 1); - - blocks_execute_repositioning($instance, $newpos, $newweight, $pinned); - break; - case 'moveright': - if(empty($instance)) { - print_error('invalidblockinstance', '', '', $blockaction); - } - - // Where is the instance going to be moved? - $newpos = $page->blocks_move_position($instance, BLOCK_MOVE_RIGHT); - $newweight = (empty($blockmanager[$newpos]) ? 0 : max(array_keys($blockmanager[$newpos])) + 1); - - blocks_execute_repositioning($instance, $newpos, $newweight, $pinned); - break; - case 'add': - // Add a new instance of this block, if allowed - $block = blocks_get_record($blockid); - - if (empty($block) || !$block->visible) { - // Only allow adding if the block exists and is enabled - break; - } - - if (!$block->multiple && blocks_find_block($blockid, $blockmanager) !== false) { - // If no multiples are allowed and we already have one, return now - break; - } - - if (!block_method_result($block->name, 'user_can_addto', $page)) { - // If the block doesn't want to be added... - break; - } - - $region = $page->blocks->get_default_region(); - $weight = $DB->get_field_sql("SELECT MAX(defaultweight) FROM {block_instances} - WHERE parentcontextid = ? AND defaultregion = ?", array($page->context->id, $region)); - $pagetypepattern = $page->pagetype; - if (strpos($pagetypepattern, 'course-view') === 0) { - $pagetypepattern = 'course-view-*'; - } - $page->blocks->add_block($block->name, $region, $weight, false, $pagetypepattern); - break; - } - - if ($redirect) { - // In order to prevent accidental duplicate actions, redirect to a page with a clean url - redirect($page->url->out()); - } -} - -/** - * TODO deprecate - * - * You can use this to get the blocks to respond to URL actions without much hassle - * - * @param object $PAGE - * @param object $blockmanager - * @param bool $pinned - */ -function blocks_execute_url_action(&$PAGE, &$blockmanager,$pinned=false) { - $blockaction = optional_param('blockaction', '', PARAM_ALPHA); - - if (empty($blockaction) || !$PAGE->user_allowed_editing() || !confirm_sesskey()) { - return; - } - - $instanceid = optional_param('instanceid', 0, PARAM_INT); - $blockid = optional_param('blockid', 0, PARAM_INT); - - if (!empty($blockid)) { - blocks_execute_action($PAGE, $blockmanager, strtolower($blockaction), $blockid, $pinned); - } else if (!empty($instanceid)) { - $instance = $blockmanager->find_instance($instanceid); - blocks_execute_action($PAGE, $blockmanager, strtolower($blockaction), $instance, $pinned); - } -} - -/** - * TODO deprecate - * This shouldn't be used externally at all, it's here for use by blocks_execute_action() - * in order to reduce code repetition. - * - * @todo Remove exception when MDL-19010 is fixed - * - * global object - * @param $instance - * @param $newpos - * @param string|int $newweight - * @param bool $pinned - */ -function blocks_execute_repositioning(&$instance, $newpos, $newweight, $pinned=false) { - global $DB; - - throw new moodle_exception('Sorry, blocks editing is currently broken. Will be fixed. See MDL-19010.'); - - // If it's staying where it is, don't do anything, unless overridden - if ($newpos == $instance->position) { - return; - } - - // Close the weight gap we 'll leave behind - if (!empty($pinned)) { - $sql = "UPDATE {block_instance_old} - SET weight = weight - 1 - WHERE pagetype = ? AND position = ? AND weight > ?"; - $params = array($instance->pagetype, $instance->position, $instance->weight); - - } else { - $sql = "UPDATE {block_instance_old} - SET weight = weight - 1 - WHERE pagetype = ? AND pageid = ? - AND position = ? AND weight > ?"; - $params = array($instance->pagetype, $instance->pageid, $instance->position, $instance->weight); - } - $DB->execute($sql, $params); - - $instance->position = $newpos; - $instance->weight = $newweight; - - if (!empty($pinned)) { - $DB->update_record('block_pinned_old', $instance); - } else { - $DB->update_record('block_instance_old', $instance); - } -} - - -/** - * TODO deprecate - * Moves a block to the new position (column) and weight (sort order). - * - * @param object $instance The block instance to be moved. - * @param string $destpos BLOCK_POS_LEFT or BLOCK_POS_RIGHT. The destination column. - * @param string $destweight The destination sort order. If NULL, we add to the end - * of the destination column. - * @param bool $pinned Are we moving pinned blocks? We can only move pinned blocks - * to a new position withing the pinned list. Likewise, we - * can only moved non-pinned blocks to a new position within - * the non-pinned list. - * @return boolean success or failure - */ -function blocks_move_block($page, &$instance, $destpos, $destweight=NULL, $pinned=false) { - global $CFG, $DB; - - throw new moodle_exception('Sorry, blocks editing is currently broken. Will be fixed. See MDL-19010.'); - - if ($pinned) { - $blocklist = array(); //blocks_get_pinned($page); - } else { - $blocklist = array(); //blocks_get_by_page($page); - } - - if ($blocklist[$instance->position][$instance->weight]->id != $instance->id) { - // The source block instance is not where we think it is. - return false; - } - - // First we close the gap that will be left behind when we take out the - // block from it's current column. - if ($pinned) { - $closegapsql = "UPDATE {block_instance_old} - SET weight = weight - 1 - WHERE weight > ? AND position = ? AND pagetype = ?"; - $params = array($instance->weight, $instance->position, $instance->pagetype); - } else { - $closegapsql = "UPDATE {block_instance_old} - SET weight = weight - 1 - WHERE weight > ? AND position = ? - AND pagetype = ? AND pageid = ?"; - $params = array($instance->weight, $instance->position, $instance->pagetype, $instance->pageid); - } - if (!$DB->execute($closegapsql, $params)) { - return false; - } - - // Now let's make space for the block being moved. - if ($pinned) { - $opengapsql = "UPDATE {block_instance_old} - SET weight = weight + 1 - WHERE weight >= ? AND position = ? AND pagetype = ?"; - $params = array($destweight, $destpos, $instance->pagetype); - } else { - $opengapsql = "UPDATE {block_instance_old} - SET weight = weight + 1 - WHERE weight >= ? AND position = ? - AND pagetype = ? AND pageid = ?"; - $params = array($destweight, $destpos, $instance->pagetype, $instance->pageid); - } - if (!$DB->execute($opengapsql, $params)) { - return false; - } - - // Move the block. - $instance->position = $destpos; - $instance->weight = $destweight; - - if ($pinned) { - $table = 'block_pinned_old'; - } else { - $table = 'block_instance_old'; - } - return $DB->update_record($table, $instance); -} - // Functions for programatically adding default blocks to pages ================ /** diff --git a/lib/deprecatedlib.php b/lib/deprecatedlib.php index 56bacd7513..7d629a1a1c 100644 --- a/lib/deprecatedlib.php +++ b/lib/deprecatedlib.php @@ -2347,6 +2347,68 @@ function blocks_preferred_width($instances) { $width = 210; } +/** + * @deprecated since Moodle 2.0. See the replacements in blocklib.php. + * + * @param object $page The page object + * @param object $blockmanager The block manager object + * @param string $blockaction One of [config, add, delete] + * @param int|object $instanceorid The instance id or a block_instance object + * @param bool $pinned + * @param bool $redirect To redirect or not to that is the question but you should stick with true + */ +function blocks_execute_action($page, &$blockmanager, $blockaction, $instanceorid, $pinned=false, $redirect=true) { + throw new coding_exception('blocks_execute_action is no longer used. The way blocks work has been changed. See the new code in blocklib.php.'); +} + +/** + * You can use this to get the blocks to respond to URL actions without much hassle + * + * @deprecated since Moodle 2.0. Blocks have been changed. {@link block_manager::process_url_actions} is the closest replacement. + * + * @param object $PAGE + * @param object $blockmanager + * @param bool $pinned + */ +function blocks_execute_url_action(&$PAGE, &$blockmanager,$pinned=false) { + throw new coding_exception('blocks_execute_url_action is no longer used. It has been replaced by methods of block_manager.'); +} + +/** + * This shouldn't be used externally at all, it's here for use by blocks_execute_action() + * in order to reduce code repetition. + * + * @deprecated since Moodle 2.0. See the replacements in blocklib.php. + * + * @param $instance + * @param $newpos + * @param string|int $newweight + * @param bool $pinned + */ +function blocks_execute_repositioning(&$instance, $newpos, $newweight, $pinned=false) { + throw new coding_exception('blocks_execute_repositioning is no longer used. The way blocks work has been changed. See the new code in blocklib.php.'); +} + + +/** + * Moves a block to the new position (column) and weight (sort order). + * + * @deprecated since Moodle 2.0. See the replacements in blocklib.php. + * + * @param object $instance The block instance to be moved. + * @param string $destpos BLOCK_POS_LEFT or BLOCK_POS_RIGHT. The destination column. + * @param string $destweight The destination sort order. If NULL, we add to the end + * of the destination column. + * @param bool $pinned Are we moving pinned blocks? We can only move pinned blocks + * to a new position withing the pinned list. Likewise, we + * can only moved non-pinned blocks to a new position within + * the non-pinned list. + * @return boolean success or failure + */ +function blocks_move_block($page, &$instance, $destpos, $destweight=NULL, $pinned=false) { + throw new coding_exception('blocks_move_block is no longer used. The way blocks work has been changed. See the new code in blocklib.php.'); +} + /** * Print a nicely formatted table. * diff --git a/lib/pagelib.php b/lib/pagelib.php index ca65ed31a1..4d265b7b55 100644 --- a/lib/pagelib.php +++ b/lib/pagelib.php @@ -893,9 +893,11 @@ class moodle_page { if (!during_initial_install()) { $this->blocks->load_blocks(); - if (empty($this->_block_actions_done) && block_process_url_actions($this)) { + if (empty($this->_block_actions_done)) { $this->_block_actions_done = true; - redirect($this->url->out(false, array(), false)); + if ($this->blocks->process_url_actions($this)) { + redirect($this->url->out(false, array(), false)); + } } $this->blocks->create_all_block_instances(); } -- 2.39.5