<?php
require_once('class.php_sqlite3_contact_form.php');
/*
Just an example of using the class.php_sqlite3_contact_form.php class. Not for production use.
file: example.php_sqlite3_contact_form.php
title: PHP SQLite3 Contact Form Manager Example
description: An example of using the php_sqlite3_contact_form class
license: BSD 3-Clause License <https://opensource.org/licenses/BSD-3-Clause>
requires: PHP SQLite3
uses: jQuery for example
*/
// create new cform object
$cform = new php_sqlite3_contact_form('contact_form.db');
// create tables if they don't exist
$cform->create_tables();
function show_banned()
{
global $cform;
$result = $cform->get_banned_ips();
$the_str = "<div class='banned-header'>Banned IPs</div><div class='banned-ips'>";
while ($row = $result->fetchArray()) {
$the_str .= show_banned_row($row);
}
$the_str .= "</div>";
return $the_str;
}
function show_banned_row($row)
{
$the_str = "<div class='ip-row'>";
$the_str .= "<div class='fld'><div class='ip'>".$row['ip']."</div></div>";
$the_str .= "<div class='fld'><div class='btn btn-unban-ip' data-ip='".$row['ip']."'>Unban IP</div></div>";
$the_str .= "</div>";
return $the_str;
}
function show_message_row_inner($row)
{
$the_str = "";
$the_str .= "<div class='fld '><input class='def-hide' type=text name='id' value='".$row['id']."' readonly></div>";
$the_str .= "<div class='fld'><input type=text name='email' value='".$row['email']."'></div>";
$the_str .= "<div class='fld'><input type=text name='subject' value='".$row['subject']."'></div>";
$the_str .= "<div class='fld'><textarea name='message'>".$row['message']."</textarea></div>";
$the_str .= "<div class='fld'><input class='def-hide' type=text name='ip' value='".$row['ip']."' readonly></div>";
$the_str .= "<div class='fld'><input class='def-hide' type=text name='tstamp' value='".$row['tstamp']."' readonly></div>";
$the_str .= "<div class='fld fldbtn'><div class='def-hide btn btn-update-message' data-id='".$row['id']."'>Update</div></div>";
$the_str .= "<div class='fld fldbtn '><div class='def-hide btn btn-reset-message' data-id='".$row['id']."'>Reset</div></div>";
$the_str .= "<div class='fld fldbtn '><div class='def-hide btn btn-delete-message' data-id='".$row['id']."'>Delete</div></div>";
$the_str .= "<div class='fld fldbtn '><div class='def-hide btn btn-ban-ip' data-ip='".$row['ip']."'>Ban IP</div></div>";
return $the_str;
} // end show_message_row_inner
function show_message_row($row)
{
$the_str = "";
$the_str .= "<div class='message' msg-id='".$row['id']."'>";
$the_str .= show_message_row_inner($row);
$the_str .= "</div>";
return $the_str;
} // end show_message_row
function show_messages_list($messages)
{
$the_str = "";
// as divs
while($row = $messages->fetchArray(SQLITE3_ASSOC))
$the_str .= show_message_row($row);
return $the_str;
} // end show_messages_list
# gets ajax request and then returns json data and quits.
if(!empty($_GET['ajax']))
{
switch($_GET['ajax'])
{
case 'load_banned':
$return_arr[] = array(
"command" => 'html',
"selector" => ".banned-list",
"msg" => show_banned()
);
break; // load_banned
case 'ip_unban':
$ip = $_POST['flds']['ip'];
$cform->unban_ip($ip);
$return_arr[] = array(
"command" => 'alert',
"msg" => "IP $ip has been unbanned."
);
$return_arr[] = array(
"command" => 'html',
"selector" => ".banned-list",
"msg" => show_banned()
);
break; // ip_unban
case 'ip_ban':
$ip = $_POST['flds']['ip'];
// if ip alreadu banned, alert already banned.
if($cform->check_banned($ip))
{
$return_arr[] = array(
"command" => 'alert',
"msg" => "IP $ip is already banned."
);
break;
}
$cform->ban_ip($ip);
$return_arr[] = array(
"command" => 'alert',
"msg" => "IP $ip has been banned."
#"data" => show_banned_list($cform->get_banned_ips())
);
$return_arr[] = array(
"command" => 'html',
"selector" => ".banned-list",
"msg" => show_banned()
);
break; // ban_ip
case 'messages_get':
// $messages = $cform->get_messages();
// $ret = array();
// while($row = $messages->fetchArray(SQLITE3_ASSOC))
// {
// $ret[] = array(
// "id" => $row['id'],
// "email" => $row['email'],
// "subject" => $row['subject'],
// "message" => $row['message'],
// "ip" => $row['ip'],
// "tstamp" => $row['tstamp']
// );
// }
$messages_html = show_messages_list($cform->get_messages());
$return_arr[] = array(
"command" => 'update_messages_list',
"data" => $messages_html
);
break; // messages_get
case 'message_get':
// just handle a row fetch for a single message
// show_message_row($row)
$id = $_POST['flds']['id'];
$message = $cform->get_message($id);
$row = $message->fetchArray(SQLITE3_ASSOC);
$the_str = show_message_row_inner($row);
$return_arr[] = array(
"command" => 'update_message_row',
"id" => $id,
"data" => $the_str
);
break; // message_get
case 'message_add':
// print array $_POST
// print_r($_POST);
$email = $_POST['flds']['email'];
$subject = $_POST['flds']['subject'];
$message = $_POST['flds']['message'];
$ip = $_POST['flds']['ip'];
$cform->add_message($email, $subject, $message, $ip);
$return_arr[] = array(
"command" => 'reset_message_add_form'
);
$return_arr[] = array(
"command" => 'refresh_messages_list'
);
$return_arr[] = array(
"command" => 'enable_input',
'selector' => '.message-add-form .btn-submit'
);
break; // message_add
case 'message_delete':
$id = $_POST['flds']['id'];
$cform->delete_message($id);
$return_arr[] = array(
"command" => 'remove_message_row',
"id" => $id
);
break; // message_delete
case 'message_update':
// print_r($_POST);
// print_r($_POST['flds']);
$id = $_POST['flds']['id'];
$email = $_POST['flds']['email'];
$subject = $_POST['flds']['subject'];
$message = $_POST['flds']['message'];
$ip = $_POST['flds']['ip'];
$cform->update_message($id, $email, $subject, $message, $ip);
$return_arr[] = array(
"command" => 'success',
"id" => $id
);
$return_arr[] = array(
"command" => 'update_message_row',
"id" => $id
);
break; // message_update
} // end switch
// if we have a return array, send it back as json for javascript processing
if(!empty($return_arr) && is_array($return_arr))
die(json_encode($return_arr));
die(); // end ajax, end program.
} // end ajax
?>
<!-- jQuery example manager -->
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
/*
// send_data structure
new_arr[key] = {};
new_arr[key].col = the_col;
new_arr[key].val = the_val;
var url = "ajax.command_process.php?&ajax=customer_save&id="+db_id;
do_cmd_post(url, new_arr);
*/
function do_cmd_post(url, send_data)
{
$.post( url, { flds: send_data /* in php will appear as $_POST['flds'] */ },
function( return_data ) {
do_cmd_process(return_data);
}, "json" ); // punt any returned data to processor
}
</script>
<style>
html, body {
font-family: Arial, Helvetica, sans-serif;
padding:0;margin:0;
}
</style>
<script>
function do_cmd_process(data) // handle data coming back from ajax
{
if (data instanceof Array) {
data.forEach(function(entry) {
console.log(entry.command);
//console.log(entry.message);
// handle returned commands //
switch(entry.command)
{
case 'alert':
alert(entry.msg);
break;
case 'reload':
window.location.replace('./');
break;
case 'update_messages_list':
$('#messages-list').html(entry.data);
break;
case 'update_message_row':
// $the_str .= "<div class='message' msg-id='".$row['id']."'>";
// the target div is a div with class: .message
// update html
$('.message[msg-id="'+entry.id+'"]').html(entry.data);
// remove any editing class
$('.message[msg-id="'+entry.id+'"]').removeClass('editing');
break;
case 'remove_message_row':
// $the_str .= "<div class='message' msg-id='".$row['id']."'>";
// the target div is a div with class: .message
// update html
$('.message[msg-id="'+entry.id+'"]').remove();
break;
case 'refresh_messages_list':
var id = entry.id;
var url = "example.php_sqlite3_contact_form.php?&ajax=messages_get";
do_cmd_post(url, {});
break;
case 'refresh_message_row':
var id = entry.id;
var url = "example.php_sqlite3_contact_form.php?&ajax=message_get";
do_cmd_post(url, {id: id});
break;
case 'scrolltop':
$('html, body').animate({ scrollTop: $('body').offset().top - 190 }, 200);
break;
case 'reload_messages_list':
$('#messages-list').load('example.php_sqlite3_contact_form.php #messages-list');
break;
case 'reset_message_add_form':
$('#message-add-form').each(function(){
this.reset();
});
break;
case 'reset_message_add_form':
$('#message-add-form').each(function(){
this.reset();
});
break;
// generic commands //
case 'alert':
alert(entry.msg);
break;
case 'log':
console.log(entry.msg);
break;
case 'append':
$(entry.selector).append(entry.msg);
break;
case 'prepend':
$(entry.selector).prepend(entry.msg);
break;
case 'html':
$(entry.selector).html(entry.msg);
break;
case 'val':
$(entry.selector).val(entry.msg);
break;
case 'focus':
$(entry.selector).focus();
break;
case 'blur':
$(entry.selector).blur();
break;
case 'clear':
$(entry.selector).val('');
break;
case 'js':
eval(entry.msg);
break;
case 'disable_input':
$(entry.selector).prop('disabled', true);
break;
case 'enable_input':
$(entry.selector).prop('disabled', false);
break;
}
});
}
}
</script>
</head>
<body>
<script>
$(document).on('click', '.message', function() {
// switch all .def-hide on the message to .def-hide-show
var $this = $(this);
var $message = $this.closest('.message');
$message.find('.def-hide').removeClass('def-hide').addClass('def-hide-show');
});
// on double click, hide if .def-hide-show is showing
$(document).on('dblclick', '.message', function() {
// switch all .def-hide-show on the message to .def-hide
var $this = $(this);
var $message = $this.closest('.message');
$message.find('.def-hide-show').removeClass('def-hide-show').addClass('def-hide');
});
// on editing an input or textarea in .message, apply an editing class to the .message div
$(document).on('change', '.message input, .message textarea', function() {
var $this = $(this);
var $message = $this.closest('.message');
$message.addClass('editing');
});
</script>
<style>
.section-button-wrapper {
width:100%;
margin:0px; padding:0px;
display: block;
background-color: #38c172;
border-bottom: 1px solid #28a162;
}
.section-button {
margin:0px; padding:0px;
display: inline-block;
padding: 10px 20px;
background-color: #38c172;
color: #fff;
border-radius: 5px;
text-align: center;
text-decoration: none;
font-size: 2vmax;
cursor: pointer;
transition: all 0.3s ease;
/* center */
position: relative;
left: 10vw;
margin:2vw;
}
.section-button:hover {
background: #555;
}
</style>
<script>
$(document).ready(function(){
$('#message-add').hide();
$('.message-add-showhide').click(function(){
/* if it has class 'showing' then remove class 'showing' */
/* slide down if not showing */
if($('#message-add').hasClass('showing'))
{
$('#message-add').removeClass('showing');
$('#message-add').slideUp();
}
else
{
$('#message-add').addClass('showing');
$('#message-add').slideDown();
}
});
});
</script>
<div class='section-button-wrapper showhide-wrapper'>
<div class='section-button message-add-showhide'>show/hide add message</div>
</div>
<div id="message-add">
<form id="message-add-form" action="javascript:void(0);" method="post">
<div class='message-add-form'>
<div class='message-add-form-row'>
<div class='message-add-form-label'>Email</div>
<div class='message-add-form-input'><input type="text" name="email" placeholder="email" /></div>
</div>
<div class='message-add-form-row'>
<div class='message-add-form-label'>IP</div>
<div class='message-add-form-input'><input type="text" name="ip" placeholder="ip" /></div>
</div>
<div class='message-add-form-row'>
<div class='message-add-form-label'>Subject</div>
<div class='message-add-form-input'><input type="text" name="subject" placeholder="subject" /></div>
</div>
<div class='message-add-form-row'>
<div class='message-add-form-label'>Message</div>
<div class='message-add-form-input'><textarea name="message" placeholder="message"></textarea></div>
</div>
<div class='message-add-form-row'>
<div class='message-add-form-label'></div>
<div class='message-add-form-input'><input class='btn btn-submit' type="submit" value="Add Message" /></div>
</div>
</div>
</form>
</div>
<style>
/* CSS for the message-add form */
#message-add {
display: flex;
justify-content: center;
align-items: center;
height: 70vh;
background-color: #d8f3dc;
}
.message-add-form {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 2rem;
border-radius: 1rem;
background-color: #fff;
box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.2);
max-width: 90%;
width: 30rem;
}
.message-add-form-row {
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
margin: 0.5rem 0;
width: 100%;
}
.message-add-form-label {
font-size: 1.2rem;
font-weight: bold;
color: #226a51;
flex: 0.3;
}
.message-add-form-input {
flex: 0.7;
}
.message-add-form input[type="text"],
.message-add-form textarea {
font-size: 1.2rem;
padding: 0.5rem;
border: none;
border-radius: 0.5rem;
background-color: #e2f0d9;
width: 100%;
transition: background-color 0.2s ease-in-out;
color: #226a51;
}
.message-add-form input[type="text"]:focus,
.message-add-form textarea:focus {
outline: none;
background-color: #cfe5ce;
}
.message-add-form input[type="submit"] {
font-size: 1.2rem;
font-weight: bold;
color: #fff;
background-color: #4b8e74;
border: none;
border-radius: 0.5rem;
padding: 0.5rem 1rem;
margin-top: 1rem;
cursor: pointer;
transition: background-color 0.2s ease-in-out;
}
.message-add-form input[type="submit"]:hover {
background-color: #3a6e5a;
}
/* Responsive CSS for the message-add form */
@media screen and (max-width: 1024px) {
.message-add-form {
max-width: 100%;
width: 90%;
}
.message-add-form-label {
font-size: 1rem;
flex: 0.4;
}
.message-add-form-input {
flex: 0.6;
}
}
</style>
<div class='section-button-wrapper btn-update-list-wrapper'>
<div class='section-button btn-update-list'>Refresh List</div>
</div>
<div id="messages-list" class='messages-list'>
<?php
// echo show_messages_list($cform->get_messages());
?>
</div>
<script>
$(function() {
var send_data = {};
var url = "example.php_sqlite3_contact_form.php?&ajax=messages_get";
do_cmd_post(url, send_data);
}); // end document ready
</script>
<script>
$(document).ready(function() {
// hide update section
// add message
$('#message-add-form').submit(function() {
// disable .message-add-form .btn-submit
$('.message-add-form .btn-submit').attr('disabled', 'disabled');
var email = $('input[name=email]').val();
var subject = $('input[name=subject]').val();
var message = $('textarea[name=message]').val();
var ip = $('input[name=ip]').val();
var send_data = {};
send_data['email'] = email;
send_data['subject'] = subject;
send_data['message'] = message;
send_data['ip'] = ip;
var url = "example.php_sqlite3_contact_form.php?&ajax=message_add";
do_cmd_post(url, send_data);
});
$(document).on('click', '.btn-update-message', function() {
// get the data
var id = $(this).parent().parent().find('input[name=id]').val();
var email = $(this).parent().parent().find('input[name=email]').val();
var subject = $(this).parent().parent().find('input[name=subject]').val();
var message = $(this).parent().parent().find('textarea[name=message]').val();
var ip = $(this).parent().parent().find('input[name=ip]').val();
var send_data = {};
send_data['id'] = id;
send_data['email'] = email;
send_data['subject'] = subject;
send_data['message'] = message;
send_data['ip'] = ip;
var url = "example.php_sqlite3_contact_form.php?&ajax=message_update";
do_cmd_post(url, send_data);
});
// update list
$('.btn-update-list').click(function() {
var url = "example.php_sqlite3_contact_form.php?&ajax=messages_get";
do_cmd_post(url, {});
});
// reset message (reload)
$(document).on('click', '.btn-reset-message', function() {
id = $(this).parent().parent().find('input[name=id]').val();
var url = "example.php_sqlite3_contact_form.php?&ajax=message_get";
do_cmd_post(url, {id: id});
});
// delete message
// handle even on dynamic loaded elements
$(document).on('click', '.btn-delete-message', function() {
var id = $(this).parent().parent().find('input[name=id]').val();
var send_data = {};
send_data['id'] = id;
var url = "example.php_sqlite3_contact_form.php?&ajax=message_delete";
do_cmd_post(url, send_data);
}); // end btn-delete-message click
// ban ip
$(document).on('click', '.btn-ban-ip', function() {
// button has a data-ip= attribute
var ip = $(this).attr('data-ip');
var send_data = {};
send_data['ip'] = ip;
var url = "example.php_sqlite3_contact_form.php?&ajax=ip_ban";
do_cmd_post(url, send_data);
}); // end btn-ban-ip click
// unban ip
$(document).on('click', '.btn-unban-ip', function() {
// button has a data-ip= attribute
var ip = $(this).attr('data-ip');
var send_data = {};
send_data['ip'] = ip;
var url = "example.php_sqlite3_contact_form.php?&ajax=ip_unban";
do_cmd_post(url, send_data);
}); // end btn-unban-ip click
}); // end document ready
</script>
<style>
.btn {
display: inline-block;
padding: 10px;
background: #ccc;
cursor: pointer;
}
.btn:hover {
background: #ddd;
}
#messages-list {
margin-bottom: 20px;
}
</style>
<style>
/* Messages List */
#messages-list {
display: flex;
flex-wrap: wrap;
justify-content: center;
}
.message {
position:relative;
background-color: #fff;
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1);
border-radius: 5px;
padding: 20px;
margin: 20px;
width:30vw;
min-width:400px;
box-sizing: border-box;
color: #333;
font-size: 16px;
}
.message.editing {
background-color: red;
}
/* if the screen is smaller than 768px, make the message 100% width */
@media screen and (max-width: 1400px) {
.message {
width: 100%;
}
}
.message:hover {
transform: translateY(-5px);
transition: all 0.3s ease;
cursor: pointer;
}
.message .fld {
margin-bottom: 10px;
}
.message input[type="text"],
.message textarea {
padding: 10px;
border: none;
border-radius: 5px;
background-color: #f5f5f5;
width: 100%;
font-size: 16px;
color: #333;
}
.message input[type="text"]:focus,
.message textarea:focus {
outline: none;
background-color: #fff;
}
.message input[type="text"][readonly] {
background-color: #d9d9d9;
}
.message div.fldbtn {
position:relative;
padding:0px;margin:0px;
display:inline-block;
color: #fff;
text-align: center;
text-decoration: none;
font-size: 16px;
cursor: pointer;
transition: all 0.3s ease;
}
.message .btn {
display:block;
margin:0px;
position:relative;
background-color: #38c172;
color: #fff;
border-radius: 5px;
text-align: center;
text-decoration: none;
font-size: 16px;
cursor: pointer;
transition: all 0.3s ease;
/* set flex size to about 30% */
font-size:2vmax;
width:7.4vw;
min-width:100px;
margin:0.2vw;
padding:0.3vw;
}
.message .btn:hover {
background-color: #2f855a;
}
.message .btn-delete-message {
background-color: #e53e3e;
}
.message .btn-delete-message:hover {
background-color: #c53030;
}
.message .btn-update-message {
background-color: #4299e1;
}
.message .btn-update-message:hover {
background-color: #3182ce;
}
.message .btn-reset-message {
background-color: #ed8936;
}
.message .btn-reset-message:hover {
background-color: #dd6b20;
}
</style>
<style>
/* hide .def-hide by default for jQuery to show with a show() function */
.message .def-hide {
display:none;
}
</style>
<!-- show and handle banned list -->
<div class='banned-list'>banned list</div>
<script>
// document ready
$(function() {
var send_data = {};
var url = "example.php_sqlite3_contact_form.php?&ajax=load_banned";
do_cmd_post(url, send_data);
}); // end document ready
</script>
<style>
.banned-list {
/* flex */
display:flex;
flex-direction:column;
justify-content:flex-start;
align-items:flex-start;
padding:2vw;
}
.banned-list .banned-header {
font-size:2vmax;
font-weight:bold;
margin-bottom:10px;
}
.banned-list .ip-row {
display:block;
padding:2vw;
}
.banned-list .ip-row .fld {
display:inline-block;
width:25vw;
}
</style>
</body>
</html>
|