Как заполнить поля Profile2 с помощью uLogin и Rules? [РЕШЕНО]

Главные вкладки

Аватар пользователя Shizuku Shizuku 5 июля 2013 в 17:18

С помощью модуля Profile2 я добавил в учетку пользователя поля Фамилия, Имя, Email и хотел бы их заполнить данными, полученными из соцсетей через модуль uLogin. Пытаюсь состряпать соотвествующее правило в Rules, благо что поля Profile2 с ним дружат - но ничего не выходит...

Что мне сделать, чтобы все получилось?

Комментарии

Аватар пользователя duozersk duozersk 5 июля 2013 в 17:41

Нужно в рулесах по событию создания нового пользователя, добавить кондишен, проверяющий, что пользователь создан через uLogin, потом добавить экшен создания энтити профиля для этого пользователя, и полям этой созданной энтити присвоить значения из токенов uLogin'a...

После того, как всё заработает, нужно написать статью в документацию на drupal.org со ссылкой на скринкаст Wink

Аватар пользователя Shizuku Shizuku 5 июля 2013 в 18:06

"duozersk" wrote:
После того, как всё заработает, нужно написать

Это намек на то, что на самом деле еще ни у кого?..

Аватар пользователя duozersk duozersk 5 июля 2013 в 18:09

Не, это намёк на то, что не первый раз вижу этот вопрос. Ну или хотя бы картинку с настроенным правилом в этот топик киньте.

Аватар пользователя Shizuku Shizuku 5 июля 2013 в 18:46

Для начала я создал только одно поле в Profile2 - field-born. В него пытаюсь впихнуть содержимое с датой рождения из поля uLogin
Пока это выглядит так:

И не работает... После регистрации нового пользователя имеем пустое поле в Main_profile и примерно такую ошибку:

Аватар пользователя Shizuku Shizuku 6 июля 2013 в 12:14

Как я уже писал, после создания нового профиля пользователь видит пару ошибок:

Notice: Undefined property: stdClass::$uid in profile_tokens() (line 1214 of /var/www/vhosts/upkommunalnik.by/httpdocs/sites/all/modules/token/token.tokens.inc).
Notice: Undefined index: profile_born in profile_save_profile() (line 266 of /var/www/vhosts/upkommunalnik.by/httpdocs/modules/profile/profile.module).

На первую из них есть решение, помог патч для Token

Со второй пока не ясно. Поле profile_born - это дополнительное поле, созданное в модуле Profile, еще до установки Profile2. В своих Rules я никак не трогаю старый модуль и что от него хочет uLogin - совершенно не понятно!

Аватар пользователя Shizuku Shizuku 6 июля 2013 в 15:01

Убрал вторую ошибку, напомню это

Notice: Undefined index: profile_born in profile_save_profile() (line 266 of /var/www/vhosts/upkommunalnik.by/httpdocs/modules/profile/profile.module).

Это сообщение появляется только если вот здесь: admin/config/people/profile, есть поля с пометкой "Отображать в форме регистрации пользователя". В моем случае - это поле profile_born. Снимаем флаг, сохраняем, и при регистрации больше никаких предупреждений красных.

Просьба разработчиков Profile и uLogin как-то утрясти эту деталь!

Аватар пользователя Shizuku Shizuku 6 июля 2013 в 15:18

Теперь можно отлаживать работу с полями uLogin.
Тесты показали, что из Rules нет доступа к токенам uLogin!
Они отсутсвуют в списках для выбора данных при настройке действия, и возвращают пустые строки - если указать их напрямую, вот так:
[user:ulogin:network] или так [user:ulogin:bdate]

Возможно я неправильно обращаюсь к этим токенам, или чего-то не хватает, чтобы получить их. Никто не подскажет? Какой-то грустный монолог в этой ветке получается...

Аватар пользователя duozersk duozersk 10 ноября 2015 в 11:49

Ок, для танкистов, которые не способны сами сделать вот это:

"duozersk" wrote:
Нужно в рулесах по событию создания нового пользователя, добавить кондишен, проверяющий, что пользователь создан через uLogin, потом добавить экшен создания энтити профиля для этого пользователя, и полям этой созданной энтити присвоить значения из токенов uLogin'a...

работающий пример:

{ "rules_update_user_info_after_creation_through_ulogin" : {
    "LABEL" : "Update user info after creation through uLogin",
    "PLUGIN" : "reaction rule",
    "REQUIRES" : [ "ulogin", "rules" ],
    "ON" : [ "user_insert" ],
    "IF" : [ { "ulogin_user_created_ulogin" : { "account" : [ "account" ] } } ],
    "DO" : [
      { "entity_create" : {
          "USING" : {
            "type" : "profile2",
            "param_type" : "main",
            "param_user" : [ "account" ]
          },
          "PROVIDE" : { "entity_created" : { "entity_created" : "Created entity" } }
        }
      },
      { "data_set" : {
          "data" : [ "entity-created:field-name" ],
          "value" : "[account:ulogin:first_name] [account:ulogin:last_name]"
        }
      }
    ]
  }
}

Аватар пользователя duozersk duozersk 6 июля 2013 в 23:17

"Shizuku" wrote:
Просьба разработчиков Profile и uLogin как-то утрясти эту деталь!

