Изменить переменную $actsAs из контроллера

Все, что я хочу сделать, это изменить значение («путь») в массиве $actsAs моей модели загрузки из контроллера перед сохранением.

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

Это кажется излишним, чтобы просто изменить путь. Есть ли способ проще/лучше?

$this->loadModel('Upload');
$this->Upload->Behaviors->unload('Upload.Upload');
$this->Upload->Behaviors->load('Upload.Upload', array(
    'photo' => array(
        'thumbnailSizes' => array(
            'xvga' => '1024x768',
            'vga' => '640x480',
            'thumb' => '80x80',
        ),
        'thumbnailMethod' => 'php',
        'thumbnailQuality' => '80',
        'pathMethod'=>'random',
        'path' => '{ROOT}webroot{DS}uploads{DS}test{DS}{field}{DS}',
        'maxSize' => '5242880', //5MB
        'mimetypes' => array('image/jpeg', 'image/png', 'image/gif', 'image/bmp'),
        'extensions' => array('jpg', 'gif', 'png', 'bmp'),
    ),
));
if($this->Upload->save($this->request->data)) {
//...

person Dave    schedule 08.05.2012    source источник
comment
интересно - благодаря вашему вопросу я узнал, что методы attach() и detach(), которые я всегда использовал, кажутся устаревшими (или, по крайней мере, доступны только для BC) - и что, вероятно, следует использовать load() и unload() .   -  person mark    schedule 08.05.2012


Ответы (2)


Глядя на источник, я думаю, что uploadSettings() метод - это то, что вы ищете:

$this->Upload->uploadSettings('photo', 'path', 'YOUR_PATH');
person dhofstet    schedule 08.05.2012
comment
Есть ли способ изменить переменную $actsAs без использования метода плагина? - person Dave; 08.05.2012

Коллекция BehaviorCollection должна объединять конфигурацию, когда вы загружаете ее поверх существующего поведения, поэтому вам не нужно повторно включать всю остальную конфигурацию. На самом деле, вам также не нужно его разгружать.

$this->Upload->Behaviors->load('Upload.Upload', array(
    'photo' => array(
        'path' => '{ROOT}webroot{DS}uploads{DS}test{DS}{field}{DS}'
    )
));

Поскольку слияние использует array_merge вместо array_merge_recursive, это не сработает для вас. Я включил его здесь, потому что это, вероятно, предпочтительный метод, хотя поведение, которое вы используете, использует массив конфигурации, который Cake не будет обрабатывать так, как вы этого хотите.

В качестве альтернативы вы можете просто изменить переменную $actsAs при построении модели, что приведет к ее правильной настройке.

public function __construct($id = false, $table = null, $ds = null) {
  // 2 lines for readability
  $this->actsAs['Upload.Upload']['photo']['path'] = 
  '{ROOT}webroot{DS}uploads{DS}test{DS}{field}{DS}';
  return parent::__construct($id, $table, $ds);
}
person jeremyharris    schedule 08.05.2012
comment
Я проигнорировал первый способ, так как вы говорите, что он не сработает для меня. 2-й способ дает эту ошибку: Notice (8): Indirect modification of overloaded property Upload::$Behavior has no effect [ROOT/cms.daveschwan.com/Controller/ArticleDatasController.php, line 44] - person Dave; 08.05.2012
comment
Должно быть Behaviors (множественное число). - person jeremyharris; 08.05.2012
comment
После изменения на Поведение во множественном числе: Notice (8): Indirect modification of overloaded property BehaviorCollection::$settings has no effect [ROOT/cms.daveschwan.com/Controller/ArticleDatasController.php, line 44 - person Dave; 08.05.2012
comment
Похоже, используемое вами поведение загрузки не использует массив настроек. Какой плагин вы используете? - person jeremyharris; 08.05.2012
comment
Решение может состоять в том, чтобы просто перезаписать переменную $actsAs в конструкторе модели. Однако это гораздо более хакерский ответ, чем дал @dhofstet. Я добавил это как вариант на случай, если вы захотите сделать это таким образом. - person jeremyharris; 08.05.2012