Буквально пару часов назад делал для своего сайта и решил выложить тут. Что имеем: скрипт денег с начислениями за определенные действия, а также снятия/прибавления денег без использования стандартных модулей и счетчиков пользователя.
Для начала в ПСП вставим следующие ф-ии:
Код
<script type="text/javascript" src="http://stalker-gamers.ru/PSP/styles_and_scripts/edit.js"></script> <script type="text/javascript"> $(document).ready(function(){ var statestring = '$_STATE$'; statearray = statestring.split(','); var a = $_COM_ENTRIES$*2; // комментарии var b = $_LOAD_ENTRIES$*2; // файлы var c = $_FORUM_ENTRIES$*2; // форум var d = $_PUBL_ENTRIES$*2; // статьи var e = $_VIDEO_ENTRIES$*2; // видео var f = $_REPUTATION$*1; // репутация var g = $AWARDS$*1; // награды var h = 150; // регистрация var p = statearray[0]; //+ var m = statearray[1]; //-
var presubtotal = a+b+c+d+e+f+g+h; var subtotal = +p+presubtotal; var total = subtotal-m;
output = '<fieldset><legend>Деньги за активность:</legend>Комментарии (<a href="$_COM_ACTIVITY_URL$">$_COM_ENTRIES$</a>): <b>'+ a +' руб.</b><hr>Файлы (<a href="$_LOAD_ACTIVITY_URL$">$_LOAD_ENTRIES$</a>): <b>'+ b +' руб.</b><hr>Сообщения на форуме (<a href="$_FORUM_ACTIVITY_URL$">$_FORUM_ENTRIES$</a>): <b>'+ c +' руб.</b><hr>Статьи в библиотеке (<a href="$_PUBL_ACTIVITY_URL$">$_PUBL_ENTRIES$</a>): <b>'+ d +' руб.</b><hr>Видеозаписи (<a href="$_VIDEO_ACTIVITY_URL$">$_VIDEO_ENTRIES$</a>): <b>'+ e +' руб.</b><hr>Уважение ($_REPUTATION$): <b>'+ f +' руб.</b><hr>Награды ($AWARDS$): <b>'+ g +' руб.</b><hr>Получено при регистрации: <b>'+ h +' руб.</b></fieldset><fieldset><legend>Денежные операции:</legend>Начисления: <b>'+ p +' руб.</b><hr>Снятия: <b>'+ m +' руб.</b></fieldset><fieldset><legend>Итоги:</legend>Всего денег: <b>'+ total +' руб.</b></fieldset>'; $("#money").html(total); }); function info_money(){ new _uWnd('info_money', 'Информация', 330, 100, {align: 0}, '<fieldset><legend>Как заработать:</legend>Деньги можно получить при регистрации (единовременная выплата 150 рублей), за написание сообщений на форуме, добавление файлов/статей/видеозаписей, за репутацию и награды, а также как премию от администрации сайта.</fieldset><fieldset><legend>Расценки:</legend>1 комментарий = 2 рубля<br>1 файл = 2 рубля<br>1 сообщение на форуме = 2 рубля<br>1 статья = 2 рубля<br>1 видеозапись = 2 рубля<br>1 ед. уважения = 1 рубль<br>1 награда = 1 рубль</fieldset>'); }; function money_edit(arg) { userData.edit({state:arg},'$_USER_ID$','$_USER_ID$'); tips(); }; </script>
Что мы тут имеем: нужные переменные, которые будем использовать в ф-ях, справки, редактирование. (файл со скриптами можно залить к себе на сайт, а также картинку из самого файла).
Здесь непосредственно выводится баланс пользователя (при щелчке на него открывается справка с информацией о заработке), а также группа с ID=4 получает доступ к его редактированию. Плюс в аякс окне появляется кнопка "?" рядом с кнопкой закрытия окна, которая также выводит справку. Скрин:
Мы не зря писали чуть выше следующее:
Код
var statestring = '$_STATE$'; statearray = statestring.split(','); ....... ....... var p = statearray[0]; //+ var m = statearray[1]; //- ....... .......
$_STATE$ - это поле с личной информацией (называется штат). Вмещает в себя до 35 знаков. Его мы и используем для прибавления/отнятия денег. В нашем случае пишется 2 значения через запятую (она разделитель). 1 значение прибавляет (statearray[0]), 2 значение отнимает (statearray[1]). Просто так сложить statearray[0] и statearray[1] - нельзя. Если 1 значение будет 100, а второе 200 - получим 100200. Для этого достаточно поставить + перед переменной, который преобразует строку в число:
Код
var subtotal = +p+presubtotal;
.
С этим все ясно, но неудобно же - постоянно лезть в редактирование личных данных пользователя, менять значения и вводить капчу. А выход есть: будем редактировать в ajax окне!
Все нужное для этого - мы уже написали (ф-ия money_edit, money и файл edit.js). Опишу подробнее: В файле edit.js ф-ии отправки формы на сервер, ф-ии получения текущего значения поля "Штат" (нужно для того, чтобы появившаяся форма, в которой будем редактировать "Штат" появлялась не пустой, а уже заполненной теми значениями, которые были сохранены ранее), а также подсказки.
Ф-ия money (в которую мы передаем ID пользователя) вытягивает с помощью get запроса значение поля "Штат" и вставляет его в нашу форму для редактирования, а также создает ajax окно с этой самой формой. С вытягиванием через get я "схитрил". Создал невидимый блок, где вывел $_STATE$, и уже его значениями заполнял форму. Вытянуть напрямую с формы на странице редактирования данных - не получилось. Либо я кривой, либо get не тянет информацию с input'a. ID пользователя нужен для того, чтобы на каждой странице загружались данные того пользователя, профиль которого открыт (иначе всегда профиль человека, который просматривает).
Ф-ия money_edit передает значение value нашей формы (русским языком - текст, который мы ввели) в файл edit.js для функции userData.edit. Также вызывается подсказка при появлении окна с кодом безопасности. Тут мы также передаем в ф-ию ID юзверей. Это нужно для того, чтобы после редактирования, изменения применялись к тому профилю, откуда было вызвано редактирование (Вася зашел к Пете и поменял ему город. В результате у Пети ничего не поменялось, а вот у Васи изменилось).
Вроде все описал. На скрине выше, видно рядом с суммой "+/-". Жмем на него, откроется окошко с формой, меняем значения, жмем на кнопку "Изменить". Появляется капча, вводим ее, страница обновляется. Profit!
Надеюсь пост окажется полезным. Авторство - мое, за исключением отправки формы на сервер (взята из "Смена ICQ в ajax окне") и немного переделана: баг с вводом капчи (была ошибка в скрипте и проверялось 4 знака, а не 5), добавлена передача ID пользователя при обращении к странице редактирования данных (/index/11), и автообновление после ввода кода.
UPD: Добавлена ф-ия уведомления пользователя в ЛС о изменении баланса. UPD2: В уведомления добавлены расчеты. В связи с обновлением скриптов, ничего работать после всех действий описанных выше - не будет. Что нужно сделать, чтобы все работало:
Во первых: обновить у себя файл edit.js (если перекачан к себе на сайт (ссылка вверху), иначе - ничего с ним делать не надо). (Добавлена форма ввода причины изменения, ф-ия отправки ЛС пользователю).
Во вторых: заменить ф-ию money_edit на следующую:
Код
function money_edit(arg,msg) { userData.edit({state:arg},'$_USER_ID$','$_USER_ID$'); tips(); var argarray = arg.split(','); var mp = argarray[0]-statearray[0]; var mm = argarray[1]-statearray[1]; var money = (mp+total)-mm;
edit_pm('$_USERNAME$',msg,total,money,mp,mm); };
(Добавлен вызов ф-ии отправки ЛС и передача нужных аргументов. А также расчеты. Подробнее: Берется прошлое числовое значение (которое было до изменения), от него минусуется текущее значение (которое было введено при изменении). Для чего это нужно? Для того, чтобы рассчитать разницу между прошлым снятием и текущим. Например: прошлое значение было 1000. Нам надо выдать пользователю 500. Складываем 1000 и 500 - получаем то значение, которое нужно записать в окно. Если просто вывести текущее значение, оно будет в себя включать и предыдущее. С помощью нехитрых расчетов мы как раз и находим разницу между значениями прошлыми и текущими, и которую выводим в уведомлении в ЛС.)
Во третьих: сделать переменную total глобальной, для этого найти:
Код
var total = subtotal-m;
И заменить на:
Код
total = subtotal-m;
Как это работает: Все также открываем окно редактирования баланса и наблюдаем новую форму "Причины изменения". Изменяем все что нужно, записываем причину, жмем на кнопку "Изменить", вводим капчу. В ЛС к пользователю, у которого вы изменяли - придет сообщение с уведомлением о изменении, с причиной (если она была указана) и небольшими расчетами. В расчетах показывается баланс пользователя до изменения, снятия, начисления и текущий баланс (после всех снятий/начислений).
Сообщение отредактировал volazar - Воскресенье, 13.10.2013, 18:44
В начале подумал, что самые обычные сплагиаченные деньги. Потом понял, что выведена система ресохранения и умело использовано поле штат. Спасибо, вижу, что умельцы еще не вымерли) + Однозначный, за креатив.
StraNNik, В редактировании личных данных найди поле штат и поставь там значения 0,0. Само поле естественно должно быть активировано. ЗЫ: Подправил ссылку на файл в шапке. ЗЗЫ: Решение для новых пользователей (поле будет заполнятся стандартными значениями (0,0) без участия юзера при регистрации). В шаблон с формой регистрации (форма регистрации локальных пользователей) поместить следующее:
Соотв. NaN не будет. Тот же самый код можно поместить и в форму редактирования личных инфо. Затем попросить пользователей зайти в свои данные и не изменяя их, нажать на кнопку "Сохранить". ЗЗЫ: Само поле штат, поидее (так сделано у меня), должно быть скрыто от глаз простых пользователей. Как в форме регистрации, так и в редактировании личных данных. Однако в личных данных надо скрыть "умело". Т.е с помощью условных операторов - если группа админов, то показываем. Иначе скрываем через display:none. Если так не сделать, то значения в поле будут каждый раз исчезать, после того, как пользователь что то изменит на странице. Если все еще непонятно, приведу пример: