Friday 25 September 2015

Add extra field in migration after creating table in Laravel 5.1

Hi Everybody,

In this blog we will discuss about add extra field in migration after creating table.

First time we create a table's migration & execute migration command. After this , we realize that we have to add a new field in database.

For this, we can modify table by this easy way.

Firstly run this command for create a new migration file.

php artisan make:migration add_email_in_users_details_table


It will create a new file in migration file. Write in its up() function the following lines.

        Schema::create('user_details', function ($table) {
            $table->string('email');
          });

and in down() function write the following lines:

Schema::create('user_details', function ($table) {
            $table->drop_column('email');
          });

Make sure you put the same table name which you want to edit.

Now run migration command for this file.

php artisan migrate

Thanks.

Friday 18 September 2015

How to build a web calendar in Laravel 5.1

Hi Everybody


Calendar is a very common element in today's web applications. Whether you are building an event booking application, appointment system or even a social network. Calendar is essential.
In this tutorial, we go through steps of building a calendar in Laravel 5.1.

After this tutorial, hopefully you will understand the concepts of building calendar and use the calendar script in your own application.

1. Building the Calendar route


   in routes.php

 Route::get('/calendar', 'CalendarController@getCalendar');

2. Building the calendar controller


  In controller /app/Http/Controllers/CalendarController.php

<?php

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Input;
use App\Calendar;
use URL;

class CalendarController extends Controller
{

public function getCalendar()
    {
        $month = isset($_GET['month']) && !empty($_GET['month']) ? $_GET['month'] : '';
        $year = isset($_GET['year']) && !empty($_GET['year']) ? $_GET['year'] : '';
        $calendar = new Calendar(URL::to('/') . "/calendar");
        return view('calendar', ['calendar' => $calendar->show()]);
    }
}

3. Building the calendar model


   in model(app/Calendar.php) Calendar.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Calendar extends Model
{
    //
    public function __construct($currentRoute){
-        $this->naviHref = $currentRoute;
    }

    /********************* PROPERTY ********************/
    private $dayLabels = array("Mon","Tue","Wed","Thu","Fri","Sat","Sun");

    private $currentYear=0;

    private $currentMonth=0;

    private $currentDay=0;

    private $currentDate=null;

    private $daysInMonth=0;

    private $naviHref= null;

    /********************* PUBLIC **********************/

    /**
     * print out the calendar
     */
    public function show() {
        $year  = null;

        $month = null;

        if(null==$year&&isset($_GET['year'])){

            $year = $_GET['year'];

        }else if(null==$year){

            $year = date("Y",time());

        }

        if(null==$month&&isset($_GET['month'])){

            $month = $_GET['month'];

        }else if(null==$month){

            $month = date("m",time());

        }

        $this->currentYear=$year;

        $this->currentMonth=$month;

        $this->daysInMonth=$this->_daysInMonth($month,$year);

        $content='<div id="calendar">'.
            '<div class="box">'.
            $this->_createNavi().
            '</div>'.
            '<div class="box-content">'.
            '<ul class="label">'.$this->_createLabels().'</ul>';
        $content.='<div class="clear"></div>';
        $content.='<ul class="dates">';

        $weeksInMonth = $this->_weeksInMonth($month,$year);
        // Create weeks in a month
        for( $i=0; $i<$weeksInMonth; $i++ ){

            //Create days in a week
            for($j=1;$j<=7;$j++){
                $content.=$this->_showDay($i*7+$j);
            }
        }

        $content.='</ul>';

        $content.='<div class="clear"></div>';

        $content.='</div>';

        $content.='</div>';
        return $content;
    }

    /********************* PRIVATE **********************/
    /**
     * create the li element for ul
     */
    private function _showDay($cellNumber){

        if($this->currentDay==0){

            $firstDayOfTheWeek = date('N',strtotime($this->currentYear.'-'.$this->currentMonth.'-01'));

            if(intval($cellNumber) == intval($firstDayOfTheWeek)){

                $this->currentDay=1;

            }
        }

        if( ($this->currentDay!=0)&&($this->currentDay<=$this->daysInMonth) ){

            $this->currentDate = date('Y-m-d',strtotime($this->currentYear.'-'.$this->currentMonth.'-'.($this->currentDay)));

            $cellContent = $this->currentDay;

            $this->currentDay++;

        }else{

            $this->currentDate =null;

            $cellContent=null;
        }


        return '<li id="li-'.$this->currentDate.'" class="'.($cellNumber%7==1?' start ':($cellNumber%7==0?' end ':' ')).
        ($cellContent==null?'mask':'').'">'.$cellContent.'</li>';
    }

    /**
     * create navigation
     */
    private function _createNavi(){

        $nextMonth = $this->currentMonth==12?1:intval($this->currentMonth)+1;

        $nextYear = $this->currentMonth==12?intval($this->currentYear)+1:$this->currentYear;

        $preMonth = $this->currentMonth==1?12:intval($this->currentMonth)-1;

        $preYear = $this->currentMonth==1?intval($this->currentYear)-1:$this->currentYear;

        return
            '<div class="header">'.
            '<a class="prev" href="'.$this->naviHref.'?month='.sprintf('%02d',$preMonth).'&year='.$preYear.'">Prev</a>'.
            '<span class="title">'.date('Y M',strtotime($this->currentYear.'-'.$this->currentMonth.'-1')).'</span>'.
            '<a class="next" href="'.$this->naviHref.'?month='.sprintf("%02d", $nextMonth).'&year='.$nextYear.'">Next</a>'.
            '</div>';
    }

    /**
     * create calendar week labels
     */
    private function _createLabels(){

        $content='';

        foreach($this->dayLabels as $index=>$label){

            $content.='<li class="'.($label==6?'end title':'start title').' title">'.$label.'</li>';

        }

        return $content;
    }



    /**
     * calculate number of weeks in a particular month
     */
    private function _weeksInMonth($month=null,$year=null){

        if( null==($year) ) {
            $year =  date("Y",time());
        }

        if(null==($month)) {
            $month = date("m",time());
        }

        // find number of days in this month
        $daysInMonths = $this->_daysInMonth($month,$year);

        $numOfweeks = ($daysInMonths%7==0?0:1) + intval($daysInMonths/7);

        $monthEndingDay= date('N',strtotime($year.'-'.$month.'-'.$daysInMonths));

        $monthStartDay = date('N',strtotime($year.'-'.$month.'-01'));

        if($monthEndingDay<$monthStartDay){

            $numOfweeks++;

        }

        return $numOfweeks;
    }

    /**
     * calculate number of days in a particular month
     */
    private function _daysInMonth($month=null,$year=null){

        if(null==($year))
            $year =  date("Y",time());

        if(null==($month))
            $month = date("m",time());

        return date('t',strtotime($year.'-'.$month.'-01'));
    }

}

Let us take a look at each function in detail.

3.1. public function show():This is the only public function Calendar has. This function basically calls each private function below to create the HTML calendar interface. 

The basic idea of creating a web calendar is that, firstly it determines how many rows(weeks) to create, and then it loops over the rows and create 7 cells on each row. Meanwhile it puts corresponding day value to the cell according to the day of week (Monday to Sunday). 

Take a closer look at each private function below to understand.

3.2. private function _showDay():This function will determine what value to put to the created cell. It can be empty or numbers.

3.3. private function _createNavi(): This function will create the "Prev" && "Next" navigation buttons on the top of the calendar.

3.4. private function _createLabels(): This function will create labels for the day of week. ( Monday to Sunday). You can update the language string to your own choice. But be cautious. You should not change the order of the labels.

3.5. private function _weeksInMonth(): This is a tricky function. It can tell you how many weeks are there for a given month. This is used in show() function to create number of rows(weeks).

3.6. private function _daysInMonth(); This function tells how many days in a given month.
Functions are working closely to create the PHP calendar. You should follow function show() to understand deeply how exactly they call each. Code is documented. Give yourself some time to read it.

4. Make it prettier


Now the Calendar class is actually ready. 
However it looks messy without some CSS tricks. Let us create a CSS file "public/css/calendar.css" to make the calendar look pretty.

