Here you will learn how to store the data entered in a form with ItemManager.
Let's start right away, create a new category called FormData
that will include your items which contains data from the form:
<?php
include 'imanager.php';
use Imanager\Category;
use Imanager\Field;
// Create new category
$newCategory = new Category();
if($newCategory->set('name', 'FormData')->save()) {
// Create fields:
// User name
$newField = new Field($newCategory->id);
$newField->set('name', 'username')
->set('type', 'text')
->set('label', 'Name')
->save();
// E-Mail
$newField = new Field($newCategory->id);
$newField->set('name', 'email')
->set('type', 'text')
->set('label', 'Email')
->save();
// Message
$newField = new Field($newCategory->id);
$newField->set('name', 'message')
->set('type', 'longtext')
->set('label', 'Message')
->save();
}
Execute the code above just once and then delete it outright, we won't need it anymore.
NOTE: If you encounter problems when creating, you can simply delete everything and start over:
$category = $imanager->getCategory('name=FormData'); if($category && $imanager->remove($category)) { echo "Category successfully deleted"; }
Next, create a HTML form with the following form elements:Name
,Message
.
Here is the HTML skeleton:
<?php
include 'imanager.php';
// Our $_POST data
$post = $imanager->input->post;
// Our whitelist (sanitized data)
$whitelist = $imanager->input->whitelist;
// Messages
$msgs = '';
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>IM Tutorials</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- UIkit CSS -->
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.1.6/css/uikit.min.css" />
<!-- UIkit JS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/uikit/3.1.6/js/uikit.min.js"></script>
</head>
<body>
<main role="main">
<div class="uk-container uk-container-small uk-position-relative uk-padding">
<div class="uk-width-1-2">
<h3>My Form</h3>
<?php echo $msgs; ?>
<form action="./" method="post">
<fieldset class="uk-fieldset">
<div class="uk-margin-small">
<input type="text" name="username" class="uk-input"
placeholder="Name" value="<?php
echo $whitelist->username; ?>" required>
</div>
<div class="uk-margin-small">
<input type="email" name="email" class="uk-input"
placeholder="Email" value="<?php
echo $whitelist->email; ?>" required>
</div>
<div class="uk-margin-small">
<textarea name="message" class="uk-textarea"
placeholder="Message" required><?php
echo $whitelist->message; ?></textarea>
</div>
<button class="uk-button uk-button-default">Submit</button>
</fieldset>
</form>
</div>
</div>
</main>
</body>
</html>
Continue with the PHP part. Just add it on the top of the same file, where your form is located, right after the include 'imanager.php';
line:
<?php
include 'imanager.php';
use Imanager\Category;
use Imanager\Field;
use Imanager\Item;
// Our $_POST data
$post = $imanager->input->post;
// Our whitelist (sanitized data)
$whitelist = $imanager->input->whitelist;
// Messages
$msgs = '';
// Form is sent
if($post->username) {
$category = $imanager->getCategory('name=FormData');
$error = false;
// Sanitize user input
$whitelist->username = $imanager->sanitizer->text($post->username);
$whitelist->email = $imanager->sanitizer->email($post->email);
$whitelist->message = $imanager->sanitizer->textarea($post->message);
// Ensure that all user entries are complete
if(!$whitelist->username) {
$msgs = '<div class="uk-alert-danger" uk-alert>'.
' <a class="uk-alert-close" uk-close></a>'.
' <p>Name field is required.</p>'.
'</div>';
$error = true;
}
if(!$whitelist->email) {
$msgs .= '<div class="uk-alert-danger" uk-alert>'.
' <a class="uk-alert-close" uk-close></a>'.
' <p>Email field is required.</p>'.
'</div>';
$error = true;
}
if(!$whitelist->message) {
$msgs .= '<div class="uk-alert-danger" uk-alert>'.
' <a class="uk-alert-close" uk-close></a>'.
' <p>Message field is required.</p>'.
'</div>';
$error = true;
}
// Check whether a user with the same email has already
// made an entry, if so, a message should appear.
if(!$error) {
$entry = $category->getItem("email=$whitelist->email");
if($entry) {
$msgs .= '<div class="uk-alert-danger" uk-alert>'.
' <a class="uk-alert-close" uk-close></a>'.
' <p>You\'ve already sent a message.</p>'.
'</div>';
$error = true;
}
}
// If there are no errors, save the data and show a successful message
if(!$error) {
$newItem = new Item($category->id);
if($newItem->set('username', $whitelist->username)
->set('email', $whitelist->email)
->set('message', $whitelist->message)
->save()) {
$msgs .= '<div class="uk-alert-success" uk-alert>'.
' <a class="uk-alert-close" uk-close></a>'.
' <p>We have received your message.</p>'.
'</div>';
$whitelist->username = '';
$whitelist->email = '';
$whitelist->message = '';
}
}
}
After sending, the output could look like this:
If you want to display the data entered by users, you can do it this way:
<?php
$category = $imanager->getCategory('name=FormData');
$rows = '';
foreach($category->items as $item) {
ob_start(); ?>
<div class="uk-margin-bottom">
<div class="uk-card uk-card-default uk-card-body">
<h3 class="uk-card-title"><?php echo $item->username; ?></h3>
<div class="uk-grid-small" uk-grid>
<div class="uk-width-auto">
<div>Email</div>
<div>Message</div>
</div>
<div class="uk-width-expand">
<div><span class="uk-text-muted"><?php echo $item->email; ?></span></div>
<div><span class="uk-text-muted"><?php echo $item->message; ?></span></div>
</div>
</div>
</div>
</div>
</div>
<?php $rows .= ob_get_clean();
}
echo $rows;
... here's the final output: