MDL-22548, added sortorder field to files table, drop mainfile field from resource...
authorDongsheng Cai <unoter@gmail.com>
Fri, 28 May 2010 07:29:11 +0000 (07:29 +0000)
committerDongsheng Cai <unoter@gmail.com>
Fri, 28 May 2010 07:29:11 +0000 (07:29 +0000)
17 files changed:
files/files_ajax.php
lib/db/install.xml
lib/db/upgrade.php
lib/file/file_info.php
lib/file/file_info_stored.php
lib/file/file_storage.php
lib/file/stored_file.php
lib/filelib.php
lib/form/filemanager.js
mod/resource/db/install.xml
mod/resource/db/upgrade.php
mod/resource/lib.php
mod/resource/locallib.php
mod/resource/mod_form.php
mod/resource/version.php
mod/resource/view.php
version.php

index 55a7955..bfa318c 100755 (executable)
@@ -90,6 +90,15 @@ case 'delete':
     }
     break;
 
+case 'setmainfile':
+    $filepath = file_correct_filepath($filepath);
+    // reset sort order
+    file_reset_sortorder($user_context->id, $filearea, $itemid);
+    // set main file
+    $return = file_set_sortorder($user_context->id, $filearea, $itemid, $filepath, $filename, 1);
+    echo json_encode($return);
+    break;
+
 case 'renamedir':
     $fs = get_file_storage();
     $fb = get_file_browser();
index 4ddd3d9..b807afe 100644 (file)
         <FIELD NAME="author" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false" COMMENT="The original author of the file" PREVIOUS="source" NEXT="license"/>
         <FIELD NAME="license" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false" COMMENT="license of the file to guide reuse" PREVIOUS="author" NEXT="timecreated"/>
         <FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" SEQUENCE="false" PREVIOUS="license" NEXT="timemodified"/>
-        <FIELD NAME="timemodified" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" SEQUENCE="false" PREVIOUS="timecreated"/>
+        <FIELD NAME="timemodified" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" SEQUENCE="false" PREVIOUS="timecreated" NEXT="sortorder"/>
+        <FIELD NAME="sortorder" TYPE="int" LENGTH="10" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" COMMENT="order of files" PREVIOUS="timemodified"/>
       </FIELDS>
       <KEYS>
         <KEY NAME="primary" TYPE="primary" FIELDS="id" NEXT="contextid"/>
index f3e6cea..34e4650 100644 (file)
@@ -4156,7 +4156,7 @@ WHERE gradeitemid IS NOT NULL AND grademax IS NOT NULL");
     /// Main savepoint reached
         upgrade_main_savepoint($result, 2010052700);
     }
-    
+
     if ($result && $oldversion < 2010052800) {
     /// Changes to modinfo mean we need to rebuild course cache
         require_once($CFG->dirroot . '/course/lib.php');
@@ -4164,6 +4164,20 @@ WHERE gradeitemid IS NOT NULL AND grademax IS NOT NULL");
         upgrade_main_savepoint($result, 2010052800);
     }
 
+    if ($result && $oldversion < 2010052801) {
+
+    /// Define field sortorder to be added to files
+        $table = new xmldb_table('files');
+        $field = new xmldb_field('sortorder', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, '0', 'timemodified');
+
+    /// Conditionally launch add field sortorder
+        if (!$dbman->field_exists($table, $field)) {
+            $dbman->add_field($table, $field);
+        }
+
+    /// Main savepoint reached
+        upgrade_main_savepoint($result, 2010052801);
+    }
     return $result;
 }
 
index 96f1477..40c54db 100644 (file)
@@ -169,6 +169,14 @@ abstract class file_info {
         return null;
     }
 
+    /**
+     * Returns the sort order of the file
+     * @return int
+     */
+    public function get_sortorder() {
+        return 0;
+    }
+
     /**
      * Create new directory, may throw exception - make sure
      * params are valid.
index a0068ff..45a36d4 100644 (file)
@@ -199,6 +199,14 @@ class file_info_stored extends file_info {
         return $this->lf->get_source();
     }
 
+    /**
+     * Returns the sort order of the file
+     * @return int
+     */
+    public function get_sortorder() {
+        return $this->lf->get_sortorder();
+    }
+
     /**
      * Returns list of children.
      * @return array of file_info instances
index 7e17525..a6fe2bc 100644 (file)
@@ -218,7 +218,7 @@ class file_storage {
      * @param bool $includedirs
      * @return array of stored_files indexed by pathanmehash
      */
-    public function get_area_files($contextid, $filearea, $itemid=false, $sort="itemid, filepath, filename", $includedirs = true) {
+    public function get_area_files($contextid, $filearea, $itemid=false, $sort="sortorder, itemid, filepath, filename", $includedirs = true) {
         global $DB;
 
         $conditions = array('contextid'=>$contextid, 'filearea'=>$filearea);
@@ -247,7 +247,7 @@ class file_storage {
      */
     public function get_area_tree($contextid, $filearea, $itemid) {
         $result = array('dirname'=>'', 'dirfile'=>null, 'subdirs'=>array(), 'files'=>array());
-        $files = $this->get_area_files($contextid, $filearea, $itemid, $sort="itemid, filepath, filename", true);
+        $files = $this->get_area_files($contextid, $filearea, $itemid, $sort="sortorder, itemid, filepath, filename", true);
         // first create directory structure
         foreach ($files as $hash=>$dir) {
             if (!$dir->is_directory()) {
@@ -654,6 +654,14 @@ class file_storage {
             throw new file_exception('storedfileproblem', 'Invalid itemid');
         }
 
+        if (!empty($file_record->sortorder)) {
+            if (!is_number($file_record->sortorder) or $file_record->sortorder < 0) {
+                $file_record->sortorder = 0;
+            }
+        } else {
+            $file_record->sortorder = 0;
+        }
+
         $file_record->filepath = clean_param($file_record->filepath, PARAM_PATH);
         if (strpos($file_record->filepath, '/') !== 0 or strrpos($file_record->filepath, '/') !== strlen($file_record->filepath)-1) {
             // path must start and end with '/'
@@ -683,6 +691,7 @@ class file_storage {
         $newrecord->source       = empty($file_record->source) ? null : $file_record->source;
         $newrecord->author       = empty($file_record->author) ? null : $file_record->author;
         $newrecord->license      = empty($file_record->license) ? null : $file_record->license;
+        $newrecord->sortorder    = $file_record->sortorder;
 
         list($newrecord->contenthash, $newrecord->filesize, $newfile) = $this->add_file_to_pool($pathname);
 
@@ -734,6 +743,14 @@ class file_storage {
             throw new file_exception('storedfileproblem', 'Invalid itemid');
         }
 
+        if (!empty($file_record->sortorder)) {
+            if (!is_number($file_record->sortorder) or $file_record->sortorder < 0) {
+                $file_record->sortorder = 0;
+            }
+        } else {
+            $file_record->sortorder = 0;
+        }
+
         $file_record->filepath = clean_param($file_record->filepath, PARAM_PATH);
         if (strpos($file_record->filepath, '/') !== 0 or strrpos($file_record->filepath, '/') !== strlen($file_record->filepath)-1) {
             // path must start and end with '/'
@@ -763,6 +780,7 @@ class file_storage {
         $newrecord->source       = empty($file_record->source) ? null : $file_record->source;
         $newrecord->author       = empty($file_record->author) ? null : $file_record->author;
         $newrecord->license      = empty($file_record->license) ? null : $file_record->license;
+        $newrecord->sortorder    = $file_record->sortorder;
 
         list($newrecord->contenthash, $newrecord->filesize, $newfile) = $this->add_string_to_pool($content);
 
index 5d34b08..d002f80 100644 (file)
@@ -448,5 +448,13 @@ class stored_file {
     public function get_source() {
         return $this->file_record->source;
     }
-}
 
+    /**
+     * Returns the sort order of file
+     *
+     * @return int
+     */
+    public function get_sortorder() {
+        return $this->file_record->sortorder;
+    }
+}
index 8e5c975..658ad25 100644 (file)
@@ -557,6 +557,7 @@ function file_get_user_area_folders($draftitemid, $filepath, &$data, $filearea =
         foreach ($files as $file) {
             if ($file->is_directory()) {
                 $item = new stdclass;
+                $item->sortorder = $file->get_sortorder();
                 $item->filepath = $file->get_filepath();
 
                 $foldername = explode('/', trim($item->filepath, '/'));
@@ -603,6 +604,7 @@ function file_get_user_area_files($draftitemid, $filepath = '/', $filearea = 'us
     }
 
     $list = array();
+    $maxlength = 12;
     if ($files = $fs->get_directory_files($context->id, $filearea, $draftitemid, $filepath, false)) {
         foreach ($files as $file) {
             $item = new stdclass;
@@ -611,10 +613,16 @@ function file_get_user_area_files($draftitemid, $filepath = '/', $filearea = 'us
             $item->fullname = trim($item->filename, '/');
             $filesize = $file->get_filesize();
             $item->filesize = $filesize ? display_size($filesize) : '';
+            if (strlen($item->fullname) >= $maxlength) {
+                $item->shortname = trim(substr($item->fullname, 0, $maxlength)).'...';
+            } else {
+                $item->shortname = $item->fullname;
+            }
 
             $icon = mimeinfo_from_type('icon', $file->get_mimetype());
             $icon = str_replace('.gif', '', $icon);
             $item->icon = $OUTPUT->pix_url('f/' . $icon)->out();
+            $item->sortorder = $file->get_sortorder();
 
             if ($icon == 'zip') {
                 $item->type = 'zip';
@@ -628,10 +636,16 @@ function file_get_user_area_files($draftitemid, $filepath = '/', $filearea = 'us
                 $item->type = 'folder';
                 $foldername = explode('/', trim($item->filepath, '/'));
                 $item->fullname = trim(array_pop($foldername), '/');
+                if (strlen($item->fullname) >= $maxlength) {
+                    $item->shortname = trim(substr($item->fullname, 0, $maxlength)).'...';
+                } else {
+                    $item->shortname = $item->fullname;
+                }
             } else {
                 $fb = get_file_browser();
                 $fileinfo = $fb->get_file_info($context, $file->get_filearea(), $file->get_itemid(), $file->get_filepath(), $file->get_filename());
                 $item->url = $fileinfo->get_url();
+                $item->sortorder = $fileinfo->get_sortorder();
             }
             $list[] = $item;
         }
@@ -740,7 +754,8 @@ function file_save_draft_area_files($draftitemid, $contextid, $filearea, $itemid
         $filecount = 0;
         foreach ($oldfiles as $file) {
             $oldhash = $file->get_pathnamehash();
-            if (isset($newhashes[$oldhash])) {
+            // check if sortorder, filename, filepath, filearea, itemid and contextid changed
+            if (isset($newhashes[$oldhash]) && $file->get_sortorder() == $newhashes[$oldhash]->get_sortorder()) {
                 if (!$file->is_directory()) {
                     $filecount++;
                 }
@@ -797,6 +812,53 @@ function file_save_draft_area_files($draftitemid, $contextid, $filearea, $itemid
     return $text;
 }
 
+/**
+ * Set file sort order
+ * @global object $DB
+ * @param integer $contextid the context id
+ * @param string $filearea file area.
+ * @param integer $itemid itemid.
+ * @param string $filepath file path.
+ * @param string $filename file name.
+ * @param integer $sortorer the sort order of file.
+ * @return boolean
+ */
+function file_set_sortorder($contextid, $filearea, $itemid, $filepath, $filename, $sortorder) {
+    global $DB;
+    $conditions = array('contextid'=>$contextid, 'filearea'=>$filearea, 'itemid'=>$itemid, 'filepath'=>$filepath, 'filename'=>$filename);
+    if ($file_record = $DB->get_record('files', $conditions)) {
+        $sortorder = (int)$sortorder;
+        $file_record->sortorder = $sortorder;
+        $DB->update_record('files', $file_record);
+        return true;
+    }
+    return false;
+}
+
+/**
+ * reset file sort order number to 0
+ * @global object $DB
+ * @param integer $contextid the context id
+ * @param string $filearea file area.
+ * @param integer $itemid itemid.
+ * @return boolean
+ */
+function file_reset_sortorder($contextid, $filearea, $itemid=false) {
+    global $DB;
+
+    $conditions = array('contextid'=>$contextid, 'filearea'=>$filearea);
+    if ($itemid !== false) {
+        $conditions['itemid'] = $itemid;
+    }
+
+    $file_records = $DB->get_records('files', $conditions);
+    foreach ($file_records as $file_record) {
+        $file_record->sortorder = 0;
+        $DB->update_record('files', $file_record);
+    }
+    return true;
+}
+
 /**
  * Returns description of upload error
  *
index 0db163e..ba1e676 100644 (file)
@@ -56,13 +56,6 @@ M.form_filemanager.init = function(Y, options) {
             this.options = options;
             if (options.mainfile) {
                 this.enablemainfile = options.mainfile;
-                var mainid = '#id_'+this.enablemainfile;
-                var filename = Y.one(mainid).get('value');
-                this.mainfilename = '';
-                if (filename) {
-                    var parts = filename.split('/');
-                    this.mainfilename = parts[parts.length-1];
-                }
             }
             this.client_id = options.client_id;
             this.currentpath = '/';
@@ -396,11 +389,12 @@ M.form_filemanager.init = function(Y, options) {
                     break;
                 }
                 var fullname = list[i].fullname;
+                var shorten = list[i].shortname;
 
-                if (this.mainfilename == fullname) {
-                    html = html.replace('___fullname___', '<strong><a href="'+url+'" id="'+fileid+'"><img src="'+list[i].icon+'" /> ' + fullname + '</a></strong>');
+                if (list[i].sortorder == 1) {
+                    html = html.replace('___fullname___', '<strong><a title="'+fullname+'" href="'+url+'" id="'+fileid+'"><img src="'+list[i].icon+'" /> ' + shorten + '</a></strong>');
                 } else {
-                    html = html.replace('___fullname___', '<a href="'+url+'" id="'+fileid+'"><img src="'+list[i].icon+'" /> ' + fullname + '</a>');
+                    html = html.replace('___fullname___', '<a title="'+fullname+'" href="'+url+'" id="'+fileid+'"><img src="'+list[i].icon+'" /> ' + shorten + '</a>');
                 }
                 html = html.replace('___action___', '<span class="fm-menuicon" id="'+action+'"><img alt="▶" src="'+M.util.image_url('i/menu')+'" /></span>');
                 html = '<li id="'+htmlid+'">'+html+'</li>';
@@ -452,11 +446,20 @@ M.form_filemanager.init = function(Y, options) {
                 ];
             function setmainfile(type, ev, obj) {
                 var file = obj[node.get('id')];
-                this.mainfilename = file.filename;
-                Y.one(mainid).set('value', file.filepath+file.filename);
-                scope.refresh(scope.currentpath);
+                //Y.one(mainid).set('value', file.filepath+file.filename);
+                var params = {};
+                params['filepath']   = file.filepath;
+                params['filename']   = file.filename;
+                this.request({
+                    action: 'setmainfile',
+                    scope: scope,
+                    params: params,
+                    callback: function(id, obj, args) {
+                        scope.refresh(scope.currentpath);
+                    }
+                });
             }
-            if (this.enablemainfile && (file.filename != this.mainfilename)) {
+            if (this.enablemainfile && (file.sortorder != 1)) {
                 var mainid = '#id_'+this.enablemainfile;
                 var menu = {text: M.str.repository.setmainfile, onclick:{fn: setmainfile, obj:data, scope:this}};
                 menuitems.push(menu);
index 5c607d7..99d3a31 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<XMLDB PATH="mod/resource/db" VERSION="20090722" COMMENT="XMLDB file for Resource module"
+<XMLDB PATH="mod/resource/db" VERSION="20100527" COMMENT="XMLDB file for Resource module"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd"
 >
@@ -11,9 +11,8 @@
         <FIELD NAME="name" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false" PREVIOUS="course" NEXT="intro"/>
         <FIELD NAME="intro" TYPE="text" LENGTH="small" NOTNULL="false" SEQUENCE="false" PREVIOUS="name" NEXT="introformat"/>
         <FIELD NAME="introformat" TYPE="int" LENGTH="4" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="intro" NEXT="tobemigrated"/>
-        <FIELD NAME="tobemigrated" TYPE="int" LENGTH="4" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="introformat" NEXT="mainfile"/>
-        <FIELD NAME="mainfile" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false" PREVIOUS="tobemigrated" NEXT="legacyfiles"/>
-        <FIELD NAME="legacyfiles" TYPE="int" LENGTH="4" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="mainfile" NEXT="legacyfileslast"/>
+        <FIELD NAME="tobemigrated" TYPE="int" LENGTH="4" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="introformat" NEXT="legacyfiles"/>
+        <FIELD NAME="legacyfiles" TYPE="int" LENGTH="4" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="tobemigrated" NEXT="legacyfileslast"/>
         <FIELD NAME="legacyfileslast" TYPE="int" LENGTH="10" NOTNULL="false" UNSIGNED="true" SEQUENCE="false" PREVIOUS="legacyfiles" NEXT="display"/>
         <FIELD NAME="display" TYPE="int" LENGTH="4" NOTNULL="true" UNSIGNED="true" DEFAULT="0" SEQUENCE="false" PREVIOUS="legacyfileslast" NEXT="displayoptions"/>
         <FIELD NAME="displayoptions" TYPE="text" LENGTH="small" NOTNULL="false" SEQUENCE="false" PREVIOUS="display" NEXT="filterfiles"/>
index 94ee5c8..6ec89db 100644 (file)
@@ -211,5 +211,40 @@ function xmldb_resource_upgrade($oldversion) {
         upgrade_mod_savepoint($result, 2009063000, 'resource');
     }
 
+    if ($result && $oldversion < 2009080501) {
+        require_once("$CFG->libdir/filelib.php");
+
+        $sql = "SELECT r.id,
+                       r.mainfile,
+                       cm.id AS cmid
+                  FROM {resource} r
+                  JOIN {modules} m ON m.name='resource'
+                  JOIN {course_modules} cm ON (cm.module = m.id AND cm.instance = r.id)";
+
+        if ($instances = $DB->get_recordset_sql($sql)) {
+            foreach ($instances as $instance) {
+                $context  = get_context_instance(CONTEXT_MODULE, $instance->cmid);
+                $filearea = 'resource_content';
+                $itemid   = 0;
+                $filepath = file_correct_filepath(dirname($instance->mainfile));
+                $filename = basename($instance->mainfile);
+                file_set_sortorder($context->id, $filearea, $itemid, $filepath, $filename, 1);
+            }
+        }
+
+     /// Define field mainfile to be dropped from resource
+        $table = new xmldb_table('resource');
+        $field = new xmldb_field('mainfile');
+
+    /// Conditionally launch drop field mainfile
+        if ($dbman->field_exists($table, $field)) {
+            $dbman->drop_field($table, $field);
+        }
+
+    /// resource savepoint reached
+        upgrade_mod_savepoint($result, 2009080501, 'resource');
+    }
+
+
     return $result;
 }
index 018a169..2629fba 100644 (file)
@@ -84,10 +84,7 @@ function resource_get_post_actions() {
 function resource_add_instance($data, $mform) {
     global $CFG, $DB;
     require_once("$CFG->libdir/resourcelib.php");
-
-    $cmid        = $data->coursemodule;
-    $draftitemid = $data->files;
-
+    $cmid = $data->coursemodule;
     $data->timemodified = time();
     $displayoptions = array();
     if ($data->display == RESOURCELIB_DISPLAY_POPUP) {
@@ -104,23 +101,7 @@ function resource_add_instance($data, $mform) {
 
     // we need to use context now, so we need to make sure all needed info is already in db
     $DB->set_field('course_modules', 'instance', $data->id, array('id'=>$cmid));
-    $context = get_context_instance(CONTEXT_MODULE, $cmid);
-
-    if ($draftitemid) {
-        file_save_draft_area_files($draftitemid, $context->id, 'resource_content', 0, array('subdirs'=>true));
-    }
-
-    $fs = get_file_storage();
-    $files = $fs->get_area_files($context->id, 'resource_content', 0, '', false);
-    if (count($files) == 1) {
-        $file = reset($files);
-        $path = $file->get_filepath().$file->get_filename();
-        if ($path !== $data->mainfile) {
-            $data->mainfile = $path;
-            $DB->set_field('resource', 'mainfile', $path, array('id'=>$data->id));
-        }
-    }
-
+    resource_set_mainfile($data);
     return $data->id;
 }
 
@@ -133,10 +114,6 @@ function resource_add_instance($data, $mform) {
 function resource_update_instance($data, $mform) {
     global $CFG, $DB;
     require_once("$CFG->libdir/resourcelib.php");
-
-    $cmid        = $data->coursemodule;
-    $draftitemid = $data->files;
-
     $data->timemodified = time();
     $data->id           = $data->instance;
     $data->revision++;
@@ -153,23 +130,7 @@ function resource_update_instance($data, $mform) {
     $data->displayoptions = serialize($displayoptions);
 
     $DB->update_record('resource', $data);
-
-    $context = get_context_instance(CONTEXT_MODULE, $cmid);
-    if ($draftitemid) {
-        file_save_draft_area_files($draftitemid, $context->id, 'resource_content', 0, array('subdirs'=>true));
-    }
-
-    $fs = get_file_storage();
-    $files = $fs->get_area_files($context->id, 'resource_content', 0, '', false);
-    if (count($files) == 1) {
-        $file = reset($files);
-        $path = $file->get_filepath().$file->get_filename();
-        if ($path !== $data->mainfile) {
-            $data->mainfile = $path;
-            $DB->set_field('resource', 'mainfile', $path, array('id'=>$data->id));
-        }
-    }
-
+    resource_set_mainfile($data);
     return true;
 }
 
@@ -267,8 +228,9 @@ function resource_get_coursemodule_info($coursemodule) {
     global $CFG, $DB;
     require_once("$CFG->libdir/filelib.php");
     require_once("$CFG->dirroot/mod/resource/locallib.php");
+    $context = get_context_instance(CONTEXT_MODULE, $coursemodule->id);
 
-    if (!$resource = $DB->get_record('resource', array('id'=>$coursemodule->instance), 'id, name, display, displayoptions, tobemigrated, mainfile, revision')) {
+    if (!$resource = $DB->get_record('resource', array('id'=>$coursemodule->instance), 'id, name, display, displayoptions, tobemigrated, revision')) {
         return NULL;
     }
 
@@ -279,8 +241,13 @@ function resource_get_coursemodule_info($coursemodule) {
         $info->icon ='i/cross_red_big';
         return $info;
     }
-
-    $info->icon = str_replace(array('.gif', '.png'), '', file_extension_icon($resource->mainfile));
+    $fs = get_file_storage();
+    $files = $fs->get_area_files($context->id, 'resource_content', 0, 'sortorder');
+    if (count($files) >= 1) {
+        $mainfile = array_pop($files);
+        $info->icon = str_replace(array('.gif', '.png'), '', file_extension_icon($mainfile->get_filename()));
+        $resource->mainfile = $mainfile->get_filename();
+    }
 
     $display = resource_get_final_display_type($resource);
 
@@ -301,9 +268,11 @@ function resource_get_coursemodule_info($coursemodule) {
         $info->extra = "onclick=\"window.location.href ='$fullurl';return false;\"";
 
     } else if ($display == RESOURCELIB_DISPLAY_DOWNLOAD) {
+        if (empty($mainfile)) {
+            return NULL;
+        }
         // do not open any window because it would be left there after download
-        $context = get_context_instance(CONTEXT_MODULE, $coursemodule->id);
-        $path = '/'.$context->id.'/resource_content/'.$resource->revision.$resource->mainfile;
+        $path = '/'.$context->id.'/resource_content/'.$resource->revision.$mainfile->get_filename();
         $fullurl = addslashes_js(file_encode_url($CFG->wwwroot.'/pluginfile.php', $path, true));
 
         // When completion information is enabled for download files, make
index fc05f02..0747323 100644 (file)
@@ -214,6 +214,7 @@ function resource_print_workaround($resource, $cm, $course, $file) {
     resource_print_heading($resource, $cm, $course, true);
     resource_print_intro($resource, $cm, $course, true);
 
+    $resource->mainfile = $file->get_filename();
     echo '<div class="resourceworkaround">';
     switch (resource_get_final_display_type($resource)) {
         case RESOURCELIB_DISPLAY_POPUP:
@@ -360,7 +361,11 @@ function resource_get_final_display_type($resource) {
                              'application/pdf', 'text/html',
                             );
 
-    $mimetype = mimeinfo('type', $resource->mainfile);
+    if (empty($resource->mainfile)) {
+        return RESOURCELIB_DISPLAY_DOWNLOAD;
+    } else {
+        $mimetype = mimeinfo('type', $resource->mainfile);
+    }
 
     if (in_array($mimetype, $download)) {
         return RESOURCELIB_DISPLAY_DOWNLOAD;
@@ -390,3 +395,21 @@ class resource_content_file_info extends file_info_stored {
         return parent::get_visible_name();
     }
 }
+
+function resource_set_mainfile($data) {
+    global $DB;
+    $fs = get_file_storage();
+    $cmid = $data->coursemodule;
+    $draftitemid = $data->files;
+
+    $context = get_context_instance(CONTEXT_MODULE, $cmid);
+    if ($draftitemid) {
+        file_save_draft_area_files($draftitemid, $context->id, 'resource_content', 0, array('subdirs'=>true));
+    }
+    $files = $fs->get_area_files($context->id, 'resource_content', 0, 'sortorder', false);
+    if (count($files) == 1) {
+        // only one file attached, set it as main file automatically
+        $file = reset($files);
+        file_set_sortorder($context->id, 'resource_content', 0, $file->get_filepath(), $file->get_filename(), 1);
+    }
+}
index b3409fd..c6a34e6 100644 (file)
@@ -68,13 +68,10 @@ class mod_resource_mod_form extends moodleform_mod {
         $filemanager_options['accepted_types'] = '*';
         $filemanager_options['maxbytes'] = 0;
         $filemanager_options['maxfiles'] = -1;
-        $filemanager_options['mainfile'] = 'mainfile';
+        $filemanager_options['mainfile'] = true;
 
         $mform->addElement('filemanager', 'files', get_string('selectfiles'), null, $filemanager_options);
 
-        $mform->addElement('hidden', 'mainfile', get_string('areamainfile', 'repository'), array('id'=>'id_mainfile'));
-        $mform->setType('mainfile', PARAM_PATH);
-
         //-------------------------------------------------------
         $mform->addElement('header', 'optionssection', get_string('optionsheader', 'resource'));
 
@@ -197,20 +194,25 @@ class mod_resource_mod_form extends moodleform_mod {
 
         $usercontext = get_context_instance(CONTEXT_USER, $USER->id);
         $fs = get_file_storage();
-        if (!$files = $fs->get_area_files($usercontext->id, 'user_draft', $data['files'], 'id', false)) {
+        if (!$files = $fs->get_area_files($usercontext->id, 'user_draft', $data['files'], 'sortorder', false)) {
             $errors['files'] = get_string('required');
             return $errors;
         }
         if (count($files) == 1) {
             // no need to select main file if only one picked
             return $errors;
-        }
-        $filepaths = array();
-        foreach ($files as $file) {
-            $filepaths[] = $file->get_filepath().$file->get_filename();
-        }
-        if (!in_array($data['mainfile'], $filepaths)) {
-            $errors['files'] = get_string('selectmainfile', 'resource');
+        } else if(count($files) > 1) {
+            // looking for main file
+            $mainfile = false;
+            foreach($files as $file) {
+                if ($file->get_sortorder() == 1) {
+                    $mainfile = true;
+                    break;
+                }
+            }
+            if (!$mainfile) {
+                $errors['files'] = get_string('selectmainfile', 'resource');
+            }
         }
         return $errors;
     }
index 5526ee6..beb9b38 100644 (file)
@@ -23,7 +23,7 @@
  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  */
 
-$module->version  = 2009080500;
+$module->version  = 2009080501;
 $module->requires = 2009073101;  // Requires this Moodle version
 $module->cron     = 0;
 
index 185531f..b72d2a6 100644 (file)
@@ -64,10 +64,12 @@ if ($resource->tobemigrated) {
 }
 
 $fs = get_file_storage();
-$pathnamehash = sha1($context->id.'resource_content0'.$resource->mainfile);
-if (!$file = $fs->get_file_by_hash($pathnamehash)) {
+$files = $fs->get_area_files($context->id, 'resource_content', 0, 'sortorder');
+if (count($files) < 1) {
     resource_print_filenotfound($resource, $cm, $course);
     die;
+} else {
+    $file = array_pop($files);
 }
 
 if ($redirect) {
@@ -78,6 +80,7 @@ if ($redirect) {
     redirect($fullurl);
 }
 
+$resource->mainfile = $file->get_filename();
 switch (resource_get_final_display_type($resource)) {
     case RESOURCELIB_DISPLAY_EMBED:
         resource_display_embed($resource, $cm, $course, $file);
index ddd7f45..bb48c6c 100644 (file)
@@ -6,7 +6,7 @@
 // This is compared against the values stored in the database to determine
 // whether upgrades should be performed (see lib/db/*.php)
 
-    $version = 2010052800;  // YYYYMMDD   = date of the last version bump
+    $version = 2010052801;  // YYYYMMDD   = date of the last version bump
                             //         XX = daily increments
 
     $release = '2.0 Preview 2 (Build: 20100528)';  // Human-friendly version name