Система тикетов на PHP

Форум для тех кто начинает осваивать язык php.
Max19991
Сообщения: 2
Зарегистрирован: Пн дек 15, 2014 8:05 pm

Система тикетов на PHP

Сообщение Max19991 » Пн дек 15, 2014 10:03 pm

Здравствуйте. И сразу к делу с php никак не лажу, поэтому обращаюсь к знающим людям. Ребятушки, помогите мне пожалуйста, написать скрипт технической поддержки пользователей.
Нужно, чтобы при отправке сообщения запись записывалась в бд, а далее выводилось на страницу вывода сообщений пользователя.

Страница c подробным описанием:

Код: Выделить всё

<article class="content page_catalog">
        <h1>Система технической поддержки</h1>

    <h4>#1: Test</h4>

    <table class="catalog new">
        <tr>
            <th style="width:150px;">Информация</th>
            <th>Вопрос</th>
        </tr>
        <tr>
            <td style="vertical-align:top;">
                Статус: <small>Открыт</small><br />
                Ответов: <small>0</small><br />
            </td>
            <td style="text-align:left;vertical-align:top;">Test</td>
        </tr>
    </table>

<br />



<br />

<form method="post" action="">
<input value="" />    <table class="catalog new">
        <tr>
            <th>Ответить</th>
        </tr>
        <tr>
            <td style="text-align:left;vertical-align:top;"><textarea style="border: 2px solid #1abc9c; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 5px; width: 945px; max-width: 942px; height: 170px; line-height: 16px; color: rgb(102, 102, 102); margin: 0px; background: rgb(255, 255, 255);margin-bottom: 10px;margin-top: 10px;" name="message" placeholder="Содержимое ответа" required=""></textarea></td>
        </tr>
        <tr>
            <td><input type="submit" value="Ответить" style="background:#2ecc71;color:#fff;border:0;border-radius:3px;text-transform:uppercase;font-size:14px;font-weight:bold;padding:5px 15px;"></td>
        </tr>
    </table>
</form>

<br />

<form method="post" action="">
<input value="" />    
    <table class="catalog new">
        <tr>
            <th>Закрыть вопрос</th>
        </tr>
        <tr>
            <td><input type="submit" name="close" value="Закрыть" style="background:#2ecc71;color:#fff;border:0;border-radius:3px;text-transform:uppercase;font-size:14px;font-weight:bold;padding:5px 15px;"></td>
        </tr>
    </table>
</form>


</article>
Страница вывода сообщений пользователя:

Код: Выделить всё

<article class="content page_catalog">
        <h1>Система технической поддержки</h1>
<p><a href="/tickets/add/">Задать новый вопрос</a></p>
    <h4>Активные вопросы</h4>
    <table class="catalog new">
        <tr>
            <th>№</th>
            <th>Тема</th>
            <th>Сообщений</th>
        </tr>
        <tr>
            <td colspan="4">Активных вопросов нет</td>
        </tr>
        </table>
</article>
Форма отправки сообщения:

Код: Выделить всё

<article class="content page_catalog">
    <h4>Добавить новый вопрос</h4>

<form method="post" action="">
<input value="" />    
    <table class="catalog new">
        <tr>
            <td><input style="width:935px;" type="text" name="title" required="" placeholder="Тема вопроса"></td>
        </tr>
        <tr>
            <td style="text-align:left;vertical-align:top;"><textarea style="border: 2px solid #1abc9c; border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; padding: 5px; width: 945px; max-width: 942px; height: 170px; line-height: 16px; color: rgb(102, 102, 102); margin: 0px; background: rgb(255, 255, 255);margin-bottom: 10px;margin-top: 10px;" name="message" placeholder="Содержимое вопроса" required=""></textarea></td>
        </tr>
        <tr>
            <td><input type="submit" value="Добавить новый вопрос" style="background:#2ecc71;color:#fff;border:0;border-radius:3px;text-transform:uppercase;font-size:14px;font-weight:bold;padding:5px 15px;"></td>
        </tr>
    </table>
</form>

</article> 
Ребят, прошу вас) помогите чем сможете, буду премного благодарен.

Реклама
Аватара пользователя
Местный бот
Сообщения: 148
Зарегистрирован: Сб ноя 29, 2014 3:53 pm

Re: Система тикетов на PHP

Сообщение Местный бот » Вт дек 16, 2014 8:10 am

