File "index.html"

Full Path: /home/humancap/cl.humancap.com.my/documentation/index.html
File size: 194.72 KB
MIME-type: text/html
Charset: utf-8

<!DOCTYPE html>
<html lang="en" prefix="og: http://ogp.me/ns#">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documentation and Quick Start Guide - PHP CRUD Generator</title>
    <meta name="description" content="This CRUD Generator is a program developed in pure PHP for building complete Bootstrap administration panels using a visual interface.">
    <meta name="keywords" content="php crud generator, crud generator, crud generator php, crud php generator, php crud, php crud builder, php crud generator bootstrap, php crud admin panel, crud admin generator, best php crud generator, crud builder, php admin panel generator, php crud generator open source, crud php, crud framework php, crud tool, generate crud from database, crud online, crud framework, php admin generator, generate crud, php crud generator free, admin panel generator, php simple crud, crud mvc php, best crud framework, php framework crud, crud admin panel, php json crud, crud simples php, php bootstrap crud, php generator, admin php, php table generator, php application generator, php mvc crud, bootstrap crud generator, php backend generator, php crud template, generator php, mvc php crud, php crud example, php crud framework, phpcrud, php crud table, php database generator, back office php, crud admin, crud rights, crud system php, simple php crud, what is php crud, crud demo, crud bootstrap php, curd php, php admin, backend generator, crud application in php, sql crud generator, php mvc admin panel, php user management, php crud library, php back office, php backoffice, crud features, php crud bootstrap, admin crud, crud php bootstrap, crud documentation, php curd, php crud application, best crud generator, php crude, simple crud php, crud php mvc, crud system in php, crud table php, admin generator, crud login php, crud php framework, crud website, crud templates, crud database php, php database form builder, backoffice php, php website with admin panel, php crud class, php form builder, crud ux, admin panel in php, how to make crud in php">
    <link href="https://www.phpcrudgenerator.com/documentation/index" rel="canonical">
    <meta name="locations" content="Global">
    <meta name="robots" content="index, follow">
    <meta name="distribution" content="Global">
    <meta name="language" content="en">
    <meta name="author" content="Gilles Migliori">
    <meta content="summary" name="twitter:card">
    <meta content="@miglisoft" name="twitter:creator">
    <meta content="https://www.phpcrudgenerator.com" name="twitter:domain">
    <meta content="PHP CRUD Generator" property="og:title">
    <meta content="Simple application to build backoffice for your website" property="og:description">
    <meta content="website" property="og:type">
    <meta content="PHP CRUD Generator" property="og:site_name">
    <meta content="https://www.phpcrudgenerator.com/assets/images/phpcg-504-324.png" property="og:image">
    <meta content="https://www.phpcrudgenerator.com" property="og:url">
    <meta content="en_GB" property="og:locale">
    <meta content="1848520265375276" property="fb:app_id">
    <meta name="category" content="internet">
    <meta property="og:image" content="https://www.phpcrudgenerator.com/assets/images/screenshot.jpg">
    <meta property="og:image:type" content="image/jpeg">
    <meta property="og:image:width" content="1080">
    <meta property="og:image:height" content="810">
    <link rel="preload" href="assets/fonts/barlow-condensed-v12-latin-500.woff2" as="font" type="font/woff2" crossorigin>
    <link rel="preload" href="assets/fonts/source-sans-pro-v21-latin-regular.woff2" as="font" type="font/woff2" crossorigin>
    <link rel="preload" href="assets/stylesheets/pace-theme-minimal.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
    <link rel="preload" href="assets/stylesheets/project.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
    <link rel="preload" href="assets/stylesheets/bootstrap.min.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
    <link rel="preload" href="assets/stylesheets/OverlayScrollbar-os-theme-round-dark.min.css" as="style" onload="this.rel='stylesheet'">
    <link rel="preload" href="assets/stylesheets/OverlayScrollbars.min.css" as="style" onload="this.rel='stylesheet'">
    <link rel="preload" href="assets/stylesheets/annotator-pro.min.css" as="style" onload="this.rel='stylesheet'">
    <link rel="preload" href="assets/stylesheets/prism.min.css" as="style" onload="this.rel='stylesheet'">
    <noscript>
        <link type="text/css" media="screen" rel="stylesheet" href="assets/stylesheets/pace-theme-minimal.min.css">
        <link type="text/css" media="screen" rel="stylesheet" href="assets/stylesheets/project.min.css">
        <link type="text/css" media="screen" rel="stylesheet" href="assets/stylesheets/bootstrap.min.css">
        <link type="text/css" media="screen" rel="stylesheet" href="assets/stylesheets/OverlayScrollbar-os-theme-round-dark.min.css">
        <link type="text/css" media="screen" rel="stylesheet" href="assets/stylesheets/OverlayScrollbars.min.css">
        <link type="text/css" media="screen" rel="stylesheet" href="assets/stylesheets/annotator-pro.min.css">
        <link rel="stylesheet" href="assets/stylesheets/prism.min.css" media="screen">
    </noscript>
    <script>
        /*! loadCSS. [c]2017 Filament Group, Inc. MIT License - https://github.com/filamentgroup/loadCSS */
        !function(n){"use strict";n.loadCSS||(n.loadCSS=function(){});var o=loadCSS.relpreload={};if(o.support=function(){var e;try{e=n.document.createElement("link").relList.supports("preload")}catch(t){e=!1}return function(){return e}}(),o.bindMediaToggle=function(t){var e=t.media||"all";function a(){t.media=e}t.addEventListener?t.addEventListener("load",a):t.attachEvent&&t.attachEvent("onload",a),setTimeout(function(){t.rel="stylesheet",t.media="only x"}),setTimeout(a,3e3)},o.poly=function(){if(!o.support())for(var t=n.document.getElementsByTagName("link"),e=0;e<t.length;e++){var a=t[e];"preload"!==a.rel||"style"!==a.getAttribute("as")||a.getAttribute("data-loadcss")||(a.setAttribute("data-loadcss",!0),o.bindMediaToggle(a))}},!o.support()){o.poly();var t=n.setInterval(o.poly,500);n.addEventListener?n.addEventListener("load",function(){o.poly(),n.clearInterval(t)}):n.attachEvent&&n.attachEvent("onload",function(){o.poly(),n.clearInterval(t)})}"undefined"!=typeof exports?exports.loadCSS=loadCSS:n.loadCSS=loadCSS}("undefined"!=typeof global?global:this);

    </script>
    <style>@font-face{font-family:'Barlow Condensed';font-style:normal;font-weight:500;font-display:swap;src:local(),url(https://www.phpcrudgenerator.com/documentation/assets/fonts/barlow-condensed-v12-latin-500.woff2) format("woff2"),url(https://www.phpcrudgenerator.com/documentation/assets/fonts/barlow-condensed-v12-latin-500.woff) format("woff")}h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;font-family:'Barlow Condensed',sans-serif;font-weight:500}:root{--sidebar-width:240px;--bs-blue:#3186dc;--bs-indigo:#6610f2;--bs-purple:#665986;--bs-pink:#d63384;--bs-red:#be2c2f;--bs-orange:#fd7e14;--bs-yellow:#fb3;--bs-green:#4c6b66;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#696359;--bs-gray-dark:#23211e;--bs-gray-gray-100:#f4f3f1;--bs-gray-gray-200:#e2e0dd;--bs-gray-gray-300:#c6c2bb;--bs-gray-gray-400:#a9a398;--bs-gray-gray-500:#8c8476;--bs-gray-gray-600:#696359;--bs-gray-gray-700:#46423b;--bs-gray-gray-800:#23211e;--bs-gray-gray-900:#151412;--bs-primary:#3186dc;--bs-secondary:#8c8476;--bs-success:#4c6b66;--bs-info:#665986;--bs-warning:#fb3;--bs-danger:#be2c2f;--bs-light:#f4f3f1;--bs-dark:#2e2e2e;--bs-primary-rgb:48.67626,133.63309,220.32374;--bs-secondary-rgb:140,132,118;--bs-success-rgb:76.44296,107.05704,102.44396;--bs-info-rgb:101.51563,89,133.5;--bs-warning-rgb:255,187,51;--bs-danger-rgb:189.77752,43.72248,47.2848;--bs-light-rgb:244,243,241;--bs-dark-rgb:46,46,46;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-body-color-rgb:21,20,18;--bs-body-bg-rgb:255,255,255;--bs-font-sans-serif:Source Sans Pro,-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica Neue,Arial,Noto Sans,sans-serif;--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg,rgba(255,255,255,0.15),rgba(255,255,255,0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#151412;--bs-body-bg:#fff;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#c6c2bb;--bs-border-color-translucent:rgba(0,0,0,0.175);--bs-border-radius:.375rem;--bs-border-radius-sm:.25rem;--bs-border-radius-lg:.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-2xl:2rem;--bs-border-radius-pill:50rem;--bs-link-color:#1c60a5;--bs-link-hover-color:#164c84;--bs-code-color:#d63384;--bs-highlight-bg:#fff1d6}#sidebar-main{position:fixed;height:100%;top:4rem;width:var(--sidebar-width);margin-left:calc(var(--sidebar-width) * -1);padding-top:0;padding-bottom:0;z-index:2}.sidebar{vertical-align:top;border-radius:0}.sidebar .sidebar-toggler{position:absolute;top:10px;right:10px}.sidebar .category-title{position:relative;margin:0;display:block;border-bottom-style:solid;border-bottom-width:1px}.sidebar .category-title>a{display:block;text-decoration:none;padding:12px 20px;font-weight:500;font-size:.84375rem;text-transform:uppercase}.sidebar .category-content .navbar-nav{position:relative;margin:0;padding:7px 0}.sidebar .category-content .navbar-nav li{position:relative;list-style:none}.sidebar .category-content .navbar-nav li>a{font-size:.875rem;padding:7px 20px}.sidebar .category-content .navbar-nav>li>a{font-weight:500}.sidebar.bg-dark .sidebar-toggler{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='white'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e")}.sidebar.bg-dark .category-title{border-bottom-color:#424242}.sidebar.bg-dark .category-title>a{color:#c7c7c7}.sidebar.bg-dark .category-content .navbar-nav li a.active{color:#fff;background-color:#616161}.dropdown-toggle:not(.sidebar-toggler):after{line-height:1.5rem;position:absolute;top:calc(50% - 7px);right:1rem;display:block;width:7px;height:14px;margin:0;content:" ";-webkit-transform:rotate(0);-ms-transform:rotate(0);transform:rotate(0);border:none;background-repeat:no-repeat}.dropdown-toggle{position:relative;padding-right:2.5rem!important}.dropdown-toggle:not(.dropdown-light):after{background-image:url("data:image/svg+xml,%3Csvg aria-hidden='true' data-fa-processed='' data-prefix='fas' data-icon='angle-right' role='img' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 256 512' class='svg-inline--fa fa-angle-right fa-w-8 fa-2x'%3E%3Cpath fill='%238c8476' d='M224.3 273l-136 136c-9.4 9.4-24.6 9.4-33.9 0l-22.6-22.6c-9.4-9.4-9.4-24.6 0-33.9l96.4-96.4-96.4-96.4c-9.4-9.4-9.4-24.6 0-33.9L54.3 103c9.4-9.4 24.6-9.4 33.9 0l136 136c9.5 9.4 9.5 24.6.1 34z' class=''%3E%3C/path%3E%3C/svg%3E")}.has-icon.alert{padding-left:70px}.has-icon.alert:before{padding:13px 0 0 13px}.has-icon:before{position:absolute;top:0;left:0;display:inline-block;width:50px;height:100%;content:" ";border-radius:3px 0 0 3px;background-repeat:no-repeat;background-position:center center}.has-icon.alert:after{position:absolute;top:calc(50% - 6px);left:50px;width:0;height:0;content:" ";border-width:6px 0 6px 6px;border-style:solid}.has-icon.alert-info:before{color:#665986;background-color:#665986;background-image:url("data:image/svg+xml,%3Csvg aria-hidden='true' data-fa-processed='' data-prefix='fas' data-icon='info' role='img' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 192 512' class='svg-inline--fa fa-info fa-w-6'%3E%3Cpath fill='%23fff' d='M20 424.229h20V279.771H20c-11.046 0-20-8.954-20-20V212c0-11.046 8.954-20 20-20h112c11.046 0 20 8.954 20 20v212.229h20c11.046 0 20 8.954 20 20V492c0 11.046-8.954 20-20 20H20c-11.046 0-20-8.954-20-20v-47.771c0-11.046 8.954-20 20-20zM96 0C56.235 0 24 32.235 24 72s32.235 72 72 72 72-32.235 72-72S135.764 0 96 0z' class=''%3E%3C/path%3E%3C/svg%3E");background-size:11.25%}.has-icon.alert-info:after{border-color:transparent transparent transparent #665986}.alert{position:relative;border:none;--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:1px solid var(--bs-alert-border-color);--bs-alert-border-radius:.375rem;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border)}.alert :first-child{margin-top:0}.alert p{margin-bottom:.5em}.alert a{text-decoration:underline}html{position:relative;min-height:100%}.h4{font-family:'Barlow Condensed',sans-serif;font-weight:500;text-transform:lowercase;font-variant:small-caps}code,code[class*=language],pre{font-size:.875rem}strong{font-weight:700;color:#23211e}.container>section{margin-bottom:200px}section ul:not(.list-unstyled):not(.tree-list):not(.list-group):not(.pagination)>li{position:relative;list-style:none;margin-bottom:.5rem}section ul:not(.list-unstyled):not(.tree-list):not(.list-group):not(.pagination)>li strong{color:#23211e}section ul:not(.list-unstyled):not(.tree-list):not(.list-group):not(.pagination)>li ul>li:before{content:" ";width:4px;height:4px;background:#c6c2bb;border-radius:0;display:inline-block;position:absolute;left:-30px;top:.75em}section ul:not(.list-unstyled):not(.tree-list):not(.list-group):not(.pagination)>li:before{content:" ";width:6px;height:6px;background:#a9a398;display:inline-block;position:absolute;left:-30px;top:.55em}ol li{margin-bottom:1rem}#website-navbar{z-index:1040}#website-navbar .navbar-brand{min-width:56px}#website-navbar .navbar-nav .nav-link{display:block;font-weight:500}.breadcrumb .breadcrumb-item{font-size:.875rem;margin-bottom:0}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-info{--bs-alert-color:#3d3550;--bs-alert-bg:#e0dee7;--bs-alert-border-color:#d1cddb}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:.5rem;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg:transparent;--bs-breadcrumb-divider-color:#c6c2bb;--bs-breadcrumb-item-padding-x:.5rem;--bs-breadcrumb-item-active-color:#8c8476;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.btn{ --bs-btn-padding-x: .75rem; --bs-btn-padding-y: .375rem; --bs-btn-font-size: 1rem; --bs-btn-font-weight: 400; --bs-btn-line-height: 1.5; --bs-btn-border-width: 1px; --bs-btn-border-color: transparent; --bs-btn-border-radius: .375rem; --bs-btn-hover-border-color: transparent; display: inline-block; padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x); font-family: var(--bs-btn-font-family); font-size: var(--bs-btn-font-size); font-weight: var(--bs-btn-font-weight); line-height: var(--bs-btn-line-height); text-align: center; text-decoration: none; vertical-align: middle; border: var(--bs-btn-border-width) solid var(--bs-btn-border-color); -webkit-box-shadow: var(--bs-btn-box-shadow); box-shadow: var(--bs-btn-box-shadow)}.btn-danger{ --bs-btn-color: #fff; --bs-btn-bg: #be2c2f; --bs-btn-border-color: #be2c2f; --bs-btn-hover-color: #fff; --bs-btn-hover-bg: #a12528; --bs-btn-hover-border-color: #982326; --bs-btn-focus-shadow-rgb: 200, 75, 78; --bs-btn-active-color: #fff; --bs-btn-active-bg: #982326; --bs-btn-active-border-color: #8e2123; --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); --bs-btn-disabled-color: #fff; --bs-btn-disabled-bg: #be2c2f; --bs-btn-disabled-border-color: #be2c2f}.btn-lg{ --bs-btn-padding-y: .5rem; --bs-btn-padding-x: 1rem; --bs-btn-font-size: 1.25rem; --bs-btn-border-radius: .5rem}.btn-close{-webkit-box-sizing:content-box;box-sizing:content-box;width:1em;height:1em;padding:.25em;color:#000;background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;border:0;opacity:.5}.container,.container-fluid{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}#content-wrapper,.sidebar .sidebar-category{width:100%}.sidebar .category-content,.has-icon{position:relative}.sidebar.bg-dark .category-content,.sidebar.bg-dark .category-content .navbar-nav li a{color:#a1a1a1}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){#sidebar-main{position:sticky!important;height:100vh!important;margin-left:0}#content-wrapper{width:calc(100% - var(--sidebar-width))}.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.list-group{--bs-list-group-color:#151412;--bs-list-group-bg:#fff;--bs-list-group-border-color:rgba(0,0,0,0.125);--bs-list-group-border-width:1px;--bs-list-group-border-radius:.375rem;--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:.5rem;--bs-list-group-action-color:#46423b;--bs-list-group-action-hover-color:#46423b;--bs-list-group-action-hover-bg:#f4f3f1;--bs-list-group-action-active-color:#151412;--bs-list-group-action-active-bg:#e2e0dd;--bs-list-group-disabled-color:#696359;--bs-list-group-disabled-bg:#fff;--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#3186dc;--bs-list-group-active-border-color:#3186dc;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-horizontal{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:.5rem;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:#696359;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:.5rem;--bs-navbar-color:rgba(0,0,0,0.55);--bs-navbar-hover-color:rgba(0,0,0,0.7);--bs-navbar-disabled-color:rgba(0,0,0,0.3);--bs-navbar-active-color:#be2c2f;--bs-navbar-brand-padding-y:0;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:#be2c2f;--bs-navbar-brand-hover-color:#be2c2f;--bs-navbar-nav-link-padding-x:.875rem;--bs-navbar-toggler-padding-y:.25rem;--bs-navbar-toggler-padding-x:.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280,0,0,0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(0,0,0,0.1);--bs-navbar-toggler-border-radius:.375rem;--bs-navbar-toggler-focus-width:.25rem;position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container-fluid{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:inherit;flex-wrap:inherit;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:.5rem;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active{color:var(--bs-navbar-active-color)}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}@media (min-width:768px){.navbar-expand-md{-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-collapse{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important;-ms-flex-preferred-size:auto;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}*,::after,::before{-webkit-box-sizing:border-box;box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%}hr{margin:1rem 0;color:inherit;border:0;border-top:1px solid;opacity:.25}.h4,h1{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}.h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.container{max-width:1140px}h1{font-size:2.5rem}.h4{font-size:1.5rem}}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}ol,ul{padding-left:2rem;margin-top:0;margin-bottom:1rem}ul ul{margin-bottom:0}strong{font-weight:bolder}a{color:var(--bs-link-color);text-decoration:underline}code,pre{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}img{vertical-align:middle}button{border-radius:0;margin:0;font-family:inherit;font-size:inherit;line-height:inherit;text-transform:none}[type=button],button{-webkit-appearance:button}::-moz-focus-inner{padding:0;border-style:none}::-webkit-inner-spin-button{height:auto}::-webkit-search-decoration{-webkit-appearance:none}::file-selector-button{font:inherit;-webkit-appearance:button}.collapse:not(.show){display:none}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:inherit;line-height:1.2}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field,::-webkit-color-swatch-wrapper{padding:0}@media (min-width:1200px){.display-3{font-size:4rem}}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.float-end{float:right!important}.d-inline-block{display:inline-block!important}.d-flex{display:-webkit-box!important;display:-ms-flexbox!important;display:flex!important}.d-none{display:none!important}.shadow-sm{-webkit-box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important;box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-none{-webkit-box-shadow:none!important;box-shadow:none!important}.w-100{width:100%!important}.mh-100{max-height:100%!important}.flex-fill{-webkit-box-flex:1!important;-ms-flex:1 1 auto!important;flex:1 1 auto!important}.flex-column{-webkit-box-orient:vertical!important;-webkit-box-direction:normal!important;-ms-flex-direction:column!important;flex-direction:column!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.justify-content-start{-webkit-box-pack:start!important;-ms-flex-pack:start!important;justify-content:flex-start!important}.align-items-center{-webkit-box-align:center!important;-ms-flex-align:center!important;align-items:center!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.mt-2{margin-top:.5rem!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.ms-auto{margin-left:auto!important}.p-4{padding:1.5rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pb-5{padding-bottom:3rem!important}.fw-bold{font-weight:700!important}.text-center{text-align:center!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}@media (min-width:576px){.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}}@media (min-width:768px){.d-md-none{display:none!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}}@media (min-width:992px){.d-lg-inline{display:inline!important}.d-lg-none{display:none!important}}code[class*=language-]{color:#ccc;background:0 0;font-family:Consolas,Monaco,"Andale Mono","Ubuntu Mono",monospace;font-size:.85rem;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.25;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}</style>
</head>

<body style="padding-top:56px;" data-bs-spy="scroll" data-bs-target="#sidebar-main" data-offset="180">

    <div class="d-flex flex-nowrap">
        <!-- Main sidebar -->
        <nav id="sidebar-main" class="sidebar flex-column flex-nowrap justify-content-start navbar bg-dark mb-5 pb-5" role="navigation" aria-label="Documentation navigation" aria-orientation="vertical">

            <div class="sidebar-category">
                <div class="category-title nav-link">
                    <a class="nav-link dropdown-toggle" data-bs-toggle="collapse" data-bs-target="#main" href="#" role="button" aria-expanded="false" aria-controls="main">MAIN</a>
                </div>

                <div class="category-content">

                    <ul id="main" class="navbar-nav flex-column py-0 collapse">
                        <li class="nav-item"><a class="nav-link active" href="#overview">Overview</a></li>
                        <li class="nav-item"><a class="nav-link" href="#requirements">Requirements</a></li>
                        <li class="nav-item"><a class="nav-link" href="#package-structure">Package Structure</a></li>
                        <li class="nav-item"><a class="nav-link" href="#quick-start">Quick Start</a></li>
                        <li class="nav-item"><a class="nav-link" href="#installation-registration">Installation/Registration</a> </li>
                        <li class="nav-item"><a class="nav-link" href="#configuration">Configuration</a></li>
                    </ul>
                </div>
            </div>

            <div class="sidebar-category">
                <div class="category-title nav-link">
                    <a class="nav-link dropdown-toggle" data-bs-toggle="collapse" data-bs-target="#crud-generator-collapse" href="#" role="button" aria-expanded="false" aria-controls="crud-generator-collapse"> CRUD Generator</a>
                </div>

                <div class="category-content">

                    <ul id="crud-generator-collapse" class="navbar-nav flex-column py-0 collapse">
                        <li class="nav-item w-100"><a class="nav-link" href="#protect-access">Protect Access</a></li>
                        <li class="nav-item w-100"><a class="nav-link" href="#main-panel">Main Panel</a></li>
                        <li class="nav-item w-100"><a class="nav-link" href="#read-lists">Read Lists</a></li>
                        <li class="nav-item w-100"><a class="nav-link" href="#lists-filters">Lists filters</a></li>
                        <li class="nav-item w-100"><a class="nav-link" href="#create-update-forms">Create/Update Forms</a> </li>
                        <li class="nav-item w-100"><a class="nav-link" href="#delete-forms">Delete Forms</a></li>
                    </ul>
                </div>
            </div>

            <div class="sidebar-category">
                <div class="category-title nav-link">
                    <a class="nav-link dropdown-toggle" data-bs-toggle="collapse" data-bs-target="#bootstrap-admin-panel-collapse" href="#" role="button" aria-expanded="false" aria-controls="bootstrap-admin-panel-collapse">Bootstrap Admin Panel</a>
                </div>

                <div class="category-content">

                    <ul id="bootstrap-admin-panel-collapse" class="navbar-nav flex-column py-0 collapse">
                        <li class="nav-item w-100"><a class="nav-link" href="#admin-panel-theme">Admin Panel Theme & colors</a></li>
                        <li class="nav-item w-100"><a class="nav-link" href="#admin-panel-access-protection-and-login">Access, protection and login</a></li>
                        <li class="nav-item w-100"><a class="nav-link" href="#admin-user-authentication-module">Admin User Authentication Module</a></li>
                        <li class="nav-item w-100"><a class="nav-link" href="#admin-panel-structure">Structure</a></li>
                        <li class="nav-item w-100"><a class="nav-link" href="#admin-panel-navbar">Main navigation</a></li>
                        <li class="nav-item w-100"><a class="nav-link" href="#admin-dashboard-code-samples">Admin Dashboard Code samples</a></li>
                        <li class="nav-item w-100"><a class="nav-link" href="#admin-panel-customization">Customization</a> </li>
                    </ul>
                </div>
            </div>

            <div class="sidebar-category">
                <div class="category-content">

                    <ul class="navbar-nav flex-column py-0">
                        <li class="nav-item"><a class="nav-link" href="#update">Update instructions</a></li>
                        <li class="nav-item"><a class="nav-link" href="#i18n">Languages/Translation (I18n)</a></li>
                        <li class="nav-item"><a class="nav-link" href="#php-form-builder">PHP Form Builder</a></li>
                        <li class="nav-item"><a class="nav-link" href="#sources-credits">Sources &amp; Credits</a></li>
                        <li class="nav-item"><a class="nav-link" href="#changelog">Changelog</a></li>
                    </ul>
                    <div class="py-5">&nbsp;</div>
                </div>
            </div>
        </nav>
        <!-- /main sidebar -->

        <div id="content-wrapper" class="container">

            <!-- https://www.phpcrudgenerator.com navbar -->

            <nav id="website-navbar" role="navigation" aria-label="main navigation" class="navbar navbar-light bg-white navbar-expand-md fixed-top shadow-sm">
                <div class="container-fluid">
                    <button class="sidebar-toggler btn btn-lg px-2 d-flex align-items-center shadow-none mx-2" aria-label="Toggle the secondary navigation bar"><i class="navbar-toggler-icon"></i></button>
                    <a class="navbar-brand" href="/">
                        <img src="assets/images/phpcg.svg" width="56" height="36" alt="PHPCG" title="PHP CRUD Generator - Home">
                    </a>
                    <button class="navbar-toggler" data-bs-toggle="collapse" data-bs-target="#navcol-1"><span class="sr-only">Toggle navigation</span><span class="navbar-toggler-icon"></span></button>
                    <div class="collapse navbar-collapse" id="navcol-1">

                        <ul class="nav navbar-nav phpcg-nav ms-auto">
                            <li class="nav-item" role="presentation">
                                <a class="nav-link" href="/" title="PHP CRUD Generator - Home">Home</a>
                            </li>
                            <li class="nav-item" role="presentation">
                                <a class="nav-link" href="/admin/home" title="Bootstrap Admin / CRUD Generator Demo">Demo</a>
                            </li>
                            <li class="nav-item" role="presentation">
                                <a class="nav-link active" href="/documentation/index" title="CRUD Generator Documentation">Documentation</a>
                            </li>
                            <li class="nav-item" role="presentation">
                                <a class="nav-link" href="/tutorials" title="CRUD Generator Tutorials ; Questions and answers"><span class="d-md-none d-lg-inline">CRUD </span>Tutorials<span class="d-md-none d-lg-inline"> / Q&A</span></a>
                            </li>
                            <li class="nav-item" role="presentation">
                                <a class="nav-link" href="/help-center" title="CRUD Generator Help Center">Help Center</a>
                            </li>
                            <li class="nav-item" role="presentation">
                                <a class="nav-link" href="/about" title="About PHP CRUD Generator">About</a>
                            </li>
                            <li class="nav-item" role="presentation">
                                <a class="btn btn-danger px-sm-2 px-md-3" href="https://1.envato.market/xabod" target="_blank" rel="noopener noreferrer" title="Buy PHPCG">Buy Now<span class="ms-2">
                                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512" width="20.25" height="18"><!--! Font Awesome Pro 6.2.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license (Commercial License) Copyright 2022 Fonticons, Inc. --><path fill="currentColor" d="M0 24C0 10.7 10.7 0 24 0H69.5c22 0 41.5 12.8 50.6 32h411c26.3 0 45.5 25 38.6 50.4l-41 152.3c-8.5 31.4-37 53.3-69.5 53.3H170.7l5.4 28.5c2.2 11.3 12.1 19.5 23.6 19.5H488c13.3 0 24 10.7 24 24s-10.7 24-24 24H199.7c-34.6 0-64.3-24.6-70.7-58.5L77.4 54.5c-.7-3.8-4-6.5-7.9-6.5H24C10.7 48 0 37.3 0 24zM128 464a48 48 0 1 1 96 0 48 48 0 1 1 -96 0zm336-48a48 48 0 1 1 0 96 48 48 0 1 1 0-96z"/></svg>
                                </span></a>
                            </li>
                        </ul>
                    </div>
                </div>
            </nav>
            <nav aria-label="breadcrumb">

                <ol id="documentation-breadcrumb" class="breadcrumb">
                    <li class="breadcrumb-item"><a href="/">Home</a></li>
                    <li class="breadcrumb-item active" aria-current="page">Documentation</li>
                </ol>
            </nav>

            <div id="users-info" class="alert alert-info my-5 alert-dismissible fade show has-icon d-none" role="alert">
                <p>The most recent version of the documentation is available at <a href="https://www.phpcrudgenerator.com/documentation/index">https://www.phpcrudgenerator.com/documentation/index</a></p>
                <p class="mb-0">PHP CRUD Generator offers many <a href="https://www.phpcrudgenerator.com/tutorials">PHP CRUD Tutorials</a>
                </p>
                <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
            </div>

            <section id="overview" class="pb-5">

                <h1 class="text-center display-3 mt-2 mb-3">PHP CRUD Generator - Documentation</h1>

                <p><abbr title="PHP CRUD Generator">PHPCG</abbr> is a CRUD Generator developed in pure PHP for building your complete <a href="https://www.phpcrudgenerator.com/admin/home">Bootstrap administration panel</a> using a <strong>visual <abbr title="User Interface">UI</abbr></strong>.</p>
                <p><span class="fw-bold">PHPCG</span> is suitable for both non-programmers and advanced PHP programmers, who will have access to <a href="#package-structure">clean and well-organized code</a> so they can take advantage of all its potential.</p>
                <p><span class="fw-bold">PHPCG</span> is able to analyze your database and extract tables, fields, and <a href="https://www.phpcrudgenerator.com/tutorials/how-to-manage-database-relations">any type of relationship</a> intelligently.</p>
                <p>The CRUD engine is based on PHP PDO and has full support for the following Relational Database Management Systems (RDBMS):</p>

                <ul class="list-group list-group-horizontal text-center mb-1">
                    <li class="list-group-item flex-fill">
                        <p class="h4">MySQL</p><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/assets/images/mysql.svg" data-fixed-width=true class="mh-100 mx-auto mx-md-4 my-3 my-md-0 cld-responsive" width="78" height="40" alt="MySQL">
                    </li>
                    <li class="list-group-item flex-fill">
                        <p class="h4">MariaDB</p><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/assets/images/mariadb-logo.svg" data-fixed-width=true class="mh-100 mx-auto mx-md-4 my-3 my-md-0 cld-responsive" width="80" height="40" alt="MariaDB">
                    </li>
                    <li class="list-group-item flex-fill">
                        <p class="h4">Oracle</p><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/assets/images/oracle-logo.svg" data-fixed-width=true class="mh-100 mx-auto mx-md-4 my-3 my-md-0 cld-responsive" width="110" height="40" alt="Oracle">
                    </li>
                </ul>

                <ul class="list-group list-group-horizontal text-center mb-4">
                    <li class="list-group-item flex-fill">
                        <p class="h4">Firebird</p><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/assets/images/firebird-logo.svg" data-fixed-width=true class="mh-100 mx-auto mx-md-4 my-3 my-md-0 cld-responsive" width="40" height="40" alt="Firebird">
                    </li>
                    <li class="list-group-item flex-fill">
                        <p class="h4">PostgreSQL</p><img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/assets/images/postgresql-logo.svg" data-fixed-width=true class="mh-100 mx-auto mx-md-4 my-3 my-md-0 cld-responsive" width="80" height="40" alt="PostgreSQL">
                    </li>
                </ul>

                <hr class="my-4">

                <p>You can then use the analyzed db data to generate your user administration panel:</p>

                <ul class="font-weight-light">
                    <li class="my-3"><strong>Paginated lists (CRUD READ)</strong>

                        <ul>
                            <li>record filtering, including with internal/external relational tables</li>
                            <li>sorting</li>
                            <li>advanced on-site editing (text, select, Boolean, date and time,...)</li>
                            <li>nested tables</li>
                            <li>external data tables (external relations)</li>
                            <li>export to Excel/CSV/PDF/PRINT formats</li>
                        </ul>
                    </li>

                    <li class="my-3"><strong>Create &amp; Update forms (CRUD CREATE/UPDATE)</strong>

                        <ul>
                            <li>forms built with PHP Form Builder, known for its robustness and reliability</li>
                            <li>All types of fields</li>
                            <li>Automatic integration of the best jQuery plugins to improve the user experience (custom select & radio, rich text editor, file uploader, pickers, ...)</li>
                            <li>dropdown lists with intelligent and customizable content</li>
                            <li>upload files/images with crop/resize and customizable thumbnail generation</li>
                            <li>automatic validation according to the type of customizable data</li>
                            <li>efficient and straightforward layout - Ability to group fields into 2 and 3 columns</li>
                        </ul>
                    </li>
                    <li class="my-3"><strong>Delete forms (CRUD DELETE)</strong>

                        <ul>
                            <li>Cascading Deleting Dependent Records</li>
                            <li>Display the number of dependent records that will be deleted</li>
                        </ul>
                    </li>
                </ul>

                <p class="h3 mt-5">Quick tips</p>

                <p>Here's a short <a href="https://www.phpcrudgenerator.com/tutorials/how-to-create-a-bootstrap-crud-admin-dashboard">presentation video</a> that shows how PHP CRUD Generator works from <em>A</em> to <em>Z</em>.</p>

                <p>To create your relational database we recommend you to take a look at:</p>

                <ul>
                    <li>The <a href="https://www.phpcrudgenerator.com/tutorials/requirements-and-good-practices">requirements and good practices</a></li>
                    <li>This <a href="https://www.phpcrudgenerator.com/tutorials/how-to-build-up-your-database-with-mysql-workbench">MySQL Workbench tutorial</a></li>
                    <li>This <a href="https://www.phpcrudgenerator.com/tutorials/build-your-queries-with-flyspeed-sql-query">Flyspeed SQL Query tutorial</a></li>
                </ul>
            </section>

            <section id="requirements" class="py-5">

                <h2 class="text-center text-secondary display-4 pt-3 mb-4">Requirements</h2>

                <h3>Server requirements</h3>

                <ul>
                    <li>PHP 7.4+ with PDO driver, <code>mb_string</code> and <code>curl</code> extensions enabled.<br>The PHP <code>curl</code> extension must be authorized to send requests to the licensing server.</li>
                    <li>Apache server with Rewrite module enabled<br><span class="fw-bold">OR</span><br>NGINX | Microsoft IIS server with <a href="https://www.phpcrudgenerator.com/tutorials/install-phpcg-on-nginx-and-microsoft-iis-server" title="Install PHPCG on NGINX or Microsoft IIS server">rewriting rules added in your configuration file</a></li>
                    <li>A MySQL, MariaDB, Oracle, Firebird or PostgreSQL database</li>
                    <li>The PHP and the database charsets must be set to "utf8" or variations of utf8 (utf8_general_ci, utf8mb4, ...)</li>
                </ul>

                <h3 class="mt-5">Database structure</h3>

                <h4>Naming of tables and fields</h4>
                <p>Your tables and fields must respect these standards:</p>

                <ul>
                    <li>Table and field names must contain only the following characters:

                        <ul>
                            <li>Lowercase / uppercase characters</li>
                            <li>Underscores</li>
                            <li>Numbers</li>
                        </ul>
                    </li>
                    <li>A table name or a field name must not begin with a number.</li>
                    <li>The field types must be correctly set with the data types they contain.</li>
                </ul>

                <p class="mb-5">Please visit the <a href="https://www.phpcrudgenerator.com/tutorials/requirements-and-good-practices">Database requirements and good practices</a> page for more details.</p>
            </section>

            <section id="package-structure" class="py-5">

                <h2 class="text-center text-secondary display-4 pt-3 mb-4">Package Structure</h2>

                <div class="tree">

                    <ul class="tree-list">
                        <li><a href="#" class="folder">your-project-root</a> <small class="text-muted ms-2">The project root is the folder to which the root URL points</small>

                            <ul class="tree-list">
                                <li>
                                    <a href="#" class="folder">admin<span class="text-danger fw-bold ms-1">*</span></a> <small class="text-muted ms-2">The target Bootstrap admin panel in which the CRUD files will be generated</small>

                                    <ul class="tree-list">
                                        <li><a href="#" class="folder">...</a> <small class="text-muted ms-2">Details available in the <a href="#admin-panel-structure">Bootstrap Admin Panel</a> section</small></li>
                                    </ul>
                                </li>
                                <li>
                                    <a href="#" class="folder">class<span class="text-danger fw-bold ms-1">*</span></a> <small class="text-muted ms-2">PHP Classes that may be used for your website as well as with the admin panel</small>

                                    <ul class="tree-list">
                                        <li><a href="#" class="folder">bootstrap</a> <small class="text-muted ms-2">Builds Bootstrap navbars, navs & sidebars</small></li>
                                        <li><a href="#" class="folder">common</a> <small class="text-muted ms-2">Miscellaneous utilities</small></li>
                                        <li><a href="#" class="folder">phpformbuilder</a> <small class="text-muted ms-2">The outstanding <a href="https://www.phpformbuilder.pro" target="_blank" rel="noopener noreferrer">PHP Form Builder</a></small></li>
                                    </ul>
                                </li>
                                <li><a href="#" class="folder">conf<span class="text-danger fw-bold ms-1">*</span></a> <small class="text-muted ms-2">Main configuration files</small></li>
                                <li><a href="#" class="folder">documentation</a> <small class="text-muted ms-2">PHPCG Documentation</small></li>
                                <li><a href="#" class="folder">generator<span class="text-danger fw-bold ms-1">*</span></a> <small class="text-muted ms-2">CRUD Generator engine</small></li>
                                <li><a href="#" class="folder">install<span class="text-danger fw-bold ms-1">*</span></a> <small class="text-muted ms-2">PHPCG Installer</small></li>
                                <li><a href="#" class="folder">vendor<span class="text-danger fw-bold ms-1">*</span></a> <small class="text-muted ms-2">Composer vendor files</small></li>
                            </ul>
                        </li>
                    </ul>
                </div>

                <p class="h5">Legend:</p>

                <dl class="d-flex">
                    <dt class="px-4"><span class="text-danger fw-bold">*</span></dt>
                    <dd>Required on your production server</dd>
                </dl>
            </section>

            <section id="quick-start" class="py-5">

                <h2 class="text-center text-secondary display-4 pt-3 mb-4">Quick Start</h2>

                <h3>About Local & Production workflow</h3>
                <div class="alert alert-info has-icon">
                    <p class="text-justify"><span class="fw-bold">The "generator" folder is only required to build &amp; edit your Bootstrap admin panel.</span></p>

                    <hr>

                    <ul class="list-expanded">
                        <li class="mb-4">
                            <span class="fw-bold">If you use a local server + a remote server ("production server"):</span><br>You can either:

                            <ul>
                                <li>use the local generator to create your admin panel, then upload the "admin" and "conf" folders to your remote server.</li>
                                <li>create the admin panel directly from your production server.</li>
                            </ul>
                            <span class="fw-bold pl-3">The 2nd way is the recommended method.</span>
                        </li>
                        <li>
                            <span class="fw-bold">If you do not use a local server:</span><br><span class="pl-3">Upload all the required folders and build your CRUD admin dashboard straight from the remote generator.</span>
                        </li>
                    </ul>

                    <p>Please visit the <a href="https://www.phpcrudgenerator.com/tutorials/how-to-use-phpcg-on-a-localhost-and-a-remote-server">tutorial about local/remote servers</a> for more information.</p>
                </div>

                <hr class="mb-4">

                <h3 class="mb-5">Installation process <a class="btn btn-sm btn-primary float-right ms-5" href="https://www.phpcrudgenerator.com/tutorials/how-to-install-php-crud-generator" target="_blank" rel="noopener noreferrer" role="button">Open the Tutorial <i class="fas fa-external-link-alt ms-2"></i></a></h3>

                <ol class="list-timeline">
                    <li class="d-flex align-items-start pb-4"><span class="badge bg-yellow-300 text-yellow-600 badge-circle mb-3">1</span>
                        <div class="timeline-content">
                            <p>Upload the <em>required<span class="text-danger fw-bold me-1">*</span></em> folders on your server as described in the "<a href="#package-structure">package structure</a>" section.</p>
                            <div class="alert alert-warning has-icon">

                                <p class="h4 text-danger">If you install PHP CRUD Generator inside a subfolder</p>
                                <p>(in other words, if the <em>admin</em>, <em>class</em>, <em>conf</em>, <em>generator</em>, ... folders are not at the root of your project),<br>you must edit <em>admin/.htaccess</em> to avoid 404 errors:</p>

                                <ol class="numbered">
                                    <li>open <code class="badge text-bg-secondary-200">/admin/.htaccess</code> in your code editor</li>
                                    <li>add your subfolder to the <code class="badge text-bg-secondary-200">RewriteRule</code>.<br>For instance: <code class="badge text-bg-secondary-200">RewriteRule . /your-folder/admin/index.php [QSA,L]</code></li>
                                </ol>
                            </div>
                        </div>
                    </li>
                    <li class="d-flex align-items-start pb-4"><span class="badge bg-yellow-400 text-yellow-700 badge-circle mb-3">2</span><span class="timeline-content"><a href="../install/index.php">Open the installer</a> - <code class="badge text-bg-secondary-200">install/index.php</code> - in your browser.<br><span class="text-danger">If you use a local server + a remote server, you must run the installer on both.<br>More information available in the <a href="#installation-registration">Installation/Registration</a> section</span><br>
                        <span class="text-muted">You'll have to enter your database connection settings for localhost or production server + essential general information.</span>
                        </span>
                    </li>
                    <li class="d-flex align-items-start"><span class="badge bg-yellow-500 text-yellow-800 badge-circle mb-3">3</span> <span class="timeline-content">All is now ready to generate your admin panel using the CRUD Generator.<br><a href="../generator/generator.php">Open the generator</a> - <code class="badge text-bg-secondary-200">generator/generator.php</code> - in your browser.</span> </li>
                </ol>
            </section>

            <section id="installation-registration" class="py-5">

                <h2 class="text-center text-secondary display-4 pt-3 mb-4"> Installation/Registration</h2>
                <div class="alert alert-info has-icon">
                    <p class="mb-0">If you use a local server + a remote server, <span class="fw-bold">you must run the installer on both</span>.</p>
                </div>

                <article>

                    <h3>What does the installer do?</h3>
                    <p class="mb-2">The installer:</p>

                    <ul>
                        <li>Tests your server compatibility <span class="text-muted">(PHP Version, available modules, white rights, ...)</span></li>
                        <li>Tests &amp; register your database connection credentials</li>
                        <li>Checks &amp; registers your license</li>
                        <li>Creates a MySQL table with your license settings</li>
                    </ul>
                </article>

                <article>

                    <h3>If you encounter any error</h3>

                    <p>As with any PHP program, you may encounter problems during installation or initial startup.<br>This does not mean that the program is broken, but rather that you need to configure your server properly to use it.</p>
                    <p>If it should happen:</p>

                    <ol>
                        <li>First of all, check that your server <a href="https://www.phpcrudgenerator.com/documentation/index#requirements">meets the requirements</a> (PHP version, rewriting enabled, ...)</li>
                        <li>All the <a href="https://www.phpcrudgenerator.com/help-center">common errors and fixes</a> are explained in the Help Center.</li>
                    </ol>

                    <p>If you still need help please <a href="https://www.phpcrudgenerator.com/help-center#asking-for-help">read these recommentations</a> then contact us.</p>

                </article>

                <article>

                    <h3>If you are looking for solutions to specific questions:</h3>
                    <p>The tutorials page offers many step-by-step guides, written or in video, which answer the most common situations, for example:</p>

                    <ul>
                        <li>An <a href="https://www.phpcrudgenerator.com/tutorials/how-to-create-a-bootstrap-crud-admin-dashboard">introduction video to PHP CRUD Generator</a></li>
                        <li>How to <a href="https://www.phpcrudgenerator.com/tutorials/requirements-and-good-practices">set up your database structure</a> (prerequisites and best practices)</li>
                        <li>An introduction to <a href="https://www.phpcrudgenerator.com/tutorials/build-your-queries-with-flyspeed-sql-query">Flyspeed SQL Query software</a></li>
                        <li>How to get organized for the <a href="https://www.phpcrudgenerator.com/tutorials/how-to-use-phpcg-on-a-localhost-and-a-remote-server">use on local and remote servers</a></li>
                        <li>Information about the <a href="https://www.phpcrudgenerator.com/tutorials/about-php-crud-generator-license">license terms</a></li>
                        <li>Questions about <a href="https://www.phpcrudgenerator.com/tutorials/mysql-self-join-joining-a-table-to-itself">joining a table to itself</a>, or having <a href="https://www.phpcrudgenerator.com/tutorials/my-sql-two-foreign-keys-pointing-to-the-same-table">two foreign keys pointing to one table</a></li>
                        <li>Generate your <a href="https://www.phpcrudgenerator.com/tutorials/generate-bootstrap-admin-create-update-forms">CRUD admin forms</a> or <a href="https://www.phpcrudgenerator.com/tutorials/how-to-add-links-to-custom-pages-in-the-navbar">add custom pages</a> to the admin dashboard and its navigation menu</li>
                        <li>...</li>
                    </ul>
                </article>
            </section>

            <section id="configuration" class="py-5">

                <h2 class="text-center text-secondary display-4 pt-3 mb-4">Configuration</h2>

                <article>
                    <div class="tree">

                        <ul class="tree-list">
                            <li><a href="#" class="folder">conf</a>

                                <ul class="tree-list">
                                    <li><a href="#" class="file">conf.php</a> <small class="text-muted ms-2">CORE configuration</small></li>
                                    <li><a href="#" class="file">user-conf.json</a> <small class="text-muted ms-2">USER configuration</small></li>
                                </ul>
                            </li>
                        </ul>
                    </div>

                    <h3>CORE configuration</h3>

                    <p>Don't change anything here unless you know what you're doing.</p>

                    <h3 class="mt-5">USER configuration (General Settings)</h3>

                    <p>This file contains some global settings that can be customized</p>
                    <p class="alert alert-info has-icon">To change these settings, open the Generator in your browser and click the <span>Configuration</span> tab.</p>

                    <h4>Project</h4>

                    <dl class="row border-bottom">
                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Website name</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">The name of your project displayed in the header of the admin dashboard.</dd>

                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Admin logo</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">Your project logo displayed in the header of the admin dashboard.</dd>
                    </dl>

                    <h4>Security</h4>

                    <dl class="row border-bottom">
                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Lock the Generator</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">Allows to lock/unlock the generator access.<br>If the generator is locked, access is protected by an identification page. You will need to enter your email &amp; your purchase code to access it.</dd>
                    </dl>

                    <h4>Debugging</h4>

                    <dl class="row border-bottom">
                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Display the database errors</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">Choose "Yes" to display the details when a database query encounters an error.</dd>

                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Simulate and debug</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">If enabled, all the insert/update/delete queries will be simulated (NOT executed), and the details of all the database queries will be displayed on screen.</dd>
                    </dl>

                    <h4>Styles</h4>

                    <dl class="row border-bottom">
                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Bootstrap theme</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">Select one of the many themes available in the dropdown list.</dd>

                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Navbar style</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">Style of the admin dashboard's top navigation menu.</dd>

                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Sidebar style</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">Style of the admin dashboard's sidebar.</dd>

                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">CSS class of the filtered columns</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">In the admin dashboard, the filtered columns are marked with a specific style of your choice. Here you can enter a Bootstrap CSS class and adjust the opacity. For example: <code class="language-php">bg-danger bg-opacity-10</code></dd>

                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Date & Time pickers style</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">Style of the date and time pickers ("Default" or "Material Design").</dd>

                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Default Buttons class</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">Bootstrap CSS class for the admin panel secondary buttons. For example: <code class="language-php">text-bg-light</code></dd>

                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Default Table headings background</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">Bootstrap CSS class for the admin panel table headings. For example: <code class="language-php">text-bg-dark</code></dd>
                    </dl>

                    <h4>User Interface (UI)</h4>

                    <dl class="row border-bottom">
                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Admin ACTION buttons position</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">Choose whether you want to display the record editing buttons (view/edit/delete) on the left or right in the admin READ lists.</dd>

                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Enable the ability to change styles from the admin dashboard</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">If enabled, each user can choose their theme and navigation bar colours.
                            Their preferences are stored in the browser and do not affect the other users.</dd>

                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Enable filters</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">When a user of the admin panel sets a filter, the filter can be applied immediately, or after a click on the "filter" button, as you wish.</dd>

                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Collapse inactive sidebar categories</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">Choose whether you want the admin sidebar to behave like an accordion menu or whether several categories can remain unfolded at the same time.</dd>

                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Display of data tables</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">Choose whether you want to display the table data in the visible part of the page with an internal scroll bar, or in a table of unlimited height using the browser scroll bar.</dd>

                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Show search results</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">Show the search results all on the same page, or using paginated results.</dd>

                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Password constraint for new users accounts</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">Choose the minimum security level for admin user passwords.</dd>
                    </dl>

                    <h4>Language settings</h4>

                    <dl class="row border-bottom">
                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Language</span> </dt>
                        <dd class="col-sm-8 pb-4 mb-2">The main language of the admin dashboard.
                        </dd>

                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Date/Time translation for Admin lists</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">Sets the PHP <code class="language-php">Locale::setDefault</code> to auto-translate PHP dates</dd>

                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Timezone</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">Your time zone</dd>

                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Date & Time pickers language</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">The available languages are located in <code class="language-php">class/phpformbuilder/plugins/pickadate/lib/compressed/translations/</code></dd>

                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Live (JavaScript) form validation language</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">The available languages are located in <code class="language-php">class/phpformbuilder/plugins/formvalidation/js/locales</code></dd>

                        <dt class="col-sm-4 pb-4 mb-2">
                            <span class="badge text-bg-secondary-200 text-wrap">Server-side (PHP) form validation language</span>
                        </dt>
                        <dd class="col-sm-8 pb-4 mb-2">Refer to PHP Form Builder's documentation here: <a href="https://www.phpformbuilder.pro/documentation/class-doc.php#php-validation-multilanguage" target="_blank">https://www.phpformbuilder.pro/documentation/class-doc.php#php-validation-multilanguage <i class="fas fa-up-right-from-square append"></i></a>
                        </dd>
                    </dl>
                </article>
            </section>

            <section id="crud-generator" class="py-5">

                <h2 class="text-center text-secondary display-4 pt-3 mb-4">CRUD Generator</h2>

                <article id="protect-access">

                    <h3>Protect access to the Generator with a login page</h3>
                    <p>To protect access to the generator:</p>

                    <ol>
                        <li>Open the Generator - generator/generator.php - in your browser</li>
                        <li>Open the <span class="btn btn-info btn-sm">Configuration</span> tab</li>
                        <li>Set <code class="language-php">Lock the Generator</code> to <em>Yes</em></li>
                        <li>Done - when you open <span class="badge text-bg-secondary-200 text-wrap">generator/generator.php</span> in your browser. You'll be redirected to the login page.<br>Enter your registration email &amp; your purchase code to log in.</li>
                    </ol>

                    <hr>
                </article>

                <article id="main-panel">

                    <h3>Main Panel</h3>
                    <p>When you open the CRUD Generator, the application gives you access to all its main features.</p>
                    <p>Choose the table you want to configure, then click one of the three available buttons to create or edit your admin <em>Read</em> List, <em>Create/Update</em> Forms or <em>Delete</em> Form for the chosen table.</p>
                    <p>The main page of the application also gives access to the <a href="https://www.phpcrudgenerator.com/tutorials/authentication-module-installation">installation of the authentication module</a>, the <a href="https://www.phpcrudgenerator.com/tutorials/regenerate-lists-forms-which-have-been-customized">file comparison/merge tool</a>, the <a href="https://www.phpcrudgenerator.com/tutorials/organize-customize-the-admin-navbar">organization of the admin navigation bar</a> and the global configuration.</p>
                    <div class="phpcg-screenshot img-thumbnail img-fluid">
                        <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/documentation/assets/images/phpcg-doc-generator-main-screen.png" data-ratio="1.89792" class="cld-responsive" loading="lazy" alt="PHP CRUD Generator Main screen" id="phpcg-generator-main-screen">
                    </div>

                    <hr>
                </article>

                <article id="read-lists">

                    <h3>Read Lists</h3>
                    <p>From this tab you can set everything you need to generate the Read list of the selected table.<br>For more information please see this tutorial, which shows step by step how to <a href="https://www.phpcrudgenerator.com/tutorials/generate-bootstrap-admin-list-view">create the Read Lists of your admin dashboard</a>.</p>
                    <div class="phpcg-screenshot img-thumbnail img-fluid">
                        <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/documentation/assets/images/phpcg-doc-generator-paginated-lists.png" data-ratio="0.497152" class="cld-responsive" loading="lazy" alt="PHP CRUD Generator Read Lists" id="phpcg-generator-read-list-form">
                    </div>

                    <hr>
                </article>

                <article id="lists-filters">

                    <h3>Lists filters</h3>
                    <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/documentation/assets/images/phpcg-filters.png" data-ratio="1.581028" alt="Add Filter" class="cld-responsive img-thumbnail img-fluid mb-4" loading="lazy">
                    <p>Click the "<a href="#spot-add-filter">Add Filter</a>" button in the Read Lists generator form to add a new filter.</p>
                    <p>It will add a new filter to your list.</p>
                    <p class="fw-bold">PHPCG offers you two types of filters:</p>

                    <h4>Simple filters</h4>
                    <p class="ms-3">You just have to choose the field to filter in the dropdown list.</p>

                    <h4>Advanced filters</h4>
                    <div class="ms-3">
                        <p>Advanced filters are useful:</p>

                        <ul>
                            <li>if you want to display two or more values in the admin dropdown list.<br>for example, the first and last names are displayed, and the filtered value is the ID.</li>
                            <li>if you want to filter values from external relationships.</li>
                        </ul>
                        <p>To use advanced filters, it is necessary to enter query parameters with joins.</p>
                        <p>A help button is available to help you build your query, as well as a preview button that allows you to view the generated dropdown list and check its validity.</p>
                        <p>You'll find here a tutorial which shows <a href="https://www.phpcrudgenerator.com/tutorials/add-filters-to-bootstrap-admin-list-view">how to deal with filters</a>.</p>
                        <p class="alert alert-info has-icon">To build your requests, we recommend the excellent software <a href="https://www.phpcrudgenerator.com/tutorials/build-your-queries-with-flyspeed-sql-query">FlySpeed SQL Query</a>.</p>
                    </div>

                    <hr>
                </article>

                <article id="create-update-forms">

                    <h3>Create/Update Forms</h3>
                    <p class="alert alert-warning has-icon">Always build the list view first, and then the forms.</p>
                    <div class="phpcg-screenshot img-thumbnail">
                        <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/documentation/assets/images/phpcg-doc-generator-create-update-forms.png" data-ratio="0.213333" class="cld-responsive img-fluid" loading="lazy" alt="PHPCG Create/Update Forms" id="phpcg-generator-create-update-form">
                        <p>Detailed explanations are available in the <a href="https://www.phpcrudgenerator.com/tutorials/generate-bootstrap-admin-create-update-forms"><em>create/update forms</em> tutorial</a>.</p>
                    </div>

                    <hr>
                </article>

                <article id="delete-forms">

                    <h3>Delete Forms</h3>
                    <p class="alert alert-warning has-icon">Always build the list view first, and then the forms.</p>
                    <div class="phpcg-screenshot img-thumbnail">
                        <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/documentation/assets/images/phpcg-doc-generator-delete-forms.png" data-ratio="1.315068" class="cld-responsive" loading="lazy" alt="PHPCG Delete Forms" id="phpcg-generator-delete-form">
                    </div>
                    <p>Detailed explanations are available in the <a href="https://www.phpcrudgenerator.com/tutorials/generate-bootstrap-admin-delete-form"><em>Delete forms</em> tutorial</a>.</p>

                    <hr>
                </article>
            </section>

            <section id="bootstrap-admin-panel" class="py-5">

                <h2 class="text-center text-secondary display-4 pt-3 mb-4">Bootstrap Admin Panel</h2>

                <article id="admin-panel-theme" class="py-4">

                    <h3>Admin Panel Theme & colors</h3>

                    <p>You can choose the Bootstrap theme and navigation bar colors from the Configuration tab of the CRUD Generator.</p>
                    <p>Each user of the admin dashboard can then choose individually, from the admin and according to his preferences, his preferred theme and colors, which will only be applied in his own browser (stored as cookies).</p>

                    <h4>Bootstrap themes &amp; CSS</h4>
                    <p>If you are a developer and use Gulp + SASS, the source files are available, ready to use and well organised:</p>
                    <p><strong>SASS</strong> users: all SASS sources are available</p>

                    <p><strong>Gulp</strong> users: Download <a href="https://github.com/migliori/php-crud-generator-gulp" title="Gulp tasks for PHP CRUD Generator" target="_blank" rel="noopener noreferrer">PHP CRUD Generator Gulp on Github</a> to edit and compile your SCSS source files</p>

                    <p>Please refer to this tutorial about the <a href="https://www.phpcrudgenerator.com/tutorials/how-to-customize-the-bootstrap-admin-panel-css">Admin Dashboard customization</a>.</p>
                </article>

                <article id="admin-panel-access-protection-and-login" class="py-4">

                    <h3>Access, protection and login</h3>
                    <p>As long as you have not installed and activated the <a href="#admin-user-authentication-module">authentication module</a> (login), <strong>the admin panel access is public</strong>.</p>
                    <p>To enter the admin panel, open <span class="badge text-bg-secondary-200 text-wrap">/admin/home</span></p>
                    <p>If you encounter a <span class="fw-bold">404 error</span>, you'll find the cause and solution in the <a href="https://www.phpcrudgenerator.com/help-center#error-404">Help center</a>.</p>
                    <p>If you try to log in at <span class="badge text-bg-secondary-200 text-wrap">/admin/login</span> it'll logically fail because the authentication module is not yet installed.</p>
                    <p><a href="https://www.phpcrudgenerator.com/tutorials/authentication-module-installation">The authentication module must be installed at the end of the process</a>, when you have built all your READ lists &amp; forms with the generator.</p>
                </article>

                <article id="admin-user-authentication-module" class="py-4">

                    <h2 class="text-center text-secondary display-4 pt-3 mb-4">Admin User Authentication Module</h2>

                    <h3>Installing the Admin User Authentication Module</h3>
                    <p class="alert alert-info has-icon">The User Authentication Module installer allows you to <a href="https://www.phpcrudgenerator.com/tutorials/user-profiles-and-rights">configure the rights access to the admin elements</a>.<br><strong>It should therefore be installed last after having created all the elements of the CRUD</strong>.</p>
                    <p>Open the generator in your browser, then click the "<span class="btn btn-info btn-sm">Authentication Module</span>" tab.</p>
                    <p>The installer will create the <span class="fw-bold">users</span> and the <span class="fw-bold">users_profiles</span> tables</p>
                    <p>You will also have to enter the main administrator information.</p>
                    <p>The main administrator can then manage users and profiles in the admin panel.</p>
                    <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="/documentation/assets/images/phpcg-auth-module-installer.png" width="500" data-fixed-width="true" alt="phpcg authentication module installer" class="img-thumbnail cld-responsive mb-5" loading="lazy">

                    <h3 id="reinstall-the-authentication-module">Reinstall/Update the Admin User Authentication Module</h3>
                    <p>If you add some tables to your admin panel after having installed the User Authentication Module, you'll have to update the <span class="badge bg-info">users_profiles</span> table.</p>

                    <p><strong>For that purpose, you have two possibilities:</strong></p>

                    <h4>1 - reinstall with the automatic installer</h4>

                    <ul class="mb-5">
                        <li>Disable the module from the generator<br><img data-src="/documentation/assets/images/disable-auth-module.png" width="500" height="214" data-fixed-width="true" alt="Disable the module from the generator" class="img-thumbnail cld-responsive mb-5" loading="lazy"></li>
                        <li>Uninstall the module from the generator<br><img data-src="/documentation/assets/images/uninstall-auth-module.png" width="500" height="248" data-fixed-width="true" alt="Uninstall the module from the generator" class="img-thumbnail cld-responsive mb-5" loading="lazy"></li>
                        <li>Delete <span class="badge bg-info">admin/secure/install/install.lock</span> from your server</li>
                        <li>Delete the "<strong>users</strong>" table and the "<strong>users_profiles</strong>" table from your database.</li>
                        <li>Relaunch the installer and follow the process</li>
                    </ul>

                    <h4>2 - Update with a simple SQL query</h4>
                    <p>When you install/reinstall the authentication module, the <span class="badge bg-info">users_profiles</span> table used by PHP CRUD Generator to manage user rights is modified. For each <em>table</em> of your database used in the admin panel, four fields are created:</p>

                    <ul>
                        <li>read_<em>table</em></li>
                        <li>update_<em>table</em></li>
                        <li>create_delete_<em>table</em></li>
                        <li>constraint_query_<em>table</em></li>
                    </ul>

                    <p>Instead of using the automatic installer, you can add the four fields with a simple MySQL query.<br>The result will be exactly the same as using the installer.</p>
                    <p>Copy / paste the query below into your database management interface (ie: phpmyadmin) to add the four fields to the <span class="badge text-bg-secondary-200 text-wrap">users_profiles</span> table.</p>
                    <p>Replace <span class="badge text-bg-secondary-200 text-wrap">users_profiles</span> with your <span class="badge text-bg-secondary-200 text-wrap">users_profiles</span> table name, which may have a prefix.</p>
                    <p>Replace <span class="badge text-bg-secondary-200 text-wrap">_table</span> with the name of the table that you want to add to the authentication module.</p>
                    <pre class="language-php"><code class="language-php">ALTER TABLE `users_profiles`
    ADD `r_table` BOOLEAN NOT NULL DEFAULT TRUE AFTER `profile_name`,
    ADD `u_table` BOOLEAN NOT NULL DEFAULT TRUE AFTER `r_table`,
    ADD `cd_table` BOOLEAN NOT NULL DEFAULT TRUE AFTER `u_table`,
    ADD `cq_table` VARCHAR(255) NULL DEFAULT '' AFTER `cd_table`;</code></pre>
                </article>

                <article id="admin-panel-structure" class="py-4">

                    <h3>Structure</h3>
                    <div class="tree mb-4">

                        <ul class="tree-list">
                            <li><a href="#" class="folder">your-project-root</a>

                                <ul class="tree-list">
                                    <li>
                                        <a href="#" class="folder">admin</a> <small class="text-muted ms-2">The target Bootstrap admin panel in which the CRUD files will be generated</small>

                                        <ul class="tree-list">
                                            <li><a href="#" class="folder">assets</a> <small class="text-muted ms-2">css, js & images</small></li>
                                            <li>
                                                <a href="#" class="folder">class</a> <small class="text-muted ms-2"></small>

                                                <ul class="tree-list">
                                                    <li><a href="#" class="folder">altorouter</a> <small class="text-muted ms-2">The main router</small></li>
                                                    <li><a href="#" class="folder">crud</a> <small class="text-muted ms-2">CRUD elements classes generated by PHPCG</small></li>
                                                    <li><a href="#" class="folder">export</a> <small class="text-muted ms-2">xls & csv export class</small></li>
                                                </ul>
                                            </li>
                                            <li><a href="#" class="folder">crud-data</a> <small class="text-muted ms-2">CRUD json files generated by PHPCG (filter & select data)</small></li>
                                            <li><a href="#" class="folder">i18n</a> <small class="text-muted ms-2">Translation files</small></li>
                                            <li>
                                                <a href="#" class="folder">inc</a> <small class="text-muted ms-2"></small>

                                                <ul class="tree-list">
                                                    <li><a href="#" class="folder">forms</a> <small class="text-muted ms-2">The Create/Read/Delete forms generated by PHPCG</small></li>
                                                    <li><a href="#" class="file">...</a> <small class="text-muted ms-2">Other files for internal use</small>
                                                    </li>
                                                </ul>
                                            </li>
                                            <li><a href="#" class="folder">secure</a> <small class="text-muted ms-2">The authentication module</small></li>
                                            <li><a href="#" class="folder">templates</a> <small class="text-muted ms-2">The lists TWIG templates generated by PHPCG</small></li>
                                            <li><a href="#" class="file">.htaccess</a> <small class="text-muted ms-2"></small></li>
                                            <li><a href="#" class="file">404.html</a> <small class="text-muted ms-2"></small></li>
                                            <li><a href="#" class="file">data-forms.php</a> <small class="text-muted ms-2"></small></li>
                                            <li><a href="#" class="file">data-list.php</a> <small class="text-muted ms-2"></small></li>
                                            <li><a href="#" class="file">home.php</a> <small class="text-muted ms-2"></small></li>
                                            <li><a href="#" class="file">index.php</a> <small class="text-muted ms-2"></small></li>
                                            <li><a href="#" class="file">login.php</a> <small class="text-muted ms-2"></small></li>
                                            <li><a href="#" class="file">logout.php</a> <small class="text-muted ms-2"></small></li>
                                        </ul>
                                    </li>
                                </ul>
                            </li>
                        </ul>
                    </div>

                    <p>Please visit following page to view <a href="https://www.phpcrudgenerator.com/tutorials/admin-panel-tree-structure-files-and-logic">the detailed application logic and the admin folder structure</a>.</p>
                </article>

                <article id="admin-panel-navbar" class="py-4">

                    <h3>Main navigation</h3>
                    <p>The navbar is organized into <span class="fw-bold">categories</span> and <span class="fw-bold">elements</span>.</p>

                    <p>Each element represents a table in the database and gives access to the page of the <span class="fw-bold">MySQL data table</span> (READ List).</p>

                    <p>Users can <span class="fw-bold">create, edit, delete categories</span>, <span class="fw-bold">organize them by drag-and-drop</span>, and <span class="fw-bold">organize elements</span> in the same way.</p>

                    <p>The interface also allows you to <span class="fw-bold">choose an icon</span> for each element.</p>

                    <p>Access to the navbar management interface is via the CRUD Generator, button "<em>Organize Navbar</em>".</p>

                    <div class="row">
                        <div class="col col-md-6">
                            <img src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" ci-src="documentation/assets/images/phpcg-doc-generator-organize-navbar.png" ci-ratio="0.981002" class="img-thumbnail img-fluid mb-5" loading="lazy" alt="Organize the Bootstrap Dashboard Navbar">
                        </div>
                    </div>

                    <p>The information is recorded in a simple <span class="fw-bold">JSON file</span>: <span class="badge text-bg-secondary-200 text-wrap">php-crud-generator/admin/crud-data/nav-data.json</span></p>

                    <p>This file can be edited manually. It is not necessary to go through the interface.</p>
                    <p>Everything is explained in details here in the <a href="https://www.phpcrudgenerator.com/tutorials/organize-customize-the-admin-navbar">admin navbar tutorial</a>.</p>
                </article>

                <article id="admin-dashboard-code-samples" class="py-4">

                    <h3>Bootstrap Dashboard Code samples</h3>
                    <p class="lead">The coders will probably appreciate having a preview of the codes of the admin panel files generated by PHPCG</p>
                    <p class="lead">Here are some code samples:</p>

                    <h4>Table READ List - PHP Object</h4>
                    <p>This is the main PHP Class that gets the records from the database and builds all the values</p>
                    <button class="btn btn-primary" type="button" data-bs-toggle="collapse" data-bs-target="#php-main-class-code-sample" aria-expanded="false" aria-controls="php-main-class-code-sample">Show / Hide the PHP code</button>
                    <div class="collapse" id="php-main-class-code-sample">
                        <pre><code class="language-php">&lt;?php
    namespace crud;

    use common\Utils;
    use phpformbuilder\database\Mysql;
    use phpformbuilder\database\Pagination;
    use secure\Secure;

    class Actor extends Elements
    {

        // item name passed in url
        public $item;

        // item name dispolayed
        public $item_label;

        // associative array : field =&gt; field displayed name
        public $fields;

        // external relations
        public $external_tables_count = 1;
        public $external_fields_count;
        public $external_rows_count;
        public $external_fields = array();

        // primary key passed to create|edit|delete
        public $primary_key; // primary key fieldname
        public $primary_key_alias; // primary key alias for query

        // CREATE rights
        public $can_create = false;

        // authorized primary keys for restricted updates
        public $authorized_update_pk = array();

        public $pk = array(); // primary key values for each row
        public $actor_id = array();
        public $first_name = array();
        public $last_name = array();
        public $last_update = array();

        public $export_data_button;
        public $filtered_columns = '';
        public $filters_form;
        public $join_query       = '';
        public $pagination_html;
        public $records_count;
        public $select_number_per_page;
        public $sorting;
        public $url;

        public function __construct($element)
        {
            $this-&gt;table             = $element-&gt;table;
            $this-&gt;item              = $element-&gt;item;
            $this-&gt;item_label        = $element-&gt;item_label;
            $this-&gt;primary_key       = $element-&gt;primary_key;
            $this-&gt;primary_key_alias = $element-&gt;primary_key;
            $this-&gt;select_data       = $element-&gt;select_data;
            $this-&gt;fields            = $element-&gt;fields;

            $table = $this-&gt;table;

            if (file_exists(ADMIN_DIR . 'crud-data/' . $this-&gt;item . '-filter-data.json')) {
                $json = file_get_contents(ADMIN_DIR . 'crud-data/' . $this-&gt;item . '-filter-data.json');
                $filters_array = json_decode($json, true);
            }
            $this-&gt;url        = $_SERVER['REQUEST_URI'];
            $qry_start        = 'SELECT `actor`.`actor_id`, `actor`.`first_name`, `actor`.`last_name`, `actor`.`last_update` FROM actor';

            // restricted rights query
            $qry_restriction = '';
            if (Secure::canReadRestricted($table)) {
                $qry_restriction = Secure::getRestrictionQuery($table);
            }

            // filters
            $filters           = new ElementsFilters($table, $filters_array, $this-&gt;join_query);
            $filters_where_qry = $filters-&gt;returnWhereQry();
            if (!empty($qry_restriction)) {
                $filters_where_qry = str_replace('WHERE', 'AND', $filters_where_qry);
            }

            if (isset($_SESSION['filtered_columns']) && is_array($_SESSION['filtered_columns'])) {
                $this-&gt;filtered_columns = implode(', ', $_SESSION['filtered_columns']);
            }
            $this-&gt;filters_form = $filters-&gt;returnForm($this-&gt;url);

            $active_filters_join_queries = array();

            // Get join queries from active filters
            $active_filters_join_queries = $filters-&gt;buildElementJoinQuery();

            // sorting query
            $this-&gt;sorting = ElementsUtilities::getSorting($table, $this-&gt;primary_key, 'ASC');
            $qry_sorting   = " ORDER BY" . $this-&gt;sorting;

            $db = new Pagination();
            $pagination_url = $_SERVER['REQUEST_URI'];
            if (isset($_POST['npp']) && is_numeric($_POST['npp'])) {
                $_SESSION['npp'] = $_POST['npp'];
            } elseif (!isset($_SESSION['npp'])) {
                $_SESSION['npp'] = 20;
            }

            // echo $qry_start . $qry_restriction . $active_filters_join_queries . $filters_where_qry . $qry_sorting;
            $this-&gt;pagination_html = $db-&gt;pagine($qry_start . $qry_restriction . $active_filters_join_queries . $filters_where_qry . $qry_sorting, $_SESSION['npp'], 'p', $pagination_url, 5, true, '/', '');

            $this-&gt;records_count = $db-&gt;rowCount();
            $primary_key = $this-&gt;primary_key_alias;
            if (!empty($this-&gt;records_count)) {
                while (!$db-&gt;endOfSeek()) {
                    $row = $db-&gt;row();
                    $this-&gt;pk[] = $row-&gt;$primary_key;
                    $this-&gt;actor_id[]= $row-&gt;actor_id;
                    $this-&gt;first_name[]= $row-&gt;first_name;
                    $this-&gt;last_name[]= $row-&gt;last_name;
                    $this-&gt;last_update[]= $row-&gt;last_update;
                }
            }

            // CREATE/DELETE rights
            if (Secure::canCreate($table) || Secure::canCreateRestricted($table) === true) {
                $this-&gt;can_create = true;
            }

            // restricted UPDATE rights
            if (Secure::canUpdateRestricted($table) === true) {
                $transition = 'WHERE';
                if (!empty($filters_where_qry)) {
                    $transition = 'AND';
                }

                // get authorized update primary keys
                $qry_start .= Secure::getRestrictionQuery($table, $transition);
                $db = new Pagination();
                $pagination_html = $db-&gt;pagine($qry_start . $filters_where_qry . $qry_sorting, $_SESSION['npp'], 'p', $pagination_url, 5, true, '/', '');
                $records_count = $db-&gt;rowCount();
                $primary_key = $this-&gt;primary_key_alias;
                if (!empty($records_count)) {
                    while (!$db-&gt;endOfSeek()) {
                        $row = $db-&gt;row();
                        $this-&gt;authorized_update_pk[] = $row-&gt;$primary_key;
                    }
                }
            } elseif (Secure::canUpdate($table) === true || Secure::canUpdateRestricted($table) === true) {
                // user can update ALL records
                $this-&gt;authorized_update_pk = $this-&gt;pk;
            }

            /* external relations */

            for ($i=0; $i &lt; count($this-&gt;pk); $i++) {
                $this-&gt;external_rows_count[$i] = array();
                $this-&gt;external_fields[$i] = array();
                $db = new Mysql();
                        // actor =&gt; film_actor =&gt; film
                    $qry = 'SELECT film.film_id, film.title, film.description, film.release_year FROM actor INNER JOIN `film_actor`
                ON `film_actor`.`actor_id`=`actor`.`actor_id` INNER JOIN `film`
                ON `film_actor`.`film_id`=`film`.`film_id` WHERE actor.' . $this-&gt;primary_key . ' = ' . $this-&gt;pk[$i];
                $db-&gt;query($qry);
                $this-&gt;external_rows_count[$i][] = $db-&gt;rowCount();
                $ext_fields = array(
                    'table'       =&gt; 'film',
                    'table_label' =&gt; 'film',
                    'uniqid'      =&gt; 'f-' . uniqid(),
                    'fields'      =&gt; array(
                            'title' =&gt; array(),
                            'description' =&gt; array(),
                            'release_year' =&gt; array()
                        )
                );
                if (!empty($this-&gt;external_rows_count[$i])) {
                    while (! $db-&gt;endOfSeek()) {
                        $row = $db-&gt;row();
                        $ext_fields['fields']['title'][]  = $row-&gt;title;
                        $ext_fields['fields']['description'][]  = $row-&gt;description;
                        $ext_fields['fields']['release_year'][]  = $row-&gt;release_year;
                        $ext_fields['fields']['action'][]  = '&lt;div class="btn-group"&gt;&lt;a href="film_actor/edit/' . $row-&gt;film_id . '" class="btn btn-xs btn-warning legitRipple" title="View" data-popup="tooltip" data-delay="500"&gt;&lt;span class="fas fa-pencil-alt"&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href="film_actor/delete/' . $row-&gt;film_id . '" class="btn btn-xs btn-danger legitRipple" title="Delete" data-popup="tooltip" data-delay="500"&gt;&lt;span class="fas fa-times-circle"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;';
                    } // end while
                } // end if
                $this-&gt;external_fields[$i][] = $ext_fields;
            } // end for
            $this-&gt;external_fields_count = count($this-&gt;external_fields);

            // Export data button
            $this-&gt;export_data_button = ElementsUtilities::exportDataButtons($table, 'SELECT * FROM ' . $table . ' ORDER BY ' . $this-&gt;primary_key . ' ASC', 'excel, csv');

            // number/page
            $numbers_array = array(5, 10, 20, 50, 100, 200, 10000);
            $this-&gt;select_number_per_page = ElementsUtilities::selectNumberPerPage($numbers_array, $_SESSION['npp'], $this-&gt;url);
        }
    }
                        </code></pre>
                    </div>

                    <hr class="my-5">

                    <h4>Table READ List - TWIG Template</h4>
                    <p>Once the PHP Object has been built, the view is built with the help of a clean <strong>TWIG template</strong>:</p>
                    <button class="btn btn-primary" type="button" data-bs-toggle="collapse" data-bs-target="#php-twig-template-code-sample" aria-expanded="false" aria-controls="php-twig-template-code-sample">Show / Hide the PHP code</button>
                    <div class="collapse" id="php-twig-template-code-sample">
                        <pre><code class="language-php">    &lt;div class="card {{ constant('DEFAULT_CARD_CLASS') }} me-4"&gt;
            &lt;div class="card-header d-lg-flex flex-wrap justify-content-between {{ constant('DEFAULT_CARD_HEADING_CLASS') }}"&gt;
                {% if object.records_count &gt; 0 %}

                &lt;div class="d-flex ms-auto order-lg-2"&gt;
                    {{ object.select_number_per_page|raw }}
                &lt;/div&gt;

                &lt;hr class="w-100 d-lg-none"&gt;

                {% endif %}
                &lt;div class="d-flex order-lg-0 mb-3 mb-sm-0"&gt;
                    {% if object.can_create == true %}
                    &lt;a href="{{ constant('ADMIN_URL') }}{{ object.item }}/create" class="btn btn-sm me-1 btn-primary d-flex align-items-center legitRipple"&gt;&lt;i class="{{ constant('ICON_PLUS') }} position-left"&gt;&lt;/i&gt;{{ constant('ADD_NEW') }}&lt;/a&gt;
                    {% endif %}
                    {% if object.records_count &gt; 0 %}
                    {{ object.export_data_button|raw }}
                    {% endif %}
                &lt;/div&gt;

                &lt;div class="order-lg-1 mx-lg-auto"&gt;
                    &lt;form name="rp-search-form" id="rp-search-form" action="" class="form-inline justify-content-center"&gt;
                        &lt;div class="form-group"&gt;
                            &lt;div class="input-group"&gt;
                                &lt;div id="rp-search-field" class="dropdown input-group-prepend"&gt;
                                    &lt;a class="dropdown-toggle pl-4 pr-3 rounded-left border-left border-top border-bottom" id="search-dropdown-link" data-bs-toggle="dropdown" aria-haspopup="true"
                                            aria-expanded="false"&gt;&lt;/a&gt;
                                    &lt;div class="dropdown-menu" aria-labelledby="search-dropdown-link"&gt;
                                        {% for field_name, field_display_name in object.fields %}
                                        {% set active = '' %}
                                        {% if field_name == attribute(session.rp_search_field, object.table) %}
                                        {% set active = ' active' %}
                                        {% endif %}
                                        &lt;a class="dropdown-item{{ active }}" href="#" data-value="{{ field_name }}"&gt;{{ field_display_name }}&lt;/a&gt;
                                        {% endfor %}
                                    &lt;/div&gt;
                                &lt;/div&gt;
                                {% set search_value = '' %}
                                {% if attribute(session.rp_search_string, object.table) is defined %}
                                {% set search_value = attribute(session.rp_search_string, object.table) %}
                                {% endif %}
                                &lt;input id="rp-search" name="rp-search" type="text" value="{{ search_value }}" placeholder="{{ constant('SEARCH') }}" class="form-control flex-grow-1"&gt;
                                &lt;div class="input-group-append"&gt;
                                    &lt;button id="rp-search-submit" class="btn btn-secondary ladda-button" data-style="zoom-in" type="submit"&gt;&lt;span class="ladda-label"&gt;&lt;i class="{{ constant('ICON_SEARCH') }}"&gt;&lt;/i&gt;&lt;/span&gt;&lt;/button&gt;
                                &lt;/div&gt;
                            &lt;/div&gt;
                        &lt;/div&gt;
                    &lt;/form&gt;
                &lt;/div&gt;

            &lt;/div&gt;

            {# Partial block list - rendered alone on the research results #}
            {% block object_list %}

            &lt;div id="{{ object.item }}-list"&gt;

            {% if object.records_count &gt; 0 %}

                &lt;div class="table-responsive"&gt;
                    &lt;table class="table table-striped table-condensed table-data"&gt;
                        &lt;thead&gt;
                            &lt;tr class="{{ constant('DEFAULT_TABLE_HEADING_BACKGROUND') }}"&gt;
                                {% if constant('ADMIN_ACTION_BUTTONS_POSITION') == 'left' %}
                                &lt;th&gt;{{ constant('ACTION_CONST') }}&lt;/th&gt;
                                {% endif %}

                                &lt;th class="sorting"&gt;{{ object.fields.actor_id }}&lt;a href="#" class="sorting-up" data-field="actor_id" data-direction="ASC"&gt;&lt;i class="{{ constant('ICON_ARROW_UP') }}"&gt;&lt;/i&gt;&lt;/a&gt;&lt;a href="#" class="sorting-down" data-field="actor_id" data-direction="DESC"&gt;&lt;i class="{{ constant('ICON_ARROW_DOWN') }}"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/th&gt;
                                &lt;th class="sorting"&gt;{{ object.fields.first_name }}&lt;a href="#" class="sorting-up" data-field="first_name" data-direction="ASC"&gt;&lt;i class="{{ constant('ICON_ARROW_UP') }}"&gt;&lt;/i&gt;&lt;/a&gt;&lt;a href="#" class="sorting-down" data-field="first_name" data-direction="DESC"&gt;&lt;i class="{{ constant('ICON_ARROW_DOWN') }}"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/th&gt;
                                &lt;th class="sorting"&gt;{{ object.fields.last_name }}&lt;a href="#" class="sorting-up" data-field="last_name" data-direction="ASC"&gt;&lt;i class="{{ constant('ICON_ARROW_UP') }}"&gt;&lt;/i&gt;&lt;/a&gt;&lt;a href="#" class="sorting-down" data-field="last_name" data-direction="DESC"&gt;&lt;i class="{{ constant('ICON_ARROW_DOWN') }}"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/th&gt;
                                &lt;th class="sorting"&gt;{{ object.fields.last_update }}&lt;a href="#" class="sorting-up" data-field="last_update" data-direction="ASC"&gt;&lt;i class="{{ constant('ICON_ARROW_UP') }}"&gt;&lt;/i&gt;&lt;/a&gt;&lt;a href="#" class="sorting-down" data-field="last_update" data-direction="DESC"&gt;&lt;i class="{{ constant('ICON_ARROW_DOWN') }}"&gt;&lt;/i&gt;&lt;/a&gt;&lt;/th&gt;
                                &lt;th&gt;film&lt;/th&gt;
                                &lt;th&gt;{{ constant('DISPLAY') }}&lt;/th&gt;
                            {% if constant('ADMIN_ACTION_BUTTONS_POSITION') == 'right' %}
                                &lt;th&gt;{{ constant('ACTION_CONST') }}&lt;/th&gt;
                            {% endif %}
                            &lt;/tr&gt;
                        &lt;/thead&gt;
                        &lt;tbody&gt;
                        {% for i in range(0, object.records_count - 1) %}
                            &lt;tr&gt;
                                {% if constant('ADMIN_ACTION_BUTTONS_POSITION') == 'left' %}
                                &lt;td class="has-btn-group no-ellipsis"&gt;
                                    &lt;div class="btn-group"&gt;
                                        {% if object.pk[loop.index0] in object.authorized_update_pk %}
                                        &lt;a href="{{ constant('ADMIN_URL') }}{{ object.item }}/edit/{{ object.pk[loop.index0] }}" class="btn btn-sm btn-warning legitRipple" data-tooltip="{{ constant('EDIT') }}" data-delay="500"&gt;&lt;span class="{{ constant('ICON_EDIT') }} icon-md"&gt;&lt;/span&gt;&lt;/a&gt;
                                        {% endif %}
                                        {% if object.can_create == true %}
                                        &lt;a href="{{ constant('ADMIN_URL') }}{{ object.item }}/delete/{{ object.pk[loop.index0] }}" class="btn btn-sm btn-danger legitRipple" data-tooltip="{{ constant('DELETE_CONST') }}" data-delay="500"&gt;&lt;span class="{{ constant('ICON_DELETE') }} icon-md"&gt;&lt;/span&gt;&lt;/a&gt;
                                        {% endif %}
                                    &lt;/div&gt;
                                &lt;/td&gt;
                                {% endif %}
                            &lt;td&gt;{{ object.actor_id[ loop.index0 ] }}&lt;/td&gt;
                            &lt;td&gt;{{ object.first_name[ loop.index0 ] }}&lt;/td&gt;
                            &lt;td&gt;
                            {% if object.pk[loop.index0] in object.authorized_update_pk %}
                            &lt;span class="jedit-text tip" data-field="last_name" data-delay="500" title="{{ constant('CLICK_TO_EDIT') }}" id="actor-last_name-actor_id-{{ object.pk[ loop.index0 ] }}"&gt;{{ object.last_name[ loop.index0 ] }}&lt;/span&gt;
                            {% else %}
                                {{ object.last_name[ loop.index0 ] }}
                            {% endif %}
                    &lt;/td&gt;
                            &lt;td&gt;{{ toDate(object.last_update[ loop.index0 ], 'dd MMMM yyyy H:m a')|raw }}&lt;/td&gt;
                                {% if object.external_tables_count &gt; 0 %}
                                {% for j in range(0, object.external_tables_count - 1) %}
                                &lt;td class="no-ellipsis"&gt;
                                    {% if object.external_rows_count[i][j] &gt; 0 %}
                                    &lt;h6 class="card-title text-center text-nowrap mb-2"&gt;&lt;span class="badge bg-gray-300 position-left"&gt;{{ object.external_rows_count[i][j] }}&lt;/span&gt;&lt;a class="dropdown-toggle" data-bs-toggle="collapse" href="#{{ object.external_fields[i][j]['uniqid'] }}" role="button" aria-expanded="false" aria-controls="{{ object.external_fields[i][j]['uniqid'] }}"&gt;&lt;small class="text-muted nowrap"&gt;{{ constant('SHOW') }} / {{ constant('HIDE') }}&lt;/small&gt;&lt;/a&gt;&lt;/h6&gt;
                                    &lt;div class="collapse" id="{{ object.external_fields[i][j]['uniqid'] }}"&gt;
                                    {{ object.external_add_btn[i][j]|raw }}
                                        &lt;table class="table table-striped table-condensed"&gt;
                                            &lt;thead class=" {{ constant('DEFAULT_TABLE_HEADING_BACKGROUND') }}"&gt;
                                                &lt;tr&gt;
                                                    {% for field, value in object.external_fields[i][j].fieldnames %}
                                                    &lt;th&gt;{{ value }}&lt;/th&gt;
                                                    {% endfor %}
                                                &lt;/tr&gt;
                                            &lt;/thead&gt;
                                            &lt;tbody&gt;

                                                {# Loop records #}

                                                {% for k in range(0, object.external_rows_count[i][j] - 1) %}
                                                &lt;tr&gt;

                                                    {# Loop fields #}

                                                    {% for field, value in object.external_fields[i][j].fields %}
                                                    &lt;td&gt;{{ object.external_fields[i][j].fields[field][k]|raw }}&lt;/td&gt;
                                                    {% endfor %}
                                                &lt;/tr&gt;
                                                {% endfor %}
                                            &lt;/tbody&gt;
                                        &lt;/table&gt;
                                    &lt;/div&gt;
                                    {% else %}
                                    {{ object.external_add_btn[i][j]|raw }}
                                    {% endif %}
                                &lt;/td&gt;
                                {% endfor %}
                                {% endif %}
                                &lt;td&gt;&lt;a href="{{ constant('BASE_URL') }}" data-delay="500" data-tooltip="{{ constant('OPEN_URL') }}" target="_blank"&gt;&lt;span class="{{ constant('ICON_NEW_TAB') }} text-center"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;
                                {% if constant('ADMIN_ACTION_BUTTONS_POSITION') == 'right' %}
                                &lt;td class="has-btn-group no-ellipsis"&gt;
                                    &lt;div class="btn-group"&gt;
                                        {% if object.pk[loop.index0] in object.authorized_update_pk %}
                                        &lt;a href="{{ constant('ADMIN_URL') }}{{ object.item }}/edit/{{ object.pk[loop.index0] }}" class="btn btn-sm btn-warning legitRipple" data-tooltip="{{ constant('EDIT') }}" data-delay="500"&gt;&lt;span class="{{ constant('ICON_EDIT') }} icon-md"&gt;&lt;/span&gt;&lt;/a&gt;
                                        {% endif %}
                                        {% if object.can_create == true %}
                                        &lt;a href="{{ constant('ADMIN_URL') }}{{ object.item }}/delete/{{ object.pk[loop.index0] }}" class="btn btn-sm btn-danger legitRipple" data-tooltip="{{ constant('DELETE_CONST') }}" data-delay="500"&gt;&lt;span class="{{ constant('ICON_DELETE') }} icon-md"&gt;&lt;/span&gt;&lt;/a&gt;
                                    {% endif %}
                                    &lt;/div&gt;
                                &lt;/td&gt;
                                {% endif %}
                            &lt;/tr&gt;
                            {% endfor %}
                        &lt;/tbody&gt;
                    &lt;/table&gt;
                &lt;/div&gt; &lt;!-- END table-responsive --&gt;

                {% else %}
                &lt;div class="card-body"&gt;
                    &lt;p class="text-semibold"&gt;
                        {{ alert(constant('NO_RECORD_FOUND'), 'alert-info has-icon')|raw }}
                    &lt;/p&gt;
                &lt;/div&gt;
                {% endif %}

                &lt;div class="card-footer  {{ constant('DEFAULT_CARD_FOOTER_CLASS') }} p-4 mt-5"&gt;
                    {{ object.pagination_html|raw }}
                &lt;/div&gt;
            &lt;/div&gt; &lt;!-- END {{ object.item }}-list --&gt;

            {% endblock object_list %}
            {# END Partial block - rendered alone on the research results #}

        &lt;/div&gt; &lt;!-- END card --&gt;

                        </code></pre>
                    </div>

                    <hr class="my-5">

                    <h4>Table Update form - PHP Form</h4>
                    <p>The Form generated to edit records from the given table.</p>
                    <p>The form is built with <a href="https://www.phpformbuilder.pro">PHP Form Builder</a></p>
                    <p>All the operations are made in the same file:</p>

                    <ul>
                        <li>Protected by the users authentication &amp; rights management module</li>
                        <li>Get records to prefill the form</li>
                        <li>Create and show the form, including all the plugins (select dropdowns, pickers, uploaders, ...)</li>
                        <li>PHP Validation</li>
                        <li>Update the database records or show the errors if wrong values are posted</li>
                    </ul>
                    <button class="btn btn-primary" type="button" data-bs-toggle="collapse" data-bs-target="#php-update-form-code-sample" aria-expanded="false" aria-controls="php-update-form-code-sample">Show / Hide the PHP code</button>
                    <div class="collapse" id="php-update-form-code-sample">
                        <pre><code class="language-php">&lt;?php
    use phpformbuilder\Form;
    use phpformbuilder\Validator\Validator;
    use phpformbuilder\database\Mysql;
    use common\Utils;
    use secure\Secure;

    include_once ADMIN_DIR . 'secure/class/secure/Secure.php';

    /* =============================================
        validation if posted
    ============================================= */

    if ($_SERVER["REQUEST_METHOD"] == "POST" && Form::testToken('form-edit-actor') === true) {
        include_once CLASS_DIR . 'phpformbuilder/Validator/Validator.php';
        include_once CLASS_DIR . 'phpformbuilder/Validator/Exception.php';
        $validator = new Validator($_POST);
        $validator-&gt;required()-&gt;validate('actor_id');
        $validator-&gt;integer()-&gt;validate('actor_id');
        $validator-&gt;min(0)-&gt;validate('actor_id');
        $validator-&gt;max(65535)-&gt;validate('actor_id');
        $validator-&gt;required()-&gt;validate('first_name');
        $validator-&gt;maxLength(45)-&gt;validate('first_name');
        $validator-&gt;required()-&gt;validate('last_name');
        $validator-&gt;maxLength(45)-&gt;validate('last_name');
        $validator-&gt;required()-&gt;validate('last_update');
        $validator-&gt;date()-&gt;validate('last_update');

        // check for errors
        if ($validator-&gt;hasErrors()) {
            $_SESSION['errors']['form-edit-actor'] = $validator-&gt;getAllErrors();
        } else {
            require_once CLASS_DIR . 'phpformbuilder/database/db-connect.php';
            require_once CLASS_DIR . 'phpformbuilder/database/Mysql.php';
            $db = new Mysql();
            $update['first_name'] = Mysql::SQLValue($_POST['first_name'], Mysql::SQLVALUE_TEXT);
            $update['last_name'] = Mysql::SQLValue($_POST['last_name'], Mysql::SQLVALUE_TEXT);
            $update['last_update'] = Mysql::SQLValue($_POST['last_update'] . ' ' . $_POST['last_update-time'], Mysql::SQLVALUE_DATETIME);
            $filter["actor_id"] = Mysql::SQLValue($_POST['actor_id']);
            $db-&gt;throwExceptions = true;
            try {
                    // begin transaction
                    $db-&gt;transactionBegin();

                    // update actor
                if (DEMO !== true && !$db-&gt;updateRows('actor', $update, $filter)) {
                    $error = $db-&gt;error();
                    $db-&gt;transactionRollback();
                    throw new \Exception($error);
                } else {
                    // ALL OK
                    $db-&gt;transactionEnd();
                    $_SESSION['msg'] = Utils::alert(UPDATE_SUCCESS_MESSAGE, 'alert-success has-icon');

                    // reset form values
                    Form::clear('form-edit-actor');

                    // redirect to list page
                    $page_link = '';
                    if (isset($_SESSION['previous_page_number'])) {
                        $page_link = '/p' . $_SESSION['previous_page_number'];
                    }
                    header('Location:/admin/actor' . $page_link);

                    // if we don't exit here, $_SESSION['msg'] will be unset
                    exit();
                }
            } catch (\Exception $e) {
                $msg_content = DB_ERROR;
                if (ENVIRONMENT == 'development') {
                    $msg_content .= '&lt;br&gt;' . $e-&gt;getMessage() . '&lt;br&gt;' . $db-&gt;getLastSql();
                }
                $_SESSION['msg'] = Utils::alert($msg_content, 'alert-danger has-icon');
            }
        } // END else
    } // END if POST
    $actor_id = $pk;
    if (!isset($_SESSION['errors']['form-edit-actor']) || empty($_SESSION['errors']['form-edit-actor'])) { // If no error registered
        $qry = "SELECT * FROM `actor`";

        $transition = 'WHERE';

        // if restricted rights
        if (Secure::canUpdateRestricted('actor')) {
            $qry .= Secure::getRestrictionQuery('actor');
            $transition = 'AND';
        }
        $qry .= ' ' . $transition . " actor.actor_id = '$actor_id'";

        $db = new Mysql();
        $db-&gt;query($qry);
        if ($db-&gt;rowCount() &lt; 1) {
            if (DEBUG === true) {
                exit($db-&gt;getLastSql() . ' : No Record Found');
            } else {
                Secure::logout();
            }
        }
        $row = $db-&gt;row();
        $_SESSION['form-edit-actor']['actor_id'] = $row-&gt;actor_id;
        $_SESSION['form-edit-actor']['first_name'] = $row-&gt;first_name;
        $_SESSION['form-edit-actor']['last_name'] = $row-&gt;last_name;
        $_SESSION['form-edit-actor']['last_update'] = $row-&gt;last_update;
    }
    $form = new Form('form-edit-actor', 'horizontal', 'novalidate', 'bs4');
    $form-&gt;setAction('/admin/actor/edit/' . $actor_id);
    $form-&gt;startFieldset();
    $form-&gt;setCols(2, 10);
    $form-&gt;addInput('hidden', 'actor_id', '');
    $form-&gt;groupInputs('first_name', 'last_name');
    $form-&gt;setCols(2, 4);
    $form-&gt;addInput('text', 'first_name', '', 'First Name', 'required');
    $form-&gt;addInput('text', 'last_name', '', 'Last Name', 'required');
    $form-&gt;groupInputs('last_update', 'last_update-time');
    $form-&gt;setCols(2, 10);
    $form-&gt;addPlugin('pickadate', '#last_update', 'custom-date', array('%format%' =&gt; 'dd mmmm yyyy')); // date field
    $form-&gt;addPlugin('pickadate', '#last_update-time', 'custom-time', array('%interval%' =&gt; 15, '%format%' =&gt; 'H:i a')); // time field

    $form-&gt;setCols(2, 6);
    $form-&gt;addInput('text', 'last_update', '', 'Last Update', 'required');
    $form-&gt;setCols(0, 4);
    $form-&gt;addInput('text', 'last_update-time', '', '', 'required, placeholder=Heure');
    $form-&gt;setCols(2, 10);
    $form-&gt;addBtn('button', 'cancel', 0, '&lt;i class="' . ICON_BACK . ' position-left"&gt;&lt;/i&gt;' . CANCEL, 'class=btn btn-warning legitRipple, onclick=history.go(-1)', 'btn-group');
    $form-&gt;addBtn('submit', 'submit-btn', 1, SUBMIT . '&lt;i class="' . ICON_CHECKMARK . ' position-right"&gt;&lt;/i&gt;', 'class=btn btn-success legitRipple', 'btn-group');
    $form-&gt;setCols(0, 12);
    $form-&gt;centerButtons(true);
    $form-&gt;printBtnGroup('btn-group');
    $form-&gt;endFieldset();
    $form-&gt;addPlugin('nice-check', 'form', 'default', array('%skin%' =&gt; 'green'));
                        </code></pre>
                    </div>
                </article>

                <article id="admin-panel-customization" class="py-4">

                    <h3>Customization <small>for advanced users</small></h3>
                    <p>If your database structure changes along the way, PHPCG is able to rebuild the data and allows you to regenerate the corresponding CRUD pages.</p>
                    <p>When generating administration panel pages, PHPCRUD automatically keeps a backup of the previous version.
                    </p>
                    <p>The <a href="https://www.phpcrudgenerator.com/tutorials/regenerate-lists-forms-which-have-been-customized">file comparison tool</a> integrated with the generator allows you to compare side by side your current version and the previous one and merge them by choosing the code blocks to be retained.</p>
                    <p>Administration customizations can thus be retained during version/structure changes.</p>
                </article>
            </section>

            <section id="update" class="py-5">

                <h2 class="text-center text-secondary display-4 pt-3 mb-4">Update instructions</h2>

                <p class="h3">Updates are automatic.</p>
                <p class="mb-5">When a new version is released, you'll see the "New PHP CRUD GENERATOR version is available" message in <span class="badge text-bg-secondary-200 text-wrap">/generator/generator.php</span> and will just have to click the "Install" button.</p>
                <p class="alert alert-info has-icon">Your version number is available in <span class="badge bg-info">/conf/conf.php</span> (VERSION)</p>

                <hr class="mb-5">

                <p class="h4">Upgrading from 1.x to 2.x</p>

                <p>The version 2 is a <strong>major update</strong>. It is therefore <strong>not possible</strong> to upgrade from version 1.</p>
                <p>The solution is thus to install the version 2, then reconfigure your admin dashboard from there.</p>
            </section>

            <section id="i18n" class="py-5">

                <h2 class="text-center text-secondary display-4 pt-3 mb-4">Languages/Translation (I18n)</h2>

                <p class="fw-bold">PHP CRUD Generator and the generated Bootstrap admin panel are both fully multi-language.</p>
                <p><span class="fw-bold">To translate to your own language:</span></p>

                <ol>
                    <li class="mb-2">Duplicate <span class="badge text-bg-secondary-200 text-wrap">admin/i18n/en.php</span> and rename it to your own language.</li>
                    <li class="mb-2">Make the translations inside the file that you created (<span class="badge text-bg-secondary-200 text-wrap">admin/i18n/[your-language].php</span>)</li>
                    <li class="mb-2">Open <span class="badge text-bg-secondary-200 text-wrap">conf/user-conf.php</span> and replace <code class="badge text-bg-secondary-200">define('LANG', 'en');</code> with the filename you used previously. </li>
                    <li class="mb-2">Check <span class="badge text-bg-secondary-200 text-wrap">class/phpformbuilder/plugins/select2/dist/js/i18n/[your-language].js</span> and create it if it doesn't exist.</li>
                    <li class="mb-2">You're welcome to send us your translation. It'll be useful for other users.</li>
                </ol>
            </section>

            <section id="php-form-builder" class="py-5">

                <h2 class="text-center text-secondary display-4 pt-3 mb-4">PHP Form Builder</h2>
                <p><a href="https://codecanyon.net/item/php-form-builder/8790160" title="PHP Form Builder" rel="nofollow"><strong>PHP Form Builder</strong></a> is included in the package, and you can use it without restriction on the same domain as your CRUD.</p>
                <p>This means that you can build any form you want on your website/project and use the integrated plugins &amp; functionalities.</p>
                <p>To use PHP Form Builder in your project, create a PHP file where you want to add a form or open any existing php file, then add this code at the very beginning of it:</p>
                <pre><code class="language-php">use phpformbuilder\Form;

session_start();
include_once rtrim($_SERVER['DOCUMENT_ROOT'], DIRECTORY_SEPARATOR) . '/conf/conf.php';
include_once CLASS_DIR . 'phpformbuilder/Form.php';</code></pre>
                <p>Then you can build your forms. Documentation is available on the official website: <a href="https://www.phpformbuilder.pro">https://www.phpformbuilder.pro</a></p>

                <p class="h3 mt-5">Drag &amp; drop Form Builder &amp; Templates</p>
                <p>The drag &amp; drop Form Builder &amp; the form templates are not included into the PHP CRUD Generator's package. This is not a restriction but simply because they're available online, and most users don't need it, thus reducing the weight of the PHPCG package.</p>
                <p>If you want to download them they are available here:</p>
                <p class="mb-5"><a href="https://www.phpcrudgenerator.com/php-form-builder-drag-n-drop-templates.zip" role="button" class="btn btn-lg btn-primary">Download the PHP Form Builder's<br>Drag and drop tool and form templates (zip - ~ 2.33Mo)</a></p>
                <p class="lead mb-5">The ZIP file contains two directories: <span class="badge text-bg-warning-200">drag-n-drop-form-builder</span> and <span class="badge text-bg-warning-200">templates</span></p>

                <p class="lead badge text-bg-warning-200">Drag &amp; drop Form Builder</p>
                <ul class="mb-5">
                    <li>Put the <span class="badge text-bg-secondary-200">drag-n-drop-form-builder</span> directory inside the <span class="badge text-bg-secondary-200">class</span> folder, just beside the <span class="badge text-bg-secondary-200">phpformbuilder</span> folder.<br>You can then open <em class="text-primary">/class/drag-n-drop-form-builder/index.html</em> in your browser and start building your forms.</li>
                    <li>When you get the forms codes generated by the drag & drop tool, don't forget to always add manually the CRUD Generator specific code (as explained above):
                        <pre><code class="language-php">use phpformbuilder\Form;

session_start();
include_once rtrim($_SERVER['DOCUMENT_ROOT'], DIRECTORY_SEPARATOR) . '/conf/conf.php';
include_once CLASS_DIR . 'phpformbuilder/Form.php';</code></pre>
                    </li>
                </ul>

                <p class="lead badge text-bg-warning-200">Templates</p>
                <ul>
                    <li>Put the <span class="badge text-bg-secondary-200">drag-n-drop-form-builder</span> directory inside the <span class="badge text-bg-secondary-200">class</span> folder, just beside the <span class="badge text-bg-secondary-200">phpformbuilder</span> folder.<br>You can then open <em class="text-primary">/class/drag-n-drop-form-builder/index.html</em> in your browser and start building your forms.</li>
                    <li>The <span class="badge text-bg-secondary-200">templates</span> directory can be anywhere on your server, no matter which folder it's in, the templates will work fine.</li>
                </ul>
            </section>

            <section id="sources-credits" class="py-5">

                <h2 class="text-center text-secondary display-4 pt-3 mb-4">Sources &amp; Credits</h2>
                <p>Many thanks to the authors for their great work</p>

                <ul>
                    <li><a href="https://www.phpformbuilder.pro/">PHP Form Builder</a></li>
                    <li><a href="https://twig.symfony.com/" rel="nofollow">TWIG Template Engine</a></li>
                    <li><a href="http://altorouter.com/">AltoRouter</a></li>
                    <li><a href="https://github.com/chrisboulton/php-diff">PHP Diff Class</a></li>
                    <li><a href="https://getbootstrap.com/" rel="nofollow">Bootstrap</a></li>
                    <li><a href="https://bootswatch.com/" rel="nofollow">Bootswatch</a></li>
                    <li><a href="https://jquery.com/" rel="nofollow">jQuery</a></li>
                    <li><a href="https://fooplugins.github.io/FooTable/">Footable</a></li>
                    <li><a href="http://mkoryak.github.io/floatThead/">floatThead</a></li>
                    <li><a href="https://datatables.net">DataTables</a></li>
                    <li><a href="https://apexcharts.com">ApexCharts.js - Open-Source HTML5 JavaScript Charts</a></li>
                    <li><a href="https://momentjs.com/" rel="nofollow">Moment.js</a></li>
                    <li><a href="https://github.com/CodeByZach/pace">Pace.js - Automatic page load progress bar</a></li>
                </ul>
            </section>

            <section class="py-5">

                <h2 id="changelog" class="text-center text-secondary display-4 pt-3 mb-4">Changelog</h2>
                <p class="info has-icon">After any update, close &amp; reopen your browser to clear PHP SESSION</p>

                <!-- A PUBLIER
                <p class="h4">version 2.3.3 <small class="text-muted">(01/2023)</small></p>
                <pre><code class="language-php">
    Improvements:
    Bug Fix:
    </code></pre>

                END A PUBLIER -->

                <p class="h4">version 2.3.2 <small class="text-muted">(10/2023)</small></p>
                <pre><code class="language-php">
    Improvements:
        - add SQL group_by clause in DB->select() '$extras' argument
        - ability to use HTML code for field titles
    Bug Fix:
        - the custom fieldnames are now properly displayed in the single records views
        - fix image field addons display in the generator forms
        - fix admin infinite loading bug in Firefox due to an internal Pace loader bug (https://github.com/CodeByZach/pace/issues/510)
    </code></pre>

                <p class="h4">version 2.3.1 <small class="text-muted">(04/2023)</small></p>
                <pre><code class="language-php">
    Bug Fix:
        - fix the file comparison tab not showing the tool
        - fix the broken date pickers translations
    </code></pre>

                <p class="h4">version 2.3 <small class="text-muted">(03/2023)</small></p>
                <pre><code class="language-php">
    Improvements:
        - fix wrong links & images in the documentation
        - database insert now returns the last insert id if supported by the db driver
    Bug Fix:
        - fix plugins_path in class/Form.php (PHP Form Builder) when the plugins folder URL is set with $form->setPluginsUrl()
        - repair the database getLastInsertId() function
        - remove PHP warning with Secure class when passing NULL to the constraint query
        - fix floating values that were converted to int with input[type="number"]
        - fix query error with empty filters
        - fix a warning in admin forms with some special restriction queries
        - fix error when sorting fields from relational tables
        - fix Deprecated error in class.fileuploader.php
    </code></pre>

                <p class="h4">version 2.2 <small class="text-muted">(02/2023)</small></p>
                <pre><code class="language-php">
    Improvements:
        - remove the search box in the Edit in place's boolean selects
    Bug Fix:
        - fix non-working Generator lock
        - fix error on cascade delete - please regenerate your delete forms if they use cascade deletion to get them working properly.
    </code></pre>

                <p class="h4">version 2.1 <small class="text-muted">(01/2023)</small></p>
                <pre><code class="language-php">
    Improvements:
        - authentication module installer will keep the multiselect opened when choosing the admin tables
        - update the wordcharcount plugin to set the default maxWords to -1 (= infinity)
    Bug Fix:
        - fix a wrong query in create/update forms on external tables
        - fix tinymce theme in class/phpformbuilder/plugins-config-custom/tinymce.xml
    </code></pre>

                <p class="h4">version 2.0.1 <small class="text-muted">(01/2023)</small></p>
                <pre><code class="language-php">
    Improvements:
        - enable of the auto-update system for the package's version 2
    Bug Fix:
        - fix filters inappropriate error message when the filter data contains null values
    </code></pre>

                <p class="h4">version 2.0 <small class="text-muted">(01/2023)</small></p>
                <pre><code class="language-php">
    New Features:
        - switch from Mysqli to PDO with prepared queries
        - Oracle database support
        - PostgreSQL database support
        - Firebird database support
        - upgrade to Bootstrap 5
        - upgrade Bootswatch themes
        - add the SCSS source files to the package
        - rewrite the color palette and make use of the Bootstrap 5 color contrast utilities (.text-bg-xxx)
        - replace PHP Form Builder by the latest version
        - add 'Display the database errors' and 'Simulate and debug' options to the generator's general settings for easy database debugging.
        - add an option to the generator's general settings to display the data tables in the viewport with or without a vertical scrollbar.
        - highly improve the debugging system, which now can show all the queries (including Ajax requests), PDO parameters and performances using the 'Simulate and debug' option.
        - add the ability to set a custom CSS class for the filtered columns in the admin READ
    Improvements:
        - auto-highlight filtered columns in the admin READ lists and remove the "Column number" setting in the generator "advanced filters" settings
        - the generator's advanced filters test tool now analyzes the queries and display an explicit error message when a field are missing from the query.
        - optimisation of the CRUD Generator forms and tools for more efficient loading
        - complete redesign of the generator and admin dashboard User Interface (UI)
    </code></pre>

                <p class="h4">version 1.29 <small class="text-muted">(08/2022)</small></p>
                <pre><code class="language-php">
    Improvements:
        - add an error message with a link to the documentation when a user opens a READ lists in the admin with the authentication module enabled and the table not registered inside it.
    Bug Fix:
        - fix an error with external fields multiple checkboxes
    </code></pre>

                <p class="h4">version 1.28 <small class="text-muted">(07/2022)</small></p>
                <pre><code class="language-php">
    New Features:
        - Display of values from secondary relationships.
        E.g: address.city_id -> city.country_id -> country.name
        PHPCG now can show the country name straight from the address READ list and forms.
        - Add capability to load the select options dynamically in Ajax from the database in the admin forms
    Improvements:
        - add 'json' in database fields types
        - update and improve the file comparison tool
        - test Apache FollowSymLinks + admin 404 errors in the installer and return the appropriate help messages
    </code></pre>

                <p class="h4">version 1.27 <small class="text-muted">(06/2022)</small></p>
                <pre><code class="language-php">
    Improvements:
        - the installer will now show a clear message if the database connection is successful but no table is found, instead of showing a connection failure message.
    Bug Fix:
        - fix a missing translation in Italian
        - fix a missing parenthesis in generator/generator-templates/form-edit-template.php
    </code></pre>

                <p class="h4">version 1.26 <small class="text-muted">(05/2022)</small></p>
                <pre><code class="language-php">
    Bug Fix:
        - fix a missing parenthesis in generator/generator-templates/form-create-template.php
    </code></pre>

                <p class="h4">version 1.25 <small class="text-muted">(05/2022)</small></p>
                <pre><code class="language-php">
    Improvements:
        - PHPCG will now preselect the current values in READ lists live-edit's select dropdowns
        - the Live edit in admin READ lists will now show the values of the relational table instead after editing
        - fix PHP warning with mysqli_free_result, boolean and null values & PHP 8.1
        - add a loading indicator when loading Live Edit forms from the READ lists
    Bug Fix:
        - set mysqli_report to MYSQLI_REPORT_OFF during the installation to make sure that mysqli_query will not throw a warning when a query fails (which is normal when we test if a table exist for instance, the query returns false);
        - fix all the errors in the generator with PHP8 and the count() function when some fields have been deleted from the database
        - fix broken queries due to a regex that didn't include table/field names with a number in admin/class/crud/ElementFilters
        - fix PHP Warning with Ajax filters in the admin dashboard
        - escape JSON values in Live edit select dropdowns
    </code></pre>

                <p class="h4">version 1.24 <small class="text-muted">(02/2022)</small></p>
                <pre><code class="language-php">
    Improvements:
        - add a warning to the installer if the install folder is not at the root of the project
        - add the same warning to the Quick Start Guide
    </code></pre>

                <p class="h4">version 1.23 <small class="text-muted">(11/2021)</small></p>
                <pre><code class="language-php">
    Improvements:
        - update the TWIG engine to 3.3.4
        - add a "Select" type in the READ list generator to prevent the CREATE/UPDATE form from reverting to "text" when rebuilding the READ list
        - add a message in the installer to warn users if their url has uppercase characters (uppercase are not valid and cause problems).
    Bug Fix:
        - replace a php arrow function call in ElementsFilters.php for php &lt;7.4 compatibility
    </code></pre>

                <p class="h4">version 1.22 <small class="text-muted">(10/2021)</small></p>
                <pre><code class="language-php">
    Improvements:
        - load the Codecanyon package images in documentation/index.html from local assets instead of Cloudinary CDN, whic was not authorized for external hostnames
    Bug Fix:
        - fix a sql error caused by Secure users rights (Secure::getRestrictionQuery() returning a single space instead of an empty value)
        - the Date Range filters now remove the NULL values to detect the minimum / maximum available dates for filter
        - fix filter error with invalid JSON values in database in latest MySQL versions
        - fix missing images in the documentation on users localhost.
        - fix the admin search engine for relational fields with 2 values
    </code></pre>

                <p class="h4">version 1.21 <small class="text-muted">(08/2021)</small></p>
                <pre><code class="language-php">
    Bug Fix:
        - the PHP integer validator will now accept null values
        - In the generator - custom validation: removing a validator will now work as expected instead of always removing the last validation rule.
    </code></pre>

                <p class="h4">version 1.20 <small class="text-muted">(07/2021)</small></p>
                <pre><code class="language-php">
    New Features:
        - Add a new option in the generator that allows to choose the target (intermediate or final table) of the add/edit/delete buttons for relational tables
    Bug Fix:
        - fix error in Material Datepicker months (error coming from the original plugin)
        - fix missing ACTION header in the admin lists when the action buttons are on the right and bulk check is disabled
    </code></pre>

                <p class="h4">version 1.19 <small class="text-muted">(04/2021)</small></p>
                <pre><code class="language-php">
    Improvements:
        - update the admin css to align the nested tables vertically on top
    Bug Fix:
        - fix broken boolean filters in the admin panel
        - fix php warnings in the generator with validation auto + INT fields + MySQL v8
        - restore the "add new" button for nested tables (external relations) in the admin dashboard READ lists
        - fix paginated search results urls in the admin dashboard
        - fix wrong links from READ lists nested tables to their edit/delete form if the nested table name contains underscores
    </code></pre>

                <p class="h4">version 1.18 <small class="text-muted">(03/2021)</small></p>
                <pre><code class="language-php">
    New Features:
        - PHPCG now accepts PHP 8
    Improvements:
        - choice of the name of the license table during the installation process
        - improve php version checking during the installation process
        - update the Tinymce responsive filemanager plugin to the latest version - only in the Codecanyon package, not in the auto-update to avoid breaking customized code from users.
        - improve code standards for PHP 8 compatibility
    Bug Fix:
        - fix issues with boolean values storage in the generator
        - remove PHP warning with Ajax filters loading
        - remove PHP warnings in the generator about missing relations
        - fix weird field types returned by MySQL, e.g., "smallint unsigned" instead of "smallint", which is the official valid field type
    </code></pre>

                <p class="h4">version 1.17 <small class="text-muted">(03/2021)</small></p>
                <pre><code class="language-php">
        - quickly unreleased because of unexpected bugs
    </code></pre>

                <p class="h4">version 1.16 <small class="text-muted">(02/2021)</small></p>
                <pre><code class="language-php">
    New Features:
    Improvements:
    Bug Fix:
        - fix wrong behavior of the admin delete forms when no option or "no" is selected due to a previous update
        - solve assets urls issues in the main index.html and the documentation
    </code></pre>

                <p class="h4">version 1.15 <small class="text-muted">(12/2020)</small></p>
                <pre><code class="language-php">
    New Features:
        - add a new 'html' field type in the generator to show the HTML content in the admin lists instead of HTML code when the fields contain HTML
        - auto enable textarea + tinyMce in the generator for HTML fields
    Improvements:
        - add $mail->Sender in Form.php for PHPMailer to improve email deliverability
        - edit the Fileuploader PHP image upload script to crop the images AFTER resizing
        - (the original behavior that center-crops the original image is still available in the file code comments)
        - add a default empty value in the admin forms select, radio & checkbox when the field is not required
    Bug Fix:
        - validator now validates integers with leading zeros (PHP :: Bug #43372)
        - fix wrong ajax POST url in the admin search whith paginated results
        - fix textarea custom heights in CREATE forms
    </code></pre>

                <p class="h4">version 1.14 <small class="text-muted">(11/2020)</small></p>
                <pre><code class="language-php">
    New Features:
        - add field height option for textarea in the generator
    Improvements:
        - Accept NULL date / time instead of registering the default '1970-01-01 00:00' timestamp in database
        - sanitize directory separator in class/Form.php to avoid wrong plugins url detection on server with inconsistent $_SERVER['SCRIPT_NAME'] and $_SERVER['SCRIPT_FILENAME'] values
        - show tinymce and word char count in the generator only for textarea
    Bug Fix:
        - remove php warning when posting a delete form without choosing yes/no
    </code></pre>

                <p class="h4">version 1.13.3 <small class="text-muted">(11/2020)</small></p>
                <pre><code class="language-php">
    Improvements:
        - improve scrolling behavior in admin nested tables show / hide
    Bug Fix:
        - fix non-working nested tables show / hide due to the new OverlayScrollbars plugin
    </code></pre>

                <p class="h4">version 1.13.2 <small class="text-muted">(11/2020)</small></p>
                <pre><code class="language-php">
    Bug Fix:
        - replace the deprecated admin table scrollbar plugin broken by the latest jQuery with the great new OverlayScrollbars plugin
    </code></pre>

                <p class="h4">version 1.13.1 <small class="text-muted">(11/2020)</small></p>
                <pre><code class="language-php">
    New Features:
        - new tutorial to customize the admin Home page: https://www.phpcrudgenerator.com/tutorials/how-to-customize-the-bootstrap-admin-homepage
        - add documentation to update the Authentication Module with a simple SQL query instead of reinstalling from scratch:
        https://www.phpcrudgenerator.com/documentation/index#admin-user-authentication-module
    Bug Fix:
        - fix a bug in the General Settings Form due to the previous update
    </code></pre>

                <p class="h4">version 1.13 <small class="text-muted">(11/2020)</small></p>
                <pre><code class="language-php">
    Bug Fix:
        - update jQuery to 3.5.1 due to a recent browser bug that prevented the generator forms to submit (nothing happened after clicking the submit button)
    </code></pre>

                <p class="h4">version 1.12 <small class="text-muted">(11/2020)</small></p>
                <pre><code class="language-php">
    Bug Fix:
        - prefill the generator create/update form properly with TinyMce and character counter options & values
        - remove php warning when installing the authentication module
        - move the generator scripts to the &lt;head&gt; part to avoid jQuery not loaded error in some special circumstances
        - change the target table in READ lists nested tables EDIT buttons to the end relationnal table instead of intermediate
        - edit class/Utils/isValidTimeStamp function to return true with number entry as well as string
    </code></pre>

                <p class="h4">version 1.11 <small class="text-muted">(09/2020)</small></p>
                <pre><code class="language-php">
    Improvements:
        - trim $url in CrudTwigExtension::ifRemoteFileExists($url) - vendor/twig/twig/src/Extension/CrudTwigExtension.php
        - replace "url" property in object classes with "item_url" to avoid conflicts with database fields named "url"
    Bug Fix:
        - fix php Notice when building single record READ lists
        - add empty default value in create  / update forms for fields that get their values from a table when no record exist
        - fix the filtered columns overlay colored by colorColumns in the admin READ lists
        - fix wrong default dates / times in UPDATE forms with the pickadate & material date/time pickers hidden fields
        - fix date value with date pickers when a form is posted with errors
        - fix the index of the colored columns in READ lists when some filters are active with bulk delete enabled and admin action buttons are on the left
    </code></pre>

                <p class="h4">version 1.10 <small class="text-muted">(06/2020)</small></p>
                <pre><code class="language-php">
    Improvements:
        - add "open url button" link to the documentation in the generator
        - better date & time formats management with the material datepicker plugin
        (rebuild your create/update forms if you want to benefit from these changes)
    Bug Fix:
        - fix date and time custom formats with translations in the create / edit forms
        - add missing session_start() in ajax bulk delete forms
    </code></pre>

                <p class="h4">version 1.9 <small class="text-muted">(06/2020)</small></p>
                <pre><code class="language-php">
    New Features:
        - add Bulk Delete capabilities to the admin dashboard's data lists
        - add date range picker filter to the generator filters options + the admin dashboard's data lists
        - add "Default field for search" option to the generator
    Improvements:
        - improve the generator design consistency
        - improve root path detection for servers with inconsistent directory separators
        - collapse admin inactive sidebar categories on categorie click
    Bug Fix:
        - fix Ajax filter results when the result options use 2 field names
    </code></pre>

                <p class="h4">version 1.8 <small class="text-muted">(05/2020)</small></p>
                <pre><code class="language-php">
    Improvements:
        - add timezone to the generator general settings
        - update PHP Form Builder to the latest version (4.4)
        - upgrade Twig to Twig 3.0 and others vendor libraries for PHP 7.4.x compatibility
        - add php DOM extension test in the installer's server capabilities tests
        - add a clear error message with a link to the help center on root path detection failure
        - add a loading indicator to the auto-updater
    Bug Fix:
        - fix wrong urls in admin forms when moving the admin files from localhost to the production server
        - fix the missing relational values in the exported data
        - fix admin login failure after reinstalling the authentication module with changing the user table name
        - replace the double quotes with single quotes in the generator delete form template main query
    </code></pre>

                <p class="h4">version 1.7.7 <small class="text-muted">(04/2020)</small></p>
                <pre><code class="language-php">
    Bug Fix:
        - fix stupid ROOT path error with subfolder installations due to the previous update
    </code></pre>

                <p class="h4">version 1.7.6 <small class="text-muted">(04/2020)</small></p>
                <pre><code class="language-php">
    Improvements:
        - add a server test file in the install folder to debug paths &amp; urls
        - auto-apply ORDER BY changes from the generator to the admin panel without clearing PHP session
        - update ElementFilters to allow simple quotes in advanced filters
    Bug Fix:
        - fix ROOT path with server alias
    </code></pre>

                <p class="h4">version 1.7.5 <small class="text-muted">(04/2020)</small></p>
                <pre><code class="language-php">
    New Features:
        - add an "Ajax loading" option in the generator READ Lists filters (default: false)
            Hint: Enable Ajax loading on all the tables that contain a lot of records
            This new option allows to load the filters options on demand and will GREATLY improve the loading speed
        - add ORDER BY in the generator READ List main settings
        - add website search to https://www.phpcrudgenerator.com documentation, tutorials & help center
        - add default skin loader for each Bootstrap admin theme CSS in the general settings form
        - add the item name in the admin header h1
        - add a footer template for admin READ lists (admin/templates/footer.html)
    Improvements:
        - cleaner generator design
        - add instructions to solve 404 errors on some servers (lightspeed) in the help center + admin/.htaccess
        - various minor optimizations
    Bug Fix:
        - fix Tinymce's Responsive file manager url
        - edit the cUrl test file in install/
    </code></pre>

                <p class="h4">version 1.7.4 <small class="text-muted">(12/2019)</small></p>
                <pre><code class="language-php">
    New Features:
        - new setting available to choose to show search results in all on the same page or in a paginated list
        IMPORTANT: regenerate your READ lists from the generator if you want the paginated search results
                    or your paginated results will lead to 404 NOT FOUND
    Bug Fix:
        - fix nested table records in READ lists with only the primary key displayed
        - fix the "add new" button link (previously to 404) in READ lists nested tables with page > 1
        - the generator delete form now sets the correct stored options for external tables records
    </code></pre>

                <p class="h4">version 1.7.3 <small class="text-muted">(12/2019)</small></p>
                <pre><code class="language-php">
    New Features:
        - add an "Advanced" section in the tutorials with a new "<a href="https://www.phpcrudgenerator.com/tutorials/date-time-formats-management-logic-for-coders" title="Date and Time formats management logic tutorial">Date and Time formats management logic tutorial</a>
    Bug Fix:
        - fix wrong date / time formats in admin READ lists for servers without PHP intl extension in some random cases depending on the chosen format
        - fix date / time format dropdown helpers in the generator
    </code></pre>

                <p class="h4">version 1.7.2 <small class="text-muted">(11/2019)</small></p>
                <pre><code class="language-php">
    Improvements:
        - add Czech translation
        - improve documentation
    Bug Fix:
        - fix PHP warnings with forms &amp; array values
        - fix error in general settings form when no logo is registered
        - fix filters query with number values &amp; MySQL 5.7+
        - fix error in the Italian translation
        - fix PHP warning caused by primary keys aliases in the admin READ lists external relations
    </code></pre>

                <p class="h4">version 1.7.1 <small class="text-muted">(08/2019)</small></p>
                <pre><code class="language-php">
    Bug Fix:
        - Fix the Admin Dropdown Search field cross-browser compatibility
        (rebuild your lists to apply)
    </code></pre>

                <p class="h4">version 1.7 <small class="text-muted">(08/2019)</small></p>
                <pre><code class="language-php">
    New Features:
        - New live search with Ajax Autocomplete for Bootstrap Admin Panel READ lists
        (rebuild your lists to apply)
    Improvements:
        - Update Material Pickers for compatibility
    </code></pre>

                <p class="h4">version 1.6.1 <small class="text-muted">(07/2019)</small></p>
                <pre><code class="language-php">
    New Features:
        - Admin filters now can deal with JSON array values (select multiple, checkboxes)
        - New <a href="https://www.youtube.com/channel/UCo1PBjNNOWUQrfNRqjLz6LQ" title="PHP CRUD Generator Tutorials channel on Youtube">PHP CRUD Generator Tutorials channel on Youtube</a>
    Improvements:
        - Array values from database now displayed as comma-separated values instead of raw JSON
        - improve the online Documentation & Tutorials
    Bug Fix:
        - Rewrite code to limit users rights to their own records
        (rebuild your lists / forms to apply)
    </code></pre>

                <p class="h4">version 1.6 <small class="text-muted">(06/2019)</small></p>
                <pre><code class="language-php">
    New Features:
        - 20+ new Bootstrap themes are now available
        - Choose your preferred Bootstrap theme from the General Settings form
        - Customize all the main layout Bootstrap CSS classes from the General Settings form
        - Compile the SASS files with Gulp using the new <a href="https://github.com/migliori/php-crud-generator-gulp">PHP CRUD Generator Gulp Github repository</a>
        - New tutorial for Admin Theming & CSS: <a href="https://www.phpcrudgenerator.com/tutorials/how-to-customize-the-bootstrap-admin-panel-css" title="How to customize the bootstrap admin panel css">https://www.phpcrudgenerator.com/tutorials/how-to-customize-the-bootstrap-admin-panel-css</a>
    Bug Fix:
        - Great, no known bug!
    </code></pre>

                <p class="h4">version 1.5.6 <small class="text-muted">(06/2019)</small></p>
                <pre><code class="language-php">
    Improvements:
        - The General Settings form in the generator now allows to change the Bootstrap admin main body class
    Bug Fix:
        - the installer was broken by the previous changes. Solved now.
        - Edit in place is no more available in Admin READ lists for users with insufficient rights
        - the broken "enable/disable" authentication module in the Generator now works again
    </code></pre>

                <p class="h4">version 1.5.5 <small class="text-muted">(06/2019)</small></p>
                <pre><code class="language-php">
    New Features:
        - The date &amp; Time pickers languages can now be defined in the General Settings form
        - You can now choose the style of the Bootstrap admin date &amp; Time pickers
        (default | Material Design)
        - New Italian translation - Many thanks to Alberto
    </code></pre>

                <p class="h4">version 1.5.4 <small class="text-muted">(06/2019)</small></p>
                <pre><code class="language-php">
    New Features:
        - New General Settings form available in the Generator
        - The action buttons of the Bootstrap Admin panel can now be on the left or right of the table
        - The filters of the Bootstrap Admin panel can now be triggered automatically when selected
        - You can change the site title and admin logo using the General Settings form
        - You can change the admin language using the General Settings form
        - You can change the admin skin using the General Settings form
    Improvements:
        - Show custom table names in Admin READ lists nested tables
    Bug Fix:
        - The Validation button in the Generator should now never overlap the forms
    </code></pre>

                <p class="h4">version 1.5.3 <small class="text-muted">(06/2019)</small></p>
                <pre><code class="language-php">
    New Features:
        - Action buttons in the admin panel can now be displayed in the
        1st column of the admin READ lists
    Improvements:
        - Responsive & others in admin CSS
    Bug Fix:
        - datepicker plugin
        - files & images upload
        - tooltips
        (these bugs were due to the previous update with latest PHP Form Builder)
    </code></pre>

                <p class="h4">version 1.5.2 <small class="text-muted">(05/2019)</small></p>
                <pre><code class="language-php">
    Bug Fix:
        - fix sorting buttons in admin panel READ lists
    </code></pre>

                <p class="h4">version 1.5.1 <small class="text-muted">(05/2019)</small></p>
                <pre><code class="language-php">
    Bug Fix:
        - fix export to excel/csv in admin panel
    </code></pre>

                <p class="h4">version 1.5 <small class="text-muted">(05/2019)</small></p>
                <pre><code class="language-php">
    New Features:
        - replace PHP Form Builder with the latest version 4.2.1
    Improvements:
        - Admin Panel Fast Loading optimization with the new LoadJS features
        - PHP CRUD Fast Loading optimization with the new LoadJS features
        - rewrite queries for admin restricted users rights
        - upgrade Bootstrap to the latest version 4.3.1
        - minor various others improvements
    </code></pre>

                <p class="h4">version 1.4.9 <small class="text-muted">(05/2019)</small></p>
                <pre><code class="language-php">
    New Features:
        - add new Export features (print - current view - all records) in admin READ lists
    </code></pre>

                <p class="h4">version 1.4.8 <small class="text-muted">(02/2019)</small></p>
                <pre><code class="language-php">
    New Features:
    Improvements:
        - add (very) strong protection for fileuploader plugin uploads
    Bug Fix:
        - remove some PHP warnings
        - solved admin sidebar duplicate items issue
    </code></pre>

                <p class="h4">version 1.4.7 <small class="text-muted">(02/2019)</small></p>
                <pre><code class="language-php">
    Bug Fix:
        - fix navbar issue with empty icons
    </code></pre>

                <p class="h4">version 1.4.6 <small class="text-muted">(02/2019)</small></p>
                <pre><code class="language-php">
    New Features:
        - New "array" field type in generator for checkboxes & select multiple values
        will show JSON decoded values in the READ lists
    Improvements:
        - better admin navbar content management ("Organize Navbar")
        - improve array values management in the generator
    Bug Fix:
        - fix non-working select multiple with "set" & "enum" field types
        - fix changelog url in auto-update success message
    </code></pre>

                <p class="h4">version 1.4.5 <small class="text-muted">(02/2019)</small></p>
                <pre><code class="language-php">
    New Features:
        - License system now accepts domain with multiple extensions
        e.g., domain.com, domain.eu, domain.co.uk are all valid with the same license.
        - New button in the Generator to reload fresh database structure
        (When you add or remove tables)
    Improvements:
    Bug Fix:
        - admin filters now accept zero values
        - fix queries in admin lists on external tables with direct relation (no intermediate table)
    </code></pre>

                <p class="h4">version 1.4.4 <small class="text-muted">(02/2019)</small></p>
                <pre><code class="language-php">
    New Features:
        - external records from relational tables can now be managed
        from the READ LISTS & the CREATE/UPDATE forms (!)
        - add self-referential foreign keys management
        - tables can now be removed/re-enabled from the admin navbar
        - add Spanish admin translation (Thanks to Sergio)
    Improvements:
        - export buttons (csv/xls[x]) now export the exact filtered list items
        - align single fields on the left in admin panels

    Bug Fix:
        - remove phone validation in auth. module installer
        - logout from generator/generator.php now does its job as intended
        - upgrade PHPMailer to latest 6.0.6 to fix PHP 7.3 warnings
    </code></pre>

                <p class="h4">version 1.4.3 <small class="text-muted">(12/2018)</small></p>
                <pre><code class="language-php">
    Bug Fix:
        - fix inverted label & value in form CREATE/EDIT templates
        - protect relation tables SELECT queries in form CREATE/EDIT templates
    </code></pre>

                <p class="h4">version 1.4.2 <small class="text-muted">(10/2018)</small></p>
                <pre><code class="language-php">
    New Features:
        - new "Add New" button in admin READ lists on external nested tables even if no record
    Improvements:
        - ADMIN panel: register URL query parameters in $_GET (Altorouter ROUTES doesn't deal with these).
        - the ADMIN ADD & UPDATE forms now redirect to the correct list if we come from a nested table (external relation)
        - move date_default_timezone_set from conf/conf.php to conf/user-conf.php
        - add Help & instructions for Microsoft IIS & NGINX servers
    Bug Fix:
        - "Add New" button in admin READ lists now always targets the right CREATE form
        even if there's several external nested tables in the list.
        - Fix several warnings & minor issues
    </code></pre>

                <p class="h4">version 1.4.1 <small class="text-muted">(10/2018)</small></p>
                <pre class="mb-5"><code class="language-php">
    New Features:
        - add "Add New", "Edit" & "Delete" buttons in READ Lists nested tables for external tables records
    Improvements:
        - add compatibility for date & time without PHP intl extension
    Bug Fix:
        - definitely fix the Apache mod_security error on the install process with some misconfigured servers
    </code></pre>

                <p class="h4">version 1.4 <small class="text-muted">(10/2018)</small></p>
                <p><span class="badge text-bg-warning p-1 me-2">Warning</span>: If you admin READ lists have date or datetime fields, open the corresponding templates in <code class="language-php">/admin/templates</code>, find the functions <code class="language-php">toDate(...)</code> and replace the date PHP format with the corresponding <a href="https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/classSimpleDateFormat.html#details" title="ICU date format" rel="nofollow">ICU date format</a>.</p>
                <p><span class="label label-primary">new</span> online <a href="https://www.phpcrudgenerator.com/tutorials">PHP CRUD Tutorials</a></p>
                <pre class="mb-5"><code class="language-php">
    New Features:
        - PHPCG includes now the complete latest PHP Form Builder version with all its features & plugins.
        - Add the online knowledge base with numerous tutorials & videos
    Improvements:
        - improve date & time translations management - <a href="https://www.phpcrudgenerator.com/tutorials/how-to-translate-dates-times-in-admin-panel" title="How to translate dates times in admin panel">https://www.phpcrudgenerator.com/tutorials/how-to-translate-dates-times-in-admin-panel</a>
        - add full date & time translation in admin lists & forms
        - change admin form action from absolute url to root relative url
        - add install/curl-test.php to help with CURL debbuging
    Bug Fix:
        - the generator now retrieves the correct stored values to be displayed in READ lists for the external fields
        - get the correct time value in admin edit forms with datetime fields
        - solve plugins URL detection with paths containing uppercase letters
    </code></pre>

                <p class="h4">version 1.3.2 <small class="text-muted">(08/2018)</small></p>
                <pre class="mb-5"><code class="language-php">
    Improvements:
        - dates edit in place now get the current field value
        - image now crop from the center
    Bug Fix:
        - fix missing fields in update forms due to previous update error
        - fix admin lists bug with fields having uppercase characters
        - fix admin edit in place with dates & uppercase table name
    </code></pre>

                <p class="h4">version 1.3.1 <small class="text-muted">(08/2018)</small></p>
                <pre class="mb-5"><code class="language-php">
    Improvements:
    Bug Fix:
        - fix Generator form create profiles
    </code></pre>

                <p class="h4">version 1.3 <small class="text-muted">(08/2018)</small></p>
                <pre class="mb-5"><code class="language-php">
    Notes:
            - After this update you may have to reinstall the user authentication module from the Generator page.
    Improvements:
        - update server-side validation functions to accept empty values,
                except for the validators whose internal logic make values required.
                Details available here: <a href="https://www.phpformbuilder.pro/documentation/class-doc.php#php-validation-methods" title="PHP Form Builder validation methods">https://www.phpformbuilder.pro/documentation/class-doc.php#php-validation-methods</a>
        - the User Authentication Module now keeps the users & users profiles tables and records when uninstalling.
        - the User Authentication Module can now be reinstalled even if the users & users profiles table exist
        - improve user profiles management and rights limitations
        - the users rights changes now take effect without clearing the session
        - the admin sidebar doesn't show empty categories anymore
        - the only required fields in users table are now name, firstname, profile ID, email, pass & active
        (takes effect on new User Authentication Module installs only)
        - add simulate property to Generator.php to simulate when we reset a table structure from generator
        - remove several warnings & improve various feedback messages
    Bug Fix:
        - solve problem with updates & SSL errors on misconfigured servers
    </code></pre>

                <p class="h4">version 1.2.4 <small class="text-muted">(07/2018)</small></p>
                <pre class="mb-5"><code class="language-php">
    Notes:
            - After this update you may have to reinstall the user authentication module from the Generator page.
    Improvements:
            - set default empty value for passwords in UPDATE FORMS
    Bug Fix:
            - solve CREATE/UPDATE forms generation with custom validation
            - solve READ LISTS generation with advanced filders
            - solve image path in admin when the field thumbs are not enabled
            - remove password validation in UPDATE FORMS if posted value is empty
            - correct select values count in generator CREATE/UPDATE forms with custom values
            - solve error 500 when adding new users
    </code></pre>

                <p class="h4">version 1.2.3 <small class="text-muted">(07/2018)</small></p>
                <pre class="mb-5"><code class="language-php">
    New Features:
            - add an uninstallation process
            - add a login module for the generator on the production server
            - primary key management in admin forms
    Improvements:
            - remove the "select database" form in generator & auto select the correct database
            - add warnings for non-standard tables & field names (hyphenated)
            - improve password fields management in CREATE/UPDATE forms:
            better password encryption with Secure class
            password are now automatically optional on update forms with an helper text: "Leave blank to keep the current password"
            - turn fileuploader debug on for CREATE/UPDATE forms
            - improve documentation
            - improve auto-validation detection according to forms & database field types
    Bug Fix:
            - revert Twig template engine to version 1.35.4 to preserve PHP &lt; 7.0 compatibility
            - regenerate css & js combined plugin files for CREATE/UPDATE forms when the forms are edited with the generator
            - fix generator which failed to validate when custom validators were selected while generating the CREATE/UPDATE forms
            - fix password encryption when changes are made in CREATE/UPDATE users table
    </code></pre>

                <p class="h4">version 1.2.2 <small class="text-muted">(07/2018)</small></p>
                <pre class="mb-5"><code class="language-php">
    Improvements:
            - add user-conf file to avoid breaking user custom settings with updates
            - move the install folder outside the generator folder.
            - improve the updater script
            - improve url & path management
    Bug Fix:
            - fix server issues in some special configurations
    </code></pre>

                <p class="h4">version 1.2.1 <small class="text-muted">(07/2018)</small></p>
                <p><span class="badge text-bg-warning p-1 me-2">Warning</span>: if your authentication module is not enabled, after the update open <code class="language-php">php-crud-generator/conf/admin-lock.php</code> and set <code class="language-php">ADMIN_LOCKED</code> to <code class="language-php">false</code>.</p>
                <pre class="mb-5"><code class="language-php">
    Improvements:
            - move ADMIN_LOCKED and ADMIN_LOGO to separate files for easier updates
    Bug Fix:
            - fix several minor bugs
    </code></pre>

                <p class="h4">version 1.2 <small class="text-muted">(06/2018)</small></p>
                <pre class="mb-5"><code class="language-php">
    Bug Fix:
            - fix authentication module installation (wrong users filters)
    </code></pre>

                <p class="h4">version 1.1 <small class="text-muted">(06/2018)</small></p>
                <pre class="mb-5"><code class="language-php">
    New Features:
            - add File uploader to Generator + Admin panel
            - add version check & auto-updater
    Improvements:
            - update dependencies & move to vendor with Composer
            - improve ROOT path analysis
    Bug Fix:
            - correct date & time validation
            - correct value/display inversion with live-edit custom select
    </code></pre>

                <p class="h4">version 1.0 <small class="text-muted">(06/2018)</small></p>
                <pre class="mb-5"><code class="language-php">
    First Release
    </code></pre>
            </section>
        </div>
    </div>

    <script src="assets/javascripts/loadjs.min.js"></script>
    <script async defer src="assets/javascripts/project.min.js"></script>
    <script async defer src="assets/javascripts/fontawesome-free-5.8.1-web/js/brands.min.js" data-auto-replace-svg="nest"></script>
    <script async defer src="assets/javascripts/fontawesome-free-5.8.1-web/js/solid.min.js" data-auto-replace-svg="nest"></script>
    <script async defer src="assets/javascripts/fontawesome-free-5.8.1-web/js/fontawesome.min.js"></script>
    <!-- Syntax Highlighting -->
    <script defer src="assets/javascripts/prism.min.js"></script>
    <script>
        loadjs.ready(['core'], function() {
            loadjs([
                'assets/javascripts/annotator-pro.min.js'
            ], 'annotator-pro');
            /* Main navbar
            -------------------------------------------------- */
            if (window.location.hostname == 'www.phpcrudgenerator.com') {
                $('a[href="../generator/generator.php"]').attr('href', 'https://www.phpcrudgenerator.com/crud-generator-demo');
                $('#navcol-1 ul .users-nav')
                    .addClass('d-none');
                $('#navcol-1 ul')
                    .css('display', 'flex');
            } else {
                $('#navcol-1 ul.phpcg-nav')
                    .addClass('d-none');
                $('#users-info')
                    .removeClass('d-none');
            }
            /* Main Screen
            -------------------------------------------------- */
            loadjs.ready(['annotator-pro'], function() {
                $("#phpcg-generator-main-screen").annotatorPro({
                    frameWidth : "100%",
                    frameHeight : 353,
                    maxZoom : 2,
                    annotations : [
                    {
                        tint_color : "#f2deba",
                        style : 2,
                        popup_width : "190",
                        popup_position : "bottom",
                        title : "Main tab",
                        text : "Generate your CRUD Admin Dashboard from here",
                        text_color : "#313033",
                        id : "my-annotation-71130041",
                        spot_left : "0%",
                        spot_top : "8.8%",
                        spot_width : "12.14%",
                        spot_height : "8.32%",
                        spot_circle : false
                    },
                    {
                        tint_color : "#f2deba",
                        style : 2,
                        popup_width : "200",
                        popup_position : "bottom",
                        title : "Configuration",
                        text : "Global configuration, including Project settings, Security, Debugging, Styles, User Interface, Language settings",
                        text_color : "#313033",
                        id : "my-annotation-63314061",
                        spot_left : "11.97%",
                        spot_top : "8.8%",
                        spot_width : "9.45%",
                        spot_height : "8.32%",
                        spot_circle : false
                    },
                    {
                        tint_color : "#f2deba",
                        style : 2,
                        popup_width : "200",
                        popup_position : "bottom",
                        title : "Admin Navbar",
                        text : "Organize your admin navbar from here with categories and icons.",
                        text_color : "#313033",
                        id : "my-annotation-94551121",
                        spot_left : "20.67%",
                        spot_top : "8.8%",
                        spot_width : "10.79%",
                        spot_height : "8.32%",
                        spot_circle : false
                    },
                    {
                        tint_color : "#f2deba",
                        style : 2,
                        popup_width : "200",
                        popup_position : "bottom",
                        title : "Compare / Merge tool",
                        text : "This tool allows to compare and merge different versions if the admin files. It's especially useful when you customize some code, then regenerate the pages with the generator and want to report your previous changes to them.",
                        text_color : "#313033",
                        id : "my-annotation-90155131",
                        spot_left : "30.84%",
                        spot_top : "8.8%",
                        spot_width : "11.38%",
                        spot_height : "8.32%",
                        spot_circle : false
                    },
                    {
                        tint_color : "#f2deba",
                        style : 2,
                        popup_width : "200",
                        popup_position : "bottom",
                        title : "Authentication Module",
                        text : "Install, activate / deactivate or uninstall the admin authentication module.",
                        text_color : "#313033",
                        id : "my-annotation-44089271",
                        spot_left : "40.82%",
                        spot_top : "8.8%",
                        spot_width : "14.97%",
                        spot_height : "8.32%",
                        spot_circle : false
                    },
                    {
                        tint_color : "#f2deba",
                        style : 2,
                        popup_width : "200",
                        popup_position : "bottom",
                        title : "Display Database Relations",
                        text : "Display all the relations detected by the CRUD Generator from your database structure.",
                        text_color : "#313033",
                        id : "my-annotation-28128241",
                        spot_left : "67.02%",
                        spot_top : "15.91%",
                        spot_width : "15.84%",
                        spot_height : "8.32%",
                        spot_circle : false
                    },
                    {
                        tint_color : "#f2deba",
                        style : 2,
                        popup_width : "200",
                        popup_position : "bottom",
                        text : "When you make some changes to your database structure (add/edit/delete tables or relations), click this button so that the CRUD Generator reanalyses your database and integrates the changes.",
                        text_color : "#313033",
                        id : "my-annotation-12574041",
                        spot_left : "82.42%",
                        spot_top : "16.09%",
                        spot_width : "8.81%",
                        spot_height : "8.32%",
                        spot_circle : false
                    },
                    {
                        tint_color : "#f2deba",
                        style : 2,
                        popup_width : "200",
                        popup_position : "bottom",
                        title : "Reinstall",
                        text : "Use to completely reset the system, and delete all files and data related to your current installation.",
                        text_color : "#313033",
                        id : "my-annotation-67112841",
                        spot_left : "91.33%",
                        spot_top : "16.09%",
                        spot_width : "8.37%",
                        spot_height : "8.32%",
                        spot_circle : false
                    },
                    {
                        tint_color : "#f2deba",
                        style : 2,
                        popup_width : "200",
                        popup_position : "left",
                        title : "Load a table",
                        text : "Choose the table in your database that you want to add to your admin dashboard, or on which you want to make some changes.",
                        text_color : "#313033",
                        id : "my-annotation-96344461",
                        spot_left : "23.31%",
                        spot_top : "39.91%",
                        spot_width : "28.58%",
                        spot_height : "8.32%",
                        spot_circle : false
                    },
                    {
                        tint_color : "#f2deba",
                        style : 2,
                        popup_width : "200",
                        popup_position : "left",
                        title : "Refresh the structure of a table",
                        text : "If you make changes to a table in your database (add/modify/delete fields), click this button to have the generator consider the changes.",
                        text_color : "#313033",
                        id : "my-annotation-4383491",
                        spot_left : "70.83%",
                        spot_top : "39.91%",
                        spot_width : "17.83%",
                        spot_height : "8.32%",
                        spot_circle : false
                    },
                    {
                        tint_color : "#f2deba",
                        style : 2,
                        popup_width : "300",
                        title : "Main CRUD action buttons",
                        text : "These 3 big buttons lead you to the main functions of the CRUD: creating your data lists (READ lists) and the forms of your admin dashboard.",
                        text_color : "#313033",
                        id : "my-annotation-5700391",
                        spot_left : "3.33%",
                        spot_top : "66.66%",
                        spot_width : "92.78%",
                        spot_height : "17.77%",
                        spot_circle : false
                    }
                ]
                });
                /* Read List
                -------------------------------------------------- */
                $("#phpcg-generator-read-list-form").annotatorPro({
                    frameWidth : "100%",
                    frameHeight : 600,
                    navigator : true,
                    navigatorImagePreview : true,
                    maxZoom : 2,
                    annotations : [
                        {
                            tint_color : "#f2deba",
                            style : 2,
                            popup_width : "300",
                            popup_position : "bottom",
                            title : "Global options",
                            text : "Global options for the admin READ list (display the export buttons, default order, default field for search, ...)",
                            text_color : "#313033",
                            id : "my-annotation-63166151",
                            spot_left : "4.5%",
                            spot_top : "11.95%",
                            spot_width : "92%",
                            spot_height : "12.11%",
                            spot_circle : false
                        },
                        {
                            tint_color : "#f2deba",
                            style : 2,
                            popup_width : "300",
                            popup_position : "bottom",
                            title : "Table & fields names",
                            text : "Table & fields names displayed in the admin dashboard",
                            text_color : "#313033",
                            id : "my-annotation-15801861",
                            spot_left : "4.5%",
                            spot_top : "24.76%",
                            spot_width : "92%",
                            spot_height : "8.25%",
                            spot_circle : false
                        },
                        {
                            tint_color : "#f2deba",
                            style : 2,
                            popup_width : "300",
                            popup_position : "bottom",
                            title : "Filters",
                            text : "Add the filters of your choice that will enable to filter the list of the displayed records.",
                            text_color : "#313033",
                            id : "my-annotation-82796481",
                            spot_left : "4.5%",
                            spot_top : "33.88%",
                            spot_width : "92%",
                            spot_height : "18.77%",
                            spot_circle : false
                        },
                        {
                            tint_color : "#f2deba",
                            style : 2,
                            popup_width : "300",
                            title : "Fields settings",
                            text : "Configure each field according to your needs: type of values, sorting options, display in a nested table, enable or disable live editing. Different options are available depending on the type of field.",
                            text_color : "#313033",
                            id : "my-annotation-21733601",
                            spot_left : "4.5%",
                            spot_top : "53.18%",
                            spot_width : "92%",
                            spot_height : "23.68%",
                            spot_circle : false
                        },
                        {
                            tint_color : "#f2deba",
                            style : 2,
                            popup_width : "300",
                            title : "External relationships",
                            text : "If your table is joined to others you can activate the display of the records of the joined tables here. For example displaying the actors of a movie, etc. You can choose which fields to display, and whether or not to allow users to add/edit records from here.",
                            text_color : "#313033",
                            id : "my-annotation-25787641",
                            spot_left : "4.5%",
                            spot_top : "77.22%",
                            spot_width : "92%",
                            spot_height : "16.49%",
                            spot_circle : false
                        }
                    ]
                });
                /* Create/Update form
                -------------------------------------------------- */
                $("#phpcg-generator-create-update-form").annotatorPro({
                    frameWidth : "100%",
                    frameHeight : 600,
                    navigator : true,
                    navigatorImagePreview : true,
                    maxZoom : 2,
                    annotations : [
                        {
                            tint_color : "#f2deba",
                            style : 2,
                            popup_width : "300",
                            popup_position : "bottom",
                            title : "Create / Update forms",
                            text : "Build the Create / Update forms of your admin dashboard from this tab. Choose your options for each field of the active table then validate.",
                            text_color : "#313033",
                            id : "my-annotation-92491281",
                            spot_left : "35%",
                            spot_top : "0%",
                            spot_width : "30.17%",
                            spot_height : "7.72%",
                            spot_circle : false
                        },
                        {
                            tint_color : "#f2deba",
                            style : 2,
                            popup_width : "300",
                            title : "Primary keys and auto-incremented fields",
                            text : "The CRUD Generator detects automatically your primary keys and auto-incremented fields.",
                            text_color : "#313033",
                            id : "my-annotation-77529831",
                            spot_left : "5%",
                            spot_top : "13.36%",
                            spot_width : "90%",
                            spot_height : "17.54%",
                            spot_circle : false
                        },
                        {
                            tint_color : "#f2deba",
                            style : 2,
                            popup_width : "300",
                            popup_position : "bottom",
                            title : "Field settings",
                            text : "The CRUD Generator has detected the field types and provides you with the appropriate options. You can add help texts, tooltips, group several fields on the same line, and modify the validation options.",
                            text_color : "#313033",
                            id : "my-annotation-28248931",
                            spot_left : "5%",
                            spot_top : "31.43%",
                            spot_width : "90%",
                            spot_height : "19.82%",
                            spot_circle : false
                        },
                        {
                            tint_color : "#f2deba",
                            style : 2,
                            popup_width : "300",
                            title : "Special fields",
                            text : "Whether it is dates and times, file uploads, select fields, etc., the generator will always offer you the necessary options, with for example the choice of the displayed format of the date, the upload directories, the creation of thumbnails, ...",
                            text_color : "#313033",
                            id : "my-annotation-93811291",
                            spot_left : "5%",
                            spot_top : "51.78%",
                            spot_width : "90%",
                            spot_height : "26.49%",
                            spot_circle : false
                        },
                        {
                            tint_color : "#f2deba",
                            style : 2,
                            popup_width : "300",
                            title : "External relations",
                            text : "Records from relational tables can be edited in the same form.",
                            text_color : "#313033",
                            id : "my-annotation-26133991",
                            spot_left : "5%",
                            spot_top : "78.97%",
                            spot_width : "90%",
                            spot_height : "12.63%",
                            spot_circle : false
                        }
                    ]
                });

                /* Delete form
                -------------------------------------------------- */
                $("#phpcg-generator-delete-form").annotatorPro({
                    frameWidth : "100%",
                    frameHeight : 341,
                    annotations : [
                        {
                            tint_color : "#f2deba",
                            style : 2,
                            popup_width : "200",
                            title : "Build Delete forms",
                            text : "Build the admin Delete forms from this tab",
                            text_color : "#313033",
                            id : "my-annotation-15017251",
                            spot_left : "65.77%",
                            spot_top : "0.04%",
                            spot_width : "29.44%",
                            spot_height : "16.72%",
                            spot_circle : false
                        },
                        {
                            tint_color : "#f2deba",
                            style : 2,
                            popup_width : "300",
                            title : "Field names",
                            text : "Choose the fields you want to display for the admin users to confirm the deletion of the record",
                            text_color : "#313033",
                            id : "my-annotation-44956691",
                            spot_left : "3.94%",
                            spot_top : "38.16%",
                            spot_width : "90.99%",
                            spot_height : "16.13%",
                            spot_circle : false
                        },
                        {
                            tint_color : "#f2deba",
                            style : 2,
                            popup_width : "300",
                            title : "External relational records",
                            text : "You can choose whether if the records from the external relational tables will be deleted or not.",
                            text_color : "#313033",
                            id : "my-annotation-20780421",
                            spot_left : "3.94%",
                            spot_top : "58.69%",
                            spot_width : "48.17%",
                            spot_height : "18.48%",
                            spot_circle : false
                        }
                    ]
                });
            });
        });

    </script>
</body>

</html>