1ec44616569350def07bc4d9bd4f3f65155b7b33
[moodle.git] / repository / flickr / repository.class.php
1 <?php
2 /**
3  * repository_flickr class
4  * This is a subclass of repository class
5  *
6  * @author Dongsheng Cai
7  * @version 0.1 dev
8  * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
9  */
11 require_once($CFG->dirroot.'/repository/flickr/'.'phpFlickr.php');
13 class repository_flickr extends repository{
14     private $flickr;
15     public $photos;
17     public function set_option($options = array()){
18         if (!empty($options['api_key'])) {
19             set_config('api_key', trim($options['api_key']), 'flickr');
20         }
21         unset($options['api_key']);
22         $ret = parent::set_option($options);
23         return $ret;
24     }
26     public function get_option($config = ''){
27         if($config==='api_key'){
28             return trim(get_config('flickr', 'api_key'));
29         } else {
30             $options['api_key'] = trim(get_config('flickr', 'api_key'));
31         }
32         $options = parent::get_option($config);
33         return $options;
34     }
36     public function global_search(){
37         global $SESSION;
38         $sess_name = 'flickrmail'.$this->id;
39         if (empty($SESSION->$sess_name)) {
40             return false;
41         } else {
42             return true;
43         }
44     }
46     public function __construct($repositoryid, $context = SITEID, $options = array()){
47         global $SESSION, $action, $CFG;
48         $options['page']    = optional_param('p', 1, PARAM_INT);
49         parent::__construct($repositoryid, $context, $options);
50         $this->api_key = $this->get_option('api_key');
51         if (empty($this->api_key)) {
52         }
53         $this->flickr = new phpFlickr($this->api_key);
55         $reset = optional_param('reset', 0, PARAM_INT);
56         $sess_name = 'flickrmail'.$this->id;
57         if(!empty($reset)) {
58             // logout from flickr
59             unset($SESSION->$sess_name);
60             set_user_preference('flickrmail'.$this->id, '');
61         }
63         if(!empty($SESSION->$sess_name)) {
64             if(empty($action)) {
65                 $action = 'list';
66             }
67         } else {
68             // get flickr account
69             $account = optional_param('flickrmail', '', PARAM_RAW);
70             if(!empty($account)) {
71                 $people = $this->flickr->people_findByEmail($account);
72                 if(!empty($people)) {
73                     $remember = optional_param('remember', '', PARAM_RAW);
74                     if(!empty($remember)) {
75                         set_user_preference('flickrmail'.$this->id, $account);
76                     }
77                     $SESSION->$sess_name = $account;
78                     if (empty($account)) {
79                         $action = 'list';
80                     } else {
81                         $action = 'login';
82                     }
83                 } else {
84                     throw new repository_exception('invalidemail', 'repository_flickr');
85                 }
86             } else {
87                 if($account = get_user_preferences('flickrmail'.$this->id, '')){
88                     $SESSION->$sess_name = $account;
89                     if(empty($action)) {
90                         $action = 'list';
91                     }
92                 } else {
93                     $action = 'login';
94                 }
95             }
96         }
97     }
98     public function print_login($ajax = true){
99         global $SESSION;
100         $sess_name = 'flickrmail'.$this->id;
101         if(empty($SESSION->$sess_name)) {
102         $str =<<<EOD
103 <form id="moodle-repo-login">
104 <label for="account">Account (Email)</label><br/>
105 <input type='text' name='flickrmail' id='account' />
106 <input type='hidden' name='id' value='$this->id' /><br/>
107 <input type='checkbox' name='remember' id="keepid" value='true' /> <label for="keepid">Remember? </label>
108 <p><input type='button' onclick="repository_client.login()" value="Go" /></p>
109 </form>
110 EOD;
111             if($ajax){
112                 $ret = array();
113                 $e1->label = get_string('username', 'repository_flickr').': ';
114                 $e1->id    = 'account';
115                 $e1->type = 'text';
116                 $e1->name = 'flickrmail';
118                 $e2->id   = 'keepid';
119                 $e2->label = get_string('remember', 'repository_flickr').' ';
120                 $e2->type = 'checkbox';
121                 $e2->name = 'remember';
123                 $e3->type = 'hidden';
124                 $e3->name = 'repo_id';
125                 $e3->value = $this->id;
126                 $ret['login'] = array($e1, $e2, $e3);
127                 return $ret;
128             }else{
129                 echo $str;
130             }
131         } else {
132             return $this->get_listing();
133         }
134     }
135     public function get_listing($path = '1', $search = ''){
136         global $SESSION;
137         $sess_name = 'flickrmail'.$this->id;
138         $people = $this->flickr->people_findByEmail($SESSION->$sess_name);
139         $photos_url = $this->flickr->urls_getUserPhotos($people['nsid']);
141         if(!empty($search)) {
142             // do searching, if $path is not empty, ignore it.
143             $photos = $this->flickr->photos_search(array('user_id'=>$people['nsid'], 'text'=>$search));
144         } elseif(!empty($path) && empty($search)) {
145             $photos = $this->flickr->people_getPublicPhotos($people['nsid'], 'original_format', 36, $path);
146         }
148         $ret = array();
149         $ret['manage'] = $photos_url;
150         $ret['list']  = array();
151         $ret['pages'] = $photos['pages'];
152         if(is_int($path) && $path <= $ret['pages']) {
153             $ret['page'] = $path;
154         } else {
155             $ret['page'] = 1;
156         }
157         foreach ($photos['photo'] as $p) {
158             if(empty($p['title'])) {
159                 $p['title'] = get_string('notitle', 'repository_flickr');
160             }
161             if (isset($p['originalformat'])) {
162                 $format = $p['originalformat'];
163             } else {
164                 $format = 'jpg';
165             }
166             $ret['list'][] =
167                 array('title'=>$p['title'].'.'.$format,'source'=>$p['id'],'id'=>$p['id'],'thumbnail'=>$this->flickr->buildPhotoURL($p, 'Square'), 'date'=>'', 'size'=>'unknown', 'url'=>$photos_url.$p['id']);
168         }
169         if(empty($ret)) {
170             throw new repository_exception('nullphotolist', 'repository_flickr');
171         } else {
172             return $ret;
173         }
174     }
175     public function print_listing(){
176         if(empty($this->photos)){
177             $this->get_listing();
178         }
179         $str = '';
180         $str .= '<h2>Account: <span>'.$this->photos['a'].'</span></h2>';
181         foreach ((array)$this->photos['photo'] as $photo) {
182             $str .= "<a href='".$this->photos['url'].$photo[id]."'>";
183             $str .= "<img border='0' alt='$photo[title]' ".
184                 "src=" . $photo['thumbnail'] . ">";
185             $str .= "</a>";
186             $i++;
188             if ($i % 4 == 0) {
189                 $str .= "<br/>";
190             }
191         }
192         $str .= <<<EOD
193 <style type='text/css'>
194 #paging{margin-top: 10px; clear:both}
195 #paging a{padding: 4px; border: 1px solid gray}
196 </style>
197 EOD;
198         $str .= '<div id="paging">';
199         for($i=1; $i <= $this->photos['pages']; $i++) {
200             $str .= '<a href="###" onclick="cr('.$this->id.', '.$i.', 0)">';
201             $str .= $i;
202             $str .= '</a> ';
203         }
204         $str .= '</div>';
205         echo $str;
206     }
207     public function print_search(){
208         echo '<input type="text" name="Search" value="search terms..." size="40" class="right"/>';
209         return true;
210     }
211     public function get_file($photo_id, $file = ''){
212         global $CFG;
213         $result = $this->flickr->photos_getSizes($photo_id);
214         $url = '';
215         if(!empty($result[4])) {
216             $url = $result[4]['source'];
217         } elseif(!empty($result[3])) {
218             $url = $result[3]['source'];
219         } elseif(!empty($result[2])) {
220             $url = $result[2]['source'];
221         }
222         if (!file_exists($CFG->dataroot.'/repository/download')) {
223             mkdir($CFG->dataroot.'/repository/download/', 0777, true);
224         }
225         if(is_dir($CFG->dataroot.'/repository/download')) {
226             $dir = $CFG->dataroot.'/repository/download/';
227         }
229         if(empty($file)) {
230             $file = $photo_id.'_'.time().'.jpg';
231         }
232         if(file_exists($dir.$file)) {
233             $file = uniqid('m').$file;
234         }
235         $fp = fopen($dir.$file, 'w');
236         $c = new curl;
237         $c->download(array(
238             array('url'=>$url, 'file'=>$fp)
239         ));
240         return $dir.$file;
241     }
242     public static function has_admin_config() {
243         return true;
244     }
246     public static function has_multiple_instances() {
247         return true;
248     }
250     public static function has_instance_config() {
251         return false;
252     }
254     public function admin_config_form(&$mform) {
255         $api_key = get_config('flickr', 'api_key');
256         if (empty($api_key)) {
257             $api_key = '';
258         }
259         $strrequired = get_string('required');
260         $mform->addElement('text', 'api_key', get_string('apikey', 'repository_boxnet'), array('value'=>$api_key,'size' => '40'));
261         $mform->addRule('api_key', $strrequired, 'required', null, 'client');
262     }
263     public static function get_admin_option_names(){
264         return array('api_key');
265     }