/*******************************Calendar Top Navigation*********************************/
div#calendar{
  margin:0px auto;
  padding:0px;
  width: 602px;
  font-family:Helvetica, "Times New Roman", Times, serif;
}
div#calendar div.box{
    position:relative;
    top:0px;
    left:0px;
    width:100%;
    height:40px;
    background-color:   #787878 ;      
}
div#calendar div.header{
    line-height:40px;  
    vertical-align:middle;
    position:absolute;
    left:11px;
    top:0px;
    width:582px;
    height:40px;   
    text-align:center;
}
div#calendar div.header a.prev,div#calendar div.header a.next{ 
    position:absolute;
    top:0px;   
    height: 17px;
    display:block;
    cursor:pointer;
    text-decoration:none;
    color:#FFF;
}
div#calendar div.header span.title{
    color:#FFF;
    font-size:18px;
}
div#calendar div.header a.prev{
    left:0px;
}
div#calendar div.header a.next{
    right:0px;
}
/*******************************Calendar Content Cells*********************************/
div#calendar div.box-content{
    border:1px solid #787878 ;
    border-top:none;
}
div#calendar ul.label{
    float:left;
    margin: 0px;
    padding: 0px;
    margin-top:5px;
    margin-left: 5px;
}
div#calendar ul.label li{
    margin:0px;
    padding:0px;
    margin-right:5px;  
    float:left;
    list-style-type:none;
    width:80px;
    height:40px;
    line-height:40px;
    vertical-align:middle;
    text-align:center;
    color:#000;
    font-size: 15px;
    background-color: transparent;
}
div#calendar ul.dates{
    float:left;
    margin: 0px;
    padding: 0px;
    margin-left: 5px;
    margin-bottom: 5px;
}
/** overall width = width+padding-right**/
div#calendar ul.dates li{
    margin:0px;
    padding:0px;
    margin-right:5px;
    margin-top: 5px;
    line-height:80px;
    vertical-align:middle;
    float:left;
    list-style-type:none;
    width:80px;
    height:80px;
    font-size:25px;
    background-color: #DDD;
    color:#000;
    text-align:center; 
}
:focus{
    outline:none;
}
div.clear{
    clear:both;
}

5. Now let us show the calendar.

Create a test file "/resources/views/calendar.blade.php".

<html>
<head>   
<link rel="stylesheet" type="text/css" href="{{asset('/css/calendar.css')}}"/>
</head>
<body>
<div class="container-fluid">
<div class="media_box">
<div class="row media_box">
<div class="col-md-6">
<?=$calendar?>
</div>
</div>
</div>
</div>
</body>
</html>



Hopefully this simple tutorial helped you with your development.

If you have questions or find any mistakes in above tutorial, do leave a comment below to let us know.

Friday 11 September 2015

Social authentication in laravel 5 using laravel socialite

Hi Everybody

In this blog we will discuss about user login process form based authentication and social authentication in laravel 5.

A new package added laravel socialite to provide social authentication in laravel 5. Before laravel 5 their is only form based authentication now using Laravel Socialite it’s provides a simple, convenient way to authenticate with OAuth providers. laravel socialite currently supports 5 OAuth providers authentication in laravel 5, which are Facebook, Twitter, Google, GitHub and Bitbucket. So you can work with both type of user login process form based authentication and social authentication in laravel 5.

How to setup social authentication in laravel 5 :-

To setup socialite we need to add some packages and Facades below i am sharing steps to setup laravel socialite.


Social authentication in laravel 5

1. Include package :- First we need to include socialite package to get started with Socialite, for include the package go to your composer.json file and below code to require section :-


"laravel/socialite": "~2.0"

Example :- so now your file code of require section looks like:-

"require": {
   "laravel/framework": "5.0.*",
   "laravel/socialite": "~2.0"
},

2. Register provider and facades :- to register provider you need to add this Laravel Framework Service Providers list. for this go to config/app.php and add below code to “providers” array to further use:


'Laravel\Socialite\SocialiteServiceProvider',
Example :- so now your file code of provider array section looks like:-


