/**
  * Set column types
  *
  * @param array $flexFormSettings The Settings from the FlexForm
  * @return void
  */
 public function setColumnTypes($flexFormSettings)
 {
     $columnTypes = $this->recordManagementRepository->getColumnTypes($this->table->getTableNames());
     $columnConfig = $flexFormSettings['columnConfiguration'];
     $types = $this->mergeColumnTypesWithColumnConfig($columnTypes, $columnConfig);
     // Sortable columns?
     if ($this->table->getTableType() == 'list' && $flexFormSettings['useSortableColumns']) {
         $sortableColumns = explode(',', $flexFormSettings['sortableColumns']);
         foreach ($sortableColumns as $sortableColumn) {
             $types[$sortableColumn]['sortable'] = TRUE;
         }
     }
     // Include hook to set custom column types
     if (is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ezqueries']['recordManagement']['hookSetColumnTypes'])) {
         foreach ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['ezqueries']['recordManagement']['hookSetColumnTypes'] as $_classRef) {
             $_procObj =& \TYPO3\CMS\Core\Utility\GeneralUtility::getUserObj($_classRef);
             $types = $_procObj->hookSetColumnTypes($types, $this->table->getTableType());
         }
     }
     $this->table->setColumnTypes($types);
 }
 /**
  * Assign relations
  *
  * @return void
  */
 public function assignAction()
 {
     // Check permission
     if ($this->settings['enableRelation']) {
         // Get $_GET and $_POST parameters
         $arguments = $this->request->getArguments();
         $flashMessage = '';
         // Set Table names
         $tables = explode(',', $this->settings['tables']);
         // Get column types
         $columnTypes = $this->recordManagementRepository->getColumnTypes($tables);
         // Set foreign key / foreign key columns
         $foreignKeyColumn = $this->settings['relationForeignKeyColumn'];
         $foreignKeyRelationColumn = $this->settings['relationForeignKeyRelationColumn'];
         $foreignKey = $arguments['foreignKey'];
         // Get relation data
         $relationDataOld = explode('<->', $arguments['relationDataOld']);
         array_pop($relationDataOld);
         $relationDataNew = explode('<->', $arguments['relationDataNew']);
         array_pop($relationDataNew);
         if ($this->settings['relationType'] == 'manytomany') {
             // Delete removed relations
             foreach ($relationDataOld as $idOld) {
                 $deleteRelation = true;
                 $status = 'success';
                 foreach ($relationDataNew as $idNew) {
                     if ($idOld == $idNew) {
                         $deleteRelation = false;
                         break;
                     }
                 }
                 if ($deleteRelation) {
                     $deleteData = array();
                     $deleteData[$foreignKeyColumn] = $foreignKey;
                     $deleteData[$foreignKeyRelationColumn] = $idOld;
                     $status = $this->recordManagementRepository->deleteRecord($tables[0], $deleteData);
                 }
                 // Status
                 switch ($status) {
                     case 'success':
                         break;
                     default:
                         $flashMessage .= ' "' . $status . '"';
                         break;
                 }
             }
             // Create added relations
             foreach ($relationDataNew as $idNew) {
                 $createRelation = true;
                 $status = 'success';
                 foreach ($relationDataOld as $idOld) {
                     if ($idNew == $idOld) {
                         $createRelation = false;
                         break;
                     }
                 }
                 if ($createRelation) {
                     $createData = array();
                     $createData[$foreignKeyColumn]['value'] = $foreignKey;
                     if ($columnTypes[$foreignKeyColumn]['type'] != 'numeric' && $columnTypes[$foreignKeyColumn]['type'] != 'int' && $columnTypes[$foreignKeyColumn]['type'] != 'boolean') {
                         $createData[$foreignKeyColumn]['type'] = 'text';
                     } else {
                         $createData[$foreignKeyColumn]['type'] = 'numeric';
                     }
                     $createData[$foreignKeyRelationColumn]['value'] = $idNew;
                     if ($columnTypes[$foreignKeyRelationColumn]['type'] != 'numeric' && $columnTypes[$foreignKeyRelationColumn]['type'] != 'int' && $columnTypes[$foreignKeyRelationColumn]['type'] != 'boolean') {
                         $createData[$foreignKeyRelationColumn]['type'] = 'text';
                     } else {
                         $createData[$foreignKeyRelationColumn]['type'] = 'numeric';
                     }
                     $returnValues = $this->recordManagementRepository->createRecord($tables[0], $createData);
                     $status = $returnValues['status'];
                 }
                 // Status
                 switch ($status) {
                     case 'success':
                         break;
                     default:
                         $flashMessage .= ' "' . $status . '"';
                         break;
                 }
             }
         } else {
             // Update removed relations
             foreach ($relationDataOld as $idOld) {
                 $deleteRelation = true;
                 $status = 'success';
                 foreach ($relationDataNew as $idNew) {
                     if ($idOld == $idNew) {
                         $deleteRelation = false;
                         break;
                     }
                 }
                 if ($deleteRelation) {
                     $recordIdentifier = array();
                     $recordIdentifier[$foreignKeyColumn] = $foreignKey;
                     $recordIdentifier[$foreignKeyRelationColumn] = $idOld;
                     $updateData = array();
                     if ($columnTypes[$foreignKeyColumn]['type'] != 'numeric' && $columnTypes[$foreignKeyColumn]['type'] != 'int' && $columnTypes[$foreignKeyColumn]['type'] != 'boolean') {
                         $updateData[$foreignKeyColumn]['value'] = '';
                         $updateData[$foreignKeyColumn]['type'] = 'text';
                     } else {
                         if ($columnTypes[$foreignKeyColumn]['not_null']) {
                             $updateData[$foreignKeyColumn]['value'] = 0;
                         } else {
                             $updateData[$foreignKeyColumn]['value'] = NULL;
                         }
                         $updateData[$foreignKeyColumn]['type'] = 'numeric';
                     }
                     $status = $this->recordManagementRepository->updateRecord($tables[0], $recordIdentifier, $updateData);
                 }
                 // Status
                 switch ($status) {
                     case 'success':
                         break;
                     default:
                         $flashMessage .= ' "' . $status . '"';
                         break;
                 }
             }
             // Update added relations
             foreach ($relationDataNew as $idNew) {
                 $createRelation = true;
                 $status = 'success';
                 foreach ($relationDataOld as $idOld) {
                     if ($idNew == $idOld) {
                         $createRelation = false;
                         break;
                     }
                 }
                 if ($createRelation) {
                     $recordIdentifier = array();
                     $recordIdentifier[$foreignKeyRelationColumn] = $idNew;
                     $updateData = array();
                     $updateData[$foreignKeyColumn]['value'] = $foreignKey;
                     if ($columnTypes[$foreignKeyColumn]['type'] != 'numeric' && $columnTypes[$foreignKeyColumn]['type'] != 'int' && $columnTypes[$foreignKeyColumn]['type'] != 'boolean') {
                         $updateData[$foreignKeyColumn]['type'] = 'text';
                     } else {
                         $updateData[$foreignKeyColumn]['type'] = 'numeric';
                     }
                     $status = $this->recordManagementRepository->updateRecord($tables[0], $recordIdentifier, $updateData);
                 }
                 // Status
                 switch ($status) {
                     case 'success':
                         break;
                     default:
                         $flashMessage .= ' "' . $status . '"';
                         break;
                 }
             }
         }
         $this->redirect('relation', NULL, NULL, array('foreignKey' => $foreignKey, 'flashMessage' => $flashMessage));
     }
 }