Merge branch 'wip-MDL-46546-master' of git://github.com/abgreeve/moodle
[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 $response = array();
50 if ($action === 'save') {
51     $drafttext = required_param('drafttext', PARAM_RAW);
52     $params = array('elementid' => $elementid,
53                     'userid' => $USER->id,
54                     'pagehash' => $pagehash,
55                     'contextid' => $contextid);
57     $record = $DB->get_record('editor_atto_autosave', $params);
58     if ($record && $record->pageinstance != $pageinstance) {
59         print_error('concurrent access from the same user is not supported');
60         die();
61     }
63     if (!$record) {
64         $record = new stdClass();
65         $record->elementid = $elementid;
66         $record->userid = $USER->id;
67         $record->pagehash = $pagehash;
68         $record->contextid = $contextid;
69         $record->drafttext = $drafttext;
70         $record->pageinstance = $pageinstance;
71         $record->timemodified = $now;
73         $DB->insert_record('editor_atto_autosave', $record);
75         // No response means no error.
76         die();
77     } else {
78         $record->drafttext = $drafttext;
79         $record->timemodified = time();
80         $DB->update_record('editor_atto_autosave', $record);
82         // No response means no error.
83         die();
84     }
85 } else if ($action == 'resume') {
86     $params = array('elementid' => $elementid,
87                     'userid' => $USER->id,
88                     'pagehash' => $pagehash,
89                     'contextid' => $contextid);
91     $newdraftid = required_param('draftid', PARAM_INT);
93     $record = $DB->get_record('editor_atto_autosave', $params);
95     if (!$record) {
96         $record = new stdClass();
97         $record->elementid = $elementid;
98         $record->userid = $USER->id;
99         $record->pagehash = $pagehash;
100         $record->contextid = $contextid;
101         $record->pageinstance = $pageinstance;
102         $record->pagehash = $pagehash;
103         $record->draftid = $newdraftid;
104         $record->timemodified = time();
105         $record->drafttext = '';
107         $DB->insert_record('editor_atto_autosave', $record);
109         // No response means no error.
110         die();
111     } else {
112         // Copy all draft files from the old draft area.
113         $usercontext = context_user::instance($USER->id);
114         $stale = $record->timemodified < $before;
115         require_once($CFG->libdir . '/filelib.php');
117         // This function copies all the files in one draft area, to another area (in this case it's
118         // another draft area). It also rewrites the text to @@PLUGINFILE@@ links.
119         $newdrafttext = file_save_draft_area_files($record->draftid,
120                                                    $usercontext->id,
121                                                    'user',
122                                                    'draft',
123                                                    $newdraftid,
124                                                    array(),
125                                                    $record->drafttext);
127         // Final rewrite to the new draft area (convert the @@PLUGINFILES@@ again).
128         $newdrafttext = file_rewrite_pluginfile_urls($newdrafttext,
129                                                      'draftfile.php',
130                                                      $usercontext->id,
131                                                      'user',
132                                                      'draft',
133                                                      $newdraftid);
134         $record->drafttext = $newdrafttext;
136         $record->pageinstance = $pageinstance;
137         $record->draftid = $newdraftid;
138         $record->timemodified = time();
139         $DB->update_record('editor_atto_autosave', $record);
141         // A response means the draft has been restored and here is the auto-saved text.
142         if (!$stale) {
143             $response['result'] = $record->drafttext;
144             echo json_encode($response);
145         }
146         die();
147     }
148 } else if ($action == 'reset') {
149     $params = array('elementid' => $elementid,
150                     'userid' => $USER->id,
151                     'pagehash' => $pagehash,
152                     'contextid' => $contextid);
154     $DB->delete_records('editor_atto_autosave', $params);
155     die();
158 print_error('invalidarguments');