【问题标题】:Change $actsAs variable from controller从控制器更改 $actsAs 变量
【发布时间】:2012-05-08 04:46:55
【问题描述】:

我要做的就是在保存之前从控制器更改上传模型的 $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)) {
//...

【问题讨论】:

  • 有趣-通过您的问题,我发现我一直使用的 attach() 和 detach() 方法似乎已被弃用(或至少仅适用于 BC)-应该可能使用 load() 和 unload()。

标签: cakephp plugins behavior cakephp-2.2


【解决方案1】:

从查看源代码来看,我认为 uploadSettings() 方法是您正在寻找的:

$this->Upload->uploadSettings('photo', 'path', 'YOUR_PATH');

【讨论】:

  • 有没有办法在不使用插件方法的情况下更改 $actsAs 变量?
【解决方案2】:

当您将 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);
}

【讨论】:

  • 我忽略了第一种方式,因为你说它对我不起作用。第二种方式给出了这个错误:Notice (8): Indirect modification of overloaded property Upload::$Behavior has no effect [ROOT/cms.daveschwan.com/Controller/ArticleDatasController.php, line 44]
  • 应该是Behaviors(复数)。
  • 改成 Behaviors 复数后:Notice (8): Indirect modification of overloaded property BehaviorCollection::$settings has no effect [ROOT/cms.daveschwan.com/Controller/ArticleDatasController.php, line 44
  • 听起来您正在使用的上传行为没有使用设置数组。你用的是什么插件?
  • 解决方案可能只是覆盖模型构造函数上的$actsAs 变量。不过,这比@dhofstet 给出的答案要复杂得多。如果您想这样做,我已将其添加为一个选项。
猜你喜欢
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
  • 2015-03-07
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
相关资源
最近更新 更多