diff --git a/modules/backend/behaviors/RelationController.php b/modules/backend/behaviors/RelationController.php index dc2191c11..099ee721e 100644 --- a/modules/backend/behaviors/RelationController.php +++ b/modules/backend/behaviors/RelationController.php @@ -33,7 +33,7 @@ class RelationController extends ControllerBehavior /** * @var const Postback parameter for read only mode. */ - const PARAM_READ_ONLY = '_relation_read_only'; + const PARAM_EXTRA_CONFIG = '_relation_extra_config'; /** * @var Backend\Classes\WidgetBase Reference to the search widget object. @@ -80,6 +80,11 @@ class RelationController extends ControllerBehavior */ protected $originalConfig; + /** + * @var array Config provided by the relationRender method + */ + protected $extraConfig; + /** * @var bool Has the behavior been initialized. */ @@ -242,8 +247,8 @@ class RelationController extends ControllerBehavior $this->vars['relationViewWidget'] = $this->viewWidget; $this->vars['relationViewModel'] = $this->viewModel; $this->vars['relationPivotWidget'] = $this->pivotWidget; - $this->vars['relationReadOnly'] = $this->readOnly ? 1 : 0; $this->vars['relationSessionKey'] = $this->relationGetSessionKey(); + $this->vars['relationExtraConfig'] = $this->extraConfig; } /** @@ -305,6 +310,10 @@ class RelationController extends ControllerBehavior throw new ApplicationException(Lang::get('backend::lang.relation.missing_definition', compact('field'))); } + if ($extraConfig = post(self::PARAM_EXTRA_CONFIG)) { + $this->applyExtraConfig($field, $extraConfig); + } + $this->alias = camel_case('relation ' . $field); $this->config = $this->makeConfig($this->getConfig($field), $this->requiredRelationProperties); $this->controller->relationExtendConfig($this->config, $this->field); @@ -317,6 +326,7 @@ class RelationController extends ControllerBehavior $this->relationObject = $this->model->{$field}(); $this->relationModel = $this->relationObject->getRelated(); + $this->readOnly = $this->getConfig('readOnly'); $this->deferredBinding = $this->getConfig('deferredBinding') || !$this->model->exists; $this->toolbarButtons = $this->evalToolbarButtons(); $this->viewMode = $this->evalViewMode(); @@ -364,13 +374,6 @@ class RelationController extends ControllerBehavior $this->pivotWidget->bindToController(); } } - - /* - * Read only mode - */ - if (post(self::PARAM_READ_ONLY, $this->getConfig('readOnly'))) { - $this->makeReadOnly(); - } } /** @@ -381,26 +384,30 @@ class RelationController extends ControllerBehavior */ public function relationRender($field, $options = []) { - $field = $this->validateField($field); - + /* + * Session key + */ if (is_string($options)) { $options = ['sessionKey' => $options]; } - /* - * Session key - */ if (isset($options['sessionKey'])) { $this->sessionKey = $options['sessionKey']; } /* - * Read only mode + * Apply options and extra config */ - if (isset($options['readOnly']) && $options['readOnly']) { - $this->makeReadOnly(); + $allowConfig = ['readOnly']; + if ($extraConfig = array_only($options, $allowConfig)) { + $this->extraConfig = $extraConfig; + $this->applyExtraConfig($field, $extraConfig); } + /* + * Initialize + */ + $this->validateField($field); $this->prepareVars(); /* @@ -526,9 +533,11 @@ class RelationController extends ControllerBehavior /* * Add buttons to toolbar */ - $defaultButtons = $this->toolbarButtons - ? '~/modules/backend/behaviors/relationcontroller/partials/_toolbar.htm' - : null; + $defaultButtons = null; + + if (!$this->readOnly && $this->toolbarButtons) { + $defaultButtons = '~/modules/backend/behaviors/relationcontroller/partials/_toolbar.htm'; + } $defaultConfig['buttons'] = $this->getConfig('view[toolbarPartial]', $defaultButtons); @@ -596,15 +605,14 @@ class RelationController extends ControllerBehavior $config->showSorting = $this->getConfig('view[showSorting]', true); $config->defaultSort = $this->getConfig('view[defaultSort]'); $config->recordsPerPage = $this->getConfig('view[recordsPerPage]'); - $config->showCheckboxes = $this->getConfig('view[showCheckboxes]', true); + $config->showCheckboxes = $this->getConfig('view[showCheckboxes]', !$this->readOnly); $config->recordUrl = $this->getConfig('view[recordUrl]', null); $defaultOnClick = sprintf( - "$.oc.relationBehavior.clickViewListRecord(':%s', '%s', '%s', %s)", + "$.oc.relationBehavior.clickViewListRecord(':%s', '%s', '%s')", $this->relationModel->getKeyName(), - $this->field, - $this->relationGetSessionKey(), - $this->readOnly ? 1 : 0 + $this->relationGetId(), + $this->relationGetSessionKey() ); if ($config->recordUrl) { @@ -737,7 +745,7 @@ class RelationController extends ControllerBehavior $config->recordOnClick = sprintf( "$.oc.relationBehavior.clickManageListRecord(:%s, '%s', '%s')", $this->relationModel->getKeyName(), - $this->field, + $this->relationGetId(), $this->relationGetSessionKey() ); } @@ -748,7 +756,7 @@ class RelationController extends ControllerBehavior $config->recordOnClick = sprintf( "$.oc.relationBehavior.clickManagePivotListRecord(:%s, '%s', '%s')", $this->relationModel->getKeyName(), - $this->field, + $this->relationGetId(), $this->relationGetSessionKey() ); } @@ -1412,14 +1420,16 @@ class RelationController extends ControllerBehavior case 'list': if ($this->eventTarget == 'button-link') { return 'backend::lang.relation.link_a_new'; - } else { + } + else { return 'backend::lang.relation.add_a_new'; } break; case 'form': if ($this->readOnly) { return 'backend::lang.relation.preview_name'; - } else { + } + else { return 'backend::lang.relation.update_name'; } break; @@ -1492,18 +1502,15 @@ class RelationController extends ControllerBehavior } /** - * Apply read only mode. + * Apply extra configuration */ - protected function makeReadOnly() + protected function applyExtraConfig($field, $config) { - $this->readOnly = true; - - if ($this->toolbarWidget && !$this->getConfig('view[toolbarPartial]', false)) { - $this->toolbarWidget->buttons = null; - } - - if ($this->viewWidget && $this->viewMode == 'multi' && !$this->getConfig('view[showCheckboxes]', false)) { - $this->viewWidget->showCheckboxes = false; + if (is_array($config) && isset($this->originalConfig->{$field})) { + $this->originalConfig->{$field} = array_merge( + $this->originalConfig->{$field}, + $config + ); } } diff --git a/modules/backend/behaviors/relationcontroller/assets/js/october.relation.js b/modules/backend/behaviors/relationcontroller/assets/js/october.relation.js index 85c052814..5ab7e07ee 100644 --- a/modules/backend/behaviors/relationcontroller/assets/js/october.relation.js +++ b/modules/backend/behaviors/relationcontroller/assets/js/october.relation.js @@ -9,38 +9,41 @@ $(el).closest('.control-list').listWidget('toggleChecked', [el]) } - this.clickViewListRecord = function(recordId, relationField, sessionKey, readOnly) { - var newPopup = $('') + this.clickViewListRecord = function(recordId, relationId, sessionKey) { + var newPopup = $(''), + $container = $('#'+relationId), + requestData = paramToObj('data-request-data', $container.data('request-data')) newPopup.popup({ handler: 'onRelationClickViewList', size: 'huge', - extraData: { + extraData: $.extend({}, requestData, { 'manage_id': recordId, - '_relation_field': relationField, - '_session_key': sessionKey, - '_relation_read_only': readOnly ? 1 : 0 - } + '_session_key': sessionKey + }) }) } - this.clickManageListRecord = function(recordId, relationField, sessionKey) { - var oldPopup = $('#relationManagePopup') + this.clickManageListRecord = function(recordId, relationId, sessionKey) { + var oldPopup = $('#relationManagePopup'), + $container = $('#'+relationId), + requestData = paramToObj('data-request-data', $container.data('request-data')) $.request('onRelationClickManageList', { - data: { + data: $.extend({}, requestData, { 'record_id': recordId, - '_relation_field': relationField, '_session_key': sessionKey - } + }) }) oldPopup.popup('hide') } - this.clickManagePivotListRecord = function(foreignId, relationField, sessionKey) { + this.clickManagePivotListRecord = function(foreignId, relationId, sessionKey) { var oldPopup = $('#relationManagePivotPopup'), - newPopup = $('') + newPopup = $(''), + $container = $('#'+relationId), + requestData = paramToObj('data-request-data', $container.data('request-data')) if (oldPopup.length) { oldPopup.popup('hide') @@ -49,11 +52,10 @@ newPopup.popup({ handler: 'onRelationClickManageListPivot', size: 'huge', - extraData: { + extraData: $.extend({}, requestData, { 'foreign_id': foreignId, - '_relation_field': relationField, '_session_key': sessionKey - } + }) }) } @@ -71,6 +73,18 @@ }) } + function paramToObj(name, value) { + if (value === undefined) value = '' + if (typeof value == 'object') return value + + try { + return JSON.parse(JSON.stringify(eval("({" + value + "})"))) + } + catch (e) { + throw new Error('Error parsing the '+name+' attribute value. '+e) + } + } + } $.oc.relationBehavior = new RelationBehavior; diff --git a/modules/backend/behaviors/relationcontroller/partials/_container.htm b/modules/backend/behaviors/relationcontroller/partials/_container.htm index e23b39885..85a2cce30 100644 --- a/modules/backend/behaviors/relationcontroller/partials/_container.htm +++ b/modules/backend/behaviors/relationcontroller/partials/_container.htm @@ -1,6 +1,6 @@
relationRenderToolbar()): ?>