[РЕШЕНО]помогите составить hook_user

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

Аватар пользователя andron81_81 andron81_81 24 января 2013 в 21:40

Друзья , изучаю друпал. книжку заказал , но она пока в пути.
Хочу перевезти свой сайт на 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. Мож где-то ошибся в коде. не пинайте , я по сути спрашиваю .

Комментарии

Аватар пользователя Niklan Niklan 24 января 2013 в 23:49

hook_user нету в Drupal 7.

"andron81_81" wrote:
я по сути спрашиваю .

По сути, сначала заходят на Drupal API и подбирают хук. http://api.drupal.org/api/drupal/modules%21user%21user.api.php/7

Только при регистрации, подойдет hook_user_insert
Если же надо еще и менять телефон при изменении в профилее (если есть необходимость), скорее подойдет hook_user_presave

"andron81_81" wrote:
$result = db_query("insert into aff_user(phone,name) VALUES(".$phone.",".$account. ")" );

Запрос вообще не годится.
Почитайте как делаются запросы тут: http://xandeadx.ru/blog/drupal/88 Особенно обратите внимание на варианты №2. Как правило, используют их.

Аватар пользователя andron81_81 andron81_81 25 января 2013 в 8:18

Niklan wrote:

hook_user нету в Drupal 7.

вот у меня он и не срабатывает. Видимо я скатал старый вариант хука на 6-ку или ещё более поздний.
не думал, что такая серьёзная вещь будет изменяться с новой версией.

Niklan wrote:

Почитайте как делаются запросы тут: http://xandeadx.ru/blog/drupal/88 Особенно обратите внимание на варианты №2. Как правило, используют их.

ого, db_select , innerJoin - друпаловские это чё за вело - недо - SQL - язык drupal ?
и ещё и указано , что этот способ более правильный

Аватар пользователя andron81_81 andron81_81 25 января 2013 в 10:03

ну ладно, съел , смирился.
а разъясните мне ещё по полям аккаунта.

Вот есть зарезервированное поле определяющее имя пользователя - машинное имя "account" и есть поле аккаунта телефон
(машинное имя "profile_phone")

как мне к значениям достучаться в теле моего хука ?
вот так вот верно ли будет ?
global $user;
profile_load_profile($user);

$phone = $user->profile_phone;
$account=$user->account;

Аватар пользователя Niklan Niklan 25 января 2013 в 10:36

"andron81_81" wrote:
ого, db_select , innerJoin - друпаловские это чё за вело - недо - SQL - язык drupal ?

Защита, + различные типы БД. Если ваше решение так и останется личным, то можно и прямые писать, но опять же, по правилам друпала, а не как вы. Т.е. не прямой вставкой переменных в запрос.

"andron81_81" wrote:
вот так вот верно ли будет ?

Если работает, то почему бы и нет? А затем выплните запрос по стандартам и радуйтесь Wink

P.s. если вам действительно не нужен 2 вариант написания SQL запросов, то посмотрите как пишется первый. Хотя разобраться вполне можно.

Аватар пользователя andron81_81 andron81_81 25 января 2013 в 10:46

Niklan wrote:

Защита, + различные типы БД. Если ваше решение так и останется личным, то можно и прямые писать, но опять же, по правилам друпала, а не как вы. Т.е. не прямой вставкой переменных в запрос.

не ну буду делать как правильно - 2-ым способом ,т.е. как советуете. там ничего сложно нет - всё понятно, просто не привычно.

Что касаемо работают ли поля , пока не знаю . триггер то у меня не срабатывал. Перепишу по новой может вопросы возникнут, а может и нет.

Пока спасибо на этом. Wink

Аватар пользователя Niklan Niklan 25 января 2013 в 10:49

"andron81_81" wrote:
триггер то у меня не срабатывал.

Куда вставили хук, в тему или модуль? А также, вы слово хук, надеюсь заменили? Если да, то почему не срабатывает? Или вы спициально его не проверяли еще?

Аватар пользователя andron81_81 andron81_81 25 января 2013 в 10:58

в модуль вставлял называется он "gaa_user_sinhronaze" .

не я имел ввиду что вставлял в hook_user вместо "hook" "gaa_user_sinhronaze" - не срабатывал хук видимо как вы сказали , что нету hook_user в 7-ке. но пока не пробовал с
hook_user_insert, hook_user_presave. позже попробую.

а тему вообще боюсь ковырять если честно и не вижу смысла.

Аватар пользователя andron81_81 andron81_81 25 января 2013 в 21:21

разобрался во всём да не во всём ;)))
не могу понять как определить новый пользователь это или уже зарегистрированный если пользоваться 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?

Аватар пользователя Niklan Niklan 25 января 2013 в 21:23

"andron81_81" wrote:
Но это показалось мне так. а может есть методы более серьёзные ?

Проприньтите
"andron81_81" wrote:
$edit и $account.

при создании и измененнии и сравните.

"andron81_81" wrote:
вот в старой hook_user читал, что была переменная $op , вот почему её убрали в hook_user_presave?

А в 8 друпале еще и $edit убрали, оставив один $account

Аватар пользователя andron81_81 andron81_81 25 января 2013 в 21:30

ну вот пропринтил и увидел.

выходит $account предлагаете пользоваться. ну я ещё там замечал, кстати, свойство $account->is_new

if (isset($account->is_new) && $account->is_new==1) {
// новый пользователь - insert
}
else {
// старый пользователь - update
}

можно таким критерием пользоваться, как считаете ?

Аватар пользователя andron81_81 andron81_81 25 января 2013 в 23:05

и кстати вот она и проблемнмнмнмнма )))))))))

<?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();

}
else {

// старый пользователь - update
}
?>

db_insert щемится то не на affiliate_users данные вставлять , а префикс добавляет судя по всему к названию таблицы : drupaltestaffiliate_users. а мне табличку менять название ну никак нельзя ))))

Аватар пользователя andron81_81 andron81_81 26 января 2013 в 15:00

да все проблемы решил, спасибо. но не пойму как мне составить элементарно запрос такой

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. но она то там есть.

Аватар пользователя andron81_81 andron81_81 26 января 2013 в 20:28

нда, только так вышло :

<?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())
?>