198 lines
5.8 KiB
PHP
198 lines
5.8 KiB
PHP
|
<?php namespace RainLab\Builder\Behaviors;
|
||
|
|
||
|
use RainLab\Builder\Classes\IndexOperationsBehaviorBase;
|
||
|
use RainLab\Builder\Classes\DatabaseTableModel;
|
||
|
use Backend\Behaviors\FormController;
|
||
|
use RainLab\Builder\Classes\MigrationModel;
|
||
|
use RainLab\Builder\Classes\TableMigrationCodeGenerator;
|
||
|
use RainLab\Builder\Classes\PluginCode;
|
||
|
use ApplicationException;
|
||
|
use Exception;
|
||
|
use Request;
|
||
|
use Input;
|
||
|
use Lang;
|
||
|
|
||
|
/**
|
||
|
* Database table management functionality for the Builder index controller
|
||
|
*
|
||
|
* @package rainlab\builder
|
||
|
* @author Alexey Bobkov, Samuel Georges
|
||
|
*/
|
||
|
class IndexDatabaseTableOperations extends IndexOperationsBehaviorBase
|
||
|
{
|
||
|
protected $baseFormConfigFile = '~/plugins/rainlab/builder/classes/databasetablemodel/fields.yaml';
|
||
|
protected $migrationFormConfigFile = '~/plugins/rainlab/builder/classes/migrationmodel/fields.yaml';
|
||
|
|
||
|
public function onDatabaseTableCreateOrOpen()
|
||
|
{
|
||
|
$tableName = Input::get('table_name');
|
||
|
$pluginCodeObj = $this->getPluginCode();
|
||
|
|
||
|
$widget = $this->makeBaseFormWidget($tableName);
|
||
|
$this->vars['tableName'] = $tableName;
|
||
|
|
||
|
$result = [
|
||
|
'tabTitle' => $this->getTabTitle($tableName),
|
||
|
'tabIcon' => 'icon-hdd-o',
|
||
|
'tabId' => $this->getTabId($tableName),
|
||
|
'tab' => $this->makePartial('tab', [
|
||
|
'form' => $widget,
|
||
|
'pluginCode' => $pluginCodeObj->toCode(),
|
||
|
'tableName' => $tableName
|
||
|
])
|
||
|
];
|
||
|
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
public function onDatabaseTableValidateAndShowPopup()
|
||
|
{
|
||
|
$tableName = Input::get('table_name');
|
||
|
|
||
|
$model = $this->loadOrCreateBaseModel($tableName);
|
||
|
$model->fill($this->processColumnData($_POST));
|
||
|
|
||
|
$pluginCode = Request::input('plugin_code');
|
||
|
$model->setPluginCode($pluginCode);
|
||
|
$model->validate();
|
||
|
|
||
|
$migration = $model->generateCreateOrUpdateMigration();
|
||
|
|
||
|
if (!$migration) {
|
||
|
return $this->makePartial('migration-popup-form', [
|
||
|
'noChanges' => true
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
return $this->makePartial('migration-popup-form', [
|
||
|
'form' => $this->makeMigrationFormWidget($migration),
|
||
|
'operation' => $model->isNewModel() ? 'create' : 'update',
|
||
|
'table' => $model->name,
|
||
|
'pluginCode' => $pluginCode
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
public function onDatabaseTableMigrationApply()
|
||
|
{
|
||
|
$pluginCode = new PluginCode(Request::input('plugin_code'));
|
||
|
$model = new MigrationModel();
|
||
|
$model->setPluginCodeObj($pluginCode);
|
||
|
|
||
|
$model->fill($_POST);
|
||
|
|
||
|
$operation = Input::get('operation');
|
||
|
$table = Input::get('table');
|
||
|
|
||
|
$model->scriptFileName = 'builder_table_'.$operation.'_'.$table;
|
||
|
$model->makeScriptFileNameUnique();
|
||
|
|
||
|
$codeGenerator = new TableMigrationCodeGenerator();
|
||
|
$model->code = $codeGenerator->wrapMigrationCode($model->scriptFileName, $model->code, $pluginCode);
|
||
|
|
||
|
try {
|
||
|
$model->save();
|
||
|
}
|
||
|
catch (Exception $ex) {
|
||
|
throw new ApplicationException($ex->getMessage());
|
||
|
}
|
||
|
|
||
|
$result = $this->controller->widget->databaseTabelList->updateList();
|
||
|
|
||
|
$result = array_merge(
|
||
|
$result,
|
||
|
$this->controller->widget->versionList->refreshActivePlugin()
|
||
|
);
|
||
|
|
||
|
$result['builderResponseData'] = [
|
||
|
'builderObjectName'=>$table,
|
||
|
'tabId' => $this->getTabId($table),
|
||
|
'tabTitle' => $table,
|
||
|
'tableName' => $table,
|
||
|
'operation' => $operation,
|
||
|
'pluginCode' => $pluginCode->toCode()
|
||
|
];
|
||
|
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
public function onDatabaseTableShowDeletePopup()
|
||
|
{
|
||
|
$tableName = Input::get('table_name');
|
||
|
|
||
|
$model = $this->loadOrCreateBaseModel($tableName);
|
||
|
$pluginCode = Request::input('plugin_code');
|
||
|
$model->setPluginCode($pluginCode);
|
||
|
|
||
|
$migration = $model->generateDropMigration();
|
||
|
|
||
|
return $this->makePartial('migration-popup-form', [
|
||
|
'form' => $this->makeMigrationFormWidget($migration),
|
||
|
'operation' => 'delete',
|
||
|
'table' => $model->name,
|
||
|
'pluginCode' => $pluginCode
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
protected function getTabTitle($tableName)
|
||
|
{
|
||
|
if (!strlen($tableName)) {
|
||
|
return Lang::get('rainlab.builder::lang.database.tab_new_table');
|
||
|
}
|
||
|
|
||
|
return $tableName;
|
||
|
}
|
||
|
|
||
|
protected function getTabId($tableName)
|
||
|
{
|
||
|
if (!strlen($tableName)) {
|
||
|
return 'databaseTable-'.uniqid(time());
|
||
|
}
|
||
|
|
||
|
return 'databaseTable-'.$tableName;
|
||
|
}
|
||
|
|
||
|
protected function loadOrCreateBaseModel($tableName, $options = [])
|
||
|
{
|
||
|
$model = new DatabaseTableModel();
|
||
|
|
||
|
if (!$tableName) {
|
||
|
$model->name = $this->getPluginCode()->toDatabasePrefix().'_';
|
||
|
|
||
|
return $model;
|
||
|
}
|
||
|
|
||
|
$model->load($tableName);
|
||
|
return $model;
|
||
|
}
|
||
|
|
||
|
protected function makeMigrationFormWidget($migration)
|
||
|
{
|
||
|
$widgetConfig = $this->makeConfig($this->migrationFormConfigFile);
|
||
|
|
||
|
$widgetConfig->model = $migration;
|
||
|
$widgetConfig->alias = 'form_migration_'.uniqid();
|
||
|
|
||
|
$form = $this->makeWidget('Backend\Widgets\Form', $widgetConfig);
|
||
|
$form->context = FormController::CONTEXT_CREATE;
|
||
|
|
||
|
return $form;
|
||
|
}
|
||
|
|
||
|
protected function processColumnData($postData)
|
||
|
{
|
||
|
if (!array_key_exists('columns', $postData)) {
|
||
|
return $postData;
|
||
|
}
|
||
|
|
||
|
$booleanColumns = ['unsigned', 'allow_null', 'auto_increment', 'primary_key'];
|
||
|
foreach ($postData['columns'] as &$row) {
|
||
|
foreach ($row as $column=>$value) {
|
||
|
if (in_array($column, $booleanColumns) && $value == 'false') {
|
||
|
$row[$column] = false;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $postData;
|
||
|
}
|
||
|
}
|