/**
  * Creates a new record
  *
  * @return void
  */
 public function createAction()
 {
     // Check permission
     if ($this->settings['enableNew']) {
         // Get $_POST parameters
         $arguments = $this->request->getArguments();
         // Create record management object
         $recordManagement = $this->objectManager->create('Frohland\\Ezqueries\\Domain\\Model\\RecordManagement', $this->recordManagementRepository, 'new');
         // Set Table names
         $recordManagement->setTableNames(explode(',', $this->settings['tables']));
         // Set column types
         $recordManagement->setColumnTypes($this->settings);
         // Set selected columns
         $recordManagement->setSelectedColumns($this->settings, $arguments);
         // Get data from $_POST ($arguments)
         $data = array();
         $columns = $recordManagement->getTable()->getSelectedColumns();
         $columnTypes = $recordManagement->getTable()->getColumnTypes();
         $tables = $recordManagement->getTable()->getTableNames();
         foreach ($columns as $column) {
             if (isset($columnTypes[$column['name']]['defaultValueQuery'])) {
                 $defaultValue = $this->recordManagementRepository->getRecordsBySQLQuery($columnTypes[$column['name']]['defaultValueQuery']);
                 if ($defaultValue !== FALSE) {
                     $defaultValue = $defaultValue[0][0];
                 } else {
                     $defaultValue = '';
                 }
                 if ($defaultValue == '' || $defaultValue == NULL) {
                     $defaultValue = 1;
                 }
                 $data[$column['name']]['value'] = $defaultValue;
                 $data[$column['name']]['type'] = 'numeric';
             } else {
                 if ($columnTypes[$column['name']]['type'] != 'numeric' && $columnTypes[$column['name']]['type'] != 'int' && $columnTypes[$column['name']]['type'] != 'boolean') {
                     if (isset($arguments[$column['name']])) {
                         $data[$column['name']]['value'] = $arguments[$column['name']];
                         $data[$column['name']]['type'] = 'text';
                     } else {
                         if ($columnTypes[$column['name']]['not_null']) {
                             $data[$column['name']]['value'] = '';
                             $data[$column['name']]['type'] = 'text';
                         }
                     }
                 } else {
                     if (isset($arguments[$column['name']])) {
                         if ($arguments[$column['name']] == '') {
                             if ($columnTypes[$column['name']]['not_null']) {
                                 $data[$column['name']]['value'] = 0;
                             } else {
                                 $data[$column['name']]['value'] = 'NULL';
                             }
                         } else {
                             $data[$column['name']]['value'] = $arguments[$column['name']];
                         }
                         $data[$column['name']]['type'] = 'numeric';
                     } else {
                         if ($columnTypes[$column['name']]['not_null']) {
                             $data[$column['name']]['value'] = 0;
                             $data[$column['name']]['type'] = 'numeric';
                         }
                     }
                 }
             }
         }
         // Search arguments
         if ($arguments['search']) {
             $search = $arguments['search'];
         } else {
             $search = array();
         }
         // Filter arguments
         if (isset($arguments['filters'])) {
             $filters = $arguments['filters'];
         } else {
             $filters = array();
         }
         // Include hook to validate data before creating the new record (return TRUE if valid; or return "any error message" if not valid)
         $isValid = TRUE;
         if (is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ezqueries']['recordManagementController']['hookBeforeCreate'])) {
             foreach ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ezqueries']['recordManagementController']['hookBeforeCreate'] as $_classRef) {
                 $_procObj =& \TYPO3\CMS\Core\Utility\GeneralUtility::getUserObj($_classRef);
                 $isValid = $_procObj->hookBeforeCreate($data, $columns, $columnTypes, $tables[0]);
             }
         }
         if ($isValid === TRUE) {
             // Create the record
             $returnValues = $this->recordManagementRepository->createRecord($tables[0], $data);
             $status = $returnValues['status'];
         } else {
             $status = $isValid;
         }
         // Include hook to do something after creating the record
         if ($status == 'success') {
             if (is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ezqueries']['recordManagementController']['hookAfterCreate'])) {
                 foreach ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ezqueries']['recordManagementController']['hookAfterCreate'] as $_classRef) {
                     $_procObj =& \TYPO3\CMS\Core\Utility\GeneralUtility::getUserObj($_classRef);
                     $_procObj->hookAfterCreate($data, $returnValues['insertID'], $columns, $columnTypes, $tables[0]);
                 }
             }
         }
         // Post-processing SQL
         if ($status == 'success' && isset($this->settings['postProcessingNewSQL'])) {
             $templateUtility = $this->objectManager->get('Frohland\\Ezqueries\\Utility\\TemplateUtility');
             $postProcessingSQLStatements = explode(';', $this->settings['postProcessingNewSQL']);
             $postProcessingSQLStatusTotal = '';
             $data['ezqueriesAIValue']['type'] = 'numeric';
             $data['ezqueriesAIValue']['value'] = $returnValues['insertID'];
             foreach ($postProcessingSQLStatements as $postProcessingSQLStatement) {
                 if ($postProcessingSQLStatement !== '') {
                     $parsedPostProcessingSQLStatement = $templateUtility->fillMarkersInSQLStatement(trim($postProcessingSQLStatement), $arguments, $data, $this->recordManagementRepository);
                     $postProcessingSQLStatus = $this->recordManagementRepository->executeSQLStatement($parsedPostProcessingSQLStatement);
                     if ($postProcessingSQLStatus !== 'success') {
                         $postProcessingSQLStatusTotal .= '<br />Post-processing error: ' . $postProcessingSQLStatus;
                     }
                 }
             }
         }
         // Show create status
         switch ($status) {
             case 'success':
                 $flashMessage = \TYPO3\CMS\Extbase\Utility\LocalizationUtility::translate('message_create_successful', 'ezqueries') . $postProcessingSQLStatusTotal;
                 break;
             default:
                 $flashMessage = \TYPO3\CMS\Extbase\Utility\LocalizationUtility::translate('message_error', 'ezqueries') . ' "' . $status . '"';
                 $status = 'error';
                 break;
         }
         // Redirect
         if ($status == 'success') {
             if ($this->settings['redirectNew'] == 'edit' || $this->settings['redirectNew'] == 'detail') {
                 $primaryKeyColumns = $this->recordManagementRepository->getPrimaryKeyColumns($tables);
                 foreach ($primaryKeyColumns as $column => $value) {
                     if (isset($arguments[$column])) {
                         $primaryKeys[$column] = $arguments[$column];
                     } else {
                         $primaryKeys[$column] = $returnValues['insertID'];
                     }
                 }
             }
             if ($this->settings['redirectNewPage'] !== '' && $this->settings['redirectNewPage'] !== NULL) {
                 $page = $this->settings['redirectNewPage'];
                 if ($this->settings['redirectNew'] == 'list') {
                     $this->redirect('list', NULL, NULL, array(), $page);
                 }
                 if ($this->settings['redirectNew'] == 'edit') {
                     $this->redirect('edit', NULL, NULL, array('primaryKeys' => $primaryKeys), $page);
                 }
                 if ($this->settings['redirectNew'] == 'detail') {
                     $this->redirect('detail', NULL, NULL, array('primaryKeys' => $primaryKeys), $page);
                 }
                 if ($this->settings['redirectNew'] == 'new') {
                     $this->redirect('new', NULL, NULL, array(), $page);
                 }
             } else {
                 if ($this->settings['redirectNew'] == 'new') {
                     $this->redirect('new', NULL, NULL, array('search' => $search, 'filters' => $filters, 'status' => $status, 'flashMessage' => $flashMessage));
                 }
                 if ($this->settings['redirectNew'] == 'list') {
                     $this->redirect('list', NULL, NULL, array('search' => $search, 'filters' => $filters));
                 }
                 if ($this->settings['redirectNew'] == 'edit') {
                     $this->redirect('edit', NULL, NULL, array('primaryKeys' => $primaryKeys, 'search' => $search, 'filters' => $filters));
                 }
                 if ($this->settings['redirectNew'] == 'detail') {
                     $this->redirect('detail', NULL, NULL, array('primaryKeys' => $primaryKeys, 'search' => $search, 'filters' => $filters));
                 }
             }
         } else {
             $this->redirect('new', NULL, NULL, array('search' => $search, 'filters' => $filters, 'status' => $status, 'flashMessage' => $flashMessage));
         }
     } else {
         $this->redirect('error');
     }
 }
 /**
  * Set columns (for the queries)
  *
  * @param array $flexFormSettings The Settings from the FlexForm
  * @return void
  */
 public function setColumns($flexFormSettings)
 {
     switch ($this->table->getTableType()) {
         case 'list':
             $selectedColumnsSettings = 'listColumns';
             break;
         case 'detail':
             $selectedColumnsSettings = 'detailColumns';
             break;
         case 'edit':
             $selectedColumnsSettings = 'editColumns';
             break;
         case 'new':
             $selectedColumnsSettings = 'newColumns';
             break;
         case 'search':
             $selectedColumnsSettings = 'searchColumns';
             break;
         case 'relation':
             $selectedColumnsSettings = 'relationColumns';
             break;
         default:
             $selectedColumnsSettings = NULL;
             break;
     }
     $columns = array();
     // Get selected columns and all columns
     if ($flexFormSettings[$selectedColumnsSettings]) {
         $selectedColumns = explode(',', $flexFormSettings[$selectedColumnsSettings]);
         foreach ($selectedColumns as $column) {
             $columns[$column]['cssName'] = str_replace('.', '_', $column);
             $columns[$column]['columnName'] = substr($column, strpos($column, '.') + 1, strlen($column) - strpos($column, '.') - 1);
             $columns[$column]['tableName'] = substr($column, 0, strpos($column, '.'));
             $columns[$column]['name'] = $column;
         }
         // Get primary key columns
         $primaryKeyColumns = $this->recordManagementRepository->getPrimaryKeyColumns($this->table->getTableNames());
         foreach ($primaryKeyColumns as $primaryKeyColumn) {
             $columns[$primaryKeyColumn['name']]['name'] = $primaryKeyColumn['name'];
         }
         // Get additional columns (for links, labels, ...)
         $columnTypes = $this->table->getColumnTypes();
         foreach ($columnTypes as $column => $name) {
             if (isset($columnTypes[$column]['filterColumn'])) {
                 $columns[$columnTypes[$column]['filterColumn']]['name'] = $columnTypes[$column]['filterColumn'];
             }
             if ($this->table->getTableType() == 'detail' || $this->table->getTableType() == 'edit') {
                 if (isset($columnTypes[$column]['labelFrom'])) {
                     $columns[$columnTypes[$column]['labelFrom']]['name'] = $columnTypes[$column]['labelFrom'];
                 }
             }
             if ($this->table->getTableType() == 'relation') {
                 if ($column == $this->table->getForeignKeyColumn()) {
                     $columns[$column]['name'] = $this->table->getForeignKeyColumn();
                 }
                 if ($column == $this->table->getForeignKeyRelationColumn()) {
                     $columns[$column]['name'] = $this->table->getForeignKeyRelationColumn();
                 }
             }
         }
         // Get additional columns (parameters, additional select, ...)
         foreach ($columns as $column => $name) {
             if (isset($columnTypes[$column]['parameters'])) {
                 $parameters = explode(',', $columnTypes[$column]['parameters']);
                 foreach ($parameters as $parameter) {
                     $parameter = trim($parameter);
                     $parameterValue = trim(substr($parameter, strpos($parameter, '=') + 1, strlen($parameter) - strpos($parameter, '=') - 1));
                     if ($parameterValue[0] != '"') {
                         $columns[$parameterValue]['name'] = $parameterValue;
                     }
                 }
             }
             if ($columnTypes[$column]['type'] == 'additional') {
                 unset($columns[$column]);
                 if (isset($columnTypes[$column]['select'])) {
                     $columns[$column]['cssName'] = str_replace('.', '_', $column);
                     $columns[$column]['name'] = $column;
                     $columns[$column]['query'] = $columnTypes[$column]['select'];
                 }
             }
         }
     } else {
         $columns = $this->recordManagementRepository->getColumnsFromTables($this->table->getTableNames());
     }
     $this->table->setColumns($columns);
 }