Element Library: Difference between revisions
Damyon Wiese (talk | contribs) |
Damyon Wiese (talk | contribs) |
||
Line 29: | Line 29: | ||
== How to add something to the element library (for developers) == | == How to add something to the element library (for developers) == | ||
Each "thing" in the element library - is rendered by an instance of a \core\output\renderer_test class. For a plugin (or core) to add a new "thing" they must: | Each "thing" in the element library - is rendered by an instance of a \core\output\renderer_test class. | ||
A) Extend the abstract class "\core\output\renderer_test_generator_base" with a new class named "\{plugin namespace}\output\renderer_test_generator". This class needs to implement the "create_tests" function which accepts no arguments and returns a list of subclasses of "\core\output\renderer_test_base" | |||
For a plugin (or core) to add a new "thing" they must: | |||
A) Implement the tests in subclasses of "\core\output\renderer_test_base". These classes can have any name, but it is recommended to name them as "\{plugin namespace}\output\XXX_renderer_test". Each test must define a "execute()" method which produces the output, as well as supply developer docs, a name for the test and a category. | |||
B) Extend the abstract class "\core\output\renderer_test_generator_base" with a new class named "\{plugin namespace}\output\renderer_test_generator". This class needs to extend "\core\output\renderer_test_generator_base". There is one function to implement, which is the "create_tests" function which accepts no arguments and returns a list of subclasses of "\core\output\renderer_test_base" (implemented in step A) | |||
Example... | Example... | ||
Adding "Assign user summary". | |||
A) Add a new class "\mod_assign\output\assign_user_summary_renderer_test" which extends "\core\output\renderer_test_base". | |||
This class should set the "name, docs and category" class variables in it's constructor. The "execute" method should create a "assign_user_summary" instance filled with dummy data, get a 'mod_assign' renderer and call render on the "assign_user_dummy" class. | |||
<code php> | |||
File: mod/assign/classes/output/assign_user_summary_renderer_test.php | |||
<?php | |||
namespace mod_assign\output; | |||
class assign_user_summary_renderer_test extends \core\output\renderer_test_base { | |||
public function __construct() { | |||
$this->name = 'Assign user summary'; | |||
$this->docs = 'A user summary object that is used to display information about a user in multiple places in mod_assign.'; | |||
$this->category = \core\output\renderer_test_base::CATEGORY_COMPONENT; | |||
} | |||
public function execute() { | |||
global $CFG, $PAGE; | |||
require_once($CFG->dirroot . '/mod/assign/renderable.php'); | |||
$renderer = $PAGE->get_renderer('mod_assign'); | |||
$mockuser = guest_user(); | |||
$mockcourseid = 5; | |||
$viewfullnames = true; | |||
$blindmarking = false; | |||
$mockuniqueidforuser = 5; | |||
$mockextrauserfields = array(); | |||
$suspendeduser = false; | |||
$renderable = new \assign_user_summary($mockuser, | |||
$mockcourseid, | |||
$viewfullnames, | |||
$blindmarking, | |||
$mockuniqueidforuser, | |||
$mockextrauserfields, | |||
$suspendeduser); | |||
return $renderer->render($renderable); | |||
} | |||
} | |||
</core> | |||
== Related links == | == Related links == | ||
* [[Render library specification]] | * [[Render library specification]] |
Revision as of 03:14, 6 June 2014
Note: This page is a work-in-progress. Feedback and suggested improvements are welcome. Please join the discussion on moodle.org or use the page comments.
Element Library | |
---|---|
Project state | Specification |
Tracker issue | https://tracker.moodle.org/browse/MDL-45770 |
Discussion | https://moodle.org/mod/forum/discuss.php?d=261202 |
Assignee | Damyon, Sam |
The element library will be a new admin tool that will display the output from a list of renderer methods / renderables. The target users for the tool are:
- Themers, used to test all the existing renderables in a newly developed theme
- Developers, used to see an organized list of all the renderables that can be used when building new pages (and the docs for them)
The requirements for this tool are:
- Show a list of renderables / renderer methods for a specific component
- Show the same renderable / renderer method rendered with different test data
- Show designer docs on the recommended usage of a specific element
- Allow easy testing in LTR/RTL and different screen sizes
- Direct links to the documentation for renderers / renderables
Some optional requirements:
- Perform some checks on the renderer to verify it contains no db queries etc
- Responsive testing in the tool (short-cuts to adjust the window size)
- Testing with different language directions
- Report on the list of renderables used by a renderable / renderer method
This tool will work by querying a core api for getting a list of renderer_test instances from each plugin. The renderer_test is an abstract class that provides documentation and an example rendering of either a renderer method or a renderable.
How to add something to the element library (for developers)
Each "thing" in the element library - is rendered by an instance of a \core\output\renderer_test class.
For a plugin (or core) to add a new "thing" they must:
A) Implement the tests in subclasses of "\core\output\renderer_test_base". These classes can have any name, but it is recommended to name them as "\{plugin namespace}\output\XXX_renderer_test". Each test must define a "execute()" method which produces the output, as well as supply developer docs, a name for the test and a category.
B) Extend the abstract class "\core\output\renderer_test_generator_base" with a new class named "\{plugin namespace}\output\renderer_test_generator". This class needs to extend "\core\output\renderer_test_generator_base". There is one function to implement, which is the "create_tests" function which accepts no arguments and returns a list of subclasses of "\core\output\renderer_test_base" (implemented in step A)
Example...
Adding "Assign user summary". A) Add a new class "\mod_assign\output\assign_user_summary_renderer_test" which extends "\core\output\renderer_test_base".
This class should set the "name, docs and category" class variables in it's constructor. The "execute" method should create a "assign_user_summary" instance filled with dummy data, get a 'mod_assign' renderer and call render on the "assign_user_dummy" class.
File: mod/assign/classes/output/assign_user_summary_renderer_test.php
<?php
namespace mod_assign\output;
class assign_user_summary_renderer_test extends \core\output\renderer_test_base {
public function __construct() {
$this->name = 'Assign user summary';
$this->docs = 'A user summary object that is used to display information about a user in multiple places in mod_assign.';
$this->category = \core\output\renderer_test_base::CATEGORY_COMPONENT;
}
public function execute() {
global $CFG, $PAGE;
require_once($CFG->dirroot . '/mod/assign/renderable.php');
$renderer = $PAGE->get_renderer('mod_assign');
$mockuser = guest_user();
$mockcourseid = 5;
$viewfullnames = true;
$blindmarking = false;
$mockuniqueidforuser = 5;
$mockextrauserfields = array();
$suspendeduser = false;
$renderable = new \assign_user_summary($mockuser,
$mockcourseid,
$viewfullnames,
$blindmarking,
$mockuniqueidforuser,
$mockextrauserfields,
$suspendeduser);
return $renderer->render($renderable);
}
}
</core>
Related links