| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
sly 20.09.2003 18:48 / 20.09.2003 18:50
Вот класс. Когда гость, показывает "]" - непонятно откуда вылазит. Хочется понять, ОТКУДА. Вызывается метод ^user:check[]в корневом auto.p.@CLASS
user
@auto[]
#========================================
^use[${MAIN:dir_mods}user/user.tmpl]
#========================================
$session_start[^dtf:sql[]]
$session_ip[$env:REMOTE_ADDR]
# Самая главная проверка, вызывается в корневом auto.p
#========================================
@check[]
^if(def $cookie:user_nick && def $cookie:session_key){
# Если куки есть, пойдем узнавать про него...
^user_info[]
}{
# ...а если нету...сделаем гостя!
^make_session_guest[]
}
#========================================
@login[]
# Если в куке написано "гость", показываем ему форму для входа
^if($cookie:user_nick ne $alert:guest){
# Если по кукам не гость (т.е. уже зашел), тогда покажем ему на выход
^show_logout_form[]
}{
# В противном случае пригласим зайти
^show_login_form[]
}
# Генерим 20-значный ключ в зависимости от времени входа
#========================================
@make_session_key[]
$long_session_key[^math:crypt[${session_start}^math:random(10000);^$apr1^$]]
$session_key[^long_session_key.right(20)]
# Генерим куки с именем и ключом сессии. Для гостя имя $alert:guest
#========================================
@make_session_cookie[nick;key;expires]
$cookie:user_nick[
$.value[$nick]
$.expires[$expires]
]
$cookie:session_key[
$.value[$key]
$.expires[$expires]
]
# Начинает сессию, записывая ник, ключ и времы старта
#========================================
@write_session[nick;key;ip;start]
^connect[${MAIN:db_connect}]{
# Удалим сессию с ip, ником (и пустым тоже - на всякий случай :о) или истекшим сроком
^void:sql{delete from
${MAIN:db_prefix}_session
where
session_ip='$ip' |
session_nick='' |
session_nick='$nick' |
session_start<='$session_start-$MAIN:site_cookie_expires'
}
# Запишем новую
^void:sql{insert into
${MAIN:db_prefix}_session
(session_nick,
session_key,
session_ip,
session_start)
values
('$nick',
'$key',
'$ip',
'$start')
}
# Если не гость, запишем в user дату последнего входа ($session_start -> $user_last_session)
^void:sql{update
${MAIN:db_prefix}_user
set
user_last_session='$session_start'
where
user_nick='$nick'
}
]
}
# Делаем сессию для гостя (для юзверя это делает скрипт ~login.html)
#========================================
@make_session_guest[]
^make_session_key[]
^write_session[$alert:guest;$session_key;$session_ip;$session_start]
^make_session_cookie[$alert:guest;$session_key;${MAIN:site_cookie_expires}]
# Получение информации о юзере
#========================================
@user_info[]
# Поищем его в табле session:
^connect[${MAIN:db_connect}]{
$user[^table::sql{
select
${MAIN:db_prefix}_user.*
from
${MAIN:db_prefix}_session,
${MAIN:db_prefix}_user
where
user_nick=session_nick &&
session_key='$cookie:session_key'
}
]
}
# Если юзверь есть в обоих таблах, не забанен и ключ в порядке, сделаем ему мешок-хэш и будем дергать в любом месте
# ^user:get[что-нибудь]
#========================================
^if($user){
$status[$user.user_status]
# Статус юзверя: 1-подключен, 0-забанен
^if(^status.int[] == 1){
$info_hash[^user.hash[user_nick]]
}{
^page:refresh[$request.uri;$alert:banned]
}
}{
# Если же куки остались, но инфы о нем в сессиях нет, то сделаем его гостем
^make_session_guest[]
}
# Сама функция доставания из мешка
#========================================
@get[field][field]
^switch[$field]{
^case[id]{$info_hash.[$cookie:user_nick].user_id}
^case[status]{$info_hash.[$cookie:user_nick].user_status}
^case[reg_date]{$info_hash.[$cookie:user_nick].user_reg_date}
^case[last_session]{$info_hash.[$cookie:user_nick].user_last_session}
^case[nick]{$info_hash.[$cookie:user_nick].user_nick}
^case[pass]{$info_hash.[$cookie:user_nick].user_pass}
^case[name]{$info_hash.[$cookie:user_nick].user_name}
^case[level]{$info_hash.[$cookie:user_nick].user_level}
^case[lang]{$info_hash.[$cookie:user_nick].user_lang}
^case[theme]{$info_hash.[$cookie:user_nick].user_theme}
^case[mail]{$info_hash.[$cookie:user_nick].user_mail}
^case[spam_mail]{$info_hash.[$cookie:user_nick].user_spam_mail}
^case[url]{$info_hash.[$cookie:user_nick].user_url}
^case[msn]{$info_hash.[$cookie:user_nick].user_msn}
^case[icq]{$info_hash.[$cookie:user_nick].user_icq}
^case[slogan]{$info_hash.[$cookie:user_nick].user_slogan}
^case[avatar]{$info_hash.[$cookie:user_nick].user_avatar}
^case[DEFAULT]{'$field' - $alert:not_def}
}