Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
gilour
/
generator
:
generator.php
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php // phpcs:disable PSR1.Files.SideEffects // phpcs:disable Generic.WhiteSpace.ScopeIndent use phpformbuilder\Form; use phpformbuilder\FormExtended; use phpformbuilder\database\DB; use generator\Generator; use common\Utils; if (file_exists('conf/conf.php')) { include_once 'conf/conf.php'; } elseif (file_exists('../conf/conf.php')) { include_once '../conf/conf.php'; } else { exit('Configuration file not found (4)'); } include_once GENERATOR_DIR . 'class/generator/Generator.php'; session_start(); // lock access on production server if (ENVIRONMENT !== 'localhost' && GENERATOR_LOCKED === true) { include_once 'inc/protect.php'; } // phpcrudgenerator.com navbar (include path from index router) if (file_exists('inc/navbar-main.php')) { define('IS_PHPCRUDGENERATOR_COM', true); } // default styles for cards, badges, ... include_once 'inc/default-generator-styles.php'; if (!isset($_SESSION['generator'])) { $generator = new Generator(DEBUG); } else { $generator = $_SESSION['generator']; } $generator->init(); $db = new DB(true); if (!empty($generator->database)) { $form_reset_relations = new Form('form-reset-relations', 'inline'); $form_reset_relations->useLoadJs('core'); $form_reset_relations->setMode('development'); $form_reset_relations->setOptions(array('buttonWrapper' => '')); // required just to transmit generator url to jQuery for the updater $form_reset_relations->addInput('hidden', 'generator-url', GENERATOR_URL); $form_reset_relations->setAction($_SERVER["REQUEST_URI"]); $form_reset_relations->addInput('hidden', 'reset-relations', 1); $form_reset_relations->addBtn('submit', 'submit', 1, REFRESH_DB_RELATIONS . '<i class="' . ICON_TRANSMISSION . ' append"></i>', 'class=dropdown-item d-flex justify-content-between, data-bs-toggle=tooltip, data-toggle-loader=true, title=' . REFRESH_DB_RELATIONS_HELPER); $generator->getTables(); if (isset($_POST['reset-table']) && $_POST['reset-table'] > 0 && DEMO !== true) { // select the posted table, which has been set as the new generator table $_SESSION['form-select-table']['table'] = $generator->table; } $form_select_table = new Form('form-select-table', 'inline', 'class=w-100'); $form_select_table->useLoadJs('core'); $options = array( 'elementsWrapper' => '<div class="d-flex flex-fill align-items-center mb-3"></div>' ); $form_select_table->setOptions($options); $form_select_table->setMode('development'); $form_select_table->setAction($_SERVER["REQUEST_URI"]); $addon = '<button class="btn btn-primary ms-2" type="submit">' . LOAD . '<i class="' . ICON_ARROW_RIGHT_CIRCLE . ' append"></i></button>'; $form_select_table->addAddon('table', $addon, 'after'); foreach ($generator->tables as $table) { $form_select_table->addOption('table', $table, $table); } $form_select_table->addSelect('table', 'table: ', 'data-slimselect=true, data-allow-deselect=false, class=w-auto'); $form_reset_table = new Form('form_reset_table', 'inline'); $form_reset_table->useLoadJs('core'); $form_reset_table->setMode('development'); $form_reset_table->setAction($_SERVER["REQUEST_URI"]); $form_reset_table->addInput('hidden', 'reset-table', 1); $form_reset_table->addInput('hidden', 'table-to-reset', $generator->table); $form_reset_table->addInput('hidden', 'reset-data', 0); $form_reset_table->setOptions(array('buttonWrapper' => '<div></div>')); $form_reset_table->addBtn('button', 'btn-reset-table', 1, REFRESH . ' "<em>' . $generator->table . '</em>" ' . STRUCTURE . '<i class="' . ICON_RESET . ' append"></i>', 'class=btn btn-sm btn-warning, data-bs-toggle=tooltip, data-bs-title=' . REFRESH_TABLE_HELPER); } if (!empty($generator->table)) { $generator->getDbColumns(); $generator->registerColumnsProperties(); if (!isset($_POST['form-select-fields']) && isset($_SESSION['form-select-fields'])) { // reset the required fields if the form is not posted. // when the table changes, if we don't reset, the new required fields will be added to the previous table's required fields. unset($_SESSION['form-select-fields']); } // reset errors unset($_SESSION['errors']['form-select-fields']); unset($_SESSION['errors']['build-list']); unset($_SESSION['errors']['build-create-edit']); if (isset($_POST['action']) && isset($_POST['form-select-fields']) && Form::testToken('form-select-fields') === true && DEMO !== true) { $validator = FormExtended::validate('form-select-fields', FORMVALIDATION_PHP_LANG); // check for errors if ($validator->hasErrors()) { $errors = $validator->getAllErrors(); // set the errors on the appropriate tab if ($_POST['action'] === 'build_read') { $_SESSION['errors']['build-list'] = $errors; } elseif ($_POST['action'] === 'build_create_edit') { $_SESSION['errors']['build-create-edit'] = $errors; } } else { $generator->runBuild(); } } // get values from generator if (!isset($_POST['form-select-fields'])) { $_SESSION['form-select-fields']['action'] = 'build_read'; } if (isset($_SESSION['errors']['build-list'])) { $_SESSION['errors']['form-select-fields'] = $_SESSION['errors']['build-list']; } // Create the form before registering session values // to overwrite posted values with the generator ones // if the form has been posted $form_select_fields = new FormExtended('form-select-fields', 'horizontal', 'novalidate'); $form_select_fields->useLoadJs('core'); $form_select_fields->setMode('development'); $form_select_fields->setAction($_SERVER['REQUEST_URI']); $options = array( 'elementsClass' => 'form-control form-control-sm' ); $form_select_fields->setOptions($options); /* ============================================= Default List Values ============================================= */ $_SESSION['form-select-fields']['list_type'] = $generator->list_options['list_type']; $_SESSION['form-select-fields']['rp_export_btn'] = $generator->list_options['export_btn']; $_SESSION['form-select-fields']['rp_open_url_btn'] = $generator->list_options['open_url_btn']; $_SESSION['form-select-fields']['rp_table_label'] = $generator->table_label; $_SESSION['form-select-fields']['rp_table_label'] = $generator->table_label; if ($generator->list_options['list_type'] !== 'build_single_element_list') { $_SESSION['form-select-fields']['rp_default_search_field'] = $generator->list_options['default_search_field']; $_SESSION['form-select-fields']['rp_bulk_delete'] = $generator->list_options['bulk_delete']; $_SESSION['form-select-fields']['rp_view_record'] = $generator->list_options['view_record']; $_SESSION['form-select-fields']['rp_order_by'] = $generator->list_options['order_by']; $_SESSION['form-select-fields']['rp_order_direction'] = $generator->list_options['order_direction']; } // columns for ($i = 0; $i < $generator->columns_count; $i++) { $column_name = $generator->columns['name'][$i]; $column_type = $generator->columns['column_type'][$i]; $column_relation = $generator->columns['relation'][$i]; // if one-to-many relation if (!empty($column_relation['target_table'])) { if (empty($column_relation['target_fields_display_values'])) { $_SESSION['form-select-fields']['rp_target_column_0_' . $column_name] = $column_relation['target_fields']; $_SESSION['form-select-fields']['rp_target_column_1_' . $column_name] = ''; } else { $target_fields_display_values = explode(', ', $column_relation['target_fields_display_values']); for ($j = 0; $j < 2; $j++) { if (isset($target_fields_display_values[$j])) { $_SESSION['form-select-fields']['rp_target_column_' . $j . '_' . $column_name] = $target_fields_display_values[$j]; } else { $_SESSION['form-select-fields']['rp_target_column_' . $j . '_' . $column_name] = ''; } } } } // label if (isset($generator->columns['fields'][$column_name])) { $_SESSION['form-select-fields']['rp_label_' . $column_name] = $generator->columns['fields'][$column_name]; } // value type $_SESSION['form-select-fields']['rp_value_type_' . $column_name] = $generator->columns['value_type'][$i]; // jedit $_SESSION['form-select-fields']['rp_jedit_' . $column_name] = $generator->columns['jedit'][$i]; // special if ($generator->columns['value_type'][$i] == 'file') { $_SESSION['form-select-fields']['rp_special_file_dir_' . $column_name] = $generator->columns['special'][$i]; $_SESSION['form-select-fields']['rp_special_file_url_' . $column_name] = $generator->columns['special2'][$i]; $_SESSION['form-select-fields']['rp_special_file_types_' . $column_name] = $generator->columns['special3'][$i]; } elseif ($generator->columns['value_type'][$i] == 'image') { $_SESSION['form-select-fields']['rp_special_image_dir_' . $column_name] = $generator->columns['special'][$i]; $_SESSION['form-select-fields']['rp_special_image_url_' . $column_name] = $generator->columns['special2'][$i]; $_SESSION['form-select-fields']['rp_special_image_thumbnails_' . $column_name] = $generator->columns['special3'][$i]; } elseif ($generator->columns['value_type'][$i] == 'password') { $_SESSION['form-select-fields']['rp_special_password_' . $column_name] = $generator->columns['special'][$i]; } elseif ($generator->columns['value_type'][$i] == 'date') { $_SESSION['form-select-fields']['rp_special_date_' . $column_name] = $generator->columns['special'][$i]; } elseif ($generator->columns['value_type'][$i] == 'time') { $_SESSION['form-select-fields']['rp_special_time_' . $column_name] = $generator->columns['special'][$i]; } // others $others = ''; if ($generator->columns['sorting'][$i]) { $others = 'sorting'; } elseif ($generator->columns['nested'][$i]) { $others = 'nested'; } elseif ($generator->columns['skip'][$i]) { $others = 'skip'; } $_SESSION['form-select-fields']['rp_others_' . $column_name] = $others; } $external_columns_count = 0; if (is_countable($generator->external_columns)) { $external_columns_count = count($generator->external_columns); } // external relations if ($external_columns_count > 0) { $i = 0; foreach ($generator->external_columns as $key => $ext_col) { if (!isset($ext_col['allow_crud_in_list'])) { $ext_col['allow_crud_in_list'] = false; } if (!isset($ext_col['allow_in_forms'])) { $ext_col['allow_in_forms'] = true; } if (!isset($ext_col['forms_fields'])) { $ext_col['forms_fields'] = array(); } if (!isset($ext_col['field_type'])) { $ext_col['field_type'] = 'select-multiple'; } if (!isset($ext_col['nested'])) { $ext_col['nested'] = false; } $_SESSION['form-select-fields']['rp_ext_col_target_table-' . $i] = $ext_col['active']; $_SESSION['form-select-fields']['rp_ext_col_target_fields-' . $i] = $ext_col['target_fields']; $_SESSION['form-select-fields']['rp_ext_col_allow_crud_in_list-' . $i] = $ext_col['allow_crud_in_list']; $_SESSION['form-select-fields']['rp_ext_col_nested_table-' . $i] = $ext_col['nested']; $i++; } } /*============================================= = Cascade delete + Bulk cascade delete = =============================================*/ // Look for other tables with foreign keys pointing to current one $constrained_from_to_relations = array(); /* constrained_from_to_relations: array( 'origin_table' 'origin_column' 'intermediate_table' 'intermediate_column_1' // refers to origin_table 'intermediate_column_2' // refers to target_table 'target_table' 'target_column', 'cascade_delete' // true will automatically delete all matching records according to foreign keys constraints. Default: true )*/ // Cascade delete - automatically delete all matching records according to foreign keys constraints (true|false) // // Current table is always the target. // // If External relation with intermediate table: // origin_table ID <- [fk-origin + fk-target] -> target_table ID // => We'll delete from [intermediate_table] THEN origin_table THEN target_table // else: // fk-origin -> target_table ID // => We'll delete from origin_table THEN target_table if (!isset($_SESSION['form-select-fields']['constrained_tables'])) { $_SESSION['form-select-fields']['constrained_tables'] = array(); } if ($generator->relations !== null && is_array($generator->relations['from_to_target_tables']) && in_array($generator->table, $generator->relations['from_to_target_tables'])) { $index = 0; $constrained_from_to_relations_indexes = array(); foreach ($generator->relations['from_to'] as $from_to) { if ($from_to['target_table'] == $generator->table) { $constrained_from_to_relations[] = $from_to; $constrained_from_to_relations_indexes[] = $index; if (!empty($from_to['intermediate_table'])) { $field_name = 'constrained_tables_' . $from_to['intermediate_table']; $_SESSION['form-select-fields'][$field_name] = $from_to['cascade_delete_from_intermediate']; // bulk delete value $bulk_field_name = 'bulk_constrained_tables_' . $from_to['intermediate_table']; $_SESSION['form-select-fields'][$bulk_field_name] = $from_to['cascade_delete_from_intermediate']; } $field_name = 'constrained_tables_' . $from_to['origin_table']; $_SESSION['form-select-fields'][$field_name] = $from_to['cascade_delete_from_origin']; // bulk delete value $bulk_field_name = 'bulk_constrained_tables_' . $from_to['origin_table']; $_SESSION['form-select-fields'][$bulk_field_name] = $from_to['cascade_delete_from_origin']; $_SESSION['form-select-fields']['constrained_tables'][] = $from_to['origin_table']; } $index++; } } // filters if (is_countable($generator->list_options['filters'])) { for ($i = 0; $i < count($generator->list_options['filters']); $i++) { $filter = $generator->list_options['filters'][$i]; $_SESSION['form-select-fields']['filter-mode-' . $i] = $filter['filter_mode']; $_SESSION['form-select-fields']['filter_field_A-' . $i] = $filter['filter_A']; $_SESSION['form-select-fields']['filter_select_label-' . $i] = $filter['select_label']; $_SESSION['form-select-fields']['filter_option_text-' . $i] = $filter['option_text']; $_SESSION['form-select-fields']['filter_fields-' . $i] = $filter['fields']; $_SESSION['form-select-fields']['filter_field_to_filter-' . $i] = $filter['field_to_filter']; $_SESSION['form-select-fields']['filter_from-' . $i] = $filter['from']; $_SESSION['form-select-fields']['filter_type-' . $i] = $filter['type']; // default values if not set $_SESSION['form-select-fields']['filter-ajax-' . $i] = false; $_SESSION['form-select-fields']['filter-daterange-' . $i] = false; // else if (isset($filter['ajax'])) { $_SESSION['form-select-fields']['filter-ajax-' . $i] = $filter['ajax']; } if (isset($filter['daterange'])) { $_SESSION['form-select-fields']['filter-daterange-' . $i] = $filter['daterange']; } } } // START 1st row $form_select_fields->startRowCol('row', 'col mb-4'); // START 1st card $form_select_fields->startCard(SELECT_ACTION, '', $card_header_class); $form_select_fields->addInput('hidden', 'action'); $form_select_fields->addHtml('<div class="row row-cols-1 row-cols-md-3 g-4 mb-3"> <div class="col"> <a href="#" class="choose-action-radio card text-bg-primary-500 text-decoration-none h-100" id="build_read"> <div class="card-body d-flex flex-column justify-content-center"> <p class="h6 card-title text-center my-4"><span class="rounded-circle text-bg-primary-200"><i class="' . ICON_CHECKMARK . '"></i></span>' . BUILD . ' Read List</p> </div> </a> </div> <div class="col"> <a href="#" class="choose-action-radio card text-bg-secondary-700 text-decoration-none h-100" id="build_create_edit"> <div class="card-body d-flex flex-column justify-content-center"> <p class="h6 card-title text-center my-4"><span class="rounded-circle text-bg-primary-200"><i class="' . ICON_CHECKMARK . '"></i></span>' . BUILD . ' Create / Update Forms</p> </div> </a> </div> <div class="col"> <a href="#" class="choose-action-radio card text-bg-secondary-700 text-decoration-none h-100" id="build_delete"> <div class="card-body d-flex flex-column justify-content-center"> <p class="h6 card-title text-center my-4"><span class="rounded-circle text-bg-primary-200"><i class="' . ICON_CHECKMARK . '"></i></span>' . BUILD . ' Delete Form</p> </div> </a> </div> </div>'); $form_select_fields->startDependentFields('action', 'build_read'); $form_select_fields->optionsJustifyCenter(); $paginated_checked = ' checked'; $single_record_checked = ''; if ($generator->list_options['list_type'] == 'build_single_element_list') { $paginated_checked = ''; $single_record_checked = ' checked'; } $form_select_fields->addRadio('list_type', PAGINATED_LIST, 'build_paginated_list', $paginated_checked); $form_select_fields->addRadio('list_type', SINGLE_RECORD, 'build_single_element_list', $single_record_checked); $form_select_fields->printRadioGroup('list_type', CHOOSE_LIST_TYPE . SINGLE_RECORD_TIP, true, 'class=pb-4'); $form_select_fields->endDependentFields(); $form_select_fields->optionsRevert(); // END 1st card $form_select_fields->endCard(); // END 1st row $form_select_fields->endRowCol(); /*__________ READ PAGINATED _________________*/ $form_select_fields->startDependentFields('action', 'build_read'); $form_select_fields->startDependentFields('list_type', 'build_paginated_list'); $form_select_fields->startDiv('slide-div'); $form_select_fields->startCard(SELECT_OPTIONS_FOR_PAGINATED_LIST, '', $card_active_header_class); $form_select_fields->startFieldset('<i class="fas fa-cogs ' . $legend_icon_color . ' prepend"></i><span class="' . $badge_class . ' prepend">' . $generator->table . '</span>' . MAIN_SETTINGS, 'class=mb-5', $legend_attr); /* $options = array( 'horizontalLabelCol' => 'col-md-4 col-lg-2', 'horizontalElementCol' => 'col-md-4 col-lg-4' ); $form_select_fields->setOptions($options); */ $form_select_fields->setCols(4, 2, 'md'); $form_select_fields->groupElements('rp_open_url_btn', 'rp_export_btn'); $form_select_fields->addCheckbox('rp_open_url_btn', '', 1, 'data-toggle=true, data-on-label=' . YES . ', data-off-label=' . NO . ', data-on-icon=' . ICON_CHECKMARK . ', data-off-icon=' . ICON_CANCEL . ', data-on-color=success-o'); $doc_link = $form_select_fields->getDocLink('https://www.phpcrudgenerator.com/tutorials/how-to-customize-the-bootstrap-admin-data-tables#open-url-button'); $form_select_fields->printCheckboxGroup('rp_open_url_btn', OPEN_URL_BUTTON . $doc_link, false); $form_select_fields->addCheckbox('rp_export_btn', '', 1, 'data-toggle=true, data-on-label=' . YES . ', data-off-label=' . NO . ', data-on-icon=' . ICON_CHECKMARK . ', data-off-icon=' . ICON_CANCEL . ', data-on-color=success-o'); $form_select_fields->printCheckboxGroup('rp_export_btn', EXPORT_BUTTON, false); $form_select_fields->groupElements('rp_bulk_delete', 'rp_view_record'); $form_select_fields->addCheckbox('rp_bulk_delete', '', 1, 'data-toggle=true, data-on-label=' . YES . ', data-off-label=' . NO . ', data-on-icon=' . ICON_CHECKMARK . ', data-off-icon=' . ICON_CANCEL . ', data-on-color=success-o'); $form_select_fields->printCheckboxGroup('rp_bulk_delete', BULK_DELETE_BUTTON . BULK_DELETE_BUTTON_TIP, false); $form_select_fields->addCheckbox('rp_view_record', '', 1, 'data-toggle=true, data-on-label=' . YES . ', data-off-label=' . NO . ', data-on-icon=' . ICON_CHECKMARK . ', data-off-icon=' . ICON_CANCEL . ', data-on-color=success-o'); $form_select_fields->printCheckboxGroup('rp_view_record', VIEW_RECORD_BUTTON . VIEW_RECORD_BUTTON_TIP, false); $form_select_fields->startDependentFields('rp_bulk_delete', 1); $index = 0; $done_tables = array(); if (!empty($constrained_from_to_relations)) { $doc_link = $form_select_fields->getDocLink('https://www.phpcrudgenerator.com/tutorials/generate-bootstrap-admin-list-view#cascade-delete-option'); $form_select_fields->startFieldset(CASCADE_DELETE_OPTIONS . $doc_link, 'class=px-3 py-2'); $form_select_fields->setCols(4, 8, 'md'); foreach ($constrained_from_to_relations as $from_to) { $form_select_fields->addInput('hidden', 'bulk_from_to_indexes[]', $constrained_from_to_relations_indexes[$index]); // if intermediate table if (!empty($from_to['intermediate_table']) && !in_array($from_to['intermediate_table'], $done_tables)) { $form_select_fields->addRadio('bulk_constrained_tables_' . $from_to['intermediate_table'], NO, 0); $form_select_fields->addRadio('bulk_constrained_tables_' . $from_to['intermediate_table'], YES, 1); $form_select_fields->printRadioGroup('bulk_constrained_tables_' . $from_to['intermediate_table'], DELETE_RECORDS_FROM . ' "' . $from_to['intermediate_table'] . '"', true, 'required'); $done_tables[] = $from_to['intermediate_table']; } if (!in_array($from_to['origin_table'], $done_tables)) { $form_select_fields->addRadio('bulk_constrained_tables_' . $from_to['origin_table'], NO, 0); $form_select_fields->addRadio('bulk_constrained_tables_' . $from_to['origin_table'], YES, 1); $form_select_fields->printRadioGroup('bulk_constrained_tables_' . $from_to['origin_table'], DELETE_RECORDS_FROM . ' "' . $from_to['origin_table'] . '"', true, 'required'); $done_tables[] = $from_to['origin_table']; } $index++; } $form_select_fields->endFieldset(); } $form_select_fields->endDependentFields(); $form_select_fields->setCols(4, 8, 'md'); for ($i = 0; $i < $generator->columns_count; $i++) { $form_select_fields->addOption('rp_default_search_field', $generator->columns['name'][$i], $generator->columns['name'][$i]); } $form_select_fields->addSelect('rp_default_search_field', DEFAULT_SEARCH_FIELD, 'data-slimselect=true, data-allow-deselect=false'); $form_select_fields->setCols(4, 6, 'md'); $form_select_fields->groupElements('rp_order_by', 'rp_order_direction'); for ($i = 0; $i < $generator->columns_count; $i++) { $form_select_fields->addOption('rp_order_by', $generator->columns['name'][$i], $generator->columns['name'][$i]); } $form_select_fields->addSelect('rp_order_by', ORDER_BY, 'data-slimselect=true, data-allow-deselect=false'); $form_select_fields->setCols(0, -1, 'md'); $form_select_fields->addOption('rp_order_direction', 'ASC', 'ASC'); $form_select_fields->addOption('rp_order_direction', 'DESC', 'DESC'); $form_select_fields->addSelect('rp_order_direction', '', 'data-slimselect=true, data-show-search=false, data-allow-deselect=false'); $form_select_fields->endFieldset(); $form_select_fields->startFieldset('<i class="fas fa-signature ' . $legend_icon_color . ' prepend"></i><span class="' . $badge_class . ' prepend">' . $generator->table . '</span>' . HUMAN_READABLE_NAMES, 'class=mb-5', $legend_attr); $form_select_fields->setCols(3, 3, 'md'); $form_select_fields->addInput('text', 'rp_table_label', '', $generator->table, 'required'); for ($i = 0; $i < $generator->columns_count; $i++) { if (Utils::pair($i) && $i + 1 < $generator->columns_count) { $form_select_fields->groupElements('rp_label_' . $generator->columns['name'][$i], 'rp_label_' . $generator->columns['name'][$i + 1]); } $form_select_fields->addInput('text', 'rp_label_' . $generator->columns['name'][$i], '', $generator->columns['name'][$i], 'required'); } $form_select_fields->setCols(2, 4, 'md'); // filters if (is_countable($generator->list_options['filters'])) { $list_options_filters_count = count($generator->list_options['filters']); } else { $list_options_filters_count = 0; } $form_select_fields->addInput('hidden', 'filters-dynamic-fields-index', $list_options_filters_count - 1); // Dynamic fields for filters - container + add button $form_select_fields->endFieldset(); $form_select_fields->startFieldset('<i class="fas fa-filter ' . $legend_icon_color . ' prepend"></i><span class="' . $badge_class . ' prepend">' . $generator->table . '</span>' . FILTER_DROPDOWNS, '', $legend_attr); $form_select_fields->startCol(12, 'xs', 'py-3 text-center'); $form_select_fields->addHtml('<button type="button" data-bs-toggle="collapse" data-bs-target="#filter-help" aria-expanded="false" aria-controls="filter-help" class="btn btn-sm btn-info dropdown-toggle dropdown-light">' . NEED_HELP . ' ?</button>'); $form_select_fields->endCol(); $form_select_fields->startCol(12, 'xs', 'mb-2 collapse', 'filter-help'); $form_select_fields->addHtml(FILTER_HELP); $form_select_fields->endCol(); $form_select_fields->startCol(12, 'xs'); // START col $form_select_fields->addHtml(FILTER_HELP_3); $form_select_fields->startDiv('', 'filters-ajax-elements-container'); // START ajax for ($i = 0; $i < $list_options_filters_count; $i++) { $form_select_fields->addFilterFields($generator->table, $generator->db_columns['name'], $generator->db_columns['type'], $i); } $form_select_fields->endDiv(); // END ajax $form_select_fields->startRowCol('row justify-content-end', 'col pt-4 pb-4'); $form_select_fields->addHtml('<button type="button" class="btn btn-sm btn-primary filters-add-element-button float-right">' . ADD_FILTER . '<i class="' . ICON_PLUS . ' append"></i></button>'); $form_select_fields->endRowCol(); $form_select_fields->endCol(); // END col $form_select_fields->endFieldset(); // values $form_select_fields->startFieldset('<i class="fas fa-database ' . $legend_icon_color . ' prepend"></i><span class="' . $badge_class . ' prepend">' . $generator->table . '</span>' . $generator->table . ' ' . FIELDS, '', $legend_attr); // values types arrays $int = array('tinyint', 'smallint', 'mediumint', 'int', 'bigint'); $decimal = array('decimal', 'numeric', 'float', 'double', 'real'); $boolean = array('boolean'); $date = array('date', 'year'); $datetime = array('datetime', 'timestamp'); $time = array('time'); $string = array('char', 'varchar', 'tinytext', 'text', 'mediumtext', 'longtext'); $sets = array('enum', 'set', 'json'); for ($i = 0; $i < $generator->columns_count; $i++) { $uniqid = uniqid(); $column_name = $generator->columns['name'][$i]; $column_type = $generator->columns['column_type'][$i]; $has_relation = false; $target_table = ''; $relation_label = ''; $column_primary = $generator->columns['primary'][$i]; $column_auto_increment = $generator->columns['auto_increment'][$i]; $primary_badge = ''; if ($column_primary) { $primary_badge = '<br><small class="badge text-bg-warning d-inline-flex align-items-center"><i class="' . ICON_KEY . ' text-warning-800 prepend"></i>primary</small>'; } $ai_badge = ''; if ($column_auto_increment) { $ai_badge = '<br><small class="badge border border-secondary-600 text-secondary-600 d-inline-flex align-items-center mt-1"><i class="' . ICON_PLUS . ' prepend"></i>auto-increment</small>'; } // if one-to-many relation if (!empty($generator->columns['relation'][$i]['target_table'])) { $has_relation = true; $target_table = $generator->columns['relation'][$i]['target_table']; $relation_label = '<br><span class="badge border border-secondary-600 text-secondary-600 d-inline-flex align-items-center mt-1"><i class="' . ICON_TRANSMISSION . ' prepend"></i>' . $target_table . '</span>'; } if ($i + 1 < $generator->columns_count) { $rc = $row_class; } else { $rc = $row_last_child_class; } $form_select_fields->startRow($rc); // START row $font_size_class = ''; if (strlen($column_name) > 24) { $font_size_class = ' text-size-mini'; } elseif (strlen($column_name) > 18) { $font_size_class = ' text-size-small'; } $form_select_fields->addHtml('<label class="col-md-2 col-form-label' . $font_size_class . '">' . $column_name . $primary_badge . $ai_badge . $relation_label . '</label>'); $form_select_fields->startCol(10, 'md'); // START col $form_select_fields->startDiv('skippable'); // START wrapper to hide skipped fields $form_select_fields->setCols(2, 4, 'md'); // value type // boolean|color|date|datetime|time|file|image|number|password|set|text|url $form_select_fields->groupElements('rp_value_type_' . $column_name, 'rp_jedit_' . $column_name); if ($has_relation === true) { $form_select_fields->addInput('text', 'rp_value_type_' . $column_name, 'text', TYPE, 'readonly, class=input-sm'); } elseif (in_array($column_type, $int) || in_array($column_type, $decimal)) { // if tinyInt, can be boolean if ($column_type == 'tinyint') { $form_select_fields->addOption('rp_value_type_' . $column_name, 'number', NUMBER); $form_select_fields->addOption('rp_value_type_' . $column_name, 'boolean', BOOLEAN_CONST); $form_select_fields->addSelect('rp_value_type_' . $column_name, TYPE, 'data-slimselect=true, data-allow-deselect=false'); } else { $form_select_fields->addInput('text', 'rp_value_type_' . $column_name, 'number', TYPE, 'readonly, class=input-sm'); } } elseif ($column_type == 'boolean') { $form_select_fields->addInput('text', 'rp_value_type_' . $column_name, 'boolean', TYPE, 'readonly, class=input-sm'); } elseif (in_array($column_type, $date)) { $form_select_fields->addInput('text', 'rp_value_type_' . $column_name, 'date', TYPE, 'readonly, class=input-sm'); } elseif (in_array($column_type, $datetime)) { $form_select_fields->addInput('text', 'rp_value_type_' . $column_name, 'datetime', TYPE, 'readonly, class=input-sm'); } elseif (in_array($column_type, $time)) { $form_select_fields->addInput('text', 'rp_value_type_' . $column_name, 'time', TYPE, 'readonly, class=input-sm'); } elseif (in_array($column_type, $string)) { if ($column_type == 'char' || $column_type == 'varchar' || $column_type == 'tinytext' || $column_type == 'text' || $column_type == 'mediumtext' || $column_type == 'longtext') { $form_select_fields->addOption('rp_value_type_' . $column_name, 'text', TEXT_NUMBER); $form_select_fields->addOption('rp_value_type_' . $column_name, 'html', HTML); $form_select_fields->addOption('rp_value_type_' . $column_name, 'select', SELECT_CONST); $form_select_fields->addOption('rp_value_type_' . $column_name, 'array', ARRAY_VALUE_TYPE); $form_select_fields->addOption('rp_value_type_' . $column_name, 'file', FILE); $form_select_fields->addOption('rp_value_type_' . $column_name, 'image', IMAGE); $form_select_fields->addOption('rp_value_type_' . $column_name, 'password', PASSWORD); $form_select_fields->addOption('rp_value_type_' . $column_name, 'color', COLOR); $form_select_fields->addOption('rp_value_type_' . $column_name, 'url', URL); $form_select_fields->addSelect('rp_value_type_' . $column_name, TYPE, 'data-slimselect=true, data-allow-deselect=false'); } else { $form_select_fields->addInput('text', 'rp_value_type_' . $column_name, 'text', TYPE, 'readonly, class=input-sm'); } } elseif (in_array($column_type, $sets)) { $form_select_fields->addInput('text', 'rp_value_type_' . $column_name, 'set', TYPE, 'readonly, class=input-sm'); } else { // incompatible type $form_select_fields->addInput('text', 'rp_value_type_' . $column_name, 'incompatible_type', TYPE, 'readonly, class=input-sm text-bg-danger'); } // edit in place $form_select_fields->addOption('rp_jedit_' . $column_name, false, DISABLED); $form_select_fields->addOption('rp_jedit_' . $column_name, 'text', TEXT_INPUT); $form_select_fields->addOption('rp_jedit_' . $column_name, 'textarea', TEXTAREA); $form_select_fields->addOption('rp_jedit_' . $column_name, 'boolean', BOOLEAN_CONST); $form_select_fields->addOption('rp_jedit_' . $column_name, 'select', SELECT_CONST); $form_select_fields->addOption('rp_jedit_' . $column_name, 'date', DATE_CONST); $form_select_fields->addSelect('rp_jedit_' . $column_name, EDIT_IN_PLACE, 'data-slimselect=true, data-allow-deselect=false'); // "select" values if (in_array($column_type, $sets)) { $form_select_fields->startRowCol('row', 'col-md-offset-8 col-md-4 pt-4 pb-4'); // show select values from generator data $select_values = $generator->getSelectValues($column_name); $form_select_fields->addHtml('<p>' . VALUES . ' : <span id="rp_select-values-' . $column_name . '">' . $select_values . '</span></p>'); $form_select_fields->endRowCol(); $form_select_fields->setCols(8, 4, 'md'); $form_select_fields->addBtn('button', 'rp_jedit_select_modal' . $column_name, '', ADD_EDIT_VALUES, 'class=btn btn-sm btn-success btn-sm mb-4, data-origin=rp_jedit, data-column=' . $column_name); $form_select_fields->setCols(2, 4, 'md'); } else { // Edit in place "select" values $form_select_fields->startDependentFields('rp_jedit_' . $column_name, 'select'); $form_select_fields->startRowCol('row', 'col-md-offset-8 col-md-4 pt-4 pb-4'); // show select values from generator data $select_values = $generator->getSelectValues($column_name); $form_select_fields->addHtml('<p>' . VALUES . ' : <span id="rp_select-values-' . $column_name . '">' . $select_values . '</span></p>'); $form_select_fields->endRowCol(); $form_select_fields->setCols(8, 4, 'md'); $form_select_fields->addBtn('button', 'rp_jedit_select_modal' . $column_name, '', ADD_EDIT_VALUES, 'class=btn btn-sm btn-success btn-sm mb-4, data-origin=rp_jedit, data-column=' . $column_name); $form_select_fields->setCols(2, 4, 'md'); $form_select_fields->endDependentFields(); } $form_select_fields->setCols(2, 10, 'md'); // date if (in_array($column_type, $date)) { $placeholder = 'dddd dd mmm yyyy'; if ($column_type == 'year') { $placeholder = 'yyyy'; } $form_select_fields->startDiv('rp_special_date_wrapper mb-3'); $form_select_fields->addHtml('<span class="form-text text-muted"><a href="#rp-date-format-helper' . $uniqid . '" class="date-format-helper-link" data-bs-toggle="collapse" role="button" aria-expanded="false" aria-controls="rp-date-format-helper' . $uniqid . '">' . DATE_HELPER . '</a></span>', 'rp_special_date_' . $column_name, 'after'); $form_select_fields->addInput('text', 'rp_special_date_' . $column_name, '', DATE_DISPLAY_FORMAT . DATE_DISPLAY_TIP, 'placeholder=' . $placeholder . ', data-index=' . $i); $form_select_fields->endDiv(); // datetime } elseif (in_array($column_type, $datetime)) { $form_select_fields->groupElements('rp_special_date_' . $column_name, 'rp_special_time_' . $column_name); $form_select_fields->startDiv('rp_special_date_wrapper mb-3'); $form_select_fields->addHtml('<span class="form-text text-muted"><a href="#rp-date-format-helper' . $uniqid . '" class="date-format-helper-link" data-bs-toggle="collapse" role="button" aria-expanded="false" aria-controls="rp-date-format-helper' . $uniqid . '">' . DATE_HELPER . '</a></span>', 'rp_special_date_' . $column_name, 'after'); $form_select_fields->addInput('text', 'rp_special_date_' . $column_name, '', DATE_DISPLAY_FORMAT . DATE_DISPLAY_TIP, 'placeholder=dddd dd mmm yyyy, data-index=' . $i); $form_select_fields->addHtml('<span class="form-text text-muted"><a href="#rp-time-format-helper' . $uniqid . '" class="time-format-helper-link" data-bs-toggle="collapse" role="button" aria-expanded="false" aria-controls="rp-time-format-helper' . $uniqid . '">' . DATE_HELPER . '</a></span>', 'rp_special_time_' . $column_name, 'after'); $form_select_fields->addInput('text', 'rp_special_time_' . $column_name, '', TIME_DISPLAY_FORMAT . TIME_DISPLAY_TIP, 'placeholder=H:i a, data-index=' . $i); $form_select_fields->endDiv(); // time } elseif (in_array($column_type, $time)) { $form_select_fields->startDiv('rp_special_date_wrapper mb-3'); $form_select_fields->addHtml('<span class="form-text text-muted"><a href="#rp-time-format-helper' . $uniqid . '" class="time-format-helper-link" data-bs-toggle="collapse" role="button" aria-expanded="false" aria-controls="rp-time-format-helper' . $uniqid . '">' . DATE_HELPER . '</a></span>', 'rp_special_time_' . $column_name, 'after'); $form_select_fields->addInput('text', 'rp_special_time_' . $column_name, '', TIME_DISPLAY_FORMAT . TIME_DISPLAY_TIP, 'placeholder=H:i a, data-index=' . $i); $form_select_fields->endDiv(); } elseif (in_array($column_type, $string)) { if ($column_type == 'char' || $column_type == 'varchar' || $column_type == 'tinytext' || $column_type == 'text' || $column_type == 'mediumtext' || $column_type == 'longtext') { // file path & url $form_select_fields->startDependentFields('rp_value_type_' . $column_name, 'file'); $form_select_fields->addAddon('rp_special_file_dir_' . $column_name, '[ROOT_PATH]/', 'before'); $form_select_fields->addInput('text', 'rp_special_file_dir_' . $column_name, '', FILE_PATH . FILE_PATH_TIP, 'class=input-sm'); $form_select_fields->addAddon('rp_special_file_url_' . $column_name, '[ROOT_URL]/', 'before'); $form_select_fields->addInput('text', 'rp_special_file_url_' . $column_name, '', FILE_URL . FILE_URL_TIP, 'class=input-sm'); $form_select_fields->addHelper(FILE_AUTHORIZED_HELPER, 'rp_special_file_types_' . $column_name); $form_select_fields->addInput('text', 'rp_special_file_types_' . $column_name, '', FILE_AUTHORIZED, 'class=input-sm'); $form_select_fields->endDependentFields(); // image path & url $form_select_fields->startDependentFields('rp_value_type_' . $column_name, 'image'); $form_select_fields->addAddon('rp_special_image_dir_' . $column_name, '[ROOT_PATH]/', 'before'); $form_select_fields->addInput('text', 'rp_special_image_dir_' . $column_name, '', IMAGE_PATH . IMAGE_PATH_TIP, 'class=input-sm'); $form_select_fields->addAddon('rp_special_image_url_' . $column_name, '[ROOT_URL]/', 'before'); $form_select_fields->addInput('text', 'rp_special_image_url_' . $column_name, '', IMAGE_URL . IMAGE_URL_TIP, 'class=input-sm'); $form_select_fields->addRadio('rp_special_image_thumbnails_' . $column_name, NO, 0); $form_select_fields->addRadio('rp_special_image_thumbnails_' . $column_name, YES, 1); $form_select_fields->printRadioGroup('rp_special_image_thumbnails_' . $column_name, CREATE_IMAGE_THUMBNAILS . CREATE_IMAGE_THUMBNAILS_TIP); $form_select_fields->endDependentFields(); // password constraints $form_select_fields->startDependentFields('rp_value_type_' . $column_name, 'password'); $lower_char = mb_strtolower(LOWERCASE_CHARACTERS, 'UTF-8'); $char = mb_strtolower(CHARACTERS, 'UTF-8'); $form_select_fields->addOption('rp_special_password_' . $column_name, 'min-3', MIN_3); $form_select_fields->addOption('rp_special_password_' . $column_name, 'min-4', MIN_4); $form_select_fields->addOption('rp_special_password_' . $column_name, 'min-5', MIN_5); $form_select_fields->addOption('rp_special_password_' . $column_name, 'min-6', MIN_6); $form_select_fields->addOption('rp_special_password_' . $column_name, 'min-7', MIN_7); $form_select_fields->addOption('rp_special_password_' . $column_name, 'min-8', MIN_8); $form_select_fields->addOption('rp_special_password_' . $column_name, 'lower-upper-min-3', LOWER_UPPER_MIN_3); $form_select_fields->addOption('rp_special_password_' . $column_name, 'lower-upper-min-4', LOWER_UPPER_MIN_4); $form_select_fields->addOption('rp_special_password_' . $column_name, 'lower-upper-min-5', LOWER_UPPER_MIN_5); $form_select_fields->addOption('rp_special_password_' . $column_name, 'lower-upper-min-6', LOWER_UPPER_MIN_6); $form_select_fields->addOption('rp_special_password_' . $column_name, 'lower-upper-min-7', LOWER_UPPER_MIN_7); $form_select_fields->addOption('rp_special_password_' . $column_name, 'lower-upper-min-8', LOWER_UPPER_MIN_8); $form_select_fields->addOption('rp_special_password_' . $column_name, 'lower-upper-number-min-3', LOWER_UPPER_NUMBER_MIN_3); $form_select_fields->addOption('rp_special_password_' . $column_name, 'lower-upper-number-min-4', LOWER_UPPER_NUMBER_MIN_4); $form_select_fields->addOption('rp_special_password_' . $column_name, 'lower-upper-number-min-5', LOWER_UPPER_NUMBER_MIN_5); $form_select_fields->addOption('rp_special_password_' . $column_name, 'lower-upper-number-min-6', LOWER_UPPER_NUMBER_MIN_6); $form_select_fields->addOption('rp_special_password_' . $column_name, 'lower-upper-number-min-7', LOWER_UPPER_NUMBER_MIN_7); $form_select_fields->addOption('rp_special_password_' . $column_name, 'lower-upper-number-min-8', LOWER_UPPER_NUMBER_MIN_8); $form_select_fields->addOption('rp_special_password_' . $column_name, 'lower-upper-number-symbol-min-3', LOWER_UPPER_NUMBER_SYMBOL_MIN_3); $form_select_fields->addOption('rp_special_password_' . $column_name, 'lower-upper-number-symbol-min-4', LOWER_UPPER_NUMBER_SYMBOL_MIN_4); $form_select_fields->addOption('rp_special_password_' . $column_name, 'lower-upper-number-symbol-min-5', LOWER_UPPER_NUMBER_SYMBOL_MIN_5); $form_select_fields->addOption('rp_special_password_' . $column_name, 'lower-upper-number-symbol-min-6', LOWER_UPPER_NUMBER_SYMBOL_MIN_6); $form_select_fields->addOption('rp_special_password_' . $column_name, 'lower-upper-number-symbol-min-7', LOWER_UPPER_NUMBER_SYMBOL_MIN_7); $form_select_fields->addOption('rp_special_password_' . $column_name, 'lower-upper-number-symbol-min-8', LOWER_UPPER_NUMBER_SYMBOL_MIN_8); $form_select_fields->addSelect('rp_special_password_' . $column_name, PASSWORD_CONSTRAINT, 'data-slimselect=true, data-allow-deselect=false'); $form_select_fields->endDependentFields(); } } if (in_array($column_type, $date) || in_array($column_type, $datetime)) { // date format helper $form_select_fields->setCols(2, 10, 'md'); $form_select_fields->startDiv('collapse', 'rp-date-format-helper' . $uniqid); $form_select_fields->addHtml('<table class="table small date-table"> <thead> <tr> <th>Rule</th> <th>Description</th> <th>Result</th> </tr> </thead> <tbody> <tr> <td><code>d</code></td> <td>Date of the month</td> <td>1 – 31</td> </tr> <tr> <td><code>dd</code></td> <td>Date of the month with a leading zero</td> <td>01 – 31</td> </tr> <tr> <td><code>ddd</code></td> <td>Day of the week in short form</td> <td>Sun – Sat</td> </tr> <tr> <td><code>dddd</code></td> <td>Day of the week in full form</td> <td>Sunday – Saturday</td> </tr> </tbody> <tbody> <tr> <td><code>m</code></td> <td>Month of the year</td> <td>1 – 12</td> </tr> <tr> <td><code>mm</code></td> <td>Month of the year with a leading zero</td> <td>01 – 12</td> </tr> <tr> <td><code>mmm</code></td> <td>Month name in short form</td> <td>Jan – Dec</td> </tr> <tr> <td><code>mmmm</code></td> <td>Month name in full form</td> <td>January – December</td> </tr> </tbody> <tbody> <tr> <td><code>yy</code></td> <td>Year in short form <b>*</b></td> <td>00 – 99</td> </tr> <tr> <td><code>yyyy</code></td> <td>Year in full form</td> <td>2000 – 2999</td> </tr> </tbody> </table>'); $form_select_fields->endDiv('</div>'); } // time format helper if (in_array($column_type, $time) || in_array($column_type, $datetime)) { $form_select_fields->startDiv('collapse', 'rp-time-format-helper' . $uniqid); $form_select_fields->addHtml('<table class="table small time-table"> <thead> <tr> <th>Rule</th> <th>Description</th> <th>Result</th> </tr> </thead> <tbody> <tr> <td><code>h</code></td> <td>Hour in 12-hour format</td> <td>1 – 12</td> </tr> <tr> <td><code>hh</code></td> <td>Hour in 12-hour format with a leading zero</td> <td>01 – 12</td> </tr> <tr> <td><code>H</code></td> <td>Hour in 24-hour format</td> <td>0 – 23</td> </tr> <tr> <td><code>HH</code></td> <td>Hour in 24-hour format with a leading zero</td> <td>00 – 23</td> </tr> </tbody> <tbody> <tr> <td><code>i</code></td> <td>Minutes</td> <td>00 – 59</td> </tr> </tbody> <tbody> <tr> <td><code>a</code></td> <td>Day time period</td> <td>a.m. / p.m.</td> </tr> <tr> <td><code>A</code></td> <td>Day time period in uppercase</td> <td>AM / PM</td> </tr> </tbody> </table>'); $form_select_fields->endDiv(); } if ($has_relation === true) { // get fields from target table $columns = $db->getColumnsNames($target_table); $columns_count = $db->rowCount(); // none value available for 2nd field only $form_select_fields->addOption('rp_target_column_1_' . $column_name, '', NONE); if (!empty($columns_count)) { foreach ($columns as $field) { $form_select_fields->addOption('rp_target_column_0_' . $column_name, $field, $field); $form_select_fields->addOption('rp_target_column_1_' . $column_name, $field, $field); } } // look for another target table if the first target table has a relation to another. // e.g: address.city_id => city.id => city.country_id => country.id, country.name, ... if (in_array($target_table, $generator->relations['all_db_related_tables'])) { foreach ($generator->relations['from_to'] as $ft) { if ($ft['origin_table'] === $target_table && empty($ft['intermediate_table'])) { $second_target_table = $ft['target_table']; $columns = $db->getColumnsNames($second_target_table); foreach ($columns as $field) { $field_prefixed = $second_target_table . '.' . $field; $form_select_fields->addOption('rp_target_column_0_' . $column_name, $field_prefixed, $field_prefixed); $form_select_fields->addOption('rp_target_column_1_' . $column_name, $field_prefixed, $field_prefixed); } } } } $form_select_fields->addSelect('rp_target_column_0_' . $column_name, DISPLAY_VALUE . ' 1', 'data-slimselect=true, data-allow-deselect=false'); $form_select_fields->addSelect('rp_target_column_1_' . $column_name, DISPLAY_VALUE . ' 2', 'data-slimselect=true'); } $form_select_fields->endDiv(); // END wrapper to hide skipped fields // others $form_select_fields->setCols(2, 10, 'md'); $form_select_fields->addRadio('rp_others_' . $column_name, NONE, ''); $form_select_fields->addRadio('rp_others_' . $column_name, ENABLE_SORTING, 'sorting'); $form_select_fields->addRadio('rp_others_' . $column_name, NESTED_TABLE, 'nested'); $form_select_fields->addRadio('rp_others_' . $column_name, '<span class="text-muted">' . SKIP_THIS_FIELD . '</span>', 'skip'); $form_select_fields->printRadioGroup('rp_others_' . $column_name, OPTIONS); $form_select_fields->endCol(); // END col $form_select_fields->endRow(); // END row } $form_select_fields->endFieldset(); // external relations if ($external_columns_count > 0) { $form_select_fields->startFieldset('<i class="' . ICON_TRANSMISSION . ' ' . $legend_icon_color . ' prepend"></i><span class="' . $badge_class . ' prepend">' . $generator->table . '</span>' . EXTERNAL_RELATIONS, '', $legend_attr); $i = 0; /* $ext_col = array( 'target_table' => array(), 'target_fields' => array(), 'name' => array(), 'label' => array(), 'allow_crud_in_list' => array(), 'allow_in_forms' => array(), 'forms_fields' => array(), 'field_type' => array(), // 'select-multiple' | 'checkboxes' 'active' => array() ); */ foreach ($generator->external_columns as $key => $ext_col) { // var_dump($ext_col); $origin_table = $ext_col['relation']['origin_table']; $intermediate_table = $ext_col['relation']['intermediate_table']; $target_table = $ext_col['relation']['target_table']; $form_select_fields->startRow(); // START row if (!empty($intermediate_table)) { // many to many $form_select_fields->addHtml('<label class="col-md-4 col-form-label">' . $target_table . '<br><small class="text-muted">(' . $origin_table . ' => ' . $intermediate_table . ' => ' . $target_table . ')</small></label>'); } else { // one to many with the current table as target $form_select_fields->addHtml('<label class="col-md-4 col-form-label">' . $origin_table . '<br><small class="text-muted">(' . $origin_table . ' => ' . $target_table . ')</small></label>'); } $form_select_fields->startCol(8, 'md'); // START col $form_select_fields->startRowCol(); $form_select_fields->setCols(4, 8, 'md'); $form_select_fields->addRadio('rp_ext_col_target_table-' . $i, NO, 0); $form_select_fields->addRadio('rp_ext_col_target_table-' . $i, YES, 1); $form_select_fields->printRadioGroup('rp_ext_col_target_table-' . $i, ENABLE, true, 'required'); $form_select_fields->startDependentFields('rp_ext_col_target_table-' . $i, 1); $columns = $db->getColumnsNames($ext_col['target_table']); $columns_count = $db->rowCount(); if (!empty($columns_count)) { foreach ($columns as $field) { $form_select_fields->addOption('rp_ext_col_target_fields-' . $i . '[]', $field, $field); } $form_select_fields->addSelect('rp_ext_col_target_fields-' . $i . '[]', FIELDS_TO_DISPLAY, 'data-slimselect=true, data-close-on-select=false,multiple, required'); $form_select_fields->addRadio('rp_ext_col_allow_crud_in_list-' . $i, NO, 0); $form_select_fields->addRadio('rp_ext_col_allow_crud_in_list-' . $i, YES, 1); $form_select_fields->printRadioGroup('rp_ext_col_allow_crud_in_list-' . $i, ALLOW_CRUD_IN_LIST, true, 'required'); if (!empty($intermediate_table)) { // many-to-many - choose if the action buttons lead to the intermediate or the target table $form_select_fields->startDependentFields('rp_ext_col_allow_crud_in_list-' . $i, 1); $form_select_fields->addRadio('rp_ext_col_action_btns_target_table-' . $i, $intermediate_table, $intermediate_table); $form_select_fields->addRadio('rp_ext_col_action_btns_target_table-' . $i, $target_table, $target_table); $form_select_fields->printRadioGroup('rp_ext_col_action_btns_target_table-' . $i, ACTION_BUTTONS_TARGET, true, 'required'); $form_select_fields->endDependentFields(); } // nested table $form_select_fields->addRadio('rp_ext_col_nested_table-' . $i, NO, 0); $form_select_fields->addRadio('rp_ext_col_nested_table-' . $i, YES, 1); $form_select_fields->printRadioGroup('rp_ext_col_nested_table-' . $i, NESTED_TABLE); } $form_select_fields->endDependentFields(); $form_select_fields->endCol(); $form_select_fields->endRow(); $form_select_fields->endRowCol(); // help dropdown if ($i + 1 < $external_columns_count) { $rc = $row_class; } else { $rc = $row_last_child_class; } $form_select_fields->startRowCol($rc); // START row $form_select_fields->setCols(0, 12, 'justify-content-end', 'md'); if (!empty($intermediate_table)) { // many to many $find = array('%origin_table%', '%intermediate_table%', '%target_table%'); $replace = array($origin_table, $intermediate_table, $target_table); $helper_text = str_replace($find, $replace, EXPLAIN_RELATION_MANY_TO_MANY); } else { // one to many with the current table as target $find = array('%origin_table%', '%target_table%'); $replace = array($origin_table, $target_table); $helper_text = str_replace($find, $replace, EXPLAIN_RELATION_ONE_TO_MANY); } $form_select_fields->addBtn('button', 'rp_ext_col_helper_btn_' . $i, 1, EXPLAIN_RELATION, 'data-bs-toggle=collapse, data-bs-target=#rp_ext_col_helper_' . $i . ', aria-expanded=false, aria-controls=rp_ext_col_helper_' . $i . ', class=btn btn-sm btn-info mt-2 mt-md-0 dropdown-toggle dropdown-light'); $form_select_fields->startCol(-1, 'xs', 'mb-2 collapse', 'rp_ext_col_helper_' . $i); $form_select_fields->addHtml($helper_text); $form_select_fields->endCol(); $form_select_fields->endRowCol(); $i++; } $form_select_fields->endFieldset(); } $form_select_fields->endCard(); $form_select_fields->endDiv(); // END slide-div $form_select_fields->endDependentFields(); // END build_paginated_list $form_select_fields->endDependentFields(); // END build_read /*__________ CREATE | UPDATE _________________*/ $form_select_fields->startDependentFields('action', 'build_create_edit'); $form_select_fields->endDependentFields(); /*__________ READ SINGLE _________________*/ $form_select_fields->startDependentFields('action', 'build_read'); $form_select_fields->startDependentFields('list_type', 'build_single_element_list'); $form_select_fields->endDependentFields(); // END build_single_element_list $form_select_fields->endDependentFields(); // END build_read /*__________ DELETE _________________*/ $form_select_fields->startDependentFields('action', 'build_delete'); $form_select_fields->startDiv('slide-div'); $form_select_fields->startCard(SELECT_OPTIONS_FOR_DELETE_FORM, 'card', 'card-header ' . $card_active_header_class); $form_select_fields->setCols(4, 8, 'md'); foreach ($generator->columns['name'] as $column_name) { $form_select_fields->addOption('field_delete_confirm_1', $column_name, $column_name); } $form_select_fields->addSelect('field_delete_confirm_1', FIELD_DELETE_CONFIRM, 'data-slimselect=true, data-allow-deselect=false'); $form_select_fields->addOption('field_delete_confirm_2', '', NONE); foreach ($generator->columns['name'] as $column_name) { $form_select_fields->addOption('field_delete_confirm_2', $column_name, $column_name); } $form_select_fields->addSelect('field_delete_confirm_2', FIELD_DELETE_CONFIRM . ' (n°2)', 'data-slimselect=true'); $form_select_fields->addHtml(FIELD_DELETE_CONFIRM_HELP); $index = 0; $done_tables = array(); foreach ($constrained_from_to_relations as $from_to) { $form_select_fields->addInput('hidden', 'from_to_indexes[]', $constrained_from_to_relations_indexes[$index]); // if intermediate table if (!empty($from_to['intermediate_table']) && !in_array($from_to['intermediate_table'], $done_tables)) { $form_select_fields->addRadio('constrained_tables_' . $from_to['intermediate_table'], NO, 0); $form_select_fields->addRadio('constrained_tables_' . $from_to['intermediate_table'], YES, 1); $form_select_fields->printRadioGroup('constrained_tables_' . $from_to['intermediate_table'], DELETE_RECORDS_FROM . ' "' . $from_to['intermediate_table'] . '"'); $done_tables[] = $from_to['intermediate_table']; } if (!in_array($from_to['origin_table'], $done_tables)) { $form_select_fields->addRadio('constrained_tables_' . $from_to['origin_table'], NO, 0); $form_select_fields->addRadio('constrained_tables_' . $from_to['origin_table'], YES, 1); $form_select_fields->printRadioGroup('constrained_tables_' . $from_to['origin_table'], DELETE_RECORDS_FROM . ' "' . $from_to['origin_table'] . '"'); $done_tables[] = $from_to['origin_table']; } $index++; } $form_select_fields->endCard(); // END card $form_select_fields->endDiv(); // END slide-div $form_select_fields->endDependentFields(); $form_select_fields->addHtml('<p> </p>'); $form_select_fields->setCols(0, 12, 'md'); $form_select_fields->centerContent(); $form_select_fields->addBtn('button', 'form-select-fields-submit-btn', 1, SUBMIT . '<i class="' . ICON_CHECKMARK . ' append"></i>', 'class=btn btn-lg btn-success, data-ladda-button=true, data-style=zoom-in'); // Custom radio & checkbox css $options = [ 'icon' => 'fas fa-check me-2 text-success', 'plain' => 'plain', 'size' => 'bigger', 'animations' => 'smooth' ]; $form_select_fields->addPlugin('pretty-checkbox', '#form-select-fields', 'default', $options); $form_select_fields->addPlugin('formvalidation', '#form-select-fields', 'default', array('language' => FORMVALIDATION_JAVASCRIPT_LANG)); } /* =========================================================== Get admin current state (locked|unlocked) Get current Secure state ($secure_installed = true|false|) Generate corresponding heading elements =========================================================== */ $secure_installed = false; if (file_exists(ADMIN_DIR . 'secure/install/install.lock')) { $secure_installed = true; $form_lock_unlock_admin = new Form('lock-unlock-admin', 'horizontal', ''); $form_lock_unlock_admin->useLoadJs('core'); $form_lock_unlock_admin->setMode('development'); $form_lock_unlock_admin->setAction($_SERVER["REQUEST_URI"]); if ($generator->authentication_module_enabled !== true) { $form_lock_unlock_admin->addInput('hidden', 'lock-admin', 1); } else { $form_lock_unlock_admin->addInput('hidden', 'unlock-admin', 1); } } // open the appropriate pill $pill_crud_aria_selected = 'true'; $pill_crud_active = ' active'; $pill_authentication_aria_selected = 'false'; $pill_authentication_active = ''; if (isset($_POST['lock-unlock-admin'])) { $pill_crud_aria_selected = 'false'; $pill_crud_active = ''; $pill_authentication_aria_selected = 'true'; $pill_authentication_active = ' active'; } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>PHP CRUD - Admin Panel Generator</title> <meta name="description" content="This CRUD Generator connects to your database and analyses the tables, fields, and relational structure. It allows you to generate in a few clicks a complete and professional admin dashboard"> <link href="https://www.phpcrudgenerator.com/crud-generator-demo" rel="canonical"> <link rel="preload" href="<?php echo ADMIN_URL; ?>assets/stylesheets/pace-theme-minimal.min.css" as="style" onload="this.rel='stylesheet'"> <link rel="preload" href="<?php echo ADMIN_URL; ?>assets/stylesheets/themes/default/bootstrap.min.css" as="style" onload="this.rel='stylesheet'"> <link rel="preload" href="<?php echo GENERATOR_URL; ?>generator-assets/stylesheets/generator.min.css" as="style" onload="this.rel='stylesheet'"> <noscript> <link type="text/css" media="screen" rel="stylesheet" href="<?php echo ADMIN_URL; ?>assets/stylesheets/pace-theme-minimal.min.css"> <link type="text/css" media="screen" rel="stylesheet" href="<?php echo ADMIN_URL; ?>assets/stylesheets/themes/default/bootstrap.min.css"> <link type="text/css" media="screen" rel="stylesheet" href="<?php echo GENERATOR_URL; ?>generator-assets/stylesheets/generator.min.css"> </noscript> <script> (function(w){ "use strict"; if (!w.loadCSS){ w.loadCSS=function(){}} var rp=loadCSS.relpreload={}; rp.support=(function(){ var ret; try{ ret=w.document.createElement("link").relList.supports("preload")} catch (e){ ret=!1} return function(){ return ret}})(); rp.bindMediaToggle=function(link){ var finalMedia=link.media || "all"; function enableStylesheet(){ link.media=finalMedia} if (link.addEventListener){ link.addEventListener("load", enableStylesheet)} else if (link.attachEvent){ link.attachEvent("onload", enableStylesheet)} setTimeout(function(){ link.rel="stylesheet"; link.media="only x"}); setTimeout(enableStylesheet, 3000)}; rp.poly=function(){ if (rp.support()){ return} var links=w.document.getElementsByTagName("link"); for (var i=0; i < links.length; i++){ var link=links[i]; if (link.rel==="preload" && link.getAttribute("as")==="style" && !link.getAttribute("data-loadcss")){ link.setAttribute("data-loadcss", !0); rp.bindMediaToggle(link)}}}; if (!rp.support()){ rp.poly(); var run=w.setInterval(rp.poly, 500); if (w.addEventListener){ w.addEventListener("load", function(){ rp.poly(); w.clearInterval(run)})} else if (w.attachEvent){ w.attachEvent("onload", function(){ rp.poly(); w.clearInterval(run)})}} if (typeof exports !=="undefined"){ exports.loadCSS=loadCSS} else{ w.loadCSS=loadCSS}}(typeof global !=="undefined" ? global : this)) </script> <style></style> </head> <body> <?php // hidden form to lock|unlock admin if (isset($form_lock_unlock_admin)) { $form_lock_unlock_admin->render(); } ?> <?php // phpcrudgenerator.com navbar for demo website if (defined('IS_PHPCRUDGENERATOR_COM')) { include_once 'inc/navbar-main.php'; } ?> <header class="align-items-center d-flex justify-content-between p-3 text-bg-secondary-800"> <h1 class="h5 text-start mb-0 opacity-50"><i class="fas fa-wrench fa-lg me-3"></i>CRUD Generator</h1> <p id="header-db-name" class="h2 mb-0"><?php echo DATABASE_CONST . ' <em>' . $generator->database . '</em>'; ?></p> <p class="mb-0 opacity-50"><?php include_once 'update/index.php'; ?></p> </header> <nav class="navbar navbar-expand-md text-bg-info-200 shadow-sm py-2" aria-label="Generator main menu"> <div class="container-fluid"> <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#main-navbar-nav" aria-controls="main-navbar-nav" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon text-info-800"></span> </button> <div class="collapse navbar-collapse" id="main-navbar-nav"> <ul class="navbar-nav nav-pills me-auto" role="tablist"> <li class="nav-item" role="presentation"> <a class="nav-link px-3<?php echo $pill_crud_active ?>" id="pills-crud-tab" data-bs-toggle="tab" data-bs-target="#pills-crud" href="#" role="tab" aria-controls="pills-crud" aria-selected="<?php echo $pill_crud_aria_selected; ?>"><span class="text-nowrap"><?php echo CRUD_GENERATOR; ?></span> <i class="fa-solid fa-wand-magic-sparkles append"></i></a> </li> <li class="nav-item" role="presentation"> <a class="nav-link px-3" id="pills-configuration-tab" data-bs-toggle="tab" data-bs-target="#pills-configuration" href="#" role="tab" data-form="configurationForm" aria-controls="pills-configuration" aria-selected="false"><span class="text-nowrap"><?php echo CONFIGURATION; ?></span> <i class="fa-solid fa-sliders append"></i></a> </li> <li class="nav-item" role="presentation"> <a class="nav-link px-3" id="pills-admin-navbar-tab" data-bs-toggle="tab" data-bs-target="#pills-admin-navbar" href="#" role="tab" aria-controls="pills-admin-navbar" aria-selected="false"><span class="text-nowrap"><?php echo ADMIN_NAVBAR; ?></span> <i class="fa-solid fa-sitemap append"></i></a> </li> <li class="nav-item" role="presentation"> <a class="nav-link px-3" id="pills-compare-merge-tab" data-bs-toggle="tab" data-bs-target="#pills-compare-merge" href="#" role="tab" aria-controls="pills-compare-merge" aria-selected="false"><span class="text-nowrap"><?php echo COMPARE . '/' . MERGE; ?></span> <i class="fa-solid fa-code-compare append"></i></a> </li> <li class="nav-item" role="presentation"> <a class="nav-link px-3<?php echo $pill_authentication_active; ?>" id="pills-authentication-tab" data-bs-toggle="tab" data-bs-target="#pills-authentication" href="#" role="tab" aria-controls="pills-authentication" aria-selected="<?php echo $pill_authentication_aria_selected; ?>"><span class="text-nowrap"><?php echo AUTHENTICATION_MODULE; ?></span> <i class="fa-solid fa-lock append"></i></a> </li> </ul> <ul class="navbar-nav nav-pills ms-auto" role="tablist"> <?php if (ENVIRONMENT !== 'localhost' && GENERATOR_LOCKED) { // Logout button ?> <li class="nav-item" role="presentation"> <a href="logout.php" class="btn btn-outline-secondary btn-sm ms-auto px-3 shadow-none" title="<?php echo LOGOUT; ?>"><?php echo LOGOUT; ?><i class="<?php echo ICON_LOGOUT; ?> append"></i></a> </li> <?php } ?> </ul> </div> </div> </nav> <?php if (!empty($generator->database)) { ?> <nav id="pills-crud-nav" class="d-flex justify-content-end p-2 mb-4" aria-label="CRUD tools menu"> <button type="button" class="btn btn-sm btn-light me-2 modal-trigger" data-target="database-relations-modal"> <?php echo DISPLAY . ' ' . $generator->database . ' ' . RELATIONS; ?><i class="<?php echo ICON_VIEW; ?> append"></i> </button> <div class="dropdown"> <button class="btn btn-sm btn-warning dropdown-toggle me-2" type="button" data-bs-toggle="dropdown" aria-expanded="false"> <i class="<?php echo ICON_REFRESH; ?> prepend"></i><?php echo REFRESH ?> </button> <ul class="dropdown-menu"> <li><?php $form_reset_relations->render(); ?></li> <li><a href="#" id="reload-db-structure-link" class="dropdown-item d-flex justify-content-between" data-bs-toggle="tooltip" data-bs-title="<?php echo REFRESH_DB_STRUCTURE_HELPER; ?>" data-toggle-loader="true"><?php echo REFRESH_DB_STRUCTURE ?><i class="<?php echo ICON_DATABASE; ?> append"></i></a></li> </ul> </div> <button type="button" name="btn-reinstall" class="btn btn-sm btn-danger" data-bs-toggle="tooltip" data-bs-title="<?php echo REINSTALL_TIP; ?>"> <?php echo REINSTALL; ?><i class="<?php echo ICON_DELETE; ?> append"></i> </button> </nav> <?php } ?> <?php if (isset($_SESSION['msg'])) { echo '<div id="user-msg-container" class="container py-4">'; if (!strpos($_SESSION['msg'], LOGIN_ERROR)) { echo $_SESSION['msg']; } echo '</div>'; unset($_SESSION['msg']); } ?> <div class="container tab-content"> <!-- pills-crud --> <div class="tab-pane<?php echo $pill_crud_active; ?>" id="pills-crud" role="tabpanel" aria-labelledby="pills-crud-tab" tabindex="0"> <?php if (DEMO === true) { ?> <div class="container"> <div class="row justify-content-md-center"> <div class="col-md-10"> <div class="alert alert-info has-icon shadow-sm"> <p class="h2 alert-heading">PHP CRUD generator - Create your Bootstrap Admin Panel from here</p> <p class="font-weight-bold">You are here in the PHP CRUD generator, which allows you to generate your <a href="https://www.phpcrudgenerator.com/admin/home">Bootstrap admin panel</a> from any MySQL/MariaDB, Oracle, PostgreSQL, Firebird database in a few clicks.</p> <hr> <ol> <li class="font-weight-bold mb-2">Select the table that you want to add in your admin panel.</li> <li class="font-weight-bold mb-2">To create your CRUD pages, click one of the 3 big buttons: <div class="d-lg-flex my-1"> <a href="#form-select-fields" class="btn btn-sm d-block d-lg-flex text-bg-primary text-decoration-none me-lg-3 mb-2">Build READ List</a> <a href="#form-select-fields" class="btn btn-sm d-block d-lg-flex text-bg-primary text-decoration-none me-lg-3 mb-2">Build Create / Update Forms</a> <a href="#form-select-fields" class="btn btn-sm d-block d-lg-flex text-bg-primary text-decoration-none mb-2">Build Delete Form</a> </div> </li> <li class="font-weight-bold">Choose your options for each field then confirm at the bottom of the page</li> </ol> <p class="d-block d-lg-flex justify-content-between py-3"> <button class="btn btn-lg w-100 mb-2 mb-lg-0 text-bg-danger" title="Switch to the CRUD Generator" disabled><i class="<?php echo ICON_ARROW_LEFT; ?> prepend"></i>Switch to the CRUD Generator</button> <a href="/admin/home" class="btn btn-lg w-100 text-bg-danger text-decoration-none" title="Switch to the Bootstrap Admin Dashboard">Switch to the Admin Dashboard<i class="<?php echo ICON_ARROW_RIGHT; ?> append"></i></a> </p> </div> </div> </div> </div> <?php } if (isset($form_select_table)) { ?> <div class="row justify-content-md-center"> <div class="col-md-10 mt-4 mb-5"> <div class="card"> <div class="card-header <?php echo $card_header_class; ?>"><?php echo CHOOSE_TABLE; ?></div> <div class="card-body"> <div class="row justify-content-md-center align-items-end"> <div class="col-12"> <div class="card-text d-flex justify-content-center mb-4 mb-lg-0"> <?php $form_select_table->render(); ?> </div> </div> <div class="col-12"> <div class="card-text d-flex justify-content-end"> <?php $form_reset_table->render(); ?> </div> </div> </div> </div> </div> </div> </div> <?php } if (DEMO === true) { ?> <div class="alert alert-info has-icon"> <p class="mb-0">All the CRUD operations are disabled in this demo.</p> </div> <?php } if (isset($form_select_fields)) { $form_select_fields->render(); } ?> </div> <!-- pills-configuration --> <div class="tab-pane" id="pills-configuration" role="tabpanel" aria-labelledby="pills-configuration-tab" tabindex="0"> <div class="container"> <h2 class="h1 text-center my-4">PHP CRUD Generator - <?php echo CONFIGURATION; ?></h2> <?php if (DEMO === true) { ?> <div class="alert alert-info has-icon"> <p class="mb-0 h4">The <em>Configuration</em> form is disabled in this demo.</p> </div> <?php } ?> <div id="ajax-configuration-form-container"></div> </div> </div> <!-- pills-admin-navbar --> <div class="tab-pane" id="pills-admin-navbar" role="tabpanel" aria-labelledby="pills-admin-navbar-tab" tabindex="0"></div> <!-- pills-compare-merge --> <div class="tab-pane" id="pills-compare-merge" role="tabpanel" aria-labelledby="pills-compare-merge-tab" tabindex="0"> <div class="container"> <h2 class="h1 text-center my-4">PHP CRUD Generator - <?php echo DIFF_FILES; ?></h2> <?php if (DEMO === true) { ?> <div class="alert alert-info has-icon"> <p class="mb-0 h4">The <em>file comparison tool</em> is disabled in this demo.</p> </div> <?php } ?> <div id="ajax-diff-files-form-container"></div> </div> </div> <!-- pills-authentication --> <div class="tab-pane<?php echo $pill_authentication_active; ?>" id="pills-authentication" role="tabpanel" aria-labelledby="pills-authentication-tab" tabindex="0"> <div class="container"> <div class="row justify-content-md-center mb-4"> <h2 class="h1 text-center my-4">PHP CRUD Generator - <?php echo AUTHENTICATION_MODULE; ?></h2> <?php if ($secure_installed !== true) { // Install auth. module button ?> <div id="authentication-module-installer"> <div class="alert alert-info has-icon mb-4"> <p><?php echo ADMIN_AUTHENTICATION_MODULE_HELPER; ?></p> <hr> <a href="https://www.phpcrudgenerator.com/documentation/index#admin-user-authentication-module" class="text-info-800" target="_blank" rel="noreferer noopener"><?php echo DOC; ?></a> </div> <p id="auth-not-installed" class="lead text-center fs-2 mb-5"><i class="<?php echo ICON_LOGIN; ?> text-danger-600 prepend"></i><?php echo ADMIN_AUTHENTICATION_MODULE_IS_NOT_INSTALLED; ?></p> <div class="d-flex justify-content-center p-md-4"> <button type="button" id="install-authentication-module-btn" data-admin-url="<?php echo ADMIN_URL; ?>" class="btn btn-lg btn-primary"><?php echo INSTALL_ADMIN_AUTHENTICATION_MODULE; ?><i class="fas fa-magic append"></i><</button> </div> </div> <?php } else { if ($generator->authentication_module_enabled !== true) { // Lock admin button ?> <p class="lead text-center fs-2 mb-5"><i class="<?php echo ICON_UNLOCK; ?> text-danger-600 prepend"></i><?php echo ADMIN_AUTHENTICATION_MODULE_IS_DISABLED; ?></p> <div class="d-flex justify-content-around p-md-4"> <a class="btn btn-lg btn-danger" href="#" id="remove-authentication-module"><?php echo REMOVE; ?><i class="<?php echo ICON_DELETE; ?> text-danger-700 append"></i></a> <a class="btn btn-lg btn-primary" href="#" id="lock-admin-link"><?php echo ENABLE; ?><i class="<?php echo ICON_CHECKMARK; ?> text-success-700 append"></i></a> </div> <?php } else { // Unlock admin button ?> <p class="lead text-center fs-2 mb-5"><i class="<?php echo ICON_LOCK; ?> text-success-600 prepend"></i><?php echo ADMIN_AUTHENTICATION_MODULE_IS_ENABLED; ?></p> <div class="d-flex justify-content-around p-md-4"> <a class="btn btn-lg btn-warning" href="#" id="lock-admin-link"><i class="<?php echo ICON_UNLOCK; ?> text-danger-600 prepend"></i><?php echo DISABLE; ?></a> <a class="btn btn-lg btn-primary" href="<?php echo ADMIN_URL . 'login' ?>" target="_blank" rel="noreferer noopener"><?php echo OPEN_ADMIN_PAGE; ?><i class="<?php echo ICON_NEW_TAB; ?> text-primary-800 append"></i></a> </div> <?php } } ?> </div> </div> </div> </div> <?php if ($generator->debug === true) { ?> <div id="debug"> <button id="btn-debug" type="button" class="btn btn-xs btn-danger">DEBUG</button> <?php if (isset($_SESSION['log-msg'])) { echo $_SESSION['log-msg']; unset($_SESSION['log-msg']); } else { echo '<p>No debug message registered</p>'; } ?> </div> <?php } ?> <!-- Database relations modal --> <div id="database-relations-modal" class="modal d-none" tabindex="-1" aria-labelledby="relationship-modal-label" aria-hidden="true"> <div class="modal-content"> <div class="modal-header text-bg-info"> <p class="modal-title h1 mb-0 fs-5" id="relationship-modal-label"><?php echo $generator->database . ' ' . RELATIONS; ?></p> <button type="button" class="btn-close modal-close" aria-label="Close"></button> </div> <div class="modal-body"> <?php // Relations table if (!empty($generator->relations)) { ?> <div class="table-responsive"> <table class="table table-sm mb-4"> <thead> <tr class="bt-0"> <th><?php echo TABLE; ?></th> <th><?php echo COLUMN; ?></th> <th><?php echo REFERENCED_TABLE; ?></th> <th><?php echo REFERENCED_COLUMN; ?></th> </tr> </thead> <tbody> <?php foreach ($generator->relations['db'] as $r) { ?> <tr> <td><?php echo $r['table']; ?></td> <td><?php echo $r['column']; ?></td> <td><?php echo $r['referenced_table']; ?></td> <td><?php echo $r['referenced_column']; ?></td> </tr> <?php } ?> </tbody> </table> </div> <?php } else { echo '<p>' . NO_RELATIONSHIP_FOUND . '</p>'; } ?> </div> <div class="modal-footer justify-content-center"> <button type="button" class="btn btn-light modal-close"><i class="<?php echo ICON_CANCEL; ?> prepend"></i> <?php echo CLOSE; ?></button> </div> </div> </div> <!-- Ajax modal --> <div id="ajax-modal" class="modal d-none" tabindex="-1" aria-hidden="true"> <div class="modal-content"></div> </div> <div id="ajax-update-validation-helper"></div> <div id="loader" class="d-none bg-white" style="--bs-bg-opacity: .75;z-index: 2;"> <div class="spinner"></div> </div> <script async defer src="<?php echo ADMIN_URL; ?>assets/javascripts/plugins/pace.min.js"></script> <script src="<?php echo ADMIN_URL; ?>assets/javascripts/loadjs.min.js"></script> <script src="<?php echo ADMIN_URL; ?>assets/javascripts/jquery-3.5.1.min.js"></script> <script> var adminUrl = '<?php echo ADMIN_URL; ?>'; var generatorUrl = '<?php echo GENERATOR_URL; ?>'; </script> <script> const classUrl = '<?php echo CLASS_URL; ?>'; </script> <script src="<?php echo CLASS_URL; ?>phpformbuilder/plugins/ajax-data-loader/ajax-data-loader.min.js"></script> <script type="module" src="<?php echo GENERATOR_URL; ?>generator-assets/javascripts/generator.js"></script> <?php if (isset($form_select_table)) { $form_select_table->printJsCode(); } if (isset($form_select_fields)) { $form_select_fields->printJsCode(); } if (!empty($generator->diff_files_form)) { $generator->diff_files_form->printJsCode(); } ?> </body> </html>