【问题标题】:CakePHP 2.1, Ajax & Miles Johnsons Uploader PluginCakePHP 2.1、Ajax 和 Miles Johnsons 上传插件
【发布时间】:2012-08-14 22:21:28
【问题描述】:

我想通过 $actAs = 'Uploader.Attachment' 使用带有 CakePHP 2.1 的插件作为行为。虽然这适用于静态上传,但我不知道如何将它用于 ajaxUpload。

简单的问题: 无论如何通过actAs-Behaviour进行ajax-Upload吗?

解释(如果需要): 附件 Behavior 似乎没有任何默认值,也没有任何其他关于 ajax 的代码(尤其是下面代码中的 ajaxField)。虽然如果我通过

包含插件,它会起作用
public function beforeFilter() {
    $this->Uploader = new Uploader(array(
        'ajaxField' => 'qqfile'
    ));
}

所以我可以使用类似的东西:

$data = $this->Uploader->upload($this->Uploader->ajaxField, array('overwrite' => true));

但不是:

$this->request->data;

这不是我一直在寻找的,因为我 1. 其他动作仍然需要actAs-Behaviour。 2.有两个不同的插件包含,我必须检查它们是否相同。 3. 无法自动创建拇指并将它们附加到模型的同一条目。

【问题讨论】:

    标签: ajax cakephp plugins uploader


    【解决方案1】:

    我已经回答了您的几个相关问题 - 我真的不想检查插件的配置设置(具体问题请联系开发人员本人)所以我只是假设它们是正确的,因为您说它适用于静态文件提交。

    1. $actAs 表示行为参数;它们是在 Model 类上定义的,根据定义,无论如何都不应该与视图直接通信。您仍然可以让您的模型充当角色,如果您愿意,您只是不能使用模型来操纵视图的行为。

    2. 这是 AJAX 驱动的文件上传,对吗?因此,您可能需要编写一个简单的客户端脚本来处理 控制器操作的关联视图 中的表单,以将表单数据异步提交给蛋糕控制器方法。 -- 见:http://www.phpletter.com/Demo/AjaxFileUpload-Demo/

    3. 添加插件只允许插件为您处理模型,对吗?你确定你需要插件的 2 次调用吗?或 2 个控制器动作或 2 个控制器或 2 个模型或两者都使用插件的东西?

    4. 视图会将数据返回给控制器操作,这可能是您希望将数据发送到模型进行处理的地方。 beforeFilter() 是控制器回调方法之一;具体来说,在控制器中的任何/每个方法之前触发的那个(请参阅 http://book.cakephp.org/2.0/en/controllers.htmlhttp://book.cakephp.org/2.0/en/views/json-and-xml-views.html 以设置控制器以处理异步请求...)

    5. 缩略图生成应该在前端还是后端征税? >_> 如果是后者,是否需要在模型中添加从数据生成缩略图的代码? Cake 的魔术模型回调也应该让这变得非常简单:http://book.cakephp.org/2.0/en/models/callback-methods.html

    以这种方式尝试至少应该为您简化事情。

    HTH

    【讨论】:

    • 感谢您的回答! (1.) 我希望控制器能够将文件顺序发送到模型。 (2.) 这在某种程度上只能在没有 actAs-Behavior 的情况下工作,因为它适用于 phps $_FILES。 (3.) 不幸的是,我必须将它用作 actAs 和新的 Uploader,因为两者的行为非常不同。 (5.) 它是后端。通过将参数传递给 actAsBehaviour 将创建拇指(如果它可以正常工作)。我会坚持我想的胖而快乐的控制器方法,并让你了解我的解决方案。再次感谢!
    • 控制器就是这样做的。当你调用 $this->Model 时,Model 对象就是你调用它的地方,它会自动获取数据。 actAs 将 Behavior 添加到 Model 中,当控制器调用它时会携带它。您可能必须明确说明模型回调,具体取决于。它们会被某些高级自动魔法(例如 saveAll)覆盖,听起来这可能是您的问题。
    【解决方案2】:

    这就是我现在针对我的具体案例所做的。也许它可以帮助某人。不漂亮,但很有效:

    public function beforeFilter() {
        $this->Uploader = new Uploader(array(
            'ajaxField' => 'qqfile'
        ));
    }
    
    public function ajax() {        
        $this->set('title_for_layout', 'Upload: AJAX File Upload');
        $this->render('ajax');
    }
    
    public function ajax_upload($album_id = null, $album_title = null) {
        $this->set('album_id', $album_id);
        $this->set('album_title', $album_title);
        $album_id = 2;
        $upload_dir = "uploads/$album_id/";
    
        $this->autoLayout = $this->autoRender = false;
        $this->Uploader->setup(array('uploadDir' => "$upload_dir"));
        $data = $this->Uploader->upload($this->Uploader->ajaxField, array(
            'overwrite' => true,
            'name' => 'uploaderFilename'
        ));
        //Creating a thumb
        $thumb_name = $data['custom_name']."_thumb.".$data['ext'];
        $this->Uploader->resize(array('width' => 250, 'expand' => true, 'aspect' => true, 'append' => '_thumb'));
        if (!empty($data)) {
            $this->Picture->set($data);   
            if ($this->Picture->validates()) {
                // Upload successful
                $data["album_id"]= $album_id;
                $data['path_thumb'] = $upload_dir.$thumb_name;
                $this->Picture->save($data);
                header('Content-Type: application/json');
                echo json_encode(array('success' => true, 'data' => $data));                                
            }
        }
    }
    

    【讨论】:

    • 是否有理由在 beforeFilter() 而不是 ajax_upload() 中创建一个新的 Uploader 实例?
    • @felipe.zkn:我不记得说实话了。从那以后就再也没有做过蛋糕了。
    猜你喜欢
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    相关资源
    最近更新 更多