Мне нравится создавать плагин, в котором 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 все работает.
любая идея ?
Проблема возникает потому, что любой объект, который реализует 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');
});
Я расширил интерфейсный пользовательский контроллер точно таким же образом, и он работает:
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;
собственность к нему. Это может быть не лучшим решением, хотя.