【问题标题】:CakePHP 1.3: How not to delete the image when admin_delete is calledCakePHP 1.3:调用admin_delete时如何不删除图像
【发布时间】:2012-04-23 01:46:14
【问题描述】:

编辑:更新我的问题以获得更多说明

============================================== ===============

我使用MeioUpload上传图片。图片位置放在image中的DBusers表中,如:/img/uploads/users/img/picture34.png。

当用户被删除时,CakePHP 也会从User.image 访问该图像的物理位置并删除该图像。

这里没有belongTo/HasMany 关系,因为我没有图像模型/控制器。

如何防止 CakePHP 物理删除此图像?

============================================== ===============

在我的应用程序中,我可以选择使用users_controller.php 中的admin_delete 函数删除用户。但是,当调用此函数时(见以下函数),保存在 DB 中的图像也会被删除。如何防止此功能删除图像。

function admin_delete($id = null) {

    if (!$id) {
        $this->Session->setFlash(__('Este usuario nao existe', true));
        $this->redirect(array('action'=>'index'));
    }

    if ($this->User->delete($id)) {
        $this->Session->setFlash(__('Este usuario ja foi removido', true));
        $this->redirect(array('action'=>'index'));
    }

    $this->Session->setFlash(__('Este usuario nao foi removido', true));
    $this->redirect(array('action' => 'index'));
}

谢谢,

【问题讨论】:

  • 您的控制器代码没有删除图像。 Meio 上传插件正在删除它。
  • 你是对的......我在与丹尼尔讨论后发现了这一点。当我调用 admin_delete 方法时,我现在正在分离这种行为。谢谢

标签: cakephp cakephp-1.3


【解决方案1】:

编辑

Meioupload 行为定义了这个 beforeDelete 方法:

/**
 * Deletes all files associated with the record beforing delete it.
 *
 * @author Vinicius Mendes
 * @param $model Object
 */
function beforeDelete(&$model) {
    $model->read(null, $model->id);
    if(isset($model->data)) {
        foreach($this->__fields as $field=>$options) {
            $file = $model->data[$model->name][$field];
            if($file && $file != $options['default'])
                $this->_deleteFiles($file, $options['dir']);
        }
    }
    return true;
}

由于没有不删除图像的选项,我认为唯一的方法是暂时分离行为。无法对其进行测试,但类似这样的东西可以工作:

function admin_delete($id = null) {
    $this->User->Behaviors->disable('MeioUpload');

    // your code

    $this->User->Behaviors->enable('MeioUpload');
}

===

我假设图像通过 belongsTo/hasMany 关联与用户模型相关联?在这种情况下标准删除方法有一个parameter to avoid deleting of associated data,这里是删除函数的定义:

delete(int $id = null, boolean $cascade = true);

如果您将 cascade 设置为 false,则关联的图像不会被删除:

if ($this->User->delete($id,false)) {
    $this->Session->setFlash(__('Este usuario ja foi removido', true));
    $this->redirect(array('action'=>'index'));
}

【讨论】:

  • 我已经这样做了,但它不起作用。请参阅我的问题以获得更多说明......
  • 抱歉,我没有在您的问题中看到任何澄清,至少我需要知道您是如何关联模型的。在我的带有 User hasMany Image 和 Image belongsTo User 关联的测试用例中,完全相同的功能按预期工作......如果您可以发布您的 User 和 Image 模型,那么提供帮助会更容易
  • 我在 EDIT 下对我最初的问题进行了澄清。无论如何,我通过访问 MeioUpload 行为并从 function _deleteFilesList(&$model) { 函数中注释掉 //$this->_deleteFiles($model, $file['field'], $file['name'], $file['dir']); 暂时修复了问题。我将致力于开发一种方法,让管理员可以选择是否要删除特定用户的图片。感谢您的努力...但是,我绝对应该实施您正在谈论的解决方案/流程。
  • 太棒了,我们的电线交叉了 3 次 :D 我认为分离(如果可行的话)是更干净的方式,因为您不必编辑插件,很高兴您找到了解决方案。 ..
  • 我完全忘记了detach。非常感谢。我已将 MeioUpload 行为文件改回其原始文件,并在我添加的user_controllers.php 文件中的admin_delete 方法的开头@ 987654331@ 一切正常。这是一个很好的建议..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-30
  • 2023-03-29
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多