Note:

If you want to create a new page for developers, you should create it on the Moodle Developer Resource site.

MForm Modal: Difference between revisions

From MoodleDocs
Line 20: Line 20:
$output = $PAGE->get_renderer('core_group');                                                                                         
$output = $PAGE->get_renderer('core_group');                                                                                         
echo $output->render($renderable);         
echo $output->render($renderable);         
</code>
The renderer is in group/classes/output/renderer.php and the renderable is in group/classes/output/index_page.php (see [[Automatic_class_loading]]) for how we worked that out.
Looking at the render_index_page function of the renderer (see https://docs.moodle.org/dev/Output_renderers) we can see that this renderer uses [[Templates]] to separate the HTML from the php (good).
<code php>
public function render_index_page(index_page $page) {                                                                         
    $data = $page->export_for_template($this);                                                                                 
    return parent::render_from_template('core_group/index', $data);                                                           
}
</code>
The name of the template is "core_group/index". This maps to a mustache template located at group/templates/index.mustache.
Hooray - we found the HTML we want to modify to add our javascript.
This template already has a {{#js}} block we can use to add our custom javascript. We don't want to code all the javascript in a mustache template - we will just add the minimal code to call a new AMD module for creating a group.
<code javascript>
{{#js}}                                                                                                                           
    require(['jquery', 'core/yui'], function($) {                                                                                 
        $("#groups").change(function() {                                                                                           
            M.core_group.membersCombo.refreshMembers();                                                                           
        });                                                                                                                       
        M.core_group.init_index(Y, "{{wwwroot}}", {{courseid}});                                                                   
        var undeletableGroups = JSON.parse('{{{undeletablegroups}}}');                                                             
        M.core_group.groupslist(Y, undeletableGroups);                                                                             
    });                                                                                                                           
    // New code to create groups in a modal.                                                                                       
    require(['core_group/newgroup'], function(NewGroup) {                                                                         
        NewGroup.init('[data-action=creategroupmodal]');                                                                           
    });
{{/js}} 
</code>
</code>



Revision as of 02:42, 14 July 2017

Advanced tutorial: MForm in a modal

Note: This tutorial is for advanced Moodle devs. You need to know a lot of APIs in order to understand all of this. See the list of related pages at the end of this tutorial for some of them.


This is a walkthrough of the steps required to convert an existing page in moodle with an mform - to an mform that displays in an mform and submits data via AJAX.

Lets get started - first lets pick a page (spins a wheel)..... "Create a group".

We will modify the "Create group" button on the groups page to open a modal with the create a group form, instead of directing you to a new page. Whether this is actually a useful improvement or not does not really matter for now - we are just trying to show how to do it.

Step 1 - Attach some javascript to the button

The first step is to add some javascript to the "Create group" button so that we can open a modal. The page we are modifying is group/index.php which we get by visiting the page and checking the url. If we read through that page, we can see it uses a renderable to generate the HTML for the page.

$renderable = new \core_group\output\index_page($courseid, $groupoptions, $selectedname, $members, $disableaddedit, $disabledelete,

             $preventgroupremoval);                                                                                                      

$output = $PAGE->get_renderer('core_group'); echo $output->render($renderable);

The renderer is in group/classes/output/renderer.php and the renderable is in group/classes/output/index_page.php (see Automatic_class_loading) for how we worked that out.

Looking at the render_index_page function of the renderer (see https://docs.moodle.org/dev/Output_renderers) we can see that this renderer uses Templates to separate the HTML from the php (good).

public function render_index_page(index_page $page) {

   $data = $page->export_for_template($this);                                                                                  
   return parent::render_from_template('core_group/index', $data);                                                             

}

The name of the template is "core_group/index". This maps to a mustache template located at group/templates/index.mustache.

Hooray - we found the HTML we want to modify to add our javascript.

This template already has a {{#js}} block we can use to add our custom javascript. We don't want to code all the javascript in a mustache template - we will just add the minimal code to call a new AMD module for creating a group.

{{#js}}

   require(['jquery', 'core/yui'], function($) {                                                                                   
       $("#groups").change(function() {                                                                                            
           M.core_group.membersCombo.refreshMembers();                                                                             
       });                                                                                                                         
       M.core_group.init_index(Y, "Template:wwwroot", Template:courseid);                                                                    
       var undeletableGroups = JSON.parse('{{{undeletablegroups}}}');                                                              
       M.core_group.groupslist(Y, undeletableGroups);                                                                              
   });                                                                                                                             
   // New code to create groups in a modal.                                                                                        
   require(['core_group/newgroup'], function(NewGroup) {                                                                           
       NewGroup.init('[data-action=creategroupmodal]');                                                                            
   });

Template:/js

Related APIs