1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - новый и перспективный форумный движок от бывших создателей vBulletin.

1.4.5 Страница со списком пользователей группы и их дополнительными полями

Тема в разделе "Вопросы и ответы по XenForo Framework", создана пользователем Lord Daedra, 29 мар 2015.

Загрузка
  1. Lord Daedra

    Lord Daedra Местный

    Регистрация:
    17.12.11
    Сообщения:
    6
    Симпатии:
    0
    Версия XF:
    1.4.5
    Добрый день.

    Есть некий игровой форум, при регистрации пользователи заполняют ряд дополнительных полей, а так же после регистрации попадают в разные группы (каждому игровому сообществу - своя группа).

    Хотелось бы сделать страницу "Члены сообщества " со списком активных пользователей (незабаненных), которые бы состояли в одной из групп (т.е. принадлежали бы к одному игровому сообществу). Таких пользователей будет примерно 200 человек.

    Пользователей на этой странице нужно сгруппировать и отсортировать по возрастанию по значению одного из дополнительных полей (поле принимает значения от 1 до 5, назовём его "Ранг в группе"), а внутри подгруппы по убыванию другого поля (назовём его "Сумма очков").

    По каждому пользователю необходимо показывать его аватарку, имя на форуме, возраст и некоторые другие дополнительные поля ("Стаж в игре", "Максимальный уровень" и другие..) Желательно, чтобы при клике на имя пользователя или аватарку открывалось бы всплывающее окно с данными пользователя (как это обычно бывает на форуме), но это опциональное требование, можно просто ссылку на профиль пользователя.

    Я примерно представляю, что нужно сделать. Помогите, пожалуйста, сделать соответствующий запрос. Тут, видимо, какой-нибудь JOIN-запрос надо написать, чтобы вытащить всю эту информацию из базы?.. Или есть API?..

    (Добавлю, что некоторые дополнительные поля у некоторых пользователей могут быть не заполнены, пользователи не должны из-за этого пропадать из списка... )

    Подскажите, что почитать (с примерами) или может быть, приведете работающий пример кода...
    --- добавлено : Mar 29, 2015 8:10 AM ---
    Добавлю, что во всех случаях я знаю id и можно вытаскивать именно по id (полей, группы) и так далее, названия выше указал просто для наглядности...
     
    Последнее редактирование модератором: 6 апр 2015
  2. akinak

    akinak Местный

    Регистрация:
    12.02.13
    Сообщения:
    259
    Симпатии:
    241
    Версия XF:
    1.1.3
    Смотрите метод public function getUsers(array $conditions, array $fetchOptions = array())
    в классе XenForo_Model_User
    $fetchOptions['customFields']если будет ключ, то юзеры будут извлечены вместе с доп. полями. Там должен быть массив с перечислением полей, которые надо извлечь.

    А вот с сортировкой хуже.
    Нужно будет расширить метод prepareUserOrderOptions и в нем уже как-то явно захардкодить сортировку по конкретному доп. полю, зная его id. Плохо то, что его не удобно совсем наследовать. Получится что-то вроде

    PHP:
        public function prepareUserOrderOptions(array &$fetchOptions$defaultOrderSql '')
        {
            
    $choices = array(
                
    'username' => 'user.username',
                
    'register_date' => 'user.register_date',
                
    'message_count' => 'user.message_count',
                
    'trophy_points' => 'user.trophy_points',
                
    'like_count' => 'user.like_count',
                
    'last_activity' => 'user.last_activity',
    //добавление
    $customFieldId1 => user_field_value_$customFieldId1 //тут надо явно указать ай-ди поля вместо переменной
    $customFieldId2 => user_field_value_$customFieldId2 //тут надо явно указать ай-ди поля вместо переменной
            
    );
            return 
    $this->getOrderByClause($choices$fetchOptions$defaultOrderSql);
        }
    После такой правки модели можно будет в контролере получить юзеров стандартной конструкцией типа:
    PHP:
            $users $userModel->getUsers($criteria, array(
                
    'join' => XenForo_Model_User::FETCH_USER_FULL,
                
    'perPage' => $usersPerPage,
                
    'page' => $page,
    'order' => array($customFieldId1'ASC'),
    'customFields' => array($customFieldId1$customFieldId2)
            ));
     
    Lord Daedra нравится это.

Поделиться этой страницей