我正在尝试通过下拉菜单为 Moodle 块插件内的课程构建过滤器功能。据我所知,要走的路是
到目前为止,除了第 3 步和第 4 步之外,我已经成功地实施了这种方法。
用load函数调用PHP文件时
.load('/blocks/course_overview_page/block_course_overview_page.php?language=' + $('[data-action="language-select"]').val())
,并没有重定向到那个页面,但是直接在浏览器中打开URL就可以了
为了过滤课程,我编写了一个 controller.php 文件来处理数据库请求。我的插件基础文件中需要控制器。但是当我调用基础文件时,它显示错误,它缺少它扩展的 block_base 类。
现在我想知道我是否犯了错误,或者我是否选择了错误的方法。任何帮助表示赞赏。
我用这个答案来帮助实现这个。
这是我的代码:
<select name="language-select" data-action="language-select">
{{#languages}}
<option value="{{.}}">{{.}}</option>
{{/languages}}
</select>
window.onload = init;
function init() {
/* load base plugin file and send language as query param */
$('[data-action="language-select"]').change(function() {
console.log($('[data-action="language-select"]').val());
$('[data-action="language-select"]').load('/blocks/course_overview_page/block_course_overview_page.php?language=' + $('[data-action="language-select"]').val());
});
}
require_once(__DIR__ . '/db/controller.php');
require_once($CFG->libdir . '/pagelib.php');
class block_course_overview_page extends block_base {
public function get_content() {
global $CFG, $OUTPUT, $PAGE;
if ($this->content !== null) {
return $this->content;
}
$this->content = new stdClass();
/* load js script to handle events */
$PAGE->requires->js(new moodle_url('/blocks/course_overview_page/js/filter.js'));
$languageoptions = get_languages();
/* get language from query params */
$selectedlanguage = optional_param('language', 0, PARAM_INT);
if ($selectedlanguage) {
get_filtered_courses($selectedlanguage);
}
/* data object is necessary to wrap courses list for iteration inside template */
$data = (object)[
'courses' => array_values(get_all_courses_for_overview()),
'languages' => $languageoptions
];
/* render template and pass data */
$this->content->text = $OUTPUT->render_from_template('block_course_overview_page/cards', $data);
return $this->content;
}