Sequenzia/app/controllers/InlineController.php
Parziphal cf9cba40b6 Fully enabled Inline Images.
A little detail: the "Add image" button was moved to a new table row, so it stands out more.
Known bugs/errors:
- When cropping an animated GIF inline (with a secondary JPG inline), although the images are correctly cropped, an empty error is displayed.
2013-12-31 14:22:59 -05:00

165 lines
5.1 KiB
PHP
Executable File

<?php
class InlineController extends ApplicationController
{
protected function filters()
{
return [
'member_only' => ['only' => ['create', 'copy']]
];
}
public function create()
{
# If this user already has an inline with no images, use it.
$inline = Inline::where("(SELECT count(*) FROM inline_images WHERE inline_images.inline_id = inlines.id) = 0 AND user_id = ?", current_user()->id)->first();
if (!$inline) {
$inline = Inline::create(['user_id' => current_user()->id]);
}
$this->redirectTo(['#edit', 'id' => $inline->id]);
}
public function index()
{
$query = Inline::none();
if (!current_user()->is_anonymous()) {
$query->order('user_id = ' . current_user()->id . ' DESC');
}
$query->order('created_at desc');
$this->inlines = $query->paginate($this->page_number(), 20);
$this->respond_to_list('inlines');
}
public function delete()
{
$inline = Inline::find($this->params()->id);
if (!current_user()->has_permission($inline)) {
$this->access_denied();
return;
}
$inline->destroy();
$this->respond_to_success('Image group deleted', '#index');
}
public function addImage()
{
$inline = Inline::find($this->params()->id);
if (!current_user()->has_permission($inline)) {
$this->access_denied();
return;
}
if ($this->request()->isPost()) {
$new_image = InlineImage::create(array_merge($this->params()->image ?: [], ['inline_id' => $inline->id, 'file' => $this->params()->files()->image['file']]));
if ($new_image->errors()->any()) {
$this->respond_to_error($new_image, ['#edit', 'id' => $inline->id]);
return;
}
$this->redirectTo(['#edit', 'id' => $inline->id]);
}
}
public function deleteImage()
{
$image = InlineImage::find($this->params()->id);
$inline = $image->inline;
if (!current_user()->has_permission($inline)) {
$this->access_denied();
return;
}
$image->destroy();
$this->redirectTo(['#edit', 'id' => $inline->id]);
}
public function update()
{
$inline = Inline::find($this->params()->id);
if (!current_user()->has_permission($inline)) {
$this->access_denied();
return;
}
$inline->updateAttributes($this->params()->inline);
$images = $this->params()->image ?: [];
foreach ($images as $id => $p) {
$image = InlineImage::where('id = ? AND inline_id = ?', $id, $inline->id)->first();
if (isset($p['description'])) {
$image->description = $p['description'];
}
if (isset($p['sequence'])) {
$image->sequence = $p['sequence'];
}
if ($image->changedAttributes()) {
$image->save();
}
}
$inline->reload();
$inline->renumber_sequences();
$this->notice('Image updated');
$this->redirectTo(['#edit', 'id' => $inline->id]);
}
# Create a copy of an inline image and all of its images. Allow copying from images
# owned by someone else.
public function copy()
{
$inline = Inline::find($this->params()->id);
$new_inline = Inline::create([
'user_id' => current_user()->id,
'description' => $inline->description
]);
foreach ($inline->inline_images as $image) {
$new_attributes = array_merge($image->attributes(), ['inline_id' => $new_inline->id]);
unset($new_attributes['id']);
$new_image = InlineImage::create($new_attributes);
}
$this->respond_to_success('Image copied', ['#edit', 'id' => $new_inline->id]);
}
public function edit()
{
$this->inline = Inline::find($this->params()->id);
}
public function crop()
{
$this->inline = Inline::find($this->params()->id);
$image = $this->inline->inline_images->toArray();
$this->image = array_shift($image);
if (!$this->image) {
throw new Rails\ActiveRecord\Exception\RecordNotFoundException(
"Inline images set #" . $this->inline->id . " doesn't have inline images"
);
}
if (!current_user()->has_permission($this->inline)) {
$this->access_denied();
return;
}
if ($this->request()->isPost()) {
if ($this->inline->crop($this->params()->toArray())) {
$this->redirectTo(['#edit', 'id' => $this->inline->id]);
} else {
$this->respond_to_error($this->inline, ['#edit', 'id' => $this->inline->id]);
}
}
}
}