AutorÃa | Ultima modificación | Ver Log |
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Manage multiblock instances.
*
* @package block_multiblock
* @copyright 2019 Peter Spicer <peter.spicer@catalyst-eu.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
use block_multiblock\helper;
use block_multiblock\icon_helper;
use block_multiblock\navigation;
require(__DIR__ . '/../../config.php');
require_once($CFG->libdir.'/tablelib.php');
$blockid = required_param('id', PARAM_INT);
$actionableinstance = optional_param('instance', 0, PARAM_INT);
$performaction = optional_param('action', '', PARAM_TEXT);
require_login();
list($block, $blockinstance, $blockmanager) = helper::bootstrap_page($blockid);
// Now we've done permissions checks, reset the URL to be the real one.
$pageurl = new moodle_url('/blocks/multiblock/manage.php', ['id' => $blockid]);
helper::set_page_real_url($pageurl);
$blockmanager->show_only_fake_blocks(true);
$blockctx = context_block::instance($blockid);
$multiblockblocks = $blockinstance->load_multiblocks($blockctx->id);
// Set up the add block routine.
$forcereload = false;
$addblock = new \block_multiblock\form\addblock($pageurl, ['id' => $blockid]);
if ($newblockdata = $addblock->get_data()) {
if (!empty($newblockdata->addsubmit) && $newblockdata->addblock) {
$position = 1;
foreach ($multiblockblocks as $instance) {
if ((int) $instance->defaultweight > $position) {
$position = (int) $instance->defaultweight;
}
}
// Add the block to the parent context, then move it in.
$blockmanager->add_block($newblockdata->addblock, $blockmanager->get_default_region(), $position + 1,
$block->showinsubcontexts);
// Helpfully, $blockmanager won't give us back the id it just added, so we have to go find it.
$conditions = [
'blockname' => $newblockdata->addblock,
'parentcontextid' => $PAGE->context->id,
];
$lastinserted = $DB->get_records('block_instances', $conditions, 'id DESC', 'id', 0, 1);
if ($lastinserted) {
helper::move_block(current($lastinserted)->id, $blockid);
}
// Now we need to re-prep the table exist.
$forcereload = true;
} else if (!empty($newblockdata->movesubmit) && !empty($newblockdata->moveblock)) {
// Merge it in and then reprep the table and form.
helper::move_block($newblockdata->moveblock, $blockid);
$forcereload = true;
}
} else if ($performaction) {
switch ($performaction) {
case 'moveup':
$positions = array_keys($multiblockblocks);
if (in_array($actionableinstance, $positions) && $positions[0] != $actionableinstance) {
$current = array_search($actionableinstance, $positions);
$temp = $positions[$current - 1];
$positions[$current - 1] = $positions[$current];
$positions[$current] = $temp;
}
foreach ($positions as $position => $actionableinstance) {
$new = (object) [
'id' => $actionableinstance,
'defaultweight' => $position + 1,
];
$DB->update_record('block_instances', $new);
}
$forcereload = true;
break;
case 'movedown':
$positions = array_keys($multiblockblocks);
if (in_array($actionableinstance, $positions) && $positions[count($positions) - 1] != $actionableinstance) {
$current = array_search($actionableinstance, $positions);
$temp = $positions[$current + 1];
$positions[$current + 1] = $positions[$current];
$positions[$current] = $temp;
}
foreach ($positions as $position => $actionableinstance) {
$new = (object) [
'id' => $actionableinstance,
'defaultweight' => $position + 1,
];
$DB->update_record('block_instances', $new);
}
$forcereload = true;
break;
case 'split':
helper::split_block($blockinstance->instance, $actionableinstance);
$forcereload = true;
break;
case 'delete':
blocks_delete_instance($multiblockblocks[$actionableinstance]);
$forcereload = true;
break;
case 'splitdelete':
$parenturl = navigation::get_page_url($blockid);
foreach (array_keys($multiblockblocks) as $childid) {
helper::split_block($blockinstance->instance, $childid);
}
blocks_delete_instance($blockinstance->instance);
redirect($parenturl);
break;
}
}
// And begin our output.
echo $OUTPUT->header();
if ($forcereload) {
$multiblockblocks = $blockinstance->load_multiblocks($blockctx->id);
unset($_POST['addblock'], $_POST['moveblock']); // Reset the form element so it doesn't attempt to reuse values it had before.
$addblock = new \block_multiblock\form\addblock($pageurl, ['id' => $blockid]);
}
if (empty($multiblockblocks)) {
echo html_writer::tag('p', get_string('multiblockhasnosubblocks', 'block_multiblock'));
} else {
$table = new flexible_table('block_multiblock_admin');
$headers = [
'title' => get_string('table:blocktitle', 'block_multiblock'),
'type' => get_string('table:blocktype', 'block_multiblock'),
'actions' => get_string('table:actions', 'block_multiblock'),
];
if (!helper::is_totara()) {
$headers['updated'] = get_string('table:lastupdated', 'block_multiblock');
}
$table->define_columns(array_keys($headers));
$table->define_headers(array_values($headers));
$table->define_baseurl(new moodle_url('/blocks/multiblock/manage.php', ['id' => $blockid]));
$table->set_attribute('class', 'admintable blockstable generaltable');
$table->set_attribute('id', 'multiblocktable');
$table->sortable(false);
$table->setup();
$first = 0;
$last = 0;
foreach ($multiblockblocks as $instance) {
if (!$first) {
$first = $instance->id;
}
$last = $instance->id;
}
foreach ($multiblockblocks as $instance) {
$actions = '';
$baseactionurl = new moodle_url('/blocks/multiblock/manage.php', [
'id' => $blockid,
'instance' => $instance->id,
'sesskey' => sesskey()
]);
// Molve the sub-block up, if it's not the first one.
if ($instance->id != $first) {
$url = $baseactionurl;
$url->params(['action' => 'moveup']);
$actions .= $OUTPUT->action_icon($url, icon_helper::arrow_up(get_string('moveup')));
} else {
$actions .= icon_helper::space();
}
// Move sub-block down, if it's not the last one.
if ($instance->id != $last) {
$url = $baseactionurl;
$url->params(['action' => 'movedown']);
$actions .= $OUTPUT->action_icon($url, icon_helper::arrow_down(get_string('movedown')));
} else {
$actions .= icon_helper::space();
}
// Edit settings button.
if (file_exists($CFG->dirroot . '/blocks/' . $instance->blockinstance->name() . '/edit_form.php')) {
$url = new moodle_url('/blocks/multiblock/configinstance.php', [
'id' => $blockid,
'instance' => $instance->id,
'sesskey' => sesskey(),
]);
$actions .= $OUTPUT->action_icon($url, icon_helper::settings(get_string('settings')));
} else {
$actions .= icon_helper::space();
}
// Split out to parent context.
$url = $baseactionurl;
$url->params(['action' => 'split']);
$actions .= $OUTPUT->action_icon($url, icon_helper::level_up(get_string('movetoparentpage', 'block_multiblock')));
// Delete button.
$url = $baseactionurl;
$url->params(['action' => 'delete']);
$actions .= $OUTPUT->action_icon($url, icon_helper::delete(get_string('delete')));
$notitle = html_writer::tag('em', get_string('notitle', 'block_multiblock'), ['class' => 'text-muted']);
$row = [
!empty($instance->blockinstance->get_title()) ? $instance->blockinstance->get_title() : $notitle,
get_string('pluginname', 'block_' . $instance->blockinstance->name()),
$actions,
];
if (!helper::is_totara()) {
$row[] = userdate($instance->timemodified, get_string('strftimedatetime', 'core_langconfig'));
}
$table->add_data($row);
}
$table->print_html();
}
echo html_writer::empty_tag('hr');
$addblock->display();
echo $OUTPUT->footer();