Инструкция позволяет создавать на сайте и активировать игровые ваучеры, так же как и ваучеры с реальными деньгами.
Игровые ваучеры записываются в столбец `game_money` таблицы `users`. Данный столбец уже присутствует у пользователей плагина GameCMS_API.
Для удобства редактирования все функции размещены в разных блоках.
Итак...
1. Открывает базу данных вашего сайта и выполняем запрос:
2. Редактируем шаблоны. Предоставляют только измененные блоки кода, т.к. ваши шаблоны могут отличаться.
3. Редактируем обработчики. Предоставляют только измененные блоки кода, т.к. ваши могут отличаться.
Немного скринов



Игровые ваучеры записываются в столбец `game_money` таблицы `users`. Данный столбец уже присутствует у пользователей плагина GameCMS_API.
Для удобства редактирования все функции размещены в разных блоках.
Итак...
1. Открывает базу данных вашего сайта и выполняем запрос:
SQL:
ALTER TABLE `vouchers`
ADD COLUMN `type` INT(5) NOT NULL DEFAULT '1' AFTER `status`;
INSERT INTO `money__actions_types` (`id`, `name`, `class`) VALUES ('22', 'Активация игрового ваучера', 'success');
2. Редактируем шаблоны. Предоставляют только измененные блоки кода, т.к. ваши шаблоны могут отличаться.
HTML:
<div id="vouchers" class="modal fade">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title">Ваучеры</h4>
</div>
<div class="modal-body">
<div class="input-group">
<span class="input-group-btn">
<button class="btn btn-default pd-23-12" type="button" onclick="add_vouchers();">Добавить</button>
</span>
<input type="number" class="form-control" id="voucher_val" maxlength="5" autocomplete="off" placeholder="Сумма, которая будет выдана при активации ваучера">
<input type="number" class="form-control" id="voucher_col" maxlength="2" autocomplete="off" placeholder="Количество ваучеров">
<select id="voucher_type" class="form-control">
<option value="1">Реальные деньги</option>
<option value="2">Игровые деньги</option>
</select>
</div>
<div id="add_vouchers_result"></div>
<hr>
<div class="panel-group" role="tablist" aria-multiselectable="true">
<table class="table table-bordered">
<thead>
<tr>
<td>#</td>
<td>Сумма</td>
<td>Ключ</td>
<td>Статус</td>
<td>Тип</td>
<td>Удалить</td>
</tr>
</thead>
<tbody id="vouchers_body">
<tr><td colspan="4"><center><img src="{site_host}templates/admin/img/loader.gif"></center></td></tr>
</tbody>
</table>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Закрыть</button>
</div>
</div>
</div>
</div>
HTML:
<tr>
<td>
{if('{shilings}' > '0')}
<span class="label label-primary">{shilings}{if('{type2}' == '8')} рублей {else}${/if}</span>
{else}
<span class="label label-danger">{shilings} {if('{type2}' == '8')} рублей {else}${/if}</span>
{/if}
</td>
<td>{type}</td>
<td>{date}</td>
</tr>
PHP:
if(isset($_POST['load_vouchers'])) {
$load_val = checkJs($_POST['load_val'], "int");
if(empty($load_val)) {
$load_val = 1;
}
$start = ($load_val - 1) * 20;
$end = 20;
$i = $start;
$i2 = 0;
$STH = $pdo->query("SELECT * FROM `vouchers` ORDER BY id ASC LIMIT ".$start.", ".$end);
$STH->execute();
$row = $STH->fetchAll();
$count = count($row);
for($l = 0; $l < $count; $l++) {
$i++;
$i2++;
if($row[$l]['status'] == 0) {
$status = 'Не активирован';
} else {
$STH = $pdo->prepare("SELECT `id`, `login`, `avatar` FROM `users` WHERE `id`=:val LIMIT 1");
$STH->setFetchMode(PDO::FETCH_OBJ);
$STH->execute(array(':val' => $row[$l]['status']));
$user = $STH->fetch();
$status = 'Активирован: <a target="_blank" href="../admin/edit_user?id='.$user->id.'"><img src="../'.$user->avatar.'" alt="'.$user->login.'"> '.$user->login.'</a>';
}
?>
<tr id="voucher_<?php echo $row[$l]['id']; ?>">
<td><?php echo $i; ?></td>
<?php if($row[$l]['type'] == 1)
echo ('<td>'.$row[$l]['val']. $messages['RUB'].'.</td>');
else
echo ('<td>'.$row[$l]['val']. ' $.</td>'); ?>
<td><?php echo $row[$l]['key']; ?></td>
<td><?php echo $status; ?></td>
<td><?php echo $row[$l]['type'] == 1 ? 'Реальные' : 'Игровые'; ?></td>
<td><a class="c-p" title="Удалить ваучер" onclick="delete_voucher(<?php echo $row[$l]['id']; ?>);">Удалить</a></td>
</tr>
<?php
}
if($i == 0) {
exit('<tr><td colspan="10">Ваучеров нет</td></tr>');
}
if(($load_val > 0) and ($i2 > 19)) {
$load_val++;
exit ('<tr id="loader_'.$load_val.'" onclick="load_vouchers(\''.$load_val.'\');" class="c-p"><td colspan="10">Подгрузить ваучеры</td></tr>');
}
if(($load_val > 0) and ($i2 < 20)) {
exit ();
}
}
PHP:
if(isset($_POST['add_vouchers'])) {
$voucher_val = check($_POST['voucher_val'], "int");
$voucher_col = check($_POST['voucher_col'], "int");
$voucher_type = check($_POST['voucher_type'], "int");
if(empty($voucher_val) or empty($voucher_col)) {
exit(json_encode(array('status' => '2', 'data' => '<p class="text-danger">Укажите всю информацию</p>'.$voucher_type)));
}
if($voucher_val == 0 or $voucher_val > 99999) {
exit(json_encode(array('status' => '2', 'data' => '<p class="text-danger">Сумма должна быть не менее 1 и не более 99999</p>')));
}
if($voucher_col == 0 or $voucher_col > 10) {
exit(json_encode(array('status' => '2', 'data' => '<p class="text-danger">Количество должно быть не менее 1 и не более 10</p>')));
}
$j = 0;
for($i = 0; $i < $voucher_col; $i++) {
$key = crate_pass(10, 2);
$STH = $pdo->prepare("SELECT `id` FROM `vouchers` WHERE `key`=:key LIMIT 1");
$STH->setFetchMode(PDO::FETCH_OBJ);
$STH->execute(array(':key' => $key));
$row = $STH->fetch();
if(empty($row->id)) {
$STH = $pdo->prepare("INSERT INTO `vouchers` (`val`, `key`, `type`) values (:val, :key, :type)");
if($STH->execute(array(':val' => $voucher_val, ':key' => $key, ':type' => $voucher_type)) == '1') {
$j++;
}
}
}
exit(json_encode(array('status' => '1', 'data' => '<p class="text-success">Создано '.$j.' ваучеров</p>')));
}
PHP:
if(isset($_POST['activate_voucher'])) {
$voucher_key = checkJs($_POST['voucher_key'], null);
if(empty($voucher_key)) {
exit('<p class="text-danger">Вы не ввели ваучер</p>');
}
$STH = $pdo->prepare("SELECT * FROM vouchers WHERE `key`=:key LIMIT 1");
$STH->setFetchMode(PDO::FETCH_OBJ);
$STH->execute(array(':key' => $voucher_key));
$row = $STH->fetch();
if(empty($row->id)) {
exit('<p class="text-danger">Ваучера не существует</p>');
} else {
if($row->status != 0) {
exit('<p class="text-danger">Ваучер уже активирован</p>');
}
}
$sum = $row->val;
$voucher_id = $row->id;
$user_id = $_SESSION['id'];
$voucher_type = $row->type;
$STH = $pdo->query("SELECT id,shilings FROM users WHERE id='$user_id' LIMIT 1");
$STH->setFetchMode(PDO::FETCH_OBJ);
$row = $STH->fetch();
if(empty($row->id)) {
exit('<p class="text-danger">Неверный ID пользователя</p>');
}
if($voucher_type == 1)
{
$shilings = round_shilings($row->shilings + $sum);
$STH = $pdo->prepare("UPDATE users SET shilings=:shilings WHERE id='$user_id' LIMIT 1");
$STH->execute(array('shilings' => $shilings));
$msg = $sum.$messages['RUB'];
$msg_type = '8';
}
else
{
$STH = $pdo->prepare("UPDATE users SET game_money=game_money+:money WHERE id='$user_id' LIMIT 1");
$STH->execute(array('money' => $sum));
$msg = $sum.' $';
$msg_type = '22';
}
$STH = $pdo->prepare("UPDATE vouchers SET status=:status WHERE id='$voucher_id' LIMIT 1");
$STH->execute(array('status' => $user_id));
$STH = $pdo->prepare("INSERT INTO money__actions (date,shilings,author,type) VALUES (:date, :shilings, :author, :type)");
$STH->execute(array('date' => date("Y-m-d H:i:s"), 'shilings' => $sum, 'author' => $user_id, 'type' => $msg_type));
include_once "../inc/notifications.php";
$noty = success_activete_voucher_for_admin($user_id, $_SESSION['login'], $msg, $voucher_key);
send_noty($pdo, $noty, 0, 2);
$noty = success_activete_voucher($msg);
send_noty($pdo, $noty, $_SESSION['id'], 2);
write_log("Активирован ваучер на сумму ".$msg);
exit ('<div class="bs-callout bs-callout-success mt-10"><h4>Ваучер успешно активирован</h4>'.$noty.'</div><script>$("#balance").empty();$("#balance").append("'.$shilings.'");$("#my_balance").empty();$("#my_balance").append("'.$shilings.'");$("#voucher_key").val("");</script>');
}
PHP:
if(isset($_POST['get_operations'])) {
if(array_key_exists('page', $_POST)) {
$page = checkJs($_POST['page'], "int");
}
if(empty($page)) {
$page = 1;
}
$limit = 10;
$start = ($page - 1) * $limit;
$globalRowNum = $start;
$localRowNum = 0;
$tpl = new Template;
$tpl->dir = '../templates/'.$conf->template.'/tpl/';
$STH = $pdo->prepare("SELECT
`money__actions`.*,
`money__actions_types`.`name`,
`money__actions_types`.`class`
FROM
`money__actions`
INNER JOIN
`money__actions_types`
ON
`money__actions_types`.`id` = `money__actions`.`type`
WHERE
`money__actions`.`author`=:author
ORDER BY `money__actions`.`date` DESC LIMIT " . $start . ", " . $limit
);
$STH->setFetchMode(PDO::FETCH_OBJ);
$STH->execute(array( ':author' => $_SESSION['id'] ));
while($row = $STH->fetch()) {
$globalRowNum++;
$localRowNum++;
$tpl->load_template('elements/money_action.tpl');
$tpl->set("{shilings}", $row->shilings);
$tpl->set("{type2}", $row->type);
$tpl->set("{type}", collect_consumption_str(1, $row->type, $row->class, $row->name, $pdo, $row->gave_out));
$tpl->set("{date}", expand_date($row->date, 7));
$tpl->compile('content');
$tpl->clear();
}
if($globalRowNum == 0) {
$tpl->result['content'] = '<tr><td colspan="10"><span class="empty-element">Пусто</span></td></tr>';
} elseif(($localRowNum > $limit - 1)) {
$page++;
$tpl->result['content'] .= '<tr id="loader'.$page.'" class="c-p" onclick="get_operations(\''.$page.'\');"><td colspan="10">Подгрузить записи</td></tr>';
}
$tpl->show($tpl->result['content']);
$tpl->global_clear();
exit();
}
PHP:
/* Успешная активация ваучера
=========================================*/
function success_activete_voucher($sum) {
$noty = "Поздравляем Вас с успешной активацией ваучера на сумму <b>".$sum."</b>";
return $noty;
}
/* Успешная активация ваучера (уведомление админу)
=========================================*/
function success_activete_voucher_for_admin($id, $login, $sum, $key) {
$noty = "Активирован ваучер на сумму <b>".$sum."</b> (код: ".$key.") пользователем: <a href='../profile?id=".$id."'>".$login."</a>";
return $noty;
}
JavaScript:
function load_vouchers(load_val){
var token=$('#token').val();
$.ajax(
{
type:"POST",
url:"../ajax/actions_panel.php",
data:"phpaction=1&load_vouchers=1&token="+token+"&load_val="+load_val,
success:function(html){
if(load_val=='first'){
$("#vouchers_body").html(html);
}else{
dell_block("loader_"+load_val);
$("#vouchers_body").append(html);
}
}
});
}
JavaScript:
function add_vouchers(){
NProgress.start();
var token=$('#token').val();
var voucher_val=$('#voucher_val').val();
voucher_val=encodeURIComponent(voucher_val);
var voucher_col=$('#voucher_col').val();
voucher_col=encodeURIComponent(voucher_col);
var voucher_type=$('#voucher_type').val();
voucher_type=encodeURIComponent(voucher_type);
$.ajax(
{
type:"POST",
url:"../ajax/actions_panel.php",
data:"phpaction=1&token="+token+"&add_vouchers=1&voucher_val="+voucher_val+"&voucher_col="+voucher_col+"&voucher_type="+voucher_type,
dataType:"json",
success:function(result){
NProgress.done();
if(result.status==1){
setTimeout(show_ok,500);
$("#add_vouchers_result").html(result.data);
load_vouchers('first');
}else{
setTimeout(show_error,500);
$("#add_vouchers_result").html(result.data);
}
}
});
}
JavaScript:
function activate_voucher(){
var token=$('#token').val();
var voucher_key=$('#voucher_key').val();
voucher_key=encodeURIComponent(voucher_key);
var voucher_type=$('#voucher_type').val();
voucher_type=encodeURIComponent(voucher_type);
$.ajax({
type:"POST",
url:"../ajax/actions_m.php",
data:"phpaction=1&token="+token+"&activate_voucher=1&voucher_key="+voucher_key+"&voucher_type="+voucher_type,
success:function(html){
$("#activate_result").html(html);
}
});
}
Немного скринов


