marc-leopold/server/plugins/graker/photoalbums/controllers/Upload.php

148 lines
4.1 KiB
PHP

<?php namespace Graker\PhotoAlbums\Controllers;
use BackendMenu;
use Backend\Classes\Controller;
use Graker\PhotoAlbums\Models\Album as AlbumModel;
use Graker\PhotoAlbums\Models\Photo as PhotoModel;
use Redirect;
use Backend;
use Flash;
use Input;
use Request;
use Response;
use Validator;
use ValidationException;
use ApplicationException;
use System\Models\File;
use Lang;
/**
* Upload Back-end Controller
*/
class Upload extends Controller
{
/**
* Display the form
*/
public function form() {
$this->pageTitle = Lang::get('graker.photoalbums::lang.plugin.upload_photos');
$this->addJs('/modules/backend/assets/vendor/dropzone/dropzone.js');
$this->addJs('/plugins/graker/photoalbums/assets/js/upload.js');
$this->addCss('/plugins/graker/photoalbums/assets/css/dropzone.css');
return $this->makePartial('form');
}
/**
* File upload controller
*/
public function post_files() {
try {
if (!Input::hasFile('file')) {
throw new ApplicationException(Lang::get('graker.photoalbums::lang.errors.no_file'));
}
$upload = Input::file('file');
$validationRules = ['max:' . File::getMaxFilesize()];
$validation = Validator::make(
['file' => $upload],
['file' => $validationRules]
);
if ($validation->fails()) {
throw new ValidationException($validation);
}
if (!$upload->isValid()) {
throw new ApplicationException(Lang::get('graker.photoalbums::lang.errors.invalid_file', ['name' => $upload->getClientOriginalName()]));
}
$file = new File;
$file->data = $upload;
$file->is_public = true;
$file->save();
return Response::json(['id' => $file->id], 200);
} catch (Exception $e) {
return Response::json($e->getMessage(), 400);
}
}
/**
* Form save callback
*/
public function onSave() {
$input = Input::all();
$album = AlbumModel::find($input['album']);
if ($album && !empty($input['file-id'])) {
$this->savePhotos($album, $input['file-id'], $input['file-title']);
Flash::success(Lang::get('graker.photoalbums::lang.messages.photos_saved'));
return Redirect::to(Backend::url('graker/photoalbums/albums/update/' . $album->id));
}
Flash::error(Lang::get('graker.photoalbums::lang.errors.album_not_found'));
return Redirect::to(Backend::url('graker/photoalbums/albums'));
}
/**
* File remove callback
*/
public function onFileRemove() {
if (Input::has('file_id')) {
$file_id = Input::get('file_id');
$file = File::find($file_id);
if ($file) {
$file->delete();
}
}
}
/**
*
* Saves photos with files attached from $file_ids and attaches them to album
*
* @param AlbumModel $album
* @param array $file_ids
* @param string[] $file_titles arrray of titles
*/
protected function savePhotos($album, $file_ids, $file_titles) {
$files = File::whereIn('id', $file_ids)->get();
$photos = array();
foreach ($files as $file) {
$photo = new PhotoModel();
$photo->title = isset($file_titles[$file->id]) ? $file_titles[$file->id] : '';
$photo->save();
$photo->image()->save($file);
$photos[] = $photo;
}
$album->photos()->saveMany($photos);
}
/**
* @return array of [album id => album title] to use in select list
*/
protected function getAlbumsList() {
$albums = AlbumModel::orderBy('created_at', 'desc')->get();
$options = [];
foreach ($albums as $album) {
$options[$album->id] = $album->title;
}
return $options;
}
public function __construct()
{
parent::__construct();
BackendMenu::setContext('Graker.PhotoAlbums', 'photoalbums', 'upload');
}
}