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, Email, 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: