如何从 Moodle 胡子模板调用 PHP 函数?

问题描述 投票:0回答:0

我正在尝试通过下拉菜单为 Moodle 块插件内的课程构建过滤器功能。据我所知,要走的路是

  1. 在模板中使用选择元素
  2. 处理js文件中select元素的onchange事件
  3. 使用来自事件处理程序的查询参数调用 PHP 文件
  4. 在 PHP 函数中使用查询参数

到目前为止,除了第 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 类。

现在我想知道我是否犯了错误,或者我是否选择了错误的方法。任何帮助表示赞赏。

我用这个答案来帮助实现这个。

这是我的代码:

filter.mustache

<select name="language-select" data-action="language-select">
  {{#languages}}
    <option value="{{.}}">{{.}}</option>
  {{/languages}}
</select>

过滤器.js

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());
    });

}

block_course_overview_page.php

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;
  }
javascript php moodle mustache
© www.soinside.com 2019 - 2024. All rights reserved.