Друзья , изучаю друпал. книжку заказал , но она пока в пути.
Хочу перевезти свой сайт на cms drupal.
Задача такая: есть справочник "aff_user" пользователей старого сайта (фактически табличка aff_user).
И его (справочник) нужно синхронизировать в период регистрации нового пользователя и в период обновления данных пользователя со справочником пользователей drupal.
Верно ли я понимаю, что нужно использовать hook_user?
пусть пока надо завести строчку (пользователя , телефон) в моём справочнике.
Итак есть поле аккаунта с машинным именем profile_phone ну и само имя пользователя account.
А вот сам хук (модуль называется gaa_user_sinhronaze):
<?php
function gaa_user_sinhronaze_user($op, &$edit, &$account, $category = NULL){
global $user;
profile_load_profile($user);
if (
$op == 'insert')
{
$phone = $user->profile_phone;
$account=$user->account;
$result = db_query("insert into aff_user(phone,name) VALUES(".$phone.",".$account. ")" );
}
}
?>
p.s. Мож где-то ошибся в коде. не пинайте , я по сути спрашиваю .
Комментарии
hook_user нету в Drupal 7.
По сути, сначала заходят на Drupal API и подбирают хук. http://api.drupal.org/api/drupal/modules%21user%21user.api.php/7
Только при регистрации, подойдет hook_user_insert
Если же надо еще и менять телефон при изменении в профилее (если есть необходимость), скорее подойдет hook_user_presave
Запрос вообще не годится.
Почитайте как делаются запросы тут: http://xandeadx.ru/blog/drupal/88 Особенно обратите внимание на варианты №2. Как правило, используют их.
вот у меня он и не срабатывает. Видимо я скатал старый вариант хука на 6-ку или ещё более поздний.
не думал, что такая серьёзная вещь будет изменяться с новой версией.
ого, db_select , innerJoin - друпаловские это чё за вело - недо - SQL - язык drupal ?
и ещё и указано , что этот способ более правильный
ну ладно, съел , смирился.
а разъясните мне ещё по полям аккаунта.
Вот есть зарезервированное поле определяющее имя пользователя - машинное имя "account" и есть поле аккаунта телефон
(машинное имя "profile_phone")
как мне к значениям достучаться в теле моего хука ?
вот так вот верно ли будет ?
global $user;
profile_load_profile($user);
$phone = $user->profile_phone;
$account=$user->account;
Защита, + различные типы БД. Если ваше решение так и останется личным, то можно и прямые писать, но опять же, по правилам друпала, а не как вы. Т.е. не прямой вставкой переменных в запрос.
Если работает, то почему бы и нет? А затем выплните запрос по стандартам и радуйтесь
P.s. если вам действительно не нужен 2 вариант написания SQL запросов, то посмотрите как пишется первый. Хотя разобраться вполне можно.
не ну буду делать как правильно - 2-ым способом ,т.е. как советуете. там ничего сложно нет - всё понятно, просто не привычно.
Что касаемо работают ли поля , пока не знаю . триггер то у меня не срабатывал. Перепишу по новой может вопросы возникнут, а может и нет.
Пока спасибо на этом.
Куда вставили хук, в тему или модуль? А также, вы слово хук, надеюсь заменили? Если да, то почему не срабатывает? Или вы спициально его не проверяли еще?
в модуль вставлял называется он "gaa_user_sinhronaze" .
не я имел ввиду что вставлял в hook_user вместо "hook" "gaa_user_sinhronaze" - не срабатывал хук видимо как вы сказали , что нету hook_user в 7-ке. но пока не пробовал с
hook_user_insert, hook_user_presave. позже попробую.
а тему вообще боюсь ковырять если честно и не вижу смысла.
В темах есть файл template.php
Там это будет выполняться также как и из модуля. Тут уж что душе угодно.
разобрался во всём да не во всём ;)))
не могу понять как определить новый пользователь это или уже зарегистрированный если пользоваться hook_user_presave,
то есть что произошло insert или update с учёткой.
все данные о новоиспечённом/редактируемом пользователе содержится в параметрах хука hook_user_presave: $edit и $account.
конечно, есть account->uid
если account->uid == 0 ,то это новый пользователь
если account->uid != 0 , то это соотвественно существующий и с ним "как бы" происходит update.
Но это показалось мне так. а может есть методы более серьёзные ?
вот в старой hook_user читал, что была переменная $op , вот почему её убрали в hook_user_presave?
Проприньтите
при создании и измененнии и сравните.
А в 8 друпале еще и $edit убрали, оставив один $account
ну вот пропринтил и увидел.
выходит $account предлагаете пользоваться. ну я ещё там замечал, кстати, свойство $account->is_new
if (isset($account->is_new) && $account->is_new==1) {
// новый пользователь - insert
}
else {
// старый пользователь - update
}
можно таким критерием пользоваться, как считаете ?
и кстати вот она и проблемнмнмнмнма )))))))))
<?php
if (isset($account->is_new) && $account->is_new==1) {
// новый пользователь - insert
$id = db_insert('affiliate_users')
->fields(array('name' => $account->name, 'website_url' =>
$account->field_acc_url_['und'][0]['value']))
->execute();
}
// старый пользователь - updateelse {
}
?>
db_insert щемится то не на affiliate_users данные вставлять , а префикс добавляет судя по всему к названию таблицы : drupaltestaffiliate_users. а мне табличку менять название ну никак нельзя ))))
хотя проблема решаема
settings.php поквырять prefix
просто юзайте запросы как обычно
да все проблемы решил, спасибо. но не пойму как мне составить элементарно запрос такой
SELECT count(*) FROM affiliate_users_ids WHERE UCASE(text_id)=UCASE($Var)
вместо $Var надо подставить выражение: $textid_primay_part . $textid_cnt . $textid_secondary_part
.вот пытаюсь вот так :
<?php
db_select('affiliate_users_ids')
->countQuery()
->where('UCASE(text_id)=UCASE(:txt)', array(':txt' => $textid_primay_part . $textid_cnt . $textid_secondary_part))
->execute()
->fetchField()
?>
во что пишет :
PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'text_id' in 'where clause': SELECT COUNT(*) AS expression FROM (SELECT 1 AS expression FROM {affiliate_users_ids} affiliate_users_ids) subquery WHERE (UCASE(text_id)=UCASE(:txt)) ; Array ( [:txt] => OL1012613 ) в функции gaa_createUserTextID() (строка 14 в файле /usr/www/users/webmisq/drupal/sites/all/modules/gaa_user_sinhronaze/gaa_user_sinhronaze.module).
то бишь не находит text_id в табличке affiliate_users_ids. но она то там есть.
нда, только так вышло :
<?php
$count=(db_select('affiliate_users_ids','a')
->fields('a', array('text_id'))
->where('UCASE(a.text_id)=UCASE(:txt)', array(':txt' => $textid_primay_part . $textid_cnt . $textid_secondary_part))
->execute()->rowCount())
?>