Я новичок в Moodle и всегда программирую на стороне клиента. Я думаю, может быть, я что-то упустил по этой причине. Мне нужно предоставить пользователю различные элементы пользовательского интерфейса, в соответствии с тем, что он выбирает в комбо. Поэтому я думал о написании леметов в соответствии со стратегией (шаблон дизайна). Из объекта в mod_form.php я пытался выполнить что-то вроде этого:
$this -> _form -> addElement('select', 'displayStrategy', get_string('displayStrategy', 'xForum'), $displayStrategy, array('onchange' => 'javascript: function loadStrategy(selVal){
$.ajax({
type: "POST",
url: "../mod/xForum/action/displayStrategy.php",
data: { class: selVal }
}).done(function( msg ) {
console.log("Strategy was executed");
});
}; loadStrategy(this.value);') );
Это выполняется, и журнал печатается в консоли, но содержимое в displayStrategy.php никогда не выполняется, эффект «загрузки» добавляется к текущему представлению, и последняя проблема заключается в том, что мне также нужно вызывать функцию в том же объект, который пишет интерфейс (тот, что в mod_form.php, который выполняет все $ this -> _form -> addElement (…))
Можешь дать мне руку? Как я могу выполнить эти методы в соответствии со стратегией?
Большое спасибо!
Для этого я сделал следующее:
Поместите ваш скрипт в отдельный документ и назовите его внутри вашего file_form.php:
// Get data dynamically based on the selection from the dropdown
$PAGE->requires->js(new moodle_url('/blocks/mymodulename/js/myscript.js'));
Файл myscript.js имеет функции «.change» для определения того, когда «select» был изменен, и «.load» для получения данных из файла getter.php, передавая параметр из выбранного «select». Также обратите внимание на префикс #id_ передpartmentid и studentid, если вы проверяете элементы, именно так они и называются.
window.onload = init;
function init() {
// When a select is changed, look for the students based on the department id
// and display on the dropdown students select
$('#id_departmentid').change(function() {
$('#id_studentid').load('getter.php?departmentid=' + $('#id_departmentid').val());
});
}
В файле getter.php перехватите параметр, отправленный методом $ _GET, выполните запрос и отобразите результаты. Так что файл getter.php будет выглядеть так:
<?php
require_once("../../config.php");
global $DB;
// Get the parameter
$departmentid = optional_param('departmentid', 0, PARAM_INT);
// If departmentid exists
if($departmentid) {
// Do your query
$query = 'SELECT * FROM {table_without_prefix} WHERE departmentid = ' . $departmentid;
$student_arr = $DB->get_records_sql($query, null, $limitfrom=0, $limitnum=0);
// echo your results, loop the array of objects and echo each one
echo "<option value='0'>All Students</option>";
foreach ($student_arr as $student) {
echo "<option value=".$student->id.">" . $student->fullname . "</option>";
}
}
?>
Наконец, ваш file_form.php будет иметь 2 выбора, один с параметрами, а другой с тем, где вам нужно показать результаты.
$mform->addElement('select', 'departmentid', "Select Department", $department_array);
$student_array = array("All Students");
$mform->addElement('select', 'studentid', "Select Student", $student_array);
Кроме того, обязательно добавьте следующую функцию, чтобы вы могли правильно читать данные при использовании $ Форма-> get_data ();
function get_data(){
global $DB;
$data = parent::get_data();
if (!empty($data)) {
$mform =& $this->_form;
// Add the studentid properly to the $data object.
if(!empty($mform->_submitValues['studentid'])) {
$data->studentid = $mform->_submitValues['studentid'];
}
}
return $data;
}
Я надеюсь, что это помогает!
Других решений пока нет …