Moodle The module MYMODULE does not define the standard capability

moodle, php

Solution

At first it seemed like a strange error message, since it mentions `mod/mymodule:addinstance` but you don't have that in your code. But on closer inspection, that seems to be the problem - moodle expects you to define `addinstance` but you don't!

This is apparently a new behavior from 2.4 onwards: http://docs.moodle.org/dev/Blocks#db.2Faccess.php

The solution seems to be to add `addinstance` (and possibly `myaddinstance`, depending on your settings and implementation) to your `$capabilities` array.

Problem

I am developing a module for Moodle. I've achieve to install and instantiate it in a course. The problem is that, in "edit mode" enabled, moodle me out the following message: ``` The module mymodule does not define the standard capability mod/mymodule:addinstance line 3451 of \course\lib.php: call to debugging() line 1899 of \course\lib.php: call to course_allowed_module() line 1767 of \course\lib.php: call to get_module_metadata() line 682 of \course\format\renderer.php: call to print_section_add_menus() line 49 of \course\format\weeks\format.php: call to format_section_renderer_base->print_multiple_section_page() line 276 of \course\view.php: call to require() ``` In `/mod/mymodule/db/access.php` file I have the following code: ``` defined('MOODLE_INTERNAL') || die(); $capabilities = array( 'mod/mymodule:view' => array( 'captype' => 'read', 'contextlevel' => CONTEXT_MODULE, 'legacy' => array( 'guest' => CAP_ALLOW, 'student' => CAP_ALLOW, 'teacher' => CAP_ALLOW, 'editingteacher' => CAP_ALLOW, 'admin' => CAP_ALLOW ) ), 'mod/mymodule:submit' => array( 'riskbitmask' => RISK_SPAM, 'captype' => 'write', 'contextlevel' => CONTEXT_MODULE, 'legacy' => array( 'student' => CAP_ALLOW ) ), ); ``` I am a beginner in module development for Moodle. I have read the following documentation: - http://docs.moodle.org/dev/NEWMODULE_Adding_capabilities - http://docs.moodle.org/dev/Access_API But I have not clarified anything. EDITED 2013-04-28 I have added this code to my access.php file ($capabilities array): ``` 'mod/mymodule:myaddinstance' => array( 'captype' => 'write', 'contextlevel' => CONTEXT_SYSTEM, 'archetypes' => array( 'user' => CAP_ALLOW ), 'clonepermissionsfrom' => 'moodle/my:manageblocks' ), 'mod/mymodule:addinstance' => array( 'riskbitmask' => RISK_SPAM | RISK_XSS, 'captype' => 'write', 'contextlevel' => CONTEXT_MODULE, 'archetypes' => array( 'editingteacher' => CAP_ALLOW, 'manager' => CAP_ALLOW ), 'clonepermissionsfrom' => 'moodle/site:manageblocks' ), ``` But it doesn't works.

Original source