Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
176 changes: 16 additions & 160 deletions edit_form.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class block_featured_courses_edit_form extends block_edit_form {
* @param object $mform
* @throws coding_exception|moodle_exception
*/
protected function specific_definition($mform) {
protected function specific_definition($mform): void {

// Section header title according to language file.
$mform->addElement('header', 'configheader', get_string('blocksettings', 'block'));
Expand All @@ -52,178 +52,34 @@ protected function specific_definition($mform) {
foreach ($courses as $c) {
$courseitems[$c->id] = " {$c->get_formatted_name()} ($c->id)";
}
$repeatarray = array();
$repeatedoptions = array();

$repeatarray[] = $mform->createElement('searchableselector',
'config_selectedcourses',
get_string('config:selectedcourses', 'block_featured_courses'),
$courseitems
);
$repeatarray = [
$mform->createElement(
'searchableselector',
'config_selectedcourses',
get_string('config:selectedcourses', 'block_featured_courses'),
$courseitems, false),
$mform->createElement('submit', 'delete', get_string('delete'))
];
$repeatedoptions['config_selectedcourses']['type'] = PARAM_RAW;
$numbcourses = empty($this->block->config->selectedcourses) ? 1 : count($this->block->config->selectedcourses);
$this->repeat_elements($repeatarray,
$this->repeat_elements(
$repeatarray,
$numbcourses,
$repeatedoptions,
'selectcourses_repeats',
'selectcourse_add_fields',
3,
get_string('addmorecourses', 'block_featured_courses'),
false,
'selectcourse_remove_fields',
get_string('removelastcourses', 'block_featured_courses')
'delete'
);
}

/**
* Method to add a repeating group of elements to a form.
*
* We can also remove the last element of the list.
*
* @param array $elementobjs Array of elements or groups of elements that are to be repeated
* @param int $repeats no of times to repeat elements initially
* @param array $options a nested array. The first array key is the element name.
* the second array key is the type of option to set, and depend on that option,
* the value takes different forms.
* 'default' - default value to set. Can include '{no}' which is replaced by the repeat number.
* 'type' - PARAM_* type.
* 'helpbutton' - array containing the helpbutton params.
* 'disabledif' - array containing the disabledIf() arguments after the element name.
* 'rule' - array containing the addRule arguments after the element name.
* 'expanded' - whether this section of the form should be expanded by default. (Name be a header element.)
* 'advanced' - whether this element is hidden by 'Show more ...'.
* @param string $repeathiddenname name for hidden element storing no of repeats in this form
* @param string $addfieldsname name for button to add more fields
* @param int $addfieldsno how many fields to add at a time
* @param string $addstring name of button, {no} is replaced by no of blanks that will be added.
* @param bool $addbuttoninside if true, don't call closeHeaderBefore($addfieldsname). Default false.
* @param string $deletefieldsname name of the button that will trigger the deletion of the repeat element
* @param string $deletestring name for button to remove the last field
* @return int no of repeats of element in this page
* @throws coding_exception
*/
public function repeat_elements($elementobjs, $repeats, $options, $repeathiddenname,
$addfieldsname,
$addfieldsno = 5,
$addstring = null,
$addbuttoninside = false,
$deletefieldsname = null,
$deletestring = null
): int {
$repeats = $this->optional_param($repeathiddenname, $repeats, PARAM_INT);
if ($deletefieldsname) {
$removefields = $this->optional_param($deletefieldsname, '', PARAM_TEXT);
if (!empty($removefields)) {
$repeats -= 1; // Remove last course.
}
if ($deletestring === null) {
$deletestring = get_string('delete', 'moodle');
}
}
if ($addstring === null) {
$addstring = get_string('addfields', 'form', $addfieldsno);
} else {
$addstring = str_ireplace('{no}', $addfieldsno, $addstring);
}

$addfields = $this->optional_param($addfieldsname, '', PARAM_TEXT);
if (!empty($addfields)) {
$repeats += $addfieldsno;
}
$mform =& $this->_form;
$mform->registerNoSubmitButton($addfieldsname);
$mform->addElement('hidden', $repeathiddenname, $repeats);
$mform->setType($repeathiddenname, PARAM_INT);
// Value not to be overridden by submitted value.
$mform->setConstants(array($repeathiddenname => $repeats));
$namecloned = array();
for ($i = 0; $i < $repeats; $i++) {
foreach ($elementobjs as $elementobj) {
$elementclone = fullclone($elementobj);
$this->repeat_elements_fix_clone($i, $elementclone, $namecloned);

if ($elementclone instanceof HTML_QuickForm_group && !$elementclone->_appendName) {
foreach ($elementclone->getElements() as $el) {
$this->repeat_elements_fix_clone($i, $el, $namecloned);
}
$elementclone->setLabel(str_replace('{no}', $i + 1, $elementclone->getLabel()));
}

$mform->addElement($elementclone);
}
}
for ($i = 0; $i < $repeats; $i++) {
foreach ($options as $elementname => $elementoptions) {
$pos = strpos($elementname, '[');
if ($pos !== false) {
$realelementname = substr($elementname, 0, $pos) . "[$i]";
$realelementname .= substr($elementname, $pos);
} else {
$realelementname = $elementname . "[$i]";
}
foreach ($elementoptions as $option => $params) {

switch ($option) {
case 'default' :
$mform->setDefault($realelementname, str_replace('{no}', $i + 1, $params));
break;
case 'helpbutton' :
$params = array_merge(array($realelementname), $params);
call_user_func_array(array(&$mform, 'addHelpButton'), $params);
break;
case 'disabledif' :
foreach ($namecloned as $name) {
if ($params[0] == $name) {
$params[0] = $params[0] . "[$i]";
break;
}
}
$params = array_merge(array($realelementname), $params);
call_user_func_array(array(&$mform, 'disabledIf'), $params);
break;
case 'hideif' :
foreach ($namecloned as $name) {
if ($params[0] == $name) {
$params[0] = $params[0] . "[$i]";
break;
}
}
$params = array_merge(array($realelementname), $params);
call_user_func_array(array(&$mform, 'hideIf'), $params);
break;
case 'rule' :
if (is_string($params)) {
$params = array(null, $params, null, 'client');
}
$params = array_merge(array($realelementname), $params);
call_user_func_array(array(&$mform, 'addRule'), $params);
break;

case 'type':
$mform->setType($realelementname, $params);
break;

case 'expanded':
$mform->setExpanded($realelementname, $params);
break;

case 'advanced' :
$mform->setAdvanced($realelementname, $params);
break;
}
}
// Add unique id to searchable selectors.
foreach ($mform->_elements as $idx => $elem) {
if ($elem instanceof MoodleQuickForm_searchableselector) {
$elem->_attributes['id'] = $elem->_attributes['id'] . $idx;
}
}
$mform->addElement('submit', $addfieldsname, $addstring);
if ($deletefieldsname) {
$mform->addElement('submit', $deletefieldsname, $deletestring);
$mform->registerNoSubmitButton($deletefieldsname);
}

if (!$addbuttoninside) {
$mform->closeHeaderBefore($addfieldsname);
}

return $repeats;
}
}