js_init_call赋予无法在Moodle块插件中调用未定义的方法'init'

时间:2012-10-22 20:52:05

标签: plugins block moodle

我有一个moodle块插件,我试图在页面中包含javascript。

无论我如何尝试,js_init_call调用的javascript总是抛出一个错误而不是运行我已经尝试将一个完整的数组传递给js_init_call,我尝试了一个简写形式,假设该文件名为module.js

如果javascript文件不存在,我会收到moodle错误抱怨丢失的文件。如果 存在,我会收到如上所述的javascript错误。我做错了什么?

block_foo.php:

<?php
class block_foo extends block_base {
    public function init() {
    $this->title = get_string('foo', 'block_foo');
    }

    public function applicable_formats(){
        return array('course-view' => true);
    }

    public function get_content() {
        global $PAGE;
        if ($this->content !== null) {
          return $this->content;
        }

        if(!isloggedin()){
        //if(!is_enrolled()){
            return false;
        }
        $this->content         =  new stdClass;
        $this->content->text = 'asdf';
        $this->content->footer = '';

        $jsmodule = array(
            'name'     => 'block_foo',
            'fullpath' => '/blocks/foo/foo.js',
            'requires' => array(),
            'strings' => array()
        );
        $PAGE->requires->js_init_call('M.block_foo.init', null, false, $jsmodule);

        //This style of call doesn't work either... (if the js is named module.js)
        //$PAGE->requires->js_init_call('M.block_foo.init', null);

        return $this->content;
    }

    function hide_header(){
        return true;
    }
}

module.js或foo.js:

M.block_foo = {};
M.block_foo.init = function(){
    alert("I was called, yay");
    $var = 1234;
    $var = $var + 3;
};

2 个答案:

答案 0 :(得分:1)

最终,这个问题是由Moodle响应大小为0的HTTP / 200响应引起的javascript文件请求。

该响应似乎是由模块只是我的开发目录的符号链接而不是文件的实际副本引起的。为什么这只发生在javascript文件中,而不是php文件,我不知道。

所以不要开发moodle模块,然后将它们符号链接到位。

答案 1 :(得分:0)

我知道这是一个老问题,但为了将来参考,请使用'fullpath' => new moodle_url($CFG->wwwroot.'/blocks/foo/foo.js'),,您不会对符号链接产生任何问题。