Backend \ Controllers \ Пользователи должны определить свойство $ отношениеConfig

Мне нравится создавать плагин, в котором Frontend User принадлежит BackendUser (отношение один ко многим). Для внутреннего пользователя я хочу отобразить частичное с помощью Relation Manager, чтобы добавить много внешних пользователей в BackendUser. Если я попытаюсь динамически определить свойство на Plugin.php, как:

use Backend\Models\User as BackendUser;
use Backend\Controllers\Users as BackendUsersController;public function boot(){
BackendUsersController::extend(function($controller) {
$controller->implement[] = 'Backend.Behaviors.RelationController';
$controller->relationConfig = '$/plg-user/plg/controllers/plg-ctr/config_relation.yaml'
});
});

я получаю сообщение об ошибке: класс Backend \ Controllers \ Users должен определить свойство $ отношениеConfig, используемое поведением Backend \ Behaviors \ RelationController

Если я попытаюсь поставить вручную:

public $relationConfig = '$/plg-user/plg/controllers/plg-ctr/config_relation.yaml'

в Backend \ Controllers \ Users Controller все работает.

любая идея ?

2

Решение

Проблема возникает потому, что любой объект, который реализует October\Rain\Extension\ExtendableTrait черта (как делает контроллер пользователя, как вы можете позвонить ::extend() на нем) предотвращает автоматическое объявление необъявленных свойств при первом назначении.

Вместо этого вы должны использовать addDynamicProperty($property, $value) метод для добавления необъявленных свойств к объекту. Это было ранее недокументировано и было задокументировано в octobercms / документы @ 9d454c.

Пример рабочего кода для вашего случая теперь будет

/**
* Extend the BackendUsers controller to include the RelationController behavior
*/
BackendUsersController::extend(function($controller) {

// Implement the list controller behavior dynamically
$controller->implement[] = 'Backend.Behaviors.RelationController';

// Declare the relationConfig property dynamically for the RelationController behavior to use
$controller->addDynamicProperty('relationConfig', '$/plg-user/plg/controllers/plg-ctr/config_relation.yaml');
});
3

Другие решения

Я расширил интерфейсный пользовательский контроллер точно таким же образом, и он работает:

UsersController::extend(function($controller){
if(!isset($controller->implement['Backend.Behaviors.RelationController'])) {
$controller->implement[] = 'Backend.Behaviors.RelationController';
}
$controller->relationConfig  =  '$/meysam/profile/controllers/profile/config_relations.yaml';
});

Я думаю, что разница в том, что relationConfig уже был определен в классе контроллера пользовательского интерфейса:

class Users extends Controller
{
public $implement = [
'Backend.Behaviors.FormController',
'Backend.Behaviors.ListController'
];

public $formConfig = 'config_form.yaml';
public $listConfig = 'config_list.yaml';
public $relationConfig;

А также public $relationConfig; не существует в пользовательском контроллере бэкэнда. Обходным путем может быть создание собственного класса пользовательского контроллера бэкэнда, который наследуется от Backend\Controllers\Users и добавить public $relationConfig; собственность к нему. Это может быть не лучшим решением, хотя.

0

По вопросам рекламы [email protected]