javascript — добавление новых элементов пользовательского интерфейса moodle в соответствии с событием onchange элемента select

Я новичок в 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 (…))

Можешь дать мне руку? Как я могу выполнить эти методы в соответствии со стратегией?

Большое спасибо!

1

Решение

Для этого я сделал следующее:

  1. Поместите ваш скрипт в отдельный документ и назовите его внутри вашего file_form.php:

    // Get data dynamically based on the selection from the dropdown
    $PAGE->requires->js(new moodle_url('/blocks/mymodulename/js/myscript.js'));
    
  2. Файл 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());
    });
    
    }
    
  3. В файле 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>";
    }
    
    }
    ?>
    
  4. Наконец, ваш 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;
}
  1. Вот краткое видео результатов: http://screencast.com/t/KDtiWzDN

Я надеюсь, что это помогает!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]