MDL-46546 core_grades: Notice display for bad import.
[moodle.git] / lib / editor / atto / autosave-ajax.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * Save and load draft text while a user is still editing a form.
19  *
20  * @package    editor_atto
21  * @copyright  2014 Damyon Wiese
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 define('AJAX_SCRIPT', true);
27 require_once(dirname(__FILE__) . '/../../../config.php');
29 $contextid = required_param('contextid', PARAM_INT);
30 $elementid = required_param('elementid', PARAM_ALPHANUMEXT);
31 $pagehash = required_param('pagehash', PARAM_ALPHANUMEXT);
32 $pageinstance = required_param('pageinstance', PARAM_ALPHANUMEXT);
33 $now = time();
34 // This is the oldest time any autosave text will be recovered from.
35 // This is so that there is a good chance the draft files will still exist (there are many variables so
36 // this is impossible to guarantee).
37 $before = $now - 60*60*24*4;
39 list($context, $course, $cm) = get_context_info_array($contextid);
40 $PAGE->set_url('/lib/editor/atto/autosave-ajax.php');
41 $PAGE->set_context($context);
43 require_login($course, false, $cm);
44 require_sesskey();
46 $action = required_param('action', PARAM_ALPHA);
48 if ($action === 'save') {
49     $drafttext = required_param('drafttext', PARAM_RAW);
50     $params = array('elementid' => $elementid,
51                     'userid' => $USER->id,
52                     'pagehash' => $pagehash,
53                     'contextid' => $contextid);
55     $record = $DB->get_record('editor_atto_autosave', $params);
56     if ($record && $record->pageinstance != $pageinstance) {
57         print_error('concurrent access from the same user is not supported');
58         die();
59     }
61     if (!$record) {
62         $record = new stdClass();
63         $record->elementid = $elementid;
64         $record->userid = $USER->id;
65         $record->pagehash = $pagehash;
66         $record->contextid = $contextid;
67         $record->drafttext = $drafttext;
68         $record->pageinstance = $pageinstance;
69         $record->timemodified = $now;
71         $DB->insert_record('editor_atto_autosave', $record);
73         // No response means no error.
74         die();
75     } else {
76         $record->drafttext = $drafttext;
77         $record->timemodified = time();
78         $DB->update_record('editor_atto_autosave', $record);
80         // No response means no error.
81         die();
82     }
83 } else if ($action == 'resume') {
84     $params = array('elementid' => $elementid,
85                     'userid' => $USER->id,
86                     'pagehash' => $pagehash,
87                     'contextid' => $contextid);
89     $newdraftid = required_param('draftid', PARAM_INT);
91     $record = $DB->get_record('editor_atto_autosave', $params);
93     if (!$record) {
94         $record = new stdClass();
95         $record->elementid = $elementid;
96         $record->userid = $USER->id;
97         $record->pagehash = $pagehash;
98         $record->contextid = $contextid;
99         $record->pageinstance = $pageinstance;
100         $record->pagehash = $pagehash;
101         $record->draftid = $newdraftid;
102         $record->timemodified = time();
103         $record->drafttext = '';
105         $DB->insert_record('editor_atto_autosave', $record);
107         // No response means no error.
108         die();
109     } else {
110         // Copy all draft files from the old draft area.
111         $usercontext = context_user::instance($USER->id);
112         $stale = $record->timemodified < $before;
113         require_once($CFG->libdir . '/filelib.php');
115         // This function copies all the files in one draft area, to another area (in this case it's
116         // another draft area). It also rewrites the text to @@PLUGINFILE@@ links.
117         $newdrafttext = file_save_draft_area_files($record->draftid,
118                                                    $usercontext->id,
119                                                    'user',
120                                                    'draft',
121                                                    $newdraftid,
122                                                    array(),
123                                                    $record->drafttext);
125         // Final rewrite to the new draft area (convert the @@PLUGINFILES@@ again).
126         $newdrafttext = file_rewrite_pluginfile_urls($newdrafttext,
127                                                      'draftfile.php',
128                                                      $usercontext->id,
129                                                      'user',
130                                                      'draft',
131                                                      $newdraftid);
132         $record->drafttext = $newdrafttext;
134         $record->pageinstance = $pageinstance;
135         $record->draftid = $newdraftid;
136         $record->timemodified = time();
137         $DB->update_record('editor_atto_autosave', $record);
139         // A response means the draft has been restored and here is the auto-saved text.
140         if (!$stale) {
141             echo $record->drafttext;
142         }
143         die();
144     }
145 } else if ($action == 'reset') {
146     $params = array('elementid' => $elementid,
147                     'userid' => $USER->id,
148                     'pagehash' => $pagehash,
149                     'contextid' => $contextid);
151     $DB->delete_records('editor_atto_autosave', $params);
152     die();
155 print_error('invalidarguments');