Я новичок в 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_ before departmentid и 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 будут два выбора: один с параметрами и другой, где вам нужно показать результаты.
$mform->addElement('select', 'departmentid', "Select Department", $department_array); $student_array = array("All Students"); $mform->addElement('select', 'studentid', "Select Student", $student_array);
Кроме того, не забудьте добавить следующую функцию, чтобы вы могли правильно читать данные при использовании $ form-> 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; }
Я надеюсь, что это помогает!