Manual Добавление игровых ваучеров на сайте

zhorzh78

Администратор
Сообщения
3,059
Решения
21
Реакции
1,214
Баллы
113
Инструкция позволяет создавать на сайте и активировать игровые ваучеры, так же как и ваучеры с реальными деньгами.
Игровые ваучеры записываются в столбец `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>
3. Редактируем обработчики. Предоставляют только измененные блоки кода, т.к. ваши могут отличаться.

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);
            }
    });
}

Немного скринов

2021-03-09_22-07-56.png

2021-03-09_22-07-39.png

2021-03-09_22-08-10.png
 
а где там выбирать тип: игровые или реальные? у меня нету такого...

Screenshot_2.png
 
Winter, выше приведена пошаговая инструкция инструкция
 
zhorzh78, Это куда игровые будут приходить ? В банк игрока ?
 
Sokol, В API. Оттуда- в банк или куда нужно.
 
через ркон лучше мне кажется осуществить)
 
через ркон лучше мне кажется осуществить)
Флаг в руки. Напишите плагин, который будет отправлять запрос к БД на добавление ваучера через ркон. Никто не запрещает.
 
Флаг в руки. Напишите плагин, который будет отправлять запрос к БД на добавление ваучера через ркон. Никто не запрещает.
та тут не ваучеры скорей, а просто что бы отправлялась сумма при покупке, на баланс сразу же, как со званиями реализовано, это в самом плагине надо делать, и никаких модулей или отдельных плагинов
 
и никаких модулей или отдельных плагинов
Переживаете за нагрузку на сервер из-за дополнительного плагина, у которого будет меньше 10-ти строк?

P.S. Нагрузка будет ровно такая же, как и от реализации как в 'званиях'. То есть, никакая.
 
foxstargod, ваучеры вводятся на сайте на баланс игровых денег, баланс можно загрузить на сервер и там использовать. О каких рконах покупках и суммах вы говорите... Это совсем разные вещи.
 
Назад
Сверху