]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/gallery.php
allow doc and api calls from private
[quix0rs-gnu-social.git] / lib / gallery.php
index cfb6b650c5bb16a8d2adc75b218131ff36918c8d..886b6b9e88bcfc1ea8b7b16158bab607d3ece510 100644 (file)
@@ -34,7 +34,13 @@ class GalleryAction extends Action {
 
        function handle($args) {
                parent::handle($args);
+
+               # Post from the tag dropdown; redirect to a GET
                
+               if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+                   common_redirect($this->self_url(), 307);
+               }
+
                $nickname = common_canonical_nickname($this->arg('nickname'));
                $user = User::staticGet('nickname', $nickname);
 
@@ -62,10 +68,16 @@ class GalleryAction extends Action {
                        $display = 'list';
                }
                
+               $tag = $this->arg('tag');
+
                common_show_header($profile->nickname . ": " . $this->gallery_type(),
                                                   NULL, $profile,
                                                   array($this, 'show_top'));
-               $this->show_gallery($profile, $page, $display);
+
+               $this->display_links($profile, $page, $display);
+               $this->show_tags_dropdown($profile);
+               
+               $this->show_gallery($profile, $page, $display, $tag);
                common_show_footer();
        }
 
@@ -73,12 +85,43 @@ class GalleryAction extends Action {
                $this->client_error(_('No such user.'));
        }
 
+       function show_tags_dropdown($profile) {
+               $tag = $this->trimmed('tag');
+               list($lst, $usr) = $this->fields();
+               $tags = $this->get_all_tags($profile, $lst, $usr);
+               $content = array();
+               foreach ($tags as $t) {
+                       $content[$t] = $t;
+               }
+               if ($tags) {
+                       common_element_start('dl', array('id'=>'filter_tags'));
+                       common_element('dt', null, _('Filter tags'));
+                       common_element_start('dd');
+                       common_element_start('ul');
+                       common_element_start('li', array('id'=>'filter_tags_all', 'class'=>'child_1'));
+                       common_element('a', array('href' => common_local_url($this->trimmed('action'),
+                                                                                                                                array('nickname' => $profile->nickname))),
+                                                  _('All'));
+                       common_element_end('li');
+                       common_element_start('li', array('id'=>'filter_tags_item'));
+                       common_element_start('form', array('name' => 'bytag', 'id' => 'bytag', 'method' => 'post'));
+                       common_dropdown('tag', _('Tag'), $content,
+                                                       _('Choose a tag to narrow list'), FALSE, $tag);
+                       common_submit('go', _('Go'));
+                       common_element_end('form');
+                       common_element_end('li');
+                       common_element_end('ul');
+                       common_element_end('dd');
+                       common_element_end('dl');
+               }
+       }
+       
        function show_top($profile) {
                common_element('div', 'instructions',
                                           $this->get_instructions($profile));
        }
 
-       function show_gallery($profile, $page, $display='list') {
+       function show_gallery($profile, $page, $display='list', $tag=NULL) {
 
                $other = new Profile();
                
@@ -96,42 +139,54 @@ class GalleryAction extends Action {
                }
 
                # XXX: memcached results
+               # FIXME: SQL injection on $tag
                
-               $cnt = $other->query('SELECT profile.* ' .
-                                                        'FROM profile JOIN subscription ' .
-                                                        'ON profile.id = subscription.' . $lst . ' ' .
-                                                        'WHERE ' . $usr . ' = ' . $profile->id . ' ' .
-                                                        'AND subscriber != subscribed ' .
-                                                        'ORDER BY subscription.created DESC ' . 
-                                                        $lim);
+               $other->query('SELECT profile.* ' .
+                                         'FROM profile JOIN subscription ' .
+                                         'ON profile.id = subscription.' . $lst . ' ' .
+                                         (($tag) ? 'JOIN profile_tag ON (profile.id = profile_tag.tagged AND subscription.'.$usr.'= profile_tag.tagger) ' : '') .
+                                         'WHERE ' . $usr . ' = ' . $profile->id . ' ' .
+                                         'AND subscriber != subscribed ' .
+                                         (($tag) ? 'AND profile_tag.tag= "' . $tag . '" ': '') .
+                                         'ORDER BY subscription.created DESC, profile.id DESC ' .
+                                         $lim);
                
-               if ($cnt == 0) {
-                       common_element('p', NULL, _('Nobody to show!'));
-                       return;
-               }
-
                if ($display == 'list') {
-                       $profile_list = new ProfileList($other);
-                       $profile_list->show_list();
+                       $profile_list = new ProfileList($other, $profile, $this->trimmed('action'));
+                       $cnt = $profile_list->show_list();
                } else {
-                       $this->icon_list($profile, $cnt);
+                       $cnt = $this->icon_list($other);
+               }
+
+               # For building the pagination URLs
+               
+               $args = array('nickname' => $profile->nickname);
+               
+               if ($display != 'list') {
+                       $args['display'] = $display;
                }
                
                common_pagination($page > 1,
                                                  $cnt > $per_page,
                                                  $page,
                                                  $this->trimmed('action'),
-                                                 array('nickname' => $profile->nickname));
+                                                 $args);
        }
 
-       function icon_list($other, $subs_count) {
+       function icon_list($other) {
                
                common_element_start('ul', $this->div_class());
-               
-               for ($idx = 0; $idx < min($subs_count, AVATARS_PER_PAGE); $idx++) {
 
-                       $other->fetch();
+               $cnt = 0;
+               
+               while ($other->fetch()) {
 
+                       $cnt++;
+                       
+                       if ($cnt > AVATARS_PER_PAGE) {
+                               break;
+                       }
+                       
                        common_element_start('li');
 
                        common_element_start('a', array('title' => ($other->fullname) ?
@@ -158,6 +213,8 @@ class GalleryAction extends Action {
                }
                        
                common_element_end('ul');
+               
+               return $cnt;
        }
        
        function gallery_type() {
@@ -175,4 +232,65 @@ class GalleryAction extends Action {
        function div_class() {
                return '';
        }
+       
+       function display_links($profile, $page, $display) {
+               $tag = $this->trimmed('tag');
+               
+               common_element_start('dl', array('id'=>'subscriptions_nav'));
+               common_element('dt', null, _('Subscriptions navigation'));
+               common_element_start('dd');
+               common_element_start('ul', array('class'=>'nav'));
+               
+               switch ($display) {
+                case 'list':
+                       common_element('li', array('class'=>'child_1'), _('List'));
+                       common_element_start('li');
+                       $url_args = array('display' => 'icons',
+                                                         'nickname' => $profile->nickname,
+                                                         'page' => 1 + floor((($page - 1) * PROFILES_PER_PAGE) / AVATARS_PER_PAGE));
+                       if ($tag) {
+                               $url_args['tag'] = $tag;
+                       }
+                       $url = common_local_url($this->trimmed('action'), $url_args);
+                       common_element('a', array('href' => $url),
+                                                  _('Icons'));
+                       common_element_end('li');
+                       break;
+                default:
+                       common_element_start('li', array('class'=>'child_1'));
+                       $url_args = array('nickname' => $profile->nickname,
+                                                         'page' => 1 + floor((($page - 1) * AVATARS_PER_PAGE) / PROFILES_PER_PAGE));
+                       if ($tag) {
+                               $url_args['tag'] = $tag;
+                       }
+                       $url = common_local_url($this->trimmed('action'), $url_args);
+                       common_element('a', array('href' => $url),
+                                                  _('List'));
+                       common_element_end('li');
+                       common_element('li', NULL, _('Icons'));
+                       break;
+               }
+               
+               common_element_end('ul');
+               common_element_end('dd');
+               common_element_end('dl');
+       }
+       
+       # Get list of tags we tagged other users with
+
+       function get_all_tags($profile, $lst, $usr) {
+               $profile_tag = new Notice_tag();
+               $profile_tag->query('SELECT DISTINCT(tag) ' .
+                                                       'FROM profile_tag, subscription ' .
+                                                       'WHERE tagger = ' . $profile->id . ' ' .
+                                                       'AND ' . $usr . ' = ' . $profile->id . ' ' .
+                                                       'AND ' . $lst . ' = tagged ' .
+                                                       'AND tagger != tagged');
+               $tags = array();
+               while ($profile_tag->fetch()) {
+                       $tags[] = $profile_tag->tag;
+               }
+               $profile_tag->free();
+               return $tags;
+       }
 }
\ No newline at end of file