如何在Moodle中调试自定义插件?

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

我被要求创建一个自定义插件,通过API显示课程概览(课程ID,课程名称,已注册和已完成)。有一个report_completionoverview插件,我可以参考,基本上想通过Moodle API以JSON格式检索完全相同的列表。

enter image description here

我试图创建一个基于moodle文档的本地插件(https:/docs.moodle.orgdevAdding_a_web_service_to_a_plugin。)等默认插件,但难以调试。

* 修改文件夹名,使之与插件名一致

我创造了

localget_completion_overviewdbservice.php。

localget_completion_overviewlangenlocal_get_completion_overview.php。

localget_completion_overviewexternallib.php

localget_completion_overviewversion.php

在Moodle中成功安装了插件,没有出错,但是在函数中没有列出这个插件。

The plugin is installed

enter image description here

说实话,我觉得我的代码不对(因为我从不同的源头复制过来的,所以很乱),但是不知道怎么调试。

谁能告诉我,如果你知道怎么做?

我还附上了localcompletionviewexternallib.php(我相信这就是导致问题的原因)。任何帮助或想法或评论将被感激。非常感谢

<?php
require_once($CFG->libdir . "/externallib.php");
require_once("lib.php");

class local_get_completion_overview_external extends external_api {

    public static function get_completion_overview_parameters() {
        return new external_function_parameters(
            array(
                'field' => new external_value(PARAM_ALPHA, 'The field to search can be left empty for all courses or:
                    id: course id
                    ids: comma separated course ids
                    shortname: course short name
                    idnumber: course id number
                    category: category id the course belongs to
                ', VALUE_DEFAULT, ''),
                'value' => new external_value(PARAM_RAW, 'The value to match', VALUE_DEFAULT, '')
            )
        );
    }

    public static function get_completion_overview($field = '', $value = ''){
        global $CFG, $DB;
        require_once($CFG->dirroot . '/course/lib.php');
        require_once($CFG->libdir . '/filterlib.php');

        $params = self::validate_parameters(self::get_completion_overview_parameters(),
            array(
                'field' => $field,
                'value' => $value,
            )
        );

        $sql = "SELECT DISTINCT cr.id AS courseid, cr.fullname AS coursename,
        COUNT(DISTINCT ra.id ) AS enrols,
        COUNT(DISTINCT cc.timecompleted) AS completed
        FROM {course} cr
        JOIN {context} ct ON ( ct.instanceid = cr.id )
        LEFT JOIN {role_assignments} ra ON ( ra.contextid = ct.id ) and ra.roleid = 5
        LEFT JOIN {course_completions} cc ON cc.course = cr.id
        GROUP BY  cr.fullname, cr.id
        ORDER BY coursename";

        $warnings = array();

        if (empty($params['field'])) {
            $courses = $DB->get_records_sql($sql, array());
        } else {
            switch ($params['field']) {
                case 'id':
                case 'category':
                    $value = clean_param($params['value'], PARAM_INT);
                    break;
                case 'ids':
                    $value = clean_param($params['value'], PARAM_SEQUENCE);
                    break;
                case 'shortname':
                    $value = clean_param($params['value'], PARAM_TEXT);
                    break;
                case 'idnumber':
                    $value = clean_param($params['value'], PARAM_RAW);
                    break;
                default:
                    throw new invalid_parameter_exception('Invalid field name');
            }

            if ($params['field'] === 'ids') {
                $courses = $DB->get_records_list('course', 'id', explode(',', $value), 'id ASC');
            } else {
                $courses = $DB->get_records('course', array($params['field'] => $value), 'id ASC');
            }
        }

        if(!empty($courses)){

            $coursesdata = array();
            $currentcourseid = null;
            $course = null;

            foreach($courses as $completion) {
                $context = context_course::instance($course->id);
                $crs = array();
                $crs['courseid'] = $completion->courseid;
                $crs['coursename'] = (string)$completion->coursename;
                $crs['enrols'] = $completion->enrols;
                $crs['completed'] = $completion->completed;

                try {
                    self::validate_context($context);
                } catch (Exception $e) {
                    continue;
                }

                if(is_null($currentcourseid) || ($completion->courseid != $currentcourseid)) {
                    if(!is_null($course)) {
                        $coursesdata[] = $course;
                    }
                    $course = array();
                    $course['courseid'] = $completion->courseid;
                }

                $course['courseid'][] = $crs;

                $currentcourseid = $completion->courseid;
            }

            if(!is_null($course)){
                $coursesdata[] = $course;
            }

            $courses->close();
        }

        $result = array();
        $result['course'] = $coursesdata;

        return $result;
    }

    public static function get_completion_overview_returns() {
        return new external_single_structure(
            array(
                'course' => new external_multiple_structure(self::get_completion_overview(), 'list of courses completion')
            )
            );
    }
}

** service.php

<?php

$functions = array(
    'local_get_completion_overview' =>
        array('classname'   => 'local_get_completion_overview_external',
            'methodname'  => 'get_completion_overview',
            'classpath'   => 'local/get_completion_overview/externallib.php',
            'description' => 'Get course completion overview',
            'type'        => 'read',
            'capabilities'=> array(), //optional, useful to let the administrator know what potential capabilities the user 'could' need
            'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
        ),
    );

$services = array(
    'get completion overview' => array(                                                //the name of the web service
        'functions' => array ('local_get_completion_overview'), //web service functions of this service
        'requiredcapability' => '',                //if set, the web service user need this capability to access 
                                                                            //any function of this service. For example: 'some/capability:specified'                 
        'restrictedusers' =>0,                                             //if enabled, the Moodle administrator must link some user to this service
                                                                            //into the administration
        'enabled'=>1,                                                       //if enabled, the service can be reachable on a default installation
        )
);
php debugging plugins moodle moodle-api
© www.soinside.com 2019 - 2024. All rights reserved.