use an array of profiles rather than a looping cursor for profile lists

This commit is contained in:
Evan Prodromou 2011-08-27 12:53:15 -04:00
parent 01fd24ce6a
commit f81c1f7554
4 changed files with 36 additions and 31 deletions

View File

@ -98,7 +98,7 @@ class Profile extends Managed_DataObject
return $this->_user; return $this->_user;
} }
protected $_avatars = array(); protected $_avatars;
function getAvatar($width, $height=null) function getAvatar($width, $height=null)
{ {
@ -106,6 +106,10 @@ class Profile extends Managed_DataObject
$height = $width; $height = $width;
} }
if (!isset($this->_avatars)) {
$this->_avatars = array();
}
if (array_key_exists($width, $this->_avatars)) { if (array_key_exists($width, $this->_avatars)) {
return $this->_avatars[$width]; return $this->_avatars[$width];
} }

View File

@ -85,14 +85,14 @@ class ProfileList extends Widget
function showProfiles() function showProfiles()
{ {
$cnt = 0; $profiles = $this->profile->fetchAll();
while ($this->profile->fetch()) { $cnt = count($profiles);
$cnt++;
if($cnt > PROFILES_PER_PAGE) { $max = min($cnt, $this->maxProfiles());
break;
} for ($i = 0; $i < $max; $i++) {
$pli = $this->newListItem($this->profile); $pli = $this->newListItem($profiles[$i]);
$pli->show(); $pli->show();
} }
@ -101,7 +101,17 @@ class ProfileList extends Widget
function newListItem($profile) function newListItem($profile)
{ {
return new ProfileListItem($this->profile, $this->action); return new ProfileListItem($profile, $this->action);
}
function maxProfiles()
{
return PROFILES_PER_PAGE;
}
function avatarSize()
{
return AVATAR_STREAM_SIZE;
} }
} }
@ -186,7 +196,7 @@ class ProfileListItem extends Widget
$avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE); $avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
$aAttrs = $this->linkAttributes(); $aAttrs = $this->linkAttributes();
$this->out->elementStart('a', $aAttrs); $this->out->elementStart('a', $aAttrs);
$this->out->element('img', array('src' => ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_STREAM_SIZE), $this->out->element('img', array('src' => (!empty($avatar)) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_STREAM_SIZE),
'class' => 'photo avatar', 'class' => 'photo avatar',
'width' => AVATAR_STREAM_SIZE, 'width' => AVATAR_STREAM_SIZE,
'height' => AVATAR_STREAM_SIZE, 'height' => AVATAR_STREAM_SIZE,

View File

@ -58,22 +58,15 @@ class ProfileMiniList extends ProfileList
return new ProfileMiniListItem($profile, $this->action); return new ProfileMiniListItem($profile, $this->action);
} }
function showProfiles() function maxProfiles()
{ {
$cnt = 0; return PROFILES_PER_MINILIST;
while ($this->profile->fetch()) {
$cnt++;
if ($cnt > PROFILES_PER_MINILIST) {
break;
}
$pli = $this->newListItem($this->profile);
$pli->show();
} }
return $cnt; function avatarSize()
{
return AVATAR_MINI_SIZE;
} }
} }
class ProfileMiniListItem extends ProfileListItem class ProfileMiniListItem extends ProfileListItem

View File

@ -130,17 +130,15 @@ class SortableSubscriptionList extends SubscriptionList
function showProfiles() function showProfiles()
{ {
$cnt = 0; $profiles = $this->profile->fetchAll();
while ($this->profile->fetch()) { $cnt = count($profiles);
$cnt++;
if($cnt > PROFILES_PER_PAGE) {
break;
}
$odd = ($cnt % 2 == 0); // for zebra striping $max = min($cnt, $this->maxProfiles());
$pli = $this->newListItem($this->profile, $odd); for ($i = 0; $i < $max; $i++) {
$odd = ($i % 2 == 0); // for zebra striping
$pli = $this->newListItem($profiles[$i], $odd);
$pli->show(); $pli->show();
} }