MDL-20069 new URL module, includes migrate from old mod/resource; remaining issues...
[moodle.git] / mod / url / lib.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * Mandatory public API of url module
20  *
21  * @package   mod-url
22  * @copyright 2009 Petr Skoda (http://skodak.org)
23  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
26 /**
27  * List of features supported in URL module
28  * @param string $feature FEATURE_xx constant for requested feature
29  * @return mixed True if module supports feature, false if not, null if doesn't know
30  */
31 function url_supports($feature) {
32     switch($feature) {
33         case FEATURE_MOD_ARCHETYPE:           return MOD_ARCHETYPE_RESOURCE;
34         case FEATURE_GROUPS:                  return false;
35         case FEATURE_GROUPINGS:               return false;
36         case FEATURE_GROUPMEMBERSONLY:        return true;
37         case FEATURE_MOD_INTRO:               return true;
38         case FEATURE_COMPLETION_TRACKS_VIEWS: return true;
39         case FEATURE_GRADE_HAS_GRADE:         return false;
40         case FEATURE_GRADE_OUTCOMES:          return false;
42         default: return null;
43     }
44 }
46 /**
47  * Returns all other caps used in module
48  * @return array
49  */
50 function url_get_extra_capabilities() {
51     return array('moodle/site:accessallgroups');
52 }
54 /**
55  * This function is used by the reset_course_userdata function in moodlelib.
56  * @param $data the data submitted from the reset course.
57  * @return array status array
58  */
59 function url_reset_userdata($data) {
60     return array();
61 }
63 /**
64  * List of view style log actions
65  * @return array
66  */
67 function url_get_view_actions() {
68     return array('view', 'view all');
69 }
71 /**
72  * List of update style log actions
73  * @return array
74  */
75 function url_get_post_actions() {
76     return array('update', 'add');
77 }
79 /**
80  * Add url instance.
81  * @param object $data
82  * @param object $mform
83  * @return int new url instance id
84  */
85 function url_add_instance($data, $mform) {
86     global $DB;
88     $parameters = array();
89     for ($i=0; $i < 100; $i++) {
90         $parameter = "parameter_$i";
91         $variable  = "variable_$i";
92         if (empty($data->$parameter) or empty($data->$variable)) {
93             continue;
94         }
95         $parameters[$data->$parameter] = $data->$variable;
96     }
97     $data->parameters = serialize($parameters);
99     $displayoptions = array();
100     if ($data->display == RESOURCELIB_DISPLAY_POPUP) {
101         $displayoptions['popupwidth']  = $data->popupwidth;
102         $displayoptions['popupheight'] = $data->popupheight;
103     }
104     if (in_array($data->display, array(RESOURCELIB_DISPLAY_AUTO, RESOURCELIB_DISPLAY_EMBED, RESOURCELIB_DISPLAY_FRAME))) {
105         $displayoptions['printheading'] = (int)!empty($data->printheading);
106         $displayoptions['printintro']   = (int)!empty($data->printintro);
107     }
108     $data->displayoptions = serialize($displayoptions);
110     if (strpos($data->externalurl, '://') === false) {
111         $data->externalurl = 'http://'.$data->externalurl;
112     }
114     $data->timemodified = time();
115     $data->id = $DB->insert_record('url', $data);
117     return $data->id;
120 /**
121  * Update url instance.
122  * @param object $data
123  * @param object $mform
124  * @return bool true
125  */
126 function url_update_instance($data, $mform) {
127     global $CFG, $DB;
129     $parameters = array();
130     for ($i=0; $i < 100; $i++) {
131         $parameter = "parameter_$i";
132         $variable  = "variable_$i";
133         if (empty($data->$parameter) or empty($data->$variable)) {
134             continue;
135         }
136         $parameters[$data->$parameter] = $data->$variable;
137     }
138     $data->parameters = serialize($parameters);
140     $displayoptions = array();
141     if ($data->display == RESOURCELIB_DISPLAY_POPUP) {
142         $displayoptions['popupwidth']  = $data->popupwidth;
143         $displayoptions['popupheight'] = $data->popupheight;
144     }
145     if (in_array($data->display, array(RESOURCELIB_DISPLAY_AUTO, RESOURCELIB_DISPLAY_EMBED, RESOURCELIB_DISPLAY_FRAME))) {
146         $displayoptions['printheading'] = (int)!empty($data->printheading);
147         $displayoptions['printintro']   = (int)!empty($data->printintro);
148     }
149     $data->displayoptions = serialize($displayoptions);
151     if (strpos($data->externalurl, '://') === false) {
152         $data->externalurl = 'http://'.$data->externalurl;
153     }
155     $data->timemodified = time();
156     $data->id           = $data->instance;
158     $DB->update_record('url', $data);
160     return true;
163 /**
164  * Delete url instance.
165  * @param int $id
166  * @return bool true
167  */
168 function url_delete_instance($id) {
169     global $DB;
171     if (!$url = $DB->get_record('url', array('id'=>$id))) {
172         return false;
173     }
175     // note: all context files are deleted automatically
177     $DB->delete_records('url', array('id'=>$url->id));
179     return true;
182 /**
183  * Return use outline
184  * @param object $course
185  * @param object $user
186  * @param object $mod
187  * @param object $url
188  * @return object|null
189  */
190 function url_user_outline($course, $user, $mod, $url) {
191     global $DB;
193     if ($logs = $DB->get_records('log', array('userid'=>$user->id, 'module'=>'url',
194                                               'action'=>'view', 'info'=>$url->id), 'time ASC')) {
196         $numviews = count($logs);
197         $lastlog = array_pop($logs);
199         $result = new object();
200         $result->info = get_string('numviews', '', $numviews);
201         $result->time = $lastlog->time;
203         return $result;
204     }
205     return NULL;
208 /**
209  * Return use complete
210  * @param object $course
211  * @param object $user
212  * @param object $mod
213  * @param object $url
214  */
215 function url_user_complete($course, $user, $mod, $url) {
216     global $CFG, $DB;
218     if ($logs = $DB->get_records('log', array('userid'=>$user->id, 'module'=>'url',
219                                               'action'=>'view', 'info'=>$url->id), 'time ASC')) {
220         $numviews = count($logs);
221         $lastlog = array_pop($logs);
223         $strmostrecently = get_string('mostrecently');
224         $strnumviews = get_string('numviews', '', $numviews);
226         echo "$strnumviews - $strmostrecently ".userdate($lastlog->time);
228     } else {
229         print_string('neverseen', 'url');
230     }
233 /**
234  * Returns the users with data in one url
235  *
236  * @param int $urlid
237  * @return bool false
238  */
239 function url_get_participants($urlid) {
240     return false;
243 /**
244  * Given a course_module object, this function returns any
245  * "extra" information that may be needed when printing
246  * this activity in a course listing.
247  *
248  * See {@link get_array_of_activities()} in course/lib.php
249  *
250  * @param object $coursemodule
251  * @return object info
252  */
253 function url_get_coursemodule_info($coursemodule) {
254     global $CFG, $DB;
255     require_once("$CFG->dirroot/mod/url/locallib.php");
257     if (!$url = $DB->get_record('url', array('id'=>$coursemodule->instance), 'id, name, display, displayoptions, externalurl, parameters')) {
258         return NULL;
259     }
261     $info = new object();
262     $info->name = $url->name;
264     //note: there should be a way to differentiate links from normal resources
265     $info->icon = url_guess_icon($url->externalurl);
267     $display = url_get_final_display_type($url);
269     if ($display == RESOURCELIB_DISPLAY_POPUP) {
270         $fullurl = "$CFG->wwwroot/mod/url/view.php?id=$coursemodule->id&amp;redirect=1";
271         $options = empty($url->displayoptions) ? array() : unserialize($url->displayoptions);
272         $width  = empty($options['popupwidth'])  ? 620 : $options['popupwidth'];
273         $height = empty($options['popupheight']) ? 450 : $options['popupheight'];
274         $wh = "width=$width,height=$height,toolbar=no,location=no,menubar=no,copyhistory=no,status=no,directories=no,scrollbars=yes,resizable=yes";
275         $info->extra = urlencode("onclick=\"window.open('$fullurl', '', '$wh'); return false;\"");
277     } else if ($display == RESOURCELIB_DISPLAY_NEW) {
278         $fullurl = "$CFG->wwwroot/mod/url/view.php?id=$coursemodule->id&amp;redirect=1";
279         $info->extra = urlencode("onclick=\"window.open('$fullurl'); return false;\"");
281     } else if ($display == RESOURCELIB_DISPLAY_OPEN) {
282         $fullurl = "$CFG->wwwroot/mod/url/view.php?id=$coursemodule->id&amp;redirect=1";
283         $info->extra = urlencode("onclick=\"window.location.href ='$fullurl';return false;\"");
284     }
286     return $info;