176 lines
5.0 KiB
PHP
176 lines
5.0 KiB
PHP
<?php namespace RainLab\Builder\Behaviors;
|
|
|
|
use RainLab\Builder\Classes\IndexOperationsBehaviorBase;
|
|
use RainLab\Builder\Classes\ModelListModel;
|
|
use RainLab\Builder\Classes\PluginCode;
|
|
use RainLab\Builder\Classes\ModelModel;
|
|
use ApplicationException;
|
|
use Exception;
|
|
use Request;
|
|
use Flash;
|
|
use Input;
|
|
use Lang;
|
|
|
|
/**
|
|
* Model list management functionality for the Builder index controller
|
|
*
|
|
* @package rainlab\builder
|
|
* @author Alexey Bobkov, Samuel Georges
|
|
*/
|
|
class IndexModelListOperations extends IndexOperationsBehaviorBase
|
|
{
|
|
protected $baseFormConfigFile = '~/plugins/rainlab/builder/classes/modellistmodel/fields.yaml';
|
|
|
|
public function onModelListCreateOrOpen()
|
|
{
|
|
$fileName = Input::get('file_name');
|
|
$modelClass = Input::get('model_class');
|
|
|
|
$pluginCodeObj = $this->getPluginCode();
|
|
|
|
$options = [
|
|
'pluginCode' => $pluginCodeObj->toCode(),
|
|
'modelClass' => $modelClass
|
|
];
|
|
|
|
$widget = $this->makeBaseFormWidget($fileName, $options);
|
|
$this->vars['fileName'] = $fileName;
|
|
|
|
$result = [
|
|
'tabTitle' => $widget->model->getDisplayName(Lang::get('rainlab.builder::lang.list.tab_new_list')),
|
|
'tabIcon' => 'icon-list',
|
|
'tabId' => $this->getTabId($modelClass, $fileName),
|
|
'tab' => $this->makePartial('tab', [
|
|
'form' => $widget,
|
|
'pluginCode' => $pluginCodeObj->toCode(),
|
|
'fileName' => $fileName,
|
|
'modelClass' => $modelClass
|
|
])
|
|
];
|
|
|
|
return $result;
|
|
}
|
|
|
|
public function onModelListSave()
|
|
{
|
|
$model = $this->loadOrCreateListFromPost();
|
|
$model->fill($_POST);
|
|
$model->save();
|
|
|
|
$result = $this->controller->widget->modelList->updateList();
|
|
|
|
Flash::success(Lang::get('rainlab.builder::lang.list.saved'));
|
|
|
|
$modelClass = Input::get('model_class');
|
|
$result['builderResponseData'] = [
|
|
'builderObjectName' => $model->fileName,
|
|
'tabId' => $this->getTabId($modelClass, $model->fileName),
|
|
'tabTitle' => $model->getDisplayName(Lang::get('rainlab.builder::lang.list.tab_new_list'))
|
|
];
|
|
|
|
$this->mergeRegistryDataIntoResult($result, $model, $modelClass);
|
|
|
|
return $result;
|
|
}
|
|
|
|
public function onModelListDelete()
|
|
{
|
|
$model = $this->loadOrCreateListFromPost();
|
|
|
|
$model->deleteModel();
|
|
|
|
$result = $this->controller->widget->modelList->updateList();
|
|
|
|
$modelClass = Input::get('model_class');
|
|
$this->mergeRegistryDataIntoResult($result, $model, $modelClass);
|
|
|
|
return $result;
|
|
}
|
|
|
|
public function onModelListGetModelFields()
|
|
{
|
|
$columnNames = ModelModel::getModelFields($this->getPluginCode(), Input::get('model_class'));
|
|
|
|
$result = [];
|
|
foreach ($columnNames as $columnName) {
|
|
$result[] = [
|
|
'title' => $columnName,
|
|
'value' => $columnName
|
|
];
|
|
}
|
|
|
|
return [
|
|
'responseData' => [
|
|
'options' => $result
|
|
]
|
|
];
|
|
}
|
|
|
|
public function onModelListLoadDatabaseColumns()
|
|
{
|
|
$columns = ModelModel::getModelColumnsAndTypes($this->getPluginCode(), Input::get('model_class'));
|
|
|
|
return [
|
|
'responseData' => [
|
|
'columns' => $columns
|
|
]
|
|
];
|
|
}
|
|
|
|
protected function loadOrCreateListFromPost()
|
|
{
|
|
$pluginCode = Request::input('plugin_code');
|
|
$modelClass = Input::get('model_class');
|
|
$fileName = Input::get('file_name');
|
|
|
|
$options = [
|
|
'pluginCode' => $pluginCode,
|
|
'modelClass' => $modelClass
|
|
];
|
|
|
|
return $this->loadOrCreateBaseModel($fileName, $options);
|
|
}
|
|
|
|
protected function getTabId($modelClass, $fileName)
|
|
{
|
|
if (!strlen($fileName)) {
|
|
return 'modelForm-'.uniqid(time());
|
|
}
|
|
|
|
return 'modelList-'.$modelClass.'-'.$fileName;
|
|
}
|
|
|
|
protected function loadOrCreateBaseModel($fileName, $options = [])
|
|
{
|
|
$model = new ModelListModel();
|
|
|
|
if (isset($options['pluginCode']) && isset($options['modelClass'])) {
|
|
$model->setPluginCode($options['pluginCode']);
|
|
$model->setModelClassName($options['modelClass']);
|
|
}
|
|
|
|
if (!$fileName) {
|
|
$model->initDefaults();
|
|
|
|
return $model;
|
|
}
|
|
|
|
$model->loadForm($fileName);
|
|
return $model;
|
|
}
|
|
|
|
protected function mergeRegistryDataIntoResult(&$result, $model, $modelClass)
|
|
{
|
|
if (!array_key_exists('builderResponseData', $result)) {
|
|
$result['builderResponseData'] = [];
|
|
}
|
|
|
|
$fullClassName = $model->getPluginCodeObj()->toPluginNamespace().'\\Models\\'.$modelClass;
|
|
$pluginCode = $model->getPluginCodeObj()->toCode();
|
|
$result['builderResponseData']['registryData'] = [
|
|
'lists' => ModelListModel::getPluginRegistryData($pluginCode, $modelClass),
|
|
'pluginCode' => $pluginCode,
|
|
'modelClass' => $fullClassName
|
|
];
|
|
}
|
|
} |