Вывод определенного количества друзей (решено)

Пытаюсь вывести в блок определенное количество друзей юзера (заданное в конфиге). Пишу следующее:

$aResult=$this->User_GetUsersFriend($this->oUserProfile->getId(),1,Config::Get('plugin.friends.friends_count'));
$aUserfriends=$aResult['collection'];

В итоге получаю ошибку: Call to a member function getId() on a non-object.

Подскажите решение, пожалуйста.

15 комментариев

avatar
1. проверять нужно залогинен ли пользователь (существует ли $this->oUserProfile) и где вы его вообще берете.
мало кода, мало информации
avatar
Блок вывожу в профиле. В BlockFriends.class.php пишу следующее:

class PluginFriends_BlockFriends extends Block {
public function Exec() {
$aResult=$this->User_GetUsersFriend($this->oUserProfile->getId(),1,Config::Get('plugin.friends.friends_count'));
$aUserfriends=$aResult['collection'];
$this->Viewer_Assign('aUserfriends',$aUserfriends);
}
}

В файле шаблона блока:

<ul class="friend">
{foreach from=$aUserfriends item=oUser name="cmt"}
<li {if $smarty.foreach.cmt.iteration % 2 == 1}class="even"{/if}>
<a href="{$oUser->getUserWebPath()}" class="user">{$oUser->getLogin()}</a>
</li>
{/foreach}
</ul>


Ну и в конфиге — вывод блока в профиле.
avatar
после
public function Exec() {

должно быть что-то

if (!$this->oUserProfile) {
    // если переменная профиля не доступна, а не доступна у вас и её нужно получить
    return false;
}

а получить её можно например так (после той первой строчки вставить):

$this -> oUserProfile = Router::GetActionEvent ();


З.Ы. GetUsersFriend — имеет только один параметр — Id пользователя и не позволяет задавать количество как вы пытаетесь
avatar
З.Ы. GetUsersFriend — имеет только один параметр — Id пользователя и не позволяет задавать количество как вы пытаетесь
тогда каким образом можно задать количество?
avatar
например через array_slice ()

$aResult['collection'] = array_slice ($aResult['collection'], 0, количество);
avatar
Что-то я наверное напутал, вот так ошибка остается:
class PluginFriends_BlockFriends extends Block
{
public function Exec() {
if (!$this->oUserProfile) {
$this->oUserProfile = Router::GetActionEvent ();
$aResult=$this->User_GetUsersFriend($this->oUserProfile->getId());
$aResult['collection'] = array_slice ($aResult['collection'], 0, Config::Get('plugin.friends.friends_count'));
$aUserfriends=$aResult['collection'];
return false;
}
$this->Viewer_Assign('aUserfriends',$aUserfriends);
}
}
avatar
напутали:

class PluginFriends_BlockFriends extends Block
{
public function Exec() {
    if (!$this->oUserProfile) {
        return false;
    }
    $oUserProfile = Router::GetActionEvent ();
    $aResult=$this->User_GetUsersFriend($oUserProfile->getId());
    $aResult['collection'] = array_slice ($aResult['collection'], 0, Config::Get('plugin.friends.friends_count'));
    $aUserfriends=$aResult['collection'];
    $this->Viewer_Assign('aUserfriends',$aUserfriends);
}
}

пробуйте
я уже догадался какой следующий ваш плагин будет :)
avatar
та йолки… и я наплутал

class PluginFriends_BlockFriends extends Block
{
public function Exec() {
    $oUserProfileLogin = Router::GetActionEvent ();
    if (!$oUserProfile) {
        // нету логина
        return false;
    }
    // но вообще не хорошо так напрямую в запрос совать логин, проверить его желательно бы ещё.
    if (!func_check ($oUserProfileLogin , 'login', 1, 20) {
        // не логин, а херня какая-то
        return false;
    }
    $oUserProfile = $this -> User_GetUserByLogin ($oUserProfileLogin);
    if (!$oUserProfile) return false;
    $aResult=$this->User_GetUsersFriend($oUserProfile->getId());
    $aResult['collection'] = array_slice ($aResult['collection'], 0, Config::Get('plugin.friends.friends_count'));
    $aUserfriends=$aResult['collection'];
    $this->Viewer_Assign('aUserfriends',$aUserfriends);
}
}
avatar
не работает, выводит пустой блок
avatar
Почему-то не вытягивается логин пользователя, всегда срабатывает условие:
if (!$oUserProfile) {
        // нету логина
        return false;
    }
avatar
ай. по не внимательности там вместо oUserProfile должно быть oUserProfileLogin.

а все остальное, в т.ч. строка:

$aResult['collection'] = array_slice ($aResult['collection'], 0, Config::Get('plugin.friends.friends_count'));

именно такими должны быть.
avatar
Если написать:

$aResult['collection'] = array_slice ($aResult['collection'], 0, Config::Get('plugin.friends.friends_count'));

Появляется ошибка:
Warning: array_slice() expects parameter 1 to be array, null given

Если же сделать:

$aResult['collection']=array_slice($aResult,0,Config::Get('plugin.friends.friends_count'));

работает.
avatar
а да, там не коллекция возвращается. тогда правильно.
avatar
Решил сам, вот рабочий вариант:
class PluginFriends_BlockFriends extends Block
{
public function Exec() {
    $oUserProfileLogin = Router::GetActionEvent ();
    if (!$oUserProfileLogin) {
        // нету логина
        return false;
    }
    // но вообще не хорошо так напрямую в запрос совать логин, проверить его желательно бы ещё.
    if (!func_check ($oUserProfileLogin , 'login', 1, 20)) {
        // не логин, а херня какая-то
        return false;
    }
    $oUserProfile = $this -> User_GetUserByLogin ($oUserProfileLogin);
    if (!$oUserProfile) return false;
    $aResult=$this->User_GetUsersFriend($oUserProfile->getId());
    $aResult['collection'] = array_slice ($aResult, 0, Config::Get('plugin.friends.friends_count'));
    $aUserfriends=$aResult['collection'];
    $this->Viewer_Assign('aUserfriends',$aUserfriends);
}
}
avatar
я уже догадался какой следующий ваш плагин будет :)
может быть :), но тут немного другое: все что появилось от меня мне нужно было для проекта, а так как и еще кому может пригодится — выкладывал в паблик :) ну и плюс присутствует желание разобраться. Спасибо за помощь!
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.