На что это похоже? Может быть на форум? Где люди создают темы с вопросам, а им отвечают.
Писать может кто угодно или только зарегистрированные?

Max19991
Сообщения: 2
Зарегистрирован: Пн дек 15, 2014 8:05 pm

Re: Система тикетов на PHP

Сообщение Max19991 » Вт дек 16, 2014 11:05 am

Что-то более на форум, но нет. У меня на сайте есть регистрация и у каждого пользователя после авторизации должна быть своя страница с вопросами, не одна общая страница где будут выводиться все вопросы, а только личные вопросы пользователя.

Вот для примера, я не знаю, может это поможет чем-то реализовать такое:

Конфиг настроек профиля

Код: Выделить всё

<?php
if (!defined("CHECK")) die( header('Location: /404/') );
$this->title = 'Настройки профиля';


if (empty($_SESSION['auth'])):
    header('Location: /auth/');
    exit;
endif;

$err[0] = '';

$tk = new token();

$check_values = new filter();
$pw = new password();

$get_user = $db->row("SELECT * FROM user WHERE id = ?", array($_SESSION['auth']['id']));

// Выборка списка авторизаций
$get_auth = $db->rows("SELECT * FROM logs_auth WHERE id_user = ? ORDER BY id DESC LIMIT 50", array("replace" => array($get_user['id'])));
// Выборка списка авторизаций

// Обновление контактных данных
if (
    !empty($_POST['token']) and 
    $tk->check($_POST['token']) and 
    $check_values->check('icq','post','regexp','~^[A-Za-z0-9]{4,20}$~')
    ):

    $db->update("UPDATE user SET contacts = ? WHERE id = ?", array($_POST['icq'], $_SESSION['auth']['id']));
    $err[0] = '<div class="success">Контактные данные успешно изменены</div>';

endif;
// Обновление контактных данных

// Обновление пароля
if (
    !empty($_POST['token']) and 
    $tk->check($_POST['token']) and 
    $check_values->check('password','post','regexp','~^[A-Za-z0-9]{4,20}$~') and 
    $check_values->check('newpassword','post','regexp','~^[A-Za-z0-9]{4,20}$~') and 
    $check_values->check('newpassword2','post','regexp','~^[A-Za-z0-9]{4,20}$~')
    ):


    if (
        $pw->check($_POST['password'],$get_user['password']) and 
        $_POST['newpassword'] == $_POST['newpassword2']
        ):

        $db->update("UPDATE user SET password = ? WHERE id = ?", array($pw->gen($_POST['newpassword']), $_SESSION['auth']['id']));
        $err[0] = '<div class="success">Пароль успешно изменён</div>';
    else:
        $err[0] = '<div class="error-block">Старый пароль не верен или новые пароли не совпадают</div>';
    endif;

endif;
// Обновление пароля

$get_user = $db->row("SELECT * FROM user WHERE id = ?", array($_SESSION['auth']['id']));


$token = $tk->input();
require $_SERVER["DOCUMENT_ROOT"].'/template/general/profile.tpl';
Страница настроек профиля:

Код: Выделить всё

<article class="content page_profile" style="margin-top: 14px;">
    <?=$err[0]?>
    <div class="left"> 
        <h1>Настройки профиля</h1>
        <form method="post" action="">
            <?=$token?>

            <table>
                <tr>
                    <td><label>Логин:</label></td>
                    <td><?=$get_user['login']?></td>
                </tr>
                <tr>
                    <td><label>Email:</label></td>
                    <td><?=$get_user['email']?></td>
                </tr>
                <tr>
                    <td><label>Баланс:</label></td>
                    <td><?=$get_user['balance']?> р <a href="/profile/balance/">[пополнить]</a></td>
                </tr>
                <tr>
                    <td><label for="icq">ICQ/Skype:</label></td>
                    <td>
                        <input type="text" name="icq" id="icq" autocomplete="off" value="<?=$get_user['contacts']?>" />
                    </td>
                </tr>
                <tr>
                    <td></td>
                    <td>
                        <input type="submit" value="Сохранить" />
                    </td>
                </tr>
            </table>
        </form>
    </div>

    <div class="right">
        <h1>Смена пароля</h1>

        <form method="post" action="">
            <?=$token?>
            
            <table>
                <tr>
                    <td><label for="password">Текущий пароль:</label></td>
                    <td>
                        <input type="password" pattern="^[A-Za-z0-9]{4,20}$" name="password" id="password" />
                    </td>
                </tr>
                <tr>
                    <td><label for="newpassword">Новый пароль:</label></td>
                    <td>
                        <input type="password" pattern="^[A-Za-z0-9]{4,20}$" name="newpassword" id="newpassword" autocomplete="off" />
                    </td>
                </tr>
                <tr>
                    <td><label for="newpassword2">Повторите пароль:</label></td>
                    <td>
                        <input type="password" pattern="^[A-Za-z0-9]{4,20}$" name="newpassword2" id="newpassword2" autocomplete="off" />
                    </td>
                </tr>
                <tr>
                    <td></td>
                    <td>
                        <input type="submit" value="Сменить пароль" />
                    </td>
                </tr>
            </table>
        </form>
    </div>