Модуль Profile мёртв, если хотите - можете сами утрясать эту деталь с разработчиками модуля Profile.

Аватар пользователя Shizuku Shizuku 6 июля 2013 в 23:44

"duozersk" wrote:
Модуль Profile мёртв

И чего злимся? Мертв, так мертв. Сами просили, подробней обо всем писать, чтобы подобных проблем тут не возникало. Я просто ищу помощи в решении рабочих вопросов, и мне очень нелегко даётся интеграция uLogin - сказывается недостаток опыта и знаний. Но я его хочу, и продолжаю разбираться. Это плохо? Думаю, очень неплохо. Скорей бы еще...

Аватар пользователя Shizuku Shizuku 7 июля 2013 в 10:48

"duozersk" wrote:
добавить экшен создания энтити профиля

Я бы еще долго копал. Очень долго. Плохо понимаю суть этих "энтити", надо будет где-то чего-то почитать. Желательно на русском.

Почему мне казалось, что раз профиль уже создан, то вызов экшен на создание еще чего-то там понаделает чего-то не того - дубликат профиля сотворит, или вообще чего неудобоваримое, а тут вот оно как! Видимо это больше виртуальная сущность, надстройка "над", через которую можно провести ниточки к реальным объектам.
А может все проще, и профиль на этом этапе еще не создан... А Rules вклинивается, создает, и данные втыкивает.

Всем утра! Оказывается, сущности - новая фишка Drupal 7, и почитать есть что, и на русском, и даже на Drupal.Org! Smile

После краткого ликбеза в этой области и анализа примера от duozersk вижу, что мое предположение про некую "виртуальную сущность" гораздо ближе к истине, а про "вклинивание" - полный бред. Мы создаём сущность, которая объединяет в себе нужный профиль из Profile2 с полями пользователя, зарегистрированного через uLogin. И получается, что внутри этой сущности можно свободно иметь токены и Profile2 и uLogin. Как-то так... Поправьте, если неправ!

Аватар пользователя Shizuku Shizuku 12 июля 2013 в 10:10

"duozersk" wrote:
Ок, для танкистов, которые не способны...

Для тех из танкистов, которые еще и в каске, советую использовать "Import Rule" для загрузки подобных примеров в свои правила. Это такой пункт меню на странице Rules.

Также нужно переписать для своих полей вот этот участок кода:

{ "data_set" : {
          "data" : [ "entity-created:field-name" ],
          "value" : "[account:ulogin:first_name] [account:ulogin:last_name]"
        }

Но он мне понравился тем, что показывает как объединить в одном поле профиля сразу два токена из uLogin. Очень полезная информация на будущее.

Все переделал, проверил - действительно на 100% рабочий пример. Андрей, спасибо! В первую очередь за модуль, а за помощь - отдельная благодарность! Drupal реально правит вебом, особенно когда умеешь править Drupal... Wink

Уже позже я попал в https://drupal.org/node/1646004. Там аналогичные вопросы, есть и рабочие варианты.

Аватар пользователя Hades Hades 30 января 2014 в 0:37

Ребят. По аналогии с данной темой реализовал правило, при помощи которого происходит автообновление полей Profile после заполнения формы Webform. Webform в свою очередь берёт токенами данные из профиля, если они есть. Получилось цикличное использование данных с перезаписью в профиле (если произошли какие то изменения).
Код правила:

{ "rules_autofill_profile_when_submitted_webform" : {
    "LABEL" : "\u0410\u0432\u0442\u043e\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u0430\u0447\u0438 \u0437\u0430\u044f\u0432\u043a\u0438",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules", "webform_rules" ],
    "ON" : { "webform_rules_submit" : [] },
    "DO" : [
      { "data_set" : { "data" : [ "user:field-nick" ], "value" : "[data:nick-value]" } },
      { "data_set" : { "data" : [ "user:field-name" ], "value" : "[data:name-value]" } },
      { "data_set" : { "data" : [ "user:field-surname" ], "value" : "[data:surname-value]" } },
      { "data_set" : { "data" : [ "user:field-phone" ], "value" : "[data:phone-value]" } },
      { "data_set" : { "data" : [ "user:field-vk" ], "value" : "[data:vk-value]" } },
      { "data_set" : { "data" : [ "user:field-icq" ], "value" : "[data:icq-value]" } },
      { "data_set" : { "data" : [ "user:field-skype" ], "value" : "[data:skype-value]" } }
    ]
  }
}

Всё замечательно работает, но обнаружился серьезный косяк. После отправки формы поле в профиль записывается с пробелом в начале:
" данные_поля"
Чревато это последствиями... после десяти отправленных форм я имею уже десять пробелов перед данными в профиле. Во первых не красиво, во вторых когда длинна поля заканчивается (ограничение в 255 символов) начинают вылетать ошибки, что невозможно записать данные в БД.

До запуска проекта осталось всего ничего. Если кто может помочь - буду благодарен.
Drupal 7.24
Webform 7.x-4.0-beta1
Webform Rules 7.x-1.6
Rules 7.x-2.6

Проблема нашлась. Недодумка в модуле Webform Rules 7.x-1.6. Решилась патчем из поста:
https://drupal.org/comment/8268279#comment-8268279