mirror of
https://github.com/moodle/moodle.git
synced 2025-08-06 09:26:35 +02:00
MDL-37455 Performance improvement in mod_folder
We cache and store additional data in cm_info::customdata and do not query DB every time the folder is displayed on a course page
This commit is contained in:
parent
38199c247b
commit
ec62d8b4e5
2 changed files with 60 additions and 12 deletions
|
@ -412,6 +412,44 @@ function folder_dndupload_handle($uploadinfo) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a coursemodule object, this function returns the extra
|
||||||
|
* information needed to print this activity in various places.
|
||||||
|
*
|
||||||
|
* If folder needs to be displayed inline we store additional information
|
||||||
|
* in customdata, so functions {@link folder_cm_info_dynamic()} and
|
||||||
|
* {@link folder_cm_info_view()} do not need to do DB queries
|
||||||
|
*
|
||||||
|
* @param cm_info $cm
|
||||||
|
* @return cached_cm_info info
|
||||||
|
*/
|
||||||
|
function folder_get_coursemodule_info($cm) {
|
||||||
|
global $DB;
|
||||||
|
if (!($folder = $DB->get_record('folder', array('id' => $cm->instance),
|
||||||
|
'id, name, display, intro, introformat'))) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
$cminfo = new cached_cm_info();
|
||||||
|
$cminfo->name = $folder->name;
|
||||||
|
if ($folder->display == FOLDER_DISPLAY_INLINE) {
|
||||||
|
// prepare folder object to store in customdata
|
||||||
|
$fdata = new stdClass;
|
||||||
|
if ($cm->showdescription && strlen(trim($folder->intro))) {
|
||||||
|
$fdata->intro = $folder->intro;
|
||||||
|
if ($folder->introformat != FORMAT_MOODLE) {
|
||||||
|
$fdata->introformat = $folder->introformat;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$cminfo->customdata = json_encode($fdata);
|
||||||
|
} else {
|
||||||
|
if ($cm->showdescription) {
|
||||||
|
// Convert intro to html. Do not filter cached version, filters run at display time.
|
||||||
|
$cminfo->content = format_module_intro('folder', $folder, $cm->id, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $cminfo;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets dynamic information about a course module
|
* Sets dynamic information about a course module
|
||||||
*
|
*
|
||||||
|
@ -421,26 +459,35 @@ function folder_dndupload_handle($uploadinfo) {
|
||||||
* @param cm_info $cm
|
* @param cm_info $cm
|
||||||
*/
|
*/
|
||||||
function folder_cm_info_dynamic(cm_info $cm) {
|
function folder_cm_info_dynamic(cm_info $cm) {
|
||||||
global $DB;
|
if (strlen($cm->get_custom_data())) {
|
||||||
$folder = $DB->get_record('folder', array('id' => $cm->instance), '*', MUST_EXIST);
|
|
||||||
if ($folder->display == FOLDER_DISPLAY_INLINE) {
|
|
||||||
$cm->set_no_view_link();
|
$cm->set_no_view_link();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds information about unread messages, that is only required for the course
|
* Overwrites the content in the course-module object with the folder files list
|
||||||
* view page (and similar), to the course-module object.
|
* if folder.display == FOLDER_DISPLAY_INLINE
|
||||||
*
|
*
|
||||||
* @param cm_info $cm
|
* @param cm_info $cm
|
||||||
*/
|
*/
|
||||||
function folder_cm_info_view(cm_info $cm) {
|
function folder_cm_info_view(cm_info $cm) {
|
||||||
global $PAGE, $DB;
|
global $PAGE;
|
||||||
if ($cm->uservisible && has_capability('mod/folder:view', $cm->context)) {
|
if ($cm->uservisible && strlen($cm->get_custom_data()) &&
|
||||||
$folder = $DB->get_record('folder', array('id' => $cm->instance), '*', MUST_EXIST);
|
has_capability('mod/folder:view', $cm->context)) {
|
||||||
if ($folder->display == FOLDER_DISPLAY_INLINE) {
|
// restore folder object from customdata
|
||||||
$renderer = $PAGE->get_renderer('mod_folder');
|
$folder = json_decode($cm->get_custom_data());
|
||||||
$cm->set_content($renderer->display_folder($folder));
|
$folder->id = (int)$cm->instance;
|
||||||
|
$folder->course = (int)$cm->course;
|
||||||
|
$folder->display = FOLDER_DISPLAY_INLINE;
|
||||||
|
$folder->name = $cm->name;
|
||||||
|
if (empty($folder->intro)) {
|
||||||
|
$folder->intro = '';
|
||||||
}
|
}
|
||||||
|
if (empty($folder->introformat)) {
|
||||||
|
$folder->introformat = FORMAT_MOODLE;
|
||||||
|
}
|
||||||
|
// display folder
|
||||||
|
$renderer = $PAGE->get_renderer('mod_folder');
|
||||||
|
$cm->set_content($renderer->display_folder($folder));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,8 @@ class mod_folder_renderer extends plugin_renderer_base {
|
||||||
* Returns html to display the content of mod_folder
|
* Returns html to display the content of mod_folder
|
||||||
* (Description, folder files and optionally Edit button)
|
* (Description, folder files and optionally Edit button)
|
||||||
*
|
*
|
||||||
* @param stdClass $folder record from 'folder' table
|
* @param stdClass $folder record from 'folder' table (please note
|
||||||
|
* it may not contain fields 'revision' and 'timemodified')
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function display_folder(stdClass $folder) {
|
public function display_folder(stdClass $folder) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue