MDL-30740 skydrive: Add filepicker navigation bar
authorDan Poltawski <dan@moodle.com>
Mon, 19 Nov 2012 16:40:47 +0000 (16:40 +0000)
committerDan Poltawski <dan@moodle.com>
Mon, 15 Jul 2013 09:57:42 +0000 (17:57 +0800)
In order not to get lost in the Sky.

We use a session cache to reduce repeated calls to the skydrive API,
storing the folder name each time we get a listing.

Original concept from Ruslan Kabalin, thanks!

repository/skydrive/lib.php
repository/skydrive/microsoftliveapi.php

index fe827a1..0e0d5d7 100644 (file)
@@ -96,6 +96,24 @@ class repository_skydrive extends repository {
         $ret['dynload'] = true;
         $ret['nosearch'] = true;
         $ret['list'] = $this->skydrive->get_file_list($path);
+
+        // Generate path bar, always start with the plugin name.
+        $ret['path']   = array();
+        $ret['path'][] = array('name'=> $this->name, 'path'=>'');
+
+        // Now add each level folder.
+        $trail = '';
+        if (!empty($path)) {
+            $parts = explode('/', $path);
+            foreach ($parts as $folderid) {
+                if (!empty($folderid)) {
+                    $trail .= ('/'.$folderid);
+                    $ret['path'][] = array('name' => $this->skydrive->get_folder_name($folderid),
+                                           'path' => $trail);
+                }
+            }
+        }
+
         return $ret;
     }
 
index bcadcd2..f58ff40 100644 (file)
@@ -44,6 +44,8 @@ class microsoft_skydrive extends oauth2_client {
     const SCOPE = 'wl.skydrive';
     /** @var string Base url to access API */
     const API = 'https://apis.live.net/v5.0';
+    /** @var cache_session cache of foldernames */
+    var $foldernamecache = null;
 
     /**
      * Construct a skydrive request object
@@ -54,6 +56,8 @@ class microsoft_skydrive extends oauth2_client {
      */
     public function __construct($clientid, $clientsecret, $returnurl) {
         parent::__construct($clientid, $clientsecret, $returnurl, self::SCOPE);
+        // Make a session cache
+        $this->foldernamecache = cache::make_from_params(cache_store::MODE_SESSION, 'repository_skydrive', 'foldernamelist');
     }
 
     /**
@@ -100,6 +104,35 @@ class microsoft_skydrive extends oauth2_client {
         return array('path'=>$path, 'url'=>$url);
     }
 
+    /**
+     * Returns a folder name property for a given folderid.
+     *
+     * @param string $folderid the folder id which is passed
+     * @return mixed folder name or false in case of error
+     */
+    public function get_folder_name($folderid) {
+        if (empty($folderid)) {
+            throw new coding_exception('Empty folderid passed to get_folder_name');
+        }
+
+        // Cache based on oauthtoken and folderid.
+        $cachekey = $this->folder_cache_key($folderid);
+
+        if ($foldername = $this->foldernamecache->get($cachekey)) {
+            return $foldername;
+        }
+
+        $url = self::API."/{$folderid}";
+        $ret = json_decode($this->get($url));
+        if (isset($ret->error)) {
+            $this->log_out();
+            return false;
+        }
+
+        $this->foldernamecache->set($cachekey, $ret->name);
+        return $ret->name;
+    }
+
     /**
      * Returns a list of files the user has formated for files api
      *
@@ -109,10 +142,13 @@ class microsoft_skydrive extends oauth2_client {
     public function get_file_list($path = '') {
         global $OUTPUT;
 
+        $precedingpath = '';
         if (empty($path)) {
             $url = self::API."/me/skydrive/files/";
         } else {
-            $url = self::API."/{$path}/files/";
+            $parts = explode('/', $path);
+            $currentfolder = array_pop($parts);
+            $url = self::API."/{$currentfolder}/files/";
         }
 
         $ret = json_decode($this->get($url));
@@ -128,9 +164,13 @@ class microsoft_skydrive extends oauth2_client {
             switch($file->type) {
                 case 'folder':
                 case 'album':
+                    // Cache the foldername for future requests.
+                    $cachekey = $this->folder_cache_key($file->id);
+                    $this->foldernamecache->set($cachekey, $file->name);
+
                     $files[] = array(
                         'title' => $file->name,
-                        'path' => $file->id,
+                        'path' => $path.'/'.$file->id,
                         'size' => 0,
                         'date' => strtotime($file->updated_time),
                         'thumbnail' => $OUTPUT->pix_url(file_folder_icon(90))->out(false),
@@ -181,4 +221,15 @@ class microsoft_skydrive extends oauth2_client {
         }
         return $files;
     }
+
+    /**
+     * Returns a key for foldernane cache
+     *
+     * @param string $folderid the folder id which is to be cached
+     * @return string the cache key to use
+     */
+    private function folder_cache_key($folderid) {
+        // Cache based on oauthtoken and folderid.
+        return $this->get_tokenname().'_'.$folderid;
+    }
 }