'providers' => [
   /* more already here */
  'Laravel\Socialite\SocialiteServiceProvider',

Facades :- To register facades go to config/app.php and add below code to “aliases” array :


'Socialize' => 'Laravel\Socialite\Facades\Socialite',
Example :- so now your file code of aliases array section looks like:-


'aliases' => [
   /* more already here */
  'Laravel\Socialite\SocialiteServiceProvider',

3. Get package from remote :- Now after add packages we need to install Socialite package in our application for this you need to run composer update command. for this pick up your laravel application directory path in CLI or terminal and run.

composer update
After install Socialite packages successfully we need to setup oauth providers credentials, routes and controllers

4. Setup OAuth providers credentials :- Now we need to create OAuth applications on providers like facebook, google, twitter, github etc. to get client id and client secret which need to authenticate with providers.
After getting client id and secret we need to setup credentials. To setup OAuth providers credentials go to config/services.php and add your provider config to existing “return” array like below


'github' => [
    'client_id' => 'your-github-app-id',
    'client_secret' => 'your-github-app-secret',
    'redirect' => 'http://your-callback-url',
],
Note:- for all provider add configuration(client id, client secret and redirect) for others like ‘facebook’, ‘google’, ‘twitter’.

5. Routes :- Now You will need two routes: one for redirecting the user to the OAuth provider, and another for receiving the callback from the provider after authentication. so add routes in app/Http/routes.php like :-


// Redirect to github to authenticate
Route::get('github', 'AccountController@github_redirect');
// Get back to redirect url
Route::get('account/github', 'AccountController@github');

6. Controller :- so according to routes you need to set your controller function and make social authentication with use of facades like


public function redirectToProvider() {
  return Socialize::with('github')->redirect();
}

public function handleProviderCallback() {
  $user = Socialize::with('github')->user();
}

7. Retrieve user details :- After get success authenticate you can get all user details with $user object like


$user->getId();
$user->getNickname();
$user->getName();
$user->getEmail();
$user->getAvatar();
Now you have successfully setup-ed social authentication in laravel 5 using laravel socialite. Below we see an example of github social authentication.

Social authentication in laravel 5 with Github :-

Now we will explore step by step an example of github login integration in laravel 5.


1. Create OAuth App :- 
A. To create an application signin in your github account.
B. Click on “settings” icon then click on “Applications” link
C. Then Click on “Register New Application” button at top right corner.
D. Now Add Application name, Homepage URL, Authorization callback URL and click on submit this will generate your Client ID and Client Secret.

2. Setup OAuth credentials :- To setup OAuth providers credentials go to config/services.php and add your provider config to existing “return” array like below


'github' => [
    'client_id' => 'f285091e4d346f1ac05459',
    'client_secret' => '866e847c2343fb77dc21a68f5cbc234fea41d7549e8c62',
    'redirect' => 'http://localhost/mylara5/account/github',
],

3. Routes :- Now you need to create routes so add routes in app/Http/routes.php.


Route::get('github', 'AccountController@github_redirect');
Route::get('account/github', 'AccountController@github');

4. Controllers :- Now you need to add authentication and redirection code with facades to get authenticate with github


<?php namespace App\Http\Controllers;
use Redirect;
use Socialize;
class AccountController extends Controller {
  // To redirect github
  public function github_redirect() {
    return Socialize::with('github')->redirect();
  }
  // to get authenticate user data
  public function github() {
    $user = Socialize::with('github')->user();
    // Do your stuff with user data.
    print_r($user);die;
  }
}

5. View :- Add a link or button to your view where you want to add github authentication link like add below link to resources/views/login.blade.php.


<a href="{!!URL::to('github')!!}">Login with Github</a>

Now click on login link it will redirect you to github. then after login redirect back to your redirect url and you will get user data, now add your stuff to user login process. So now you can easily add other providers like facebook, twitter to add social authentication in laravel 5.

Friday 4 September 2015

How to send email through terminal in ubuntu?

Send Email through Terminal:

Hi everybody,

In this blog we will cover email sending through terminal in ubuntu.
 
1. For send a email through terminal firstly install the postfix using this

sudo apt-get install postfix
  
2. Now go to this file

sudo nano /etc/postfix/main.cf

and change

myhostname = example.com

3. Put in name of your domain into myhostname.

4. If you want to have mail forwarded to other domains, replace alias_maps with virtual_alias_maps and point it to /etc/postfix/virtual.

virtual_alias_maps = hash:/etc/postfix/virtual

5. The rest of the lines are set by default. Save, exit, and reload the configuration file to put your changes into effect:

sudo /etc/init.d/postfix reload

6. Now run this for checking through terminal

sendmail sample-email@example.org