See Release Notes
Long Term Support Release
Differences Between: [Versions 401 and 402] [Versions 401 and 403]
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/>. 16 17 /** 18 * This file contains all the class definitions of the export formats. 19 * 20 * They are implemented in php classes rather than just a simpler hash 21 * Because it provides an easy way to do subtyping using php inheritance. 22 * 23 * @package core_portfolio 24 * @copyright 2008 Penny Leach <penny@catalyst.net.nz>, 25 * Martin Dougiamas <http://dougiamas.com> 26 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 27 */ 28 29 defined('MOODLE_INTERNAL') || die(); 30 31 /** 32 * Base class to inherit from. 33 * 34 * Do not use this anywhere in supported_formats 35 * 36 * @package core_portfolio 37 * @category portfolio 38 * @copyright 2008 Penny Leach <penny@catalyst.net.nz>, 39 * Martin Dougiamas <http://dougiamas.com> 40 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 41 * 42 */ 43 abstract class portfolio_format { 44 45 /** 46 * Array of mimetypes this format supports 47 * 48 * @throws coding_exception 49 */ 50 public static function mimetypes() { 51 throw new coding_exception('mimetypes() method needs to be overridden in each subclass of portfolio_format'); 52 } 53 54 /** 55 * For multipart formats, eg html with attachments, 56 * we need to have a directory to place associated files from 57 * inside the zip file. This is the name of that directory 58 * 59 * @throws coding_exception 60 */ 61 public static function get_file_directory() { 62 throw new coding_exception('get_file_directory() method needs to be overridden in each subclass of portfolio_format'); 63 } 64 65 /** 66 * Given a file, return a snippet of markup in whatever format 67 * to link to that file. 68 * Usually involves the path given by get_file_directory. 69 * This is not supported in subclasses of portfolio_format_file 70 * since they're all just single files. 71 * @see get_file_directory 72 * 73 * @param stored_file $file file information object 74 * @param array $options array of options to pass. can contain: 75 * attributes => hash of existing html attributes (eg title, height, width, etc) 76 * 77 * @throws coding_exception 78 */ 79 public static function file_output($file, $options=null) { 80 throw new coding_exception('file_output() method needs to be overridden in each subclass of portfolio_format'); 81 } 82 83 /** 84 * Create portfolio tag 85 * 86 * @param stored_file $file file information object 87 * @param string $path file path 88 * @param array $attributes portfolio attributes 89 * @return string 90 */ 91 public static function make_tag($file, $path, $attributes) { 92 $srcattr = 'href'; 93 $tag = 'a'; 94 $content = $file->get_filename(); 95 if (in_array($file->get_mimetype(), portfolio_format_image::mimetypes())) { 96 $srcattr = 'src'; 97 $tag = 'img'; 98 $content = ''; 99 } 100 101 $attributes[$srcattr] = $path; // this will override anything we might have been passed (which is good) 102 $dom = new DomDocument(); 103 $elem = null; 104 if ($content) { 105 $elem = $dom->createElement($tag, $content); 106 } else { 107 $elem = $dom->createElement($tag); 108 } 109 110 foreach ($attributes as $key => $value) { 111 $elem->setAttribute($key, $value); 112 } 113 $dom->appendChild($elem); 114 return $dom->saveXML($elem); 115 } 116 117 /** 118 * Whether this format conflicts with the given format. 119 * This is used for the case where an export location 120 * "generally" supports something like FORMAT_PLAINHTML 121 * but then in a specific export case, must add attachments, 122 * which means that FORMAT_RICHHTML is supported in that case, 123 * which implies removing support for FORMAT_PLAINHTML. 124 * Note that conflicts don't have to be bi-directional 125 * (eg FORMAT_PLAINHTML conflicts with FORMAT_RICHHTML 126 * but not the other way around) and things within the class hierarchy 127 * are resolved automatically anyway. 128 * This is really just between subclasses of format_rich 129 * and subclasses of format_file. 130 * 131 * @param string $format one of the FORMAT_XX constants 132 * @return bool 133 */ 134 public static function conflicts($format) { 135 return false; 136 } 137 } 138 139 /** 140 * The most basic type - pretty much everything is a subtype 141 * 142 * @package core_portfolio 143 * @category portfolio 144 * @copyright 2009 Penny Leach <penny@catalyst.net.nz>, Martin Dougiamas 145 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 146 */ 147 class portfolio_format_file extends portfolio_format { 148 149 /** 150 * Array of mimetypes this format supports 151 * 152 * @return array 153 */ 154 public static function mimetypes() { 155 return array(); 156 } 157 158 /** 159 * For multipart formats, eg html with attachments, 160 * we need to have a directory to place associated files from 161 * inside the zip file. This is the name of that directory 162 * 163 * @return bool 164 */ 165 public static function get_file_directory() { 166 return false; 167 } 168 169 /** 170 * Given a file, return a snippet of markup in whatever format 171 * to link to that file. 172 * Usually involves the path given by get_file_directory. 173 * This is not supported in subclasses of portfolio_format_file 174 * since they're all just single files. 175 * @see get_file_directory 176 * 177 * @param stored_file $file informations object 178 * @param array $options array of options to pass. can contain: 179 * attributes => hash of existing html attributes (eg title, height, width, etc) 180 */ 181 public static function file_output($file, $options=null) { 182 throw new portfolio_exception('fileoutputnotsupported', 'portfolio'); 183 } 184 } 185 186 /** 187 * Image format, subtype of file. 188 * 189 * @package core_portfolio 190 * @category portfolio 191 * @copyright 2009 Penny Leach 192 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 193 */ 194 class portfolio_format_image extends portfolio_format_file { 195 /** 196 * Return all mimetypes that use image.gif (eg all images) 197 * 198 * @return string 199 */ 200 public static function mimetypes() { 201 return file_get_typegroup('type', 'image'); 202 } 203 204 /** 205 * Whether this format conflicts with the given format. 206 * This is used for the case where an export location 207 * "generally" supports something like FORMAT_PLAINHTML 208 * but then in a specific export case, must add attachments, 209 * which means that FORMAT_RICHHTML is supported in that case, 210 * which implies removing support for FORMAT_PLAINHTML. 211 * Note that conflicts don't have to be bi-directional 212 * (eg FORMAT_PLAINHTML conflicts with FORMAT_RICHHTML 213 * but not the other way around) and things within the class hierarchy 214 * are resolved automatically anyway. 215 * This is really just between subclasses of format_rich 216 * and subclasses of format_file. 217 * 218 * @param string $format one of the FORMAT_XX constants 219 * @return bool 220 */ 221 public static function conflicts($format) { 222 return ($format == PORTFOLIO_FORMAT_RICHHTML 223 || $format == PORTFOLIO_FORMAT_PLAINHTML); 224 } 225 } 226 227 /** 228 * HTML format 229 * 230 * Could be used for an external cms or something in case we want to be really specific. 231 * 232 * @package core_portfolio 233 * @category portfolio 234 * @copyright 2008 Penny Leach 235 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 236 */ 237 class portfolio_format_plainhtml extends portfolio_format_file { 238 239 /** 240 * Return html mimetype 241 * 242 * @return array 243 */ 244 public static function mimetypes() { 245 return array('text/html'); 246 } 247 248 /** 249 * Whether this format conflicts with the given format. 250 * This is used for the case where an export location 251 * "generally" supports something like FORMAT_PLAINHTML 252 * but then in a specific export case, must add attachments, 253 * which means that FORMAT_RICHHTML is supported in that case, 254 * which implies removing support for FORMAT_PLAINHTML. 255 * Note that conflicts don't have to be bi-directional 256 * (eg FORMAT_PLAINHTML conflicts with FORMAT_RICHHTML 257 * but not the other way around) and things within the class hierarchy 258 * are resolved automatically anyway. 259 * This is really just between subclasses of format_rich 260 * and subclasses of format_file. 261 * 262 * @param string $format one of the FORMAT_XX constants 263 * @return bool 264 */ 265 public static function conflicts($format) { 266 return ($format == PORTFOLIO_FORMAT_RICHHTML 267 || $format == PORTFOLIO_FORMAT_FILE); 268 } 269 } 270 271 /** 272 * Video format 273 * 274 * For portfolio plugins that support videos specifically 275 * 276 * @package core_portfolio 277 * @category portfolio 278 * @copyright 2008 Penny Leach 279 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 280 */ 281 class portfolio_format_video extends portfolio_format_file { 282 283 /** 284 * Return video mimetypes 285 * 286 * @return array 287 */ 288 public static function mimetypes() { 289 return file_get_typegroup('type', 'video'); 290 } 291 } 292 293 /** 294 * Class for plain text format. 295 * 296 * Not sure why we would need this yet, 297 * but since resource module wants to export it... we can 298 * 299 * @package core_portfolio 300 * @category portfolio 301 * @copyright 2008 Penny Leach 302 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 303 */ 304 class portfolio_format_text extends portfolio_format_file { 305 306 /** 307 * Return plain text mimetypes 308 * 309 * @return array 310 */ 311 public static function mimetypes() { 312 return array('text/plain'); 313 } 314 315 /** 316 * Whether this format conflicts with the given format. 317 * This is used for the case where an export location 318 * "generally" supports something like FORMAT_PLAINHTML 319 * but then in a specific export case, must add attachments, 320 * which means that FORMAT_RICHHTML is supported in that case, 321 * which implies removing support for FORMAT_PLAINHTML. 322 * Note that conflicts don't have to be bi-directional 323 * (eg FORMAT_PLAINHTML conflicts with FORMAT_RICHHTML 324 * but not the other way around) and things within the class hierarchy 325 * are resolved automatically anyway. 326 * This is really just between subclasses of format_rich 327 * and subclasses of format_file. 328 * 329 * @param string $format one of the FORMAT_XX constants 330 * @return bool 331 */ 332 public static function conflicts($format ) { 333 return ($format == PORTFOLIO_FORMAT_PLAINHTML 334 || $format == PORTFOLIO_FORMAT_RICHHTML); 335 } 336 } 337 338 /** 339 * Base class for rich formats. 340 * 341 * These are multipart - eg things with attachments 342 * 343 * @package core_portfolio 344 * @category portfolio 345 * @copyright 2009 Penny Leach 346 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 347 */ 348 abstract class portfolio_format_rich extends portfolio_format { 349 350 /** 351 * Return rich text mimetypes 352 * 353 * @return array 354 */ 355 public static function mimetypes() { 356 return array(); 357 } 358 359 } 360 361 /** 362 * Richhtml - html with attachments. 363 * 364 * The most commonly used rich format 365 * eg inline images 366 * 367 * @package core_portfolio 368 * @category portfolio 369 * @copyright 2009 Penny Leach 370 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 371 */ 372 class portfolio_format_richhtml extends portfolio_format_rich { 373 374 /** 375 * For multipart formats, eg html with attachments, 376 * we need to have a directory to place associated files from 377 * inside the zip file. this is the name of that directory 378 * 379 * @return string 380 */ 381 public static function get_file_directory() { 382 return 'site_files/'; 383 } 384 385 /** 386 * Given a file, return a snippet of markup in whatever format 387 * to link to that file. 388 * Usually involves the path given by get_file_directory. 389 * This is not supported in subclasses of portfolio_format_file 390 * since they're all just single files. 391 * @see get_file_directory 392 * 393 * @param stored_file $file information for existing file 394 * @param array $options array of options to pass. can contain: 395 * attributes => hash of existing html attributes (eg title, height, width, etc) 396 * @return string 397 */ 398 public static function file_output($file, $options=null) { 399 $path = self::get_file_directory() . $file->get_filename(); 400 $attributes = array(); 401 if (!empty($options['attributes']) && is_array($options['attributes'])) { 402 $attributes = $options['attributes']; 403 } 404 return self::make_tag($file, $path, $attributes); 405 } 406 407 /** 408 * Whether this format conflicts with the given format. 409 * This is used for the case where an export location 410 * "generally" supports something like FORMAT_PLAINHTML 411 * but then in a specific export case, must add attachments, 412 * which means that FORMAT_RICHHTML is supported in that case, 413 * which implies removing support for FORMAT_PLAINHTML. 414 * Note that conflicts don't have to be bi-directional 415 * (eg FORMAT_PLAINHTML conflicts with FORMAT_RICHHTML 416 * but not the other way around) and things within the class hierarchy 417 * are resolved automatically anyway. 418 * This is really just between subclasses of format_rich 419 * and subclasses of format_file. 420 * 421 * @todo MDL-31305 - revisit the conflict with file, since we zip here 422 * @param string $format one of the FORMAT_XX constants 423 * @return bool 424 */ 425 public static function conflicts($format) { // TODO revisit the conflict with file, since we zip here 426 return ($format == PORTFOLIO_FORMAT_PLAINHTML || $format == PORTFOLIO_FORMAT_FILE); 427 } 428 429 } 430 431 /** 432 * Class used for leap2a format 433 * 434 * @package core_portfolio 435 * @category portfolio 436 * @copyright 2009 Penny Leach 437 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 438 */ 439 class portfolio_format_leap2a extends portfolio_format_rich { 440 441 /** 442 * For multipart formats, eg html with attachments, 443 * we need to have a directory to place associated files from 444 * inside the zip file. this is the name of that directory 445 * 446 * @return string 447 */ 448 public static function get_file_directory() { 449 return 'files/'; 450 } 451 452 /** 453 * Return the file prefix 454 * 455 * @return string 456 */ 457 public static function file_id_prefix() { 458 return 'storedfile'; 459 } 460 461 /** 462 * Return the link to a file 463 * 464 * @param stored_file $file information for existing file 465 * @param array $options array of options to pass. can contain: 466 * attributes => hash of existing html attributes (eg title, height, width, etc) 467 * @return string 468 */ 469 public static function file_output($file, $options=null) { 470 $id = ''; 471 if (!is_array($options)) { 472 $options = array(); 473 } 474 if (!array_key_exists('entry', $options)) { 475 $options['entry'] = true; 476 } 477 if (!empty($options['entry'])) { 478 $path = 'portfolio:' . self::file_id_prefix() . $file->get_id(); 479 } else { 480 $path = self::get_file_directory() . $file->get_filename(); 481 } 482 $attributes = array(); 483 if (!empty($options['attributes']) && is_array($options['attributes'])) { 484 $attributes = $options['attributes']; 485 } 486 $attributes['rel'] = 'enclosure'; 487 return self::make_tag($file, $path, $attributes); 488 } 489 490 /** 491 * Generate portfolio_format_leap2a 492 * 493 * @param stdclass $user user information object 494 * @return portfolio_format_leap2a_writer 495 */ 496 public static function leap2a_writer(stdclass $user=null) { 497 global $CFG; 498 if (empty($user)) { 499 global $USER; 500 $user = $USER; 501 } 502 require_once($CFG->libdir . '/portfolio/formats/leap2a/lib.php'); 503 return new portfolio_format_leap2a_writer($user); 504 } 505 506 /** 507 * Return the manifest name 508 * 509 * @return string 510 */ 511 public static function manifest_name() { 512 return 'leap2a.xml'; 513 } 514 } 515 516 517 // later.... a moodle plugin might support this. 518 // it's commented out in portfolio_supported_formats so cannot currently be used. 519 //class portfolio_format_mbkp extends portfolio_format_rich {} 520 521 /** 522 * 'PDF format', subtype of file. 523 * 524 * For portfolio plugins that support PDFs specifically. 525 * 526 * @package core_portfolio 527 * @category portfolio 528 * @copyright 2009 Dan Poltawski 529 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 530 */ 531 class portfolio_format_pdf extends portfolio_format_file { 532 533 /** 534 * Return pdf mimetypes 535 * 536 * @return array 537 */ 538 public static function mimetypes() { 539 return array('application/pdf'); 540 } 541 } 542 543 /** 544 * 'Document format', subtype of file. 545 * 546 * For portfolio plugins that support documents specifically. 547 * 548 * @package core_portfolio 549 * @category portfolio 550 * @copyright 2009 Dan Poltawski 551 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 552 */ 553 class portfolio_format_document extends portfolio_format_file { 554 555 /** 556 * Return documents mimetypes 557 * 558 * @return array of documents mimetypes 559 */ 560 public static function mimetypes() { 561 return file_get_typegroup('type', 'document'); 562 } 563 } 564 565 /** 566 * 'Spreadsheet format', subtype of file. 567 * 568 * For portfolio plugins that support spreadsheets specifically. 569 * 570 * @package core_portfolio 571 * @category portfolio 572 * @copyright 2009 Dan Poltawski 573 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 574 */ 575 class portfolio_format_spreadsheet extends portfolio_format_file { 576 577 /** 578 * Return spreadsheet spreadsheet mimetypes 579 * 580 * @return array of documents mimetypes 581 */ 582 public static function mimetypes() { 583 return file_get_typegroup('type', 'spreadsheet'); 584 } 585 } 586 587 /** 588 * 'Presentation format', subtype of file. 589 * 590 * For portfolio plugins that support presentation specifically. 591 * 592 * @package core_portfolio 593 * @category portfolio 594 * @copyright 2009 Dan Poltawski 595 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 596 */ 597 class portfolio_format_presentation extends portfolio_format_file { 598 599 /** 600 * Return presentation documents mimetypes 601 * 602 * @return array presentation document mimetypes 603 */ 604 public static function mimetypes() { 605 return file_get_typegroup('type', 'presentation'); 606 } 607 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body