/** * Saves submitted and validated data * * @param $verbose boolean $verbose If set to true function will only specify pending changes without making any * * @return array */ protected function save($fieldIds, $verbose = false) { $report = ''; // Instantiate Migration Generator Class (Laravel 4 Generator Module Wrapper) $generator = new MigrationGenerator(); // Check if module_name is new or existing one if (is_numeric(\Input::get('module_id'))) { // Get module data $module = Module::find(\Input::get('module_id')); // Handle Folder module type if (\Input::get('is_folder') == '1') { return $this->updateFolderModuleType($module, $verbose); } // Get id's of fields that are stored in the database $existingFieldIds = array_fetch($module->fields()->get()->toArray(), 'id'); // Check if remove module request is received if (\Input::get('remove_request') == 1) { $report .= $this->reportSectionTitleGenerator('remove', 'module', \Input::get('name')); // If in verbose mode return report array if ($verbose) { return array('report' => $report); } // Populate migrationFieldsDropped array (needed for php artisan migrate:rollback) $migrationFieldsDropped = array(); $existingFieldIds = $module->fields()->get(); foreach ($existingFieldIds as $field) { $migrationFieldsDropped[$field->column_name] = $field->column_type; } // Generate migration file $generator->destroy($module->table_name, $migrationFieldsDropped); // Run the migrations if (\Input::get('run-migrations') == 1) { \Artisan::call('migrate'); } // Remove the module (also removes orphans from fields table) $module->delete(); // Notify about successful data removal \Session::flash('success', 'Data has been removed.'); // Redirect to settings page return \Redirect::to('/admin/settings/'); } // Create an array of deleted fields, if any $deletedFieldIds = array_diff($existingFieldIds, $fieldIds); // Create an array of new fields, if any $newFieldIds = array_diff($fieldIds, $existingFieldIds); // Create an array of edited fields $editedFieldIds = array_diff($fieldIds, $deletedFieldIds, $newFieldIds); if (!$module->get()->isEmpty()) { $moduleHasChanged = false; // Updating existing module $report .= $this->reportSectionTitleGenerator('change', 'module', \Input::get('name')); if ($module->name != \Input::get('module_name')) { $report .= $this->reportGenerator('set', 'name', \Input::get('name'), $module->name); $module->name = \Input::get('name'); $moduleHasChanged = true; } if ($module->parent_module != \Input::get('parent_module')) { $report .= $this->reportGenerator('set', 'parent module', \Input::get('parent_module'), $module->parent_module); $module->parent_module = \Input::get('parent_module'); $moduleHasChanged = true; } if ($module->nestable != \Input::get('nestable')) { $report .= $this->reportGenerator('set', 'nestable', \Input::get('nestable'), $module->nestable); $module->nestable = \Input::get('nestable'); $moduleHasChanged = true; } $report .= $moduleHasChanged ? '' : '<br/>'; // Save changes to module table if (!$verbose) { $module->save(); } // Process new fields for an existing module if (count($newFieldIds) > 0) { $migrationFields = array(); foreach ($newFieldIds as $newFieldId) { // Generate a report line $report .= $this->insertFieldReport($newFieldId); // Insert a new record in fields table if (!$verbose) { $tmp = array(); $tmp['module_id'] = \Input::get('module_id'); $tmp['field_name'] = \Input::get('field_name' . $newFieldId); $tmp['field_type'] = \Input::get('field_type' . $newFieldId); $tmp['relation_table'] = \Input::get('relation_table' . $newFieldId); $tmp['column_name'] = \Input::get('column_name' . $newFieldId); $tmp['column_type'] = \Input::get('column_type' . $newFieldId); $tmp['tooltip_text'] = \Input::get('tooltip_text' . $newFieldId); $newField = Field::create($tmp); // Populate migrationFields array $migrationFields[\Input::get('column_name' . $newFieldId)] = \Input::get('column_type' . $newFieldId); } $moduleHasChanged = true; } // Generate migration files if (!$verbose) { $generator->add($module->table_name, $migrationFields); } } // Process edited fields for an existing module if (count($editedFieldIds) > 0) { $migrationFields = array(); $migrationFieldsDropped = array(); foreach ($editedFieldIds as $fieldId) { $fieldHasChanged = false; $fieldReport = ''; $field = $module->fields()->find($fieldId); // Populate migrationFields and migrationFieldsDropped arrays if ($field->column_name != \Input::get('column_name' . $fieldId) or $field->column_type != \Input::get('column_type' . $fieldId)) { $migrationFields[\Input::get('column_name' . $fieldId)] = \Input::get('column_type' . $fieldId); $migrationFieldsDropped[$field->column_name] = $field->column_type; } if ($field->field_name != \Input::get('field_name' . $fieldId)) { $fieldReport .= $this->reportGenerator('set', 'field name', \Input::get('field_name' . $fieldId), $field->field_name); $field->field_name = \Input::get('field_name' . $fieldId); $fieldHasChanged = true; } if ($field->field_type != \Input::get('field_type' . $fieldId)) { $fieldReport .= $this->reportGenerator('set', 'field type', \Input::get('field_type' . $fieldId), $field->field_type); $field->field_type = \Input::get('field_type' . $fieldId); $fieldHasChanged = true; } if ($field->relation_table != \Input::get('relation_table' . $fieldId)) { $fieldReport .= $this->reportGenerator('set', 'relation table', \Input::get('relation_table' . $fieldId), $field->relation_table); $field->relation_table = \Input::get('relation_table' . $fieldId); $fieldHasChanged = true; } if ($field->column_name != \Input::get('column_name' . $fieldId)) { $fieldReport .= $this->reportGenerator('set', 'column name', \Input::get('column_name' . $fieldId), $field->column_name); $field->column_name = \Input::get('column_name' . $fieldId); $fieldHasChanged = true; } if ($field->column_type != \Input::get('column_type' . $fieldId)) { $fieldReport .= $this->reportGenerator('set', 'column type', \Input::get('column_type' . $fieldId), $field->column_type); $field->column_type = \Input::get('column_type' . $fieldId); $fieldHasChanged = true; } if ($field->tooltip_text != \Input::get('tooltip_text' . $fieldId)) { $fieldReport .= $this->reportGenerator('set', 'tooltip text', \Input::get('tooltip_text' . $fieldId), $field->tooltip_text); $field->tooltip_text = \Input::get('tooltip_text' . $fieldId); $fieldHasChanged = true; } if ($fieldHasChanged) { $fieldReport = $this->reportSectionTitleGenerator('change', 'field', $field->field_name) . $fieldReport; $fieldReport .= '<br/>'; $report .= $fieldReport; $moduleHasChanged = true; } if (!$verbose and $fieldHasChanged) { $field->save(); } } // Generate migration files if (!$verbose and $fieldHasChanged) { // First drop fields with old column_type $generator->remove($module->table_name, $migrationFieldsDropped); // Wait 1 second so that remove migration is executed before add (filenaming issue) sleep(1); // Than add fields with changed column_type $generator->add($module->table_name, $migrationFields); } } // Process deleted fields if (count($deletedFieldIds) > 0) { $migrationFieldsDropped = array(); foreach ($deletedFieldIds as $deletedFieldId) { $field = $module->fields()->find($deletedFieldId); $report .= $this->reportSectionTitleGenerator('remove', 'field', $field->field_name); // Populate migrationFieldsDropped array $migrationFieldsDropped[$field->column_name] = $field->column_type; if (!$verbose) { $field->delete(); } $moduleHasChanged = true; } // Generate migration files if (!$verbose) { $generator->remove($module->table_name, $migrationFieldsDropped); } } // This will yield 'no changes detected' message if (!$moduleHasChanged) { return false; } // If in verbose mode return report array if ($verbose) { return array('report' => $report); } // Run the migrations if (\Input::get('run-migrations') == 1) { \Artisan::call('migrate'); } // Notify about successful data entry \Session::flash('success', 'Data has been saved.'); // Redirect to module settings page return \Redirect::to('/admin/settings/' . \Input::get('module_id')); } } // Inserting a new model $report .= $this->reportSectionTitleGenerator('create', 'module'); $report .= $this->reportGenerator('set', 'module name', \Input::get('name')); $report .= $this->reportGenerator('set', 'table name', \Input::get('table_name')); $report .= $this->reportGenerator('set', 'parent module', \Input::get('parent_module')); $report .= $this->reportGenerator('set', 'nestable', \Input::get('nestable')); $report .= '<br/>'; // Insert a new record in modules table, and get it's ID if (!$verbose) { $newModule = Module::create(\Input::all()); } $migrationFields = array(); // Inserting new fields foreach ($fieldIds as $fieldId) { // Generate a report line $report .= $this->insertFieldReport($fieldId); // Insert a new record in fields table if (!$verbose) { $tmp = array(); $tmp['module_id'] = $newModule->id; $tmp['field_name'] = \Input::get('field_name' . $fieldId); $tmp['field_type'] = \Input::get('field_type' . $fieldId); $tmp['relation_table'] = \Input::get('relation_table' . $fieldId); $tmp['column_name'] = \Input::get('column_name' . $fieldId); $tmp['column_type'] = \Input::get('column_type' . $fieldId); $tmp['tooltip_text'] = \Input::get('tooltip_text' . $fieldId); $newField = Field::create($tmp); // Populate migrationFields array $migrationFields[\Input::get('column_name' . $fieldId)] = \Input::get('column_type' . $fieldId); } } // If in verbose mode return report array if ($verbose) { return array('report' => $report); } // Generate migration files (Only if module type is not folder) if (\Input::get('is_folder') !== '1') { $generator->create(\Input::get('table_name'), $migrationFields); } // Run the migrations (Only if module type is not folder) if (\Input::get('run-migrations') == 1 && \Input::get('is_folder') !== '1') { \Artisan::call('migrate'); } // Notify about successful data entry \Session::flash('success', 'Data has been saved.'); // Redirect to new module settings page return \Redirect::to('/admin/settings/' . $newModule->id); }