<?php if (!empty($get_auth)): ?>
    <h4 style="margin-top: 290px;">История активности</h4>
    <table class="catalog new">
        <tr>
            <th>Дата</th>
            <th>IP</th>
            <th>Браузер</th>
        </tr>
<?php foreach ($get_auth as $key => $value): ?>
        <tr>
            <td><?=date("d.m.Y H:i",strtotime($value['date']))?></td>
            <td><?=$value['ip']?></td>
            <td><?=$value['user_agent']?></td>
        </tr>
<?php endforeach; ?>
        </table>
<?php endif; ?>

</article>

Аватара пользователя
Slash
Администратор
Сообщения: 2112
Зарегистрирован: Сб авг 11, 2012 7:39 am
Поблагодарили: 71 раз

Re: Система тикетов на PHP

Сообщение Slash » Вт дек 16, 2014 12:34 pm

Набросал для примера простую систему тикетов:
Для тикетов создаем новую таблицу со всеми необходимыми полями, пример (выполняем запрос):

Код: Выделить всё

CREATE TABLE IF NOT EXISTS `ticket` (
  `ticket_id` int(11) NOT NULL AUTO_INCREMENT,
  `ticket_user_id` varchar(10) NOT NULL,
  `ticket_author_id` varchar(10) NOT NULL,
  `ticket_text` text,
  PRIMARY KEY (`ticket_id`)
); 
ticket_id - в этом поле буде находится идентификатор сообщения.
ticket_user_id - тут будет храниться идентификатор профиля пользователя, в чьем профиле это будет создан тикет.
ticket_author_id - идентификатор автора сообщения.
ticket_text - само сообщение.

Далее пишем форму для отправки поста:

Код: Выделить всё

<?php
if (isset($_POST['submit']))
{
    $ticket_text = mysqli_real_escape_string($connect, htmlspecialchars($_POST['ticket_text']));
    
    if (empty($ticket_text))
    {
        echo 'Поле для ввода текста осталось пустым. Пожалуйста заполните все поля.';
    }
    else
    {
        $ticket_user_id = $profile_user_id; # Тут Ваша переменная со значением id профиля 
        $ticket_author_id = $_SESSION['user_id'];    

        $sql = "INSERT INTO ticket (ticket_user_id, ticket_author_id, ticket_text)
            VALUES ('$ticket_user_id', '$ticket_author_id', '$ticket_text')";
        $query = mysqli_query($connect, $sql);
        
        if (!$query)
        {
            echo 'Произошла ошибка';
        }
        else
        {
            echo 'Ваш комментарий успешно добавлен!';
        }
    }
}
?>

<form method="post" action="">
    <textarea rows="5" cols="70" name="ticket_text"></textarea><br />
    <input class="button" type="submit" name="submit" value="Отправить" />
</form>
Теперь выводим все сообщения с именем автора поста, для этого делаем один запрос сразу в две таблицы, затем через цикл выводим результат:

Код: Выделить всё

$sql_ticket = "SELECT * 
    FROM ticket a, user b
    WHERE a.ticket_user_id = b.profile_user_id    
    ORDER BY a.ticket_id DESC";
$query_ticket = mysqli_query($connect, $sql_ticket);
if (!$query_ticket)
{
    mysqli_error();
}
else
{
    while($comment = mysqli_fetch_assoc($query_ticket))
    {
        echo 'Автор: ' . $user_name . '<br />';
        echo 'Сообщение: ' . $ticket_text;        
    }
} 
Не проверял.
Сценарий требует серьёзной доделки. Это всего лишь пример... Но исходя из этого можно написать полноценную систему тикетов.

Ответить Пред. темаСлед. тема

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя