]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
Break profilelist into a recipe
authorEvan Prodromou <evan@controlyourself.ca>
Sun, 14 Jun 2009 21:52:26 +0000 (14:52 -0700)
committerEvan Prodromou <evan@controlyourself.ca>
Sun, 14 Jun 2009 21:52:26 +0000 (14:52 -0700)
Expanded the ProfileList class so it worked more like a recipe. This
helps to get rid of a lot of special cases and simplifies the code. It
also makes it possible to do things like group block.

actions/groupmembers.php
actions/showgroup.php
actions/subscribers.php
actions/subscriptions.php
lib/peoplesearchresults.php
lib/profileaction.php
lib/profilelist.php
lib/profileminilist.php

index 21e5ebbaa19c443b0bc81f8f9163b827eb488655..53fee31292ccec61b23204942d95f90ad0c8ade0 100644 (file)
@@ -127,7 +127,7 @@ class GroupmembersAction extends Action
         $members = $this->group->getMembers($offset, $limit);
 
         if ($members) {
-            $member_list = new ProfileList($members, null, $this);
+            $member_list = new GroupMemberList($members, $this->group, $this);
             $cnt = $member_list->show();
         }
 
@@ -138,3 +138,15 @@ class GroupmembersAction extends Action
                           array('nickname' => $this->group->nickname));
     }
 }
+
+class GroupMemberList extends ProfileList {
+
+    var $group = null;
+
+    function __construct($profile, $group=null, $action=null)
+    {
+        parent::__construct($profile, $action);
+
+        $this->group = $group;
+    }
+}
index 29b6fa1e61be25ee576a7256a4d89eb1bb88daa3..3ce45adc674d26114618c7941c765975cb0c5202 100644 (file)
@@ -344,7 +344,7 @@ class ShowgroupAction extends Action
 
         $this->element('h2', null, _('Members'));
 
-        $pml = new ProfileMiniList($member, null, $this);
+        $pml = new ProfileMiniList($member, $this);
         $cnt = $pml->show();
         if ($cnt == 0) {
              $this->element('p', null, _('(None)'));
index 4482de9a7c74279b000e042012fbb927a86b5dbd..66ac00fb19aa26d64da5441d07fafec8bc08f36a 100644 (file)
@@ -130,18 +130,34 @@ class SubscribersAction extends GalleryAction
     }
 }
 
-class SubscribersList extends ProfileList
+class SubscribersList extends SubscriptionList
 {
-    function showBlockForm()
+    function newListItem($profile)
     {
-        $bf = new BlockForm($this->out, $this->profile,
-                            array('action' => 'subscribers',
-                                  'nickname' => $this->owner->nickname));
-        $bf->show();
+        return new SubscribersListItem($profile, $this->owner, $this->action);
     }
+}
 
-    function isReadOnly($args)
+class SubscribersListItem extends SubscriptionListItem
+{
+    function showActions()
     {
-        return true;
+        $this->startActions();
+        $this->showSubscribeButton();
+        // Relevant code!
+        $this->showBlockForm();
+        $this->endActions();
+    }
+
+    function showBlockForm()
+    {
+        $user = common_current_user();
+
+        if (!empty($user) && $this->owner->id == $user->id) {
+            $bf = new BlockForm($this->out, $this->profile,
+                                array('action' => 'subscribers',
+                                      'nickname' => $this->owner->nickname));
+            $bf->show();
+        }
     }
 }
index 095b18ad87db49b97f1c16746d3a7366f6b0f7a4..4124abea4d2e77e82dbde71c296f0cbff526a02c 100644 (file)
@@ -137,22 +137,46 @@ class SubscriptionsAction extends GalleryAction
     }
 }
 
-class SubscriptionsList extends ProfileList
+// XXX SubscriptionsList and SubscriptionList are dangerously close
+
+class SubscriptionsList extends SubscriptionList
 {
-    function showOwnerControls($profile)
+    function newListItem($profile)
+    {
+        return new SubscriptionsListItem($profile, $this->owner, $this->action);
+    }
+}
+
+class SubscriptionsListItem extends SubscriptionListItem
+{
+    function showProfile()
+    {
+        $this->startProfile();
+        $this->showAvatar();
+        $this->showFullName();
+        $this->showLocation();
+        $this->showHomepage();
+        $this->showBio();
+        $this->showTags();
+        // Relevant portion!
+        $this->showOwnerControls();
+        $this->endProfile();
+    }
+
+    function showOwnerControls()
     {
         $sub = Subscription::pkeyGet(array('subscriber' => $this->owner->id,
-                                           'subscribed' => $profile->id));
+                                           'subscribed' => $this->profile->id));
         if (!$sub) {
             return;
         }
 
-        $this->out->elementStart('form', array('id' => 'subedit-' . $profile->id,
+        $this->out->elementStart('form', array('id' => 'subedit-' . $this->profile->id,
                                           'method' => 'post',
                                           'class' => 'form_subscription_edit',
                                           'action' => common_local_url('subedit')));
         $this->out->hidden('token', common_session_token());
-        $this->out->hidden('profile', $profile->id);
+        $this->out->hidden('profile', $this->profile->id);
         $this->out->checkbox('jabber', _('Jabber'), $sub->jabber);
         $this->out->checkbox('sms', _('SMS'), $sub->sms);
         $this->out->submit('save', _('Save'));
index d3f8408525ae3eb3dd43f9c5a50b37d63bca1841..9d9d1729939a54424e432c80fc873b63cad54859 100644 (file)
@@ -56,20 +56,25 @@ class PeopleSearchResults extends ProfileList
 
     function __construct($profile, $terms, $action)
     {
-        parent::__construct($profile, $terms, $action);
+        parent::__construct($profile, $action);
+
         $this->terms = array_map('preg_quote',
                                  array_map('htmlspecialchars', $terms));
+
         $this->pattern = '/('.implode('|',$terms).')/i';
     }
 
-    function highlight($text)
+    function newProfileItem($profile)
     {
-        return preg_replace($this->pattern, '<strong>\\1</strong>', htmlspecialchars($text));
+        return new PeopleSearchResultItem($profile, $this->action);
     }
+}
 
-    function isReadOnly($args)
+class PeopleSearchResultItem extends ProfileListItem
+{
+    function highlight($text)
     {
-        return true;
+        return preg_replace($this->pattern, '<strong>\\1</strong>', htmlspecialchars($text));
     }
 }
 
index a3437ff4ddbec567d630c3f25e4985aa8b3f73a8..298f34b2212f3773c540dc92c485d2f713d51dcd 100644 (file)
@@ -110,7 +110,7 @@ class ProfileAction extends Action
         $this->element('h2', null, _('Subscriptions'));
 
         if ($profile) {
-            $pml = new ProfileMiniList($profile, $this->user, $this);
+            $pml = new ProfileMiniList($profile, $this);
             $cnt = $pml->show();
             if ($cnt == 0) {
                 $this->element('p', null, _('(None)'));
@@ -139,7 +139,7 @@ class ProfileAction extends Action
         $this->element('h2', null, _('Subscribers'));
 
         if ($profile) {
-            $pml = new ProfileMiniList($profile, $this->user, $this);
+            $pml = new ProfileMiniList($profile, $this);
             $cnt = $pml->show();
             if ($cnt == 0) {
                 $this->element('p', null, _('(None)'));
index a4cc235552a4d24723cbb5abe9934bfa1c9e08a6..e2faf10af48ed16d1fcd5fb08726c90628b6a2fa 100644 (file)
@@ -49,23 +49,19 @@ class ProfileList extends Widget
 {
     /** Current profile, profile query. */
     var $profile = null;
-    /** Owner of this list */
-    var $owner = null;
     /** Action object using us. */
     var $action = null;
 
-    function __construct($profile, $owner=null, $action=null)
+    function __construct($profile, $action=null)
     {
         parent::__construct($action);
 
         $this->profile = $profile;
-        $this->owner = $owner;
         $this->action = $action;
     }
 
     function show()
     {
-
         $this->out->elementStart('ul', 'profiles');
 
         $cnt = 0;
@@ -75,7 +71,8 @@ class ProfileList extends Widget
             if($cnt > PROFILES_PER_PAGE) {
                 break;
             }
-            $this->showProfile();
+            $pli = $this->newListItem($this->profile);
+            $pli->show();
         }
 
         $this->out->elementEnd('ul');
@@ -83,16 +80,59 @@ class ProfileList extends Widget
         return $cnt;
     }
 
-    function showProfile()
+    function newListItem($profile)
+    {
+        return new ProfileListItem($this->profile, $this->action);
+    }
+}
+
+class ProfileListItem extends Widget
+{
+    /** Current profile. */
+    var $profile = null;
+    /** Action object using us. */
+    var $action = null;
+
+    function __construct($profile, $action)
+    {
+        parent::__construct($action);
+
+        $this->profile = $profile;
+        $this->action  = $action;
+    }
+
+    function show()
+    {
+        $this->startItem();
+        $this->showProfile();
+        $this->showActions();
+        $this->endItem();
+    }
+
+    function startItem()
     {
         $this->out->elementStart('li', array('class' => 'profile',
                                              'id' => 'profile-' . $this->profile->id));
+    }
 
-        $user = common_current_user();
-        $is_own = !is_null($user) && isset($this->owner) && ($user->id === $this->owner->id);
+    function showProfile()
+    {
+        $this->startProfile();
+        $this->showAvatar();
+        $this->showFullName();
+        $this->showLocation();
+        $this->showHomepage();
+        $this->showBio();
+        $this->endProfile();
+    }
 
+    function startProfile()
+    {
         $this->out->elementStart('div', 'entity_profile vcard');
+    }
 
+    function showAvatar()
+    {
         $avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
         $this->out->elementStart('a', array('href' => $this->profile->profileurl,
                                             'class' => 'url'));
@@ -108,7 +148,10 @@ class ProfileList extends Widget
         $this->out->raw($this->highlight($this->profile->nickname));
         $this->out->elementEnd('span');
         $this->out->elementEnd('a');
+    }
 
+    function showFullName()
+    {
         if (!empty($this->profile->fullname)) {
             $this->out->elementStart('dl', 'entity_fn');
             $this->out->element('dt', null, 'Full name');
@@ -119,6 +162,10 @@ class ProfileList extends Widget
             $this->out->elementEnd('dd');
             $this->out->elementEnd('dl');
         }
+    }
+
+    function showLocation()
+    {
         if (!empty($this->profile->location)) {
             $this->out->elementStart('dl', 'entity_location');
             $this->out->element('dt', null, _('Location'));
@@ -127,6 +174,10 @@ class ProfileList extends Widget
             $this->out->elementEnd('dd');
             $this->out->elementEnd('dl');
         }
+    }
+
+    function showHomepage()
+    {
         if (!empty($this->profile->homepage)) {
             $this->out->elementStart('dl', 'entity_url');
             $this->out->element('dt', null, _('URL'));
@@ -138,6 +189,10 @@ class ProfileList extends Widget
             $this->out->elementEnd('dd');
             $this->out->elementEnd('dl');
         }
+    }
+
+    function showBio()
+    {
         if (!empty($this->profile->bio)) {
             $this->out->elementStart('dl', 'entity_note');
             $this->out->element('dt', null, _('Note'));
@@ -146,57 +201,33 @@ class ProfileList extends Widget
             $this->out->elementEnd('dd');
             $this->out->elementEnd('dl');
         }
+    }
 
-        # If we're on a list with an owner (subscriptions or subscribers)...
-
-        if ($this->owner) {
-            # Get tags
-            $tags = Profile_tag::getTags($this->owner->id, $this->profile->id);
-
-            $this->out->elementStart('dl', 'entity_tags');
-            $this->out->elementStart('dt');
-            if ($is_own) {
-                $this->out->element('a', array('href' => common_local_url('tagother',
-                                                                          array('id' => $this->profile->id))),
-                                    _('Tags'));
-            } else {
-                $this->out->text(_('Tags'));
-            }
-            $this->out->elementEnd('dt');
-            $this->out->elementStart('dd');
-            if ($tags) {
-                $this->out->elementStart('ul', 'tags xoxo');
-                foreach ($tags as $tag) {
-                    $this->out->elementStart('li');
-                    $this->out->element('span', 'mark_hash', '#');
-                    $this->out->element('a', array('rel' => 'tag',
-                                                   'href' => common_local_url($this->action->trimmed('action'),
-                                                                              array('nickname' => $this->owner->nickname,
-                                                                                    'tag' => $tag))),
-                                        $tag);
-                    $this->out->elementEnd('li');
-                }
-                $this->out->elementEnd('ul');
-            } else {
-                $this->out->text(_('(none)'));
-            }
-            $this->out->elementEnd('dd');
-            $this->out->elementEnd('dl');
-        }
-
-        if ($is_own) {
-            $this->showOwnerControls($this->profile);
-        }
-
+    function endProfile()
+    {
         $this->out->elementEnd('div');
+    }
 
-        $this->out->elementStart('div', 'entity_actions');
+    function showActions()
+    {
+        $this->startActions();
+        $this->showSubscribeButton();
+        $this->endActions();
+    }
 
+    function startActions()
+    {
+        $this->out->elementStart('div', 'entity_actions');
         $this->out->elementStart('ul');
+    }
 
+    function showSubscribeButton()
+    {
         // Is this a logged-in user, looking at someone else's
         // profile?
 
+        $user = common_current_user();
+
         if (!empty($user) && $this->profile->id != $user->id) {
             $this->out->elementStart('li', 'entity_subscribe');
             if ($user->isSubscribed($this->profile)) {
@@ -207,33 +238,22 @@ class ProfileList extends Widget
                 $sf->show();
             }
             $this->out->elementEnd('li');
-            $this->out->elementStart('li', 'entity_block');
-            if ($user->id == $this->owner->id) {
-                $this->showBlockForm();
-            }
-            $this->out->elementEnd('li');
         }
+    }
 
+    function endActions()
+    {
         $this->out->elementEnd('ul');
-
         $this->out->elementEnd('div');
-
-        $this->out->elementEnd('li');
     }
 
-    /* Override this in subclasses. */
-
-    function showOwnerControls($profile)
+    function endItem()
     {
-        return;
+        $this->out->elementEnd('li');
     }
 
     function highlight($text)
     {
         return htmlspecialchars($text);
     }
-
-    function showBlockForm()
-    {
-    }
 }
index 57496d0e97d77ee236a74d03adead1ad5860bdd8..f11cae8a5f4df9d9700091ce4977d5ad1c97e497 100644 (file)
@@ -47,26 +47,15 @@ define('PROFILES_PER_MINILIST', 27);
 
 class ProfileMiniList extends ProfileList
 {
-    function show()
+    function newListItem($profile)
     {
-        $this->out->elementStart('ul', 'entities users xoxo');
-
-        $cnt = 0;
-
-        while ($this->profile->fetch()) {
-            $cnt++;
-            if($cnt > PROFILES_PER_MINILIST) {
-                break;
-            }
-            $this->showProfile();
-        }
-
-        $this->out->elementEnd('ul');
-
-        return $cnt;
+        return new ProfileMiniListItem($profile, $this->action);
     }
+}
 
-    function showProfile()
+class ProfileMiniListItem extends ProfileListItem
+{
+    function show()
     {
         $this->out->elementStart('li', 'vcard');
         $this->out->elementStart('a', array('title' => $this->profile->getBestName(),