Seditio Source
Root |
./othercms/croogo-4.0.7/vendor/croogo/croogo/FileManager/src/Controller/Admin/AttachmentsController.php
<?php

namespace Croogo\FileManager\Controller\Admin;

use
Cake\Event\Event;
use
Cake\Http\Exception\NotFoundException;
use
Cake\Log\Log;
use
Cake\Utility\Hash;
use
Croogo\Core\Croogo;
use
Exception;

/**
 * Attachments Controller
 *
 * This file will take care of file uploads (with rich text editor integration).
 *
 * @category Assets.Controller
 * @package  Assets.Controller
 * @author   Fahad Ibnay Heylaal <contact@fahad19.com>
 * @author   Rachman Chavik <contact@xintesa.com>
 * @license  http://www.opensource.org/licenses/mit-license.php The MIT License
 * @link     http://www.croogo.org
 */
class AttachmentsController extends AppController
{

   
/**
     * Helpers used by the Controller
     *
     * @var array
     * @access public
     */
   
public $helpers = [
       
'Croogo/FileManager.AssetsImage',
       
'Croogo/FileManager.FileManager',
       
'Text',
    ];

    public
$paginate = [
       
'paramType' => 'querystring',
       
'limit' => 5,
    ];

    public function
initialize()
    {
       
parent::initialize();
       
$this->loadComponent('Search.Prg', [
           
'actions' => [
               
'index', 'browse', 'listings',
            ],
        ]);

       
$this->_loadCroogoComponents(['BulkProcess']);
       
$this->loadModel('Croogo/FileManager.Attachments');
    }

   
/**
     * Before executing controller actions
     *
     * @return void
     * @access public
     */
   
public function beforeFilter(Event $event)
    {
       
parent::beforeFilter($event);

        if (
$this->getRequest()->getParam('action') == 'resize') {
           
$this->Security->setConfig('validatePost', false);
        }
    }

   
/**
     * Admin index
     *
     * @return void
     * @access public
     */
   
public function index()
    {
       
$this->set('title_for_layout', __d('croogo', 'Attachments'));

       
$this->set('searchFields', [
           
'search',
           
'model' => [
               
'type' => 'hidden',
            ],
           
'foreign_key' => [
               
'type' => 'hidden',
            ],
           
'all' => [
               
'type' => 'hidden',
            ],
        ]);

       
$query = $this->Attachments->find();

       
$isChooser = false;

        if (
$this->getRequest()->getQuery('links') || $this->getRequest()->getQuery('chooser')) {
           
$isChooser = true;
        }

       
$model = $this->getRequest()->getQuery('model');
       
$foreignKey = $this->getRequest()->getQuery('foreign_key');
       
$this->set(compact('model', 'foreignKey'));
       
$httpQuery = (array)$this->getRequest()->getQuery();

        if (
$this->getRequest()->getQuery('manage')) {
           
$finder = 'versions';
            unset(
$httpQuery['model']);
            unset(
$httpQuery['foreign_key']);
        } elseif (isset(
$httpQuery['asset_id']) ||
            isset(
$httpQuery['all'])
        ) {
           
$finder = 'versions';
            unset(
$httpQuery['model']);
            unset(
$httpQuery['foreign_key']);

            if (!
$this->getRequest()->getQuery('sort')) {
               
$query->order([
                   
$this->Attachments->aliasField('id') => 'desc',
                ]);
            }
        } elseif (
$this->getRequest()->getQuery('search')) {
           
$finder = null;
        } else {
            if (empty(
$model) || empty($foreignKey)) {
               
$finder = 'versions';
            } else {
               
$finder = 'modelAttachments';
            }
           
$query->where([
               
'Assets.parent_asset_id IS' => null,
            ]);
        }

        if (!
$this->getRequest()->getQuery('sort')) {
           
$query->order(['Attachments.created' => 'DESC']);
        }

        if (
$isChooser) {
            if (
$this->getRequest()->getQuery('chooser_type') == 'image') {
               
$query->where([
                   
'Assets.mime_type LIKE' => 'image/%',
                ]);
            } else {
               
$query->where([
                   
'Assets.mime_type NOT LIKE' => 'image/%',
                ]);
            }
        }

       
$query->find('search', [
           
'search' => $httpQuery,
        ]);

        if (isset(
$finder)) {
           
$query->find($finder);
        }

       
$query->formatResults([$this->Attachments, 'getVideoPoster']);

       
$this->set('attachments', $this->paginate($query));

        if (
$this->getRequest()->getQuery('links') || $this->getRequest()->getQuery('chooser')) {
           
$this->viewBuilder()->setLayout('admin_popup');
           
$this->render('chooser');
        }
    }

   
/**
     * Admin add
     *
     * @return void
     * @access public
     */
   
public function add()
    {
       
$this->set('title_for_layout', __d('croogo', 'Add Attachment'));

        if (
$this->getRequest()->getQuery('editor')) {
           
$this->viewBuilder()->setLayout('admin_popup');
        }

        if (
$this->getRequest()->is('post')) {
           
$data = $this->getRequest()->getData();
            if (!empty(
$data)) {
               
$entity = $this->Attachments->newEntity($data);
               
$errors = $entity->getErrors();
            } else {
               
$errors = [
                   
'file' => __d('croogo', 'Upload failed. Please ensure size does not exceed the server limit.')
                ];
            }

            if (empty(
$errors)) {
               
$attachment = $this->Attachments->save($entity);

               
$errors = $entity->getErrors();
                if (empty(
$errors) && $attachment) {
                   
$eventKey = 'Controller.FileManager/Attachment.newAttachment';
                   
Croogo::dispatchEvent($eventKey, $this, compact('attachment'));
                } else {
                   
Log::error('Failed saving attachments:');
                   
Log::error(print_r($errors, true));
                }
            } else {
               
Log::error('Failed validating attachments:');
               
Log::error(print_r($errors, true));
            }

            if (
$this->getRequest()->is('ajax')) {
               
$files = [];
               
$error = false;

                if (empty(
$errors)) {
                   
$this->viewBuilder()->setClassName('Json');
                   
$files = [[
                       
'url' => $attachment->asset->path,
                       
'thumbnail_url' => $attachment->asset->path,
                       
'name' => $attachment->title,
                       
'type' => $attachment->asset->mime_type,
                       
'size' => $attachment->asset->filesize,
                    ]];
                } else {
                   
$error = implode("\n", Hash::flatten($errors));
                   
$files = [[
                       
'error' => $error,
                    ]];
                }

               
$this->set(compact('files', 'error'));
               
$this->set('_serialize', ['files', 'error']);

                return;
            } else {
               
// noop
           
}

            if (
$attachment) {
               
$this->Flash->success(__d('croogo', 'The Attachment has been saved'));
               
$url = [];
                if (isset(
$attachment->asset->asset_usage[0])) {
                   
$usage = $attachment->asset->asset_usage[0];
                    if (!empty(
$usage->model) && !empty($usage->foreign_key)) {
                       
$url['?']['model'] = $usage->model;
                       
$url['?']['foreign_key'] = $usage->foreign_key;
                    }
                }
                if (
$this->getRequest()->getQuery('editor')) {
                   
$url = array_merge($url, ['action' => 'browse']);
                } else {
                   
$url = array_merge($url, ['action' => 'index']);
                }

                return
$this->redirect($url);
            } else {
               
$this->Flash->error(__d('croogo', 'The Attachment could not be saved. Please, try again.'));
            }
        } else {
           
// noop
       
}

       
$attachment = $this->Attachments->newEntity();
       
$this->set(compact('attachment'));
    }

   
/**
     * Admin edit
     *
     * @param int $id
     * @return \Cake\Http\Response|void
     * @access public
     */
   
public function edit($id)
    {
       
$this->set('title_for_layout', __d('croogo', 'Edit Attachment'));

        if (
$this->getRequest()->getQuery('editor')) {
           
$this->layout = 'admin_popup';
        }

       
$redirect = ['action' => 'index'];
        if (!empty(
$this->getRequest()->getQuery())) {
           
$redirect = array_merge(
               
$redirect,
                [
'action' => 'browse', '?' => $this->getRequest()->getQuery()]
            );
        }

        if (!
$id && empty($this->getRequest()->getData())) {
           
$this->Flash->error(__d('croogo', 'Invalid Attachment'));

            return
$this->redirect($redirect);
        }
       
$attachment = $this->Attachments->get($id, [
           
'contain' => [
               
'Assets',
            ],
        ]);
        if (!empty(
$this->getRequest()->getData())) {
           
$attachment = $this->Attachments->patchEntity($attachment, $this->getRequest()->getData());
            if (
$this->Attachments->save($attachment)) {
               
$this->Flash->success(__d('croogo', 'The Attachment has been saved'));

               
$redirect = $this->getRequest()->getQuery('redirect') ?: [
                   
'action' => 'index',
                ];
                return
$this->redirect($redirect);
            } else {
               
$this->Flash->error(__d('croogo', 'The Attachment could not be saved. Please, try again.'));
            }
        }
       
$this->set(compact('attachment'));
    }

   
/**
     * Admin delete
     *
     * @param int $id
     * @return \Cake\Http\Response|void
     * @access public
     */
   
public function delete($id)
    {
        if (!
$id) {
           
$this->Flash->error(__d('croogo', 'Invalid id for Attachment'));

            return
$this->redirect(['action' => 'index']);
        }

       
$redirect = $this->referer(['action' => 'index'], true);

       
$attachment = $this->Attachments->get($id);
       
$this->Attachments->getConnection()->begin();
        if (
$this->Attachments->delete($attachment)) {
           
$this->Attachments->getConnection()->commit();
           
$this->Flash->success(__d('croogo', 'Attachment deleted'));

            return
$this->redirect($redirect);
        }

       
$this->Flash->error(__d('croogo', 'Invalid id for Attachment'));

        return
$this->redirect($redirect);
    }

   
/**
     * Admin browse
     *
     * @return void
     * @access public
     */
   
public function browse()
    {
       
$this->viewBuilder()->setLayout('admin_popup');
       
$this->index();
    }

    public function
listing()
    {
        if (
$this->getRequest()->is('ajax')) {
           
$this->viewBuilder()->setLayout('ajax');
           
$this->paginate['limit'] = 100;
        }

       
$query = $this->Attachments
           
->find('search', [
               
'search' => (array)$this->getRequest()->getQuery(),
            ])
            ->
find('modelAttachments');
       
$attachments = $this->paginate($query);
       
$this->set(compact('attachments'));
    }

    public function
resize($id = null)
    {
        if (empty(
$id)) {
            throw new
NotFoundException('Missing Asset Id to resize');
        }

       
$result = false;
        if (!empty(
$this->getRequest()->getData('width'))) {
           
$width = $this->getRequest()->getData('width');
            try {
               
$result = $this->Attachments->createResized($id, $width, null);
            } catch (
Exception $e) {
               
$result = $e->getMessage();
            }
        }

       
$this->set(compact('result'));
       
$this->set('_serialize', 'result');
    }

    public function
process()
    {
       
$Attachments = $this->Attachments;
        list(
$action, $ids) = $this->BulkProcess->getRequestVars($Attachments->alias());

       
$messageMap = [
           
'delete' => __d('croogo', 'Attachments deleted'),
        ];

        return
$this->BulkProcess->process($Attachments, $action, $ids, [
           
'messageMap' => $messageMap,
        ]);
    }
}