Вы здесь

Программный вывод пользователей из БД, если использовался HybridAuth при регистрации

0

Итак, без прелюдий.

Есть сайт, который очень долго и давно использовал авторизацию через модуль HybridAuth Social Login. Накопилось пользователей более 600 штук. При этом более-менее активных — около 150 штук. Админам захотелось вернуть обратно на сайт тех 450 пользователей + прокачать интерес активных юзеров новыми фишками, добавленными на сайт. Было решено сделать новостную-фитча-рассылку для всех пользователей, кто авторизовался через соц. сети.

Если короче, то выбираем из БД всех пользователей у кого есть e-mail (кто не через Одноклассников авторизировался), формируем таблицу с этими данными на скрытой (от не админских глаз) странице, получаем, копируем и вставляем в почтовый сервис.

Таблица должна была иметь вид:

UID | DISPLAY_NAME | E-MAIL
...
234 | Платон Фёдорович | platonfedr@gmail.com
...

При этом очень важно было получить именно фамилию и имя юзера (а не бездушный логин), чтобы сформировать адресованный посыл в рассылке аля «...дорогой ты наш, Платон Фёдорович, что же ты нас покинул?! Возвращайся, мы завезли новые печенки...».

Логично, пошли через Views, но там не получилось вывести поле displayName из HybridAuth (просто нет такой связи). Поэтому, написали вот такую функцию:

function get_userlist() {

    $rows = array();

    // Задаём заголовок таблицы                 
    $header = array(
        array(
            'data' => 'UID', // ID пользователя
            'field' => 'uid'
        ),
        array(
            // Поле data из таблицы users, 
            // где лежит информация об авторизации через HybridAuth,
            // в том числе и displayName
            'data' => 'Data',
            'field' => 'data'
        ),
        array(
            'data' => 'E-mail', // Почта пользователя
            'field' => 'mail'
        )
    );

    // Берём инфу из БД
    $users = db_select('users', 'u')
        ->fields('u', array('uid', 'data', 'mail'))
        ->extend('PagerDefault')
        ->limit(100) // Выставляем лимит в 100 юзеров на страницу
        ->extend('TableSort')
        ->orderByHeader($header)
        ->execute();

    // Собираем данные
    foreach ($users as $user) {
        if ($user->mail) {
            $rows[] = array(
                check_plain($user->uid),
                check_plain($user->data),
                check_plain($user->mail)
            );
        }
    }

    // Формируем таблицу и пагинатор
    $output = theme('table', array('header' => $header, 'rows' => $rows));
    $output .= theme('pager');

    // Выводим таблицу
    return $output;

}

Делаем вывод через if ($is_admin) print get_userlist(); и получаем таблицу. Вопрос в том, как получить displayName из поля data (таблица users), когда там вот такая штука вылезает (для каждого пользователя — своя):

a:1:{s:10:"hybridauth";a:23:{s:10:"identifier";s:9:"61722XXXX";s:10:"webSiteURL";s:0:"";s:10:"profileURL";s:40:"https://www.facebook.com/XXXX";s:8:"photoURL";s:65:"https://graph.facebook.com/61722XXXX/picture?width=150&height=150";s:11:"displayName";s:15:"USER DISPLAY_NAME";s:11:"description";s:16:"Hello everybody!";s:9:"firstName";s:7:"USER FIRST_NAME";s:8:"lastName";s:7:"USER LAST_NAME";s:6:"gender";s:4:"male";s:8:"language";N;s:3:"age";N;s:8:"birthDay";N;s:10:"birthMonth";N;s:9:"birthYear";N;s:5:"email";s:23:"USER E_MAIL";s:13:"emailVerified";s:23:"USER E_MAIL";s:5:"phone";N;s:7:"address";N;s:7:"country";N;s:6:"region";s:0:"";s:4:"city";N;s:3:"zip";N;s:8:"provider";s:8:"Facebook";}}

Да, модуль HybridAuth это всё распарсивает и приводит к нормальному виду. У нас же, скорее всего получение displayName будет через регулярки и это будет такой хардкод, что даже страшно подумать.. плюс для каждого юзера (соц. сети) нужно будет писать свою.

Подскажите, пожалуйста, может есть способ проще?!

Версия Drupal: 
7.x
Категория: 
Database API
Связанные проекты: 
HybridAuth Social Login
Вопрос задан 18.10.2015 - 12:31

Ответы

1
Ответ дан 18.10.2015 - 12:48

В теории — ясно, на практике — «что делать-то с этим?».. Не могли бы вы показать на примере моего кода, а то там в мануале такие примеры, что жесть.

Комментарий оставлен 18.10.2015 - 12:57

А, всё уже не надо, разобрался :) Спасибо.

..
foreach ($users as $user) {                     
    if ($user->mail) {
        $data = unserialize($user->data);
        $rows[] = array(
            check_plain($user->uid),
            check_plain($data['hybridauth']['displayName']),
            check_plain($user->mail)
        );
    }
}
..
Комментарий оставлен 18.10.2015 - 13:15

Вижу нестандартный пример.
Выдает ошибку разбора. Тут у вас несколько значений, как матрешки одна в одной.
Тут нужно знать алгоритм, как его запихали в базу. Или анализировать всю строку

Комментарий оставлен 18.10.2015 - 13:37