Moving photos between albums
Moving photos between albums is a great feature for managing the album’s images. Many photo gallery systems come with this feature. So, we can code it easily with Laravel. We need a form and controller function for adding this feature to our photo gallery system. Let’s code the controller function first. Open the ImagesController.php
file which is located in app/http/controllers/
and add the following code in it:
public function postMove() { $rules = array( 'new_album' => 'required|numeric|exists:albums,id', 'photo'=>'required|numeric|exists:images,id' ); $validator = Validator::make(Input::all(), $rules); if($validator->fails()){ return Redirect::route('index'); } $image = Image::find(Input::get('photo')); $image->album_id = Input::get('new_album'); $image->save(); return Redirect::route('show_album',array('id'=>Input::get('new_album'))); }
As you can see in the preceding code, we use the Validation
class again. Let’s examine the rules. The first rule is as follows:
'new_album' => 'required|numeric|exists:albums,id'
The preceding rule means that the new_album
field is required
(must be posted in the form), must be a numeric value, and exist in the id
column of the albums
table. We want to assign images to albums, so the images must exist. The second rule is as follows:
'photo'=>'required|numeric|exists:images,id'
The preceding rule means that the photo
field is required
(must be posted in the form), must be a numeric value, and exist in the id
column of the images
table.
After successful validation, we update the album_id
column of the photos
field and redirect the browser to show the new album of photos using the following code:
$image = Image::find(Input::get('photo')); $image->album_id = Input::get('new_album'); $image->save(); return Redirect::route('show_album',array('id'=>Input::get('new_album')));
The final code of the Images
controller should be as follows:
<?php class ImagesController extends BaseController{ public function getForm($id) { $album = Album::find($id); return View::make('addimage') ->with('album',$album); } public function postAdd() { $rules = array( 'album_id' => 'required|numeric|exists:albums,id', 'image'=>'required|image' ); $validator = Validator::make(Input::all(), $rules); if($validator->fails()){ return Redirect::route('add_image',array('id' =>Input::get('album_id'))) ->withErrors($validator) ->withInput(); } $file = Input::file('image'); $random_name = str_random(8); $destinationPath = 'albums/'; $extension = $file->getClientOriginalExtension(); $filename=$random_name.'_album_image.'.$extension; $uploadSuccess = Input::file('image')->move($destinationPath, $filename); Image::create(array( 'description' => Input::get('description'), 'image' => $filename, 'album_id'=> Input::get('album_id') )); return Redirect::route('show_album',array('id'=>Input::get('album_id'))); } public function getDelete($id) { $image = Image::find($id); $image->delete(); return Redirect::route('show_album',array('id'=>$image->album_id)); } public function postMove() { $rules = array( 'new_album' => 'required|numeric|exists:albums,id', 'photo'=>'required|numeric|exists:images,id' ); $validator = Validator::make(Input::all(), $rules); if($validator->fails()){ return Redirect::route('index'); } $image = Image::find(Input::get('photo')); $image->album_id = Input::get('new_album'); $image->save(); return Redirect::route('show_album',array('id'=>Input::get('new_album'))); } }
Our controller is ready, so we need to set up the updated form’s route in app/routes.php
. Open the file and add the following code:
Route::post('/moveimage', array('as' => 'move_image', 'uses' => 'ImagesController@postMove'));
The final code located in app/http/routes.php
should look as follows:
<?php Route::get('/', array('as' => 'index', 'uses' => 'AlbumsController@getList')); Route::get('/createalbum', array('as' => 'create_album_form', 'uses' => 'AlbumsController@getForm')); Route::post('/createalbum', array('as' => 'create_album', 'uses' => 'AlbumsController@postCreate')); Route::get('/deletealbum/{id}', array('as' => 'delete_album', 'uses' => 'AlbumsController@getDelete')); Route::get('/album/{id}', array('as' => 'show_album', 'uses' => 'AlbumsController@getAlbum')); Route::get('/addimage/{id}', array('as' => 'add_image', 'uses' => 'ImagesController@getForm')); Route::post('/addimage', array('as' => 'add_image_to_album', 'uses' => 'ImagesController@postAdd')); Route::get('/deleteimage/{id}', array('as' => 'delete_image', 'uses' => 'ImagesController@getDelete')); Route::post('/moveimage', array('as' => 'move_image', 'uses' => 'ImagesController@postMove'));
Creating an update form
Now we need to create our update form in our template file. Open the template file which is located inapp/views/ album.blade.php
and change the foreach
loop as follows:
@foreach($album->Photos as $photo) <div class="col-lg-3"> <div class="thumbnail" style="max-height: 350px;min-height: 350px;"> <img alt="{{$album->name}}" src="/albums/{{$photo->image}}"> <div class="caption"> <p>{{$photo->description}}</p> <p>Created date: {{ date("d F Y",strtotime($photo->created_at)) }}at {{ date("g:ha",strtotime($photo->created_at)) }}</p> <a href="{{URL::route('delete_image',array('id'=>$photo->id))}}" onclick="returnconfirm('Are you sure?')"><button type="button"class="btn btn-danger btn-small">Delete Image</button></a> <p>Move image to another Album :</p> <form name="movephoto" method="POST"action="{{URL::route('move_image')}}"> <select name="new_album"> @foreach($albums as $others) <option value="{{$others->id}}">{{$others->name}}</option> @endforeach </select> <input type="hidden" name="photo"value="{{$photo->id}}" /> <button type="submit" class="btn btn-smallbtn-info" onclick="return confirm('Are you sure?')">Move Image</button> </form> </div> </div> </div> @endforeach
Wrapping up
In this article, we’ve created a simple photo gallery system with Laravel’s built-in functions and the Eloquent database driver. We’ve learned how to validate the data, and about the powerful data relation method in Eloquent named hasMany. In the next coming articles , we’ll learn to work with more complex tables, and relational data and relation types.
hope you will like it :)