Переменная контроллера доступа из компонента - CakePHP

Я использую плагин для CakePHP - AjaxMultiUpload (хороший плагин :-) - но у меня есть вопрос о том, как изменить/получить доступ к переменной, которая определена в контроллере, который является частью плагина.

Я использовал этот плагин раньше, и он мне нравится. Но я пытаюсь ограничить, какие типы файлов разрешено загружать в зависимости от того, к какому контроллеру я прикрепил компонент.

В Плагине есть Контроллер - UploadsController.php. В этом классе есть публичная переменная:

// list of valid extensions, ex. array("jpeg", "xml", "bmp")
public $allowedExtensions = array();

Если я изменю это на:

public $allowedExtensions = array('mp3');

когда я пытаюсь загрузить файл .jpg, выдается сообщение об ошибке (как и следовало ожидать :-).

В моем контроллере (Tracks) я прикрепил плагин AjaxMultiUpload. Оно работает. В методе beforeFilter() моего контроллера Tracks я поместил следующую строку:

$this->Upload->allowedExtensions = array('mp3');

Это не имело никакого эффекта. (Между прочим, никаких предупреждений о том, что я пытался получить доступ к чему-то несуществующему, не выдается).

Я не хочу изменять содержимое массива allowExtensions, жестко запрограммировав его в контроллере плагина. Это плохо по двум причинам: 1) возможность обновления плагина и 2) я хочу изменить ограничения (например, типы аудиофайлов по сравнению с типами файлов изображений) в зависимости от того, какой из моих контроллеров (дорожки, изображения и т. д.) подключаемый модуль прилагается к.

Чего я не понимаю, так это отношения между компонентом (прикрепленным к контроллеру треков) и контроллером загрузки, который является частью плагина. Что создает экземпляр UploadsController, который является частью плагина? Это происходит автоматически?

Кто-нибудь может помочь?

Спасибо, Кен


person Ken Winans    schedule 15.05.2014    source источник


Ответы (3)


Доступ к компонентам осуществляется так же, как и к моделям в Cake, с контроллера. Я создал тестовый компонент и включил его как в контроллер из основного приложения, так и в контроллер из плагина:

приложение/контроллеры/компоненты/test.php

class TestComponent extends Object {
    public $allowedExtensions = array(); // put your defaults in the component
}

приложение/контроллеры/my_controller.php

class MyController extends AppController {
    // ... vars
    var $components = array('Test', /* ...others */);
    var $layout = '';

    public function test() {
        $this->render(false);

        // get current values from component
        debug($this->Test->allowedExtensions);

        // add a JPG
        $this->Test->allowedExtensions[] = 'jpg';
        debug($this->Test->allowedExtensions);

        // add a MP3
        $this->Test->allowedExtensions[] = 'mp3';
        debug($this->Test->allowedExtensions);
    }
}

Результат этого теста:

app\controllers\my_controller.php (строка n) Массив ( )

app\controllers\my_controller.php (строка n) Массив ( [0] => jpg )

app\controllers\my_controller.php (строка n) Массив ( [0] => jpg [1] => mp3 )

Итак, из этого вы можете видеть, что общедоступное свойство компонента Test доступно из любого контроллера, который его использует.

Использование точно такого же метода для включения компонента из основного проекта (конкретные модели плагинов, компоненты и т. д. должны иметь префикс имени плагина) дает те же результаты, вы фактически можете управлять этим свойством компонента из плагина или любого контроллера индивидуально и все еще есть ваши значения по умолчанию в самом компоненте.

person scrowler    schedule 15.05.2014
comment
Я знаю, как получить доступ к компоненту. Это был не мой вопрос. Переменная класса allowExtensions НЕ является частью класса компонента. Он объявлен в контроллере, который является частью плагина. Я не знаю, как создается экземпляр этого контроллера и в каком контексте я могу изменить его значение? - person Ken Winans; 17.05.2014

Вы можете получить контроллер компонента в CakePhp 3.x, как показано ниже:

$objController = $this->_registry->getController();

person daudichya    schedule 29.04.2020

Если бы в вашем контроллере была переменная с именем $fooVariable, вы могли бы получить к ней доступ в связанном компоненте следующим образом: $this->getController()->myVariable.

Обратите внимание, что переменная должна быть общедоступной в контроллере. Если переменная защищена или закрыта, вы можете внедрить ее в компонент при его загрузке.

person Juan Pablo Ramirez    schedule 11.10.2017
comment
Просмотрите Как написать хороший ответ. Ответы, содержащие только код, не рекомендуются, потому что они не объясняют, как они решают проблему в вопросе. Вы должны обновить свой ответ, чтобы объяснить, что это делает и как его использовать. - person FluffyKitten; 11.10.2017