domingo, 8 de enero de 2017

Laravel Schema Builder Cómo poner un comentario a la tabla que se va a crear (migration)

Ya sabemos que para ponerle un comentario a una columna de una tabla se utiliza el método
->comment('el comentario de la columna'):

$tableName = 'tokens';
        Schema::create($tableName, function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned()->comment('Foreign key from `users` table');
            $table->string('token',255)->unique()->comment('A unique token for each user');
            $table->timestamps();
        });
Pero para ponerle el comentario en una tabla hay que poner abajo y fuera de Schema (pero dentro de la función up() ) lo siguiente:

//Referencias: http://stackoverflow.com/a/34272884/1883256
        DB::statement("ALTER TABLE `$tableName` comment 'Stores a multi-purpose token for each user'");
Es todo.


martes, 3 de enero de 2017

Solución al error en Laravel Invalid Text Representation: 7 ERROR Invalid input syntax for integer

Seguramente estás queriendo obtener una variable desde una URL para hacer consultas a la base de datos usando tu modelo (Route Model Binding - RMB).

Por default en Laravel, cuando utilizas el concepto de RMB, por default éste busca el id. Si quieres buscar por otra columna debes especificarlo en tu modelo tecleando el siguiente método:

public function getRouteKeyName(){
      return 'nombre_columna';
}

Saludos.

lunes, 2 de enero de 2017

Instalar limesurvey con SSL HTTPS de Let's Encrypt

Estaba yo experimentando si se podía instalar el Limesurvey a un servidor remoto con la modalidad https con un certificado de Let's Encrypt.

Asistente de instalación de Limesurvey encriptado SSL de Let's Encrypt


La razón por la que decidí ponerle un certificado fue porque al principio de la configuración del Limesurvey, hay que especificar en el formulario de instalación las credenciales de acceso a la base de datos. Dichos datos viajan por el Internet tal cual. Así que es mejor que dichos datos se envíen de manera encriptada.

Limesurvey. Especificando los datos de acceso de conexión a la base de datos con conexión privada SSL de Let's Encrypt


Con la encriptación agregamos más seguridad al tener una conexión cifrada (encriptada) con nuestra instalación de Limesurvey en un servidor remoto.

La instalación del limesurvey junto con su base de datos, el nombre del dominio, dirección de correo electrónico asociada con dicho dominio y con el certificado SSL (el candadito verde) de Let's encrypt fue muy fácil con Webfaction.

martes, 27 de diciembre de 2016

Notificar al usuario via Email cuando hubo un cambio de contraseña en Laravel 5.3

Este artículo es la continuación de "Crear un formulario y controlador para el cambio de contraseña de una cuenta en Laravel 5.3":

Ya que se terminó la funcionalidad de permitirle al usuario cambiar su contraseña, ahora vamos a notificarle via email acerca del cambio de la contraseña.

Para ello vamos a hacer uso de eventos y de escuchas (events & listeners) de Laravel 5.3

Lo que se hizo fue lo siguiente:

1.- Ir al archivo providers/EventServiceProvider.php en donde se dieron de alta tanto el "event" como el "listener" dentro del arreglo protected $listen[]:


'App\Events\UserChangedPassword' => ['App\Listeners\SendPasswordChangedNotificationEmail',],


2.- Ahora en la consola, con PHP Artisan generamos los archivos para el "event" y el "listener" con el siguiente comando:

$ php artisan event:generate

3.- Simplemente en el evento, le inyectamos los datos del usuario a través de User $user, ya que Laravel, por defecto buscará los campos "name" e "email" para hacer el envío del correo:

El código del evento "UserChangedPassword" queda como sigue:

class UserChangedPassword
{
    use SerializesModels;//InteractsWithSockets,

    public $user;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct(User $user)
    {
        $this->user = $user;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return Channel|array
     */
    /*public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }*/

}




Ahora, el listener "SendPasswordChangedNotificationEmail.php" queda como sigue:

class SendPasswordChangedNotificationEmail
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  UserChangedPassword  $event
     * @return void
     */
    public function handle($event)/*UserChangedPassword $event*/
    {
        Mail::to($event->user)->send(new SendPasswordChangeNotification($event->user));
    }
}

Nos damos cuenta que también necesitamos crear una clase, la cual llamamos "SendPasswordChangeNotification", para el envío del correo. Creamos pues la clase email desde la consola tecleando

$php artisan make:mail SendPasswordChangeNotification

Y el archivo "Mail/SendPasswordChangeNotification.php" queda como sigue:
class SendPasswordChangeNotification extends Mailable
{
    use Queueable, SerializesModels;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->subject('Your password has been changed')
            ->from('system@authentication.app')
            ->view('email.auth.passwordChanged');
    }
}


Asimismo nos falta crear la vista del mensaje de correo electrónico la cual se llama "views/email/passwordChanged.blade.php"
This email is to let you know that your account's password has been changed.


Have a nice day!



Finalmente activamos dicho evento dentro del controlador "Controllers/Auth/ChangePasswordController.php"

//Fire event to notify the user about the password change
        event(new UserChangedPassword($user));


Uff, es todo!

lunes, 26 de diciembre de 2016

Crear un formulario y controlador para el cambio de contraseña de una cuenta en Laravel 5.3

Si has ejecutado la creación de autentificación de usuarios en laravel

Y ahora quieres agregar un formulario y un controlador para que el usuario pueda cambiar su contraseña, cuando éste se encuentra logueado o autentificado, estos son los pasos que seguí:

1) Creación de la vista del formulario. En este caso, creé el archivo /views/auth/passwords/change.blade.php

 @extends('layouts.app')  
   
 @section('title')  
   Cambio de contraseña  
 @endsection  
   
 @section('content')  
   <div class="container">  
     <div class="row">  
       <div class="col-md-8 col-md-offset-2">  
         <div class="panel panel-default">  
           <div class="panel-heading">Change Password</div>  
           <div class="panel-body">  
             <form class="form-horizontal" method="POST" role="form" action="{{ route('password.change.post') }}">  
               @if (count($errors) > 0)  
                 <div class="alert alert-danger">  
                   <ul>  
                     @foreach ($errors->all() as $error)  
                       <li>{{ $error }}</li>  
                     @endforeach  
                   </ul>  
                 </div>  
               @endif  
               {{ csrf_field() }}  
               {{-- Current password --}}  
               <div class="form-group{{ $errors->has('current_password') ? ' has-error' : '' }}">  
                 <label for="current_password" class="col-md-4 control-label">Current Password</label>  
   
                 <div class="col-md-6">  
                   <input id="current_password" type="password" class="form-control" name="current_password" required autofocus>  
   
                   @if ($errors->has('current_password'))  
                     <span class="help-block">  
                     <strong>{{ $errors->first('current_password') }}</strong>  
                   </span>  
                   @endif  
                 </div>  
               </div>  
   
               {{-- New password --}}  
               <div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}">  
                 <label for="password" class="col-md-4 control-label">Password</label>  
   
                 <div class="col-md-6">  
                   <input id="password" type="password" class="form-control" name="password" required>  
   
                   @if ($errors->has('password'))  
                     <span class="help-block">  
                     <strong>{{ $errors->first('password') }}</strong>  
                   </span>  
                   @endif  
                 </div>  
               </div>  
   
               {{-- Confirm new password --}}  
               <div class="form-group">  
                 <label for="password-confirm" class="col-md-4 control-label">Confirm Password</label>  
   
                 <div class="col-md-6">  
                   <input id="password-confirm" type="password" class="form-control" name="password_confirmation" required>  
                 </div>  
               </div>  
   
               {{-- Submit button --}}  
               <div class="form-group">  
                 <div class="col-md-6 col-md-offset-4">  
                   <button type="submit" class="btn btn-primary">  
                     Change password  
                   </button>  
                 </div>  
               </div>  
   
             </form>  
           </div>  
           <div class="panel-footer">Hello</div>  
         </div>  
       </div>  
     </div>  
   </div>  
 @endsection  
2) Creación del controlador para el cambio de contraseña ChangePasswordController.php

Ejecuté el comando:

$ php artisan make:controller Auth\\ChangePasswordController

** Aunque por ahí vi en la documentación de Laravel que, a manera de ejemplo, le llamaban UpdatePasswordController

 <?php  
   
 namespace App\Http\Controllers\Auth;  
   
 use App\User;  
 use Illuminate\Http\Request;  
 use App\Http\Controllers\Controller;  
 use Illuminate\Support\Facades\Hash;  
   
 class ChangePasswordController extends Controller  
 {  
   public function __construct()  
   {  
     $this->middleware('auth');  
   }  
   
   //show form:  
   public function showChangePasswordForm(Request $request, User $user)  
   {  
     return view('auth.passwords.change')->with(  
       ['user' => $user]  
     );  
   }  
   
   public function change(Request $request)  
   {  
     //Get current user data:  
     //$user = auth()->user();  
   
     //Validation:  
     $this->validate($request, [  
       'password'     => 'required|min:6|confirmed',  
       'current_password' => 'isCurrentPassword' ,  
     ]);  
   
     $request->user()->fill([  
       'password' => Hash::make($request->password)  
     ])->save();  
   
     return redirect('home')->with('info','Your password has been updated succesfully.');  
   }  
   
   
 }  
   
3) Registrar las rutas para el cambio de la contraseña
Las siguientes rutas las registré justo en el archivo en donde se encuentran las demás rutas relacionadas con el sistema de autentificación que te crea Laravel, dicho archivo se encuentra en y es: /vendor/laravel/framework/src/Illuminate/Routing/Router.php y justo dentro y al final de la función o método public function auth(){}:
        // Password Change Routes...
        $this->get('password/change', 'Auth\ChangePasswordController@showChangePasswordForm')->name('password.change');
        $this->post('password/change', 'Auth\ChangePasswordController@change')->name('password.change.post');


Habrá que ver si luego pongo esas rutas en otro archivo, como por ejemplo, en routes/web.php 4) Validación del formulario para el cambio de contraseña.

La validación se ve ya en el controlador ChangePasswordController.php, pero esto me hizo crear una nueva regla para comprobar si la contraseña actual es la correcta. Básicamente es obtener la contraseña actual que el usuario tecleó en el formulario, encriptarla o hashearla, y compararla con la contraseña del usuario autentificado que está en la base de datos. Entonces, de acuerdo a un tutorial (http://itsolutionstuff.com/post/laravel-5-create-custom-validation-rule-exampleexample.html) lo que hice fue abrir el archivo Providers/AppServiceProvider.php y dentro del método boot() {} declaré la nueva regla a la que titulé como "isCurrentPassword":
        //Validate if user's current password is correct
        Validator::extend('isCurrentPassword',function ($attribute, $value, $parameters, $validator){
            $user = auth()->user();
            if(Hash::check($value, $user->password)){
                return true;
            }
            return false;
        });

5) Agregar esta nueva regla de validación al listado ya existente de reglas de validación. Luego, abrí el archivo resources/lang/en/validation.php y agregué el mensaje de error, pero fíjense que el CamelCase lo tuve que sustituir por guiones bajos y dentro del arreglo return[] fue donde agregué el mensaje:
'is_current_password'    => 'The :attribute is not correct.',

6) De momento es lo que llevo. Continuará ... notificar via email al usuario del cambio de contraseña utilizando events y listeners ...

Siguiente parte: "Notificar al usuario via Email cuando hubo un cambio de contraseña"

domingo, 18 de diciembre de 2016

Composer self-update error exception permission denied

Si después de intentar actualizar tu composer

$ composer self-update

 te sale el siguiente error:

[ErrorException] rename(/home/vagrant/.composer/cache/composer-temp.phar,/usr/local/bin/composer): Permission denied

Lo que tienes que hacer es agregarle sudo al principio y listo:

$ sudo composer self-update

Listo


Wordpress fatal error maximum execution of time of 30 seconds class-wp-image-editor.php line 420

Este error se debe a que el tiempo por defecto de tiempo de ejecución para un script de php dado, ha excedido los 30 segundos.

Prueba aumentando el tiempo de ejecución a, por ejemplo, 60 segundos.

Busca el archivo php.ini de tu servidor y en la parte donde diga:

max_execution_time = 30

Cámbialo a:

max_execution_time = 60

Si no, prueba a agregar un archivo php.ini en la raíz de tu aplicación de wordpress, es decir, en donde se encuentran archivos tales como .htaccess y wp-config.php

y sólo agrega esa línea.

Por ejemplo, estando en la consola, en el directorio raíz de tu aplicación, teclea:

$ touch php.ini

$ nano php.ini

max_execution_time = 30

Dale ctrl + o para guardar y luego ctrl + x para salir del editor.

Saludos.


martes, 25 de octubre de 2016

Cómo modificar el número de resultados a mostrar por página en DataTables

Has visto que los números de resultados a mostrar por default son 10, 25, 50 y 100.

Si quieres modificar estos datos, incluso agregar al final "Mostrar todos", debes agregar una opción en el código que se llama "lengthMenu" seguido de un arreglo en donde especifiques los números de resultados por páginas que desees ofrecer. Nótese que si quieres mostrar todos, entonces debes marcarlo como un menos uno (-1).

Es todo!

Cómo resaltar los resultados de búsqueda en DataTables

Básicamente, lo que debes hacer es incluir las tres librerías necesarias:

Si no las incluyes, puedes tener errores tales como "body.unhighlight is not a function".

Ahora, para poder especificar en tu DataTable que se resalten los resultados de búsqueda debes realizar lo siguiente:

Es todo.

domingo, 23 de octubre de 2016

Laravel Call to undefined method Illuminate\Database\Query\Builder::lists()

Si estás utilizando Laravel 5.3, este método de lists() ya no existe.

Si por ejemplo tienes:

dd($request->user()->following()->lists('users.id'));

Prueba con utilizar entonces la función pluck() :

dd($request->user()->following()->pluck('users.id'));

Es todo.

Laravel FatalThrowableError in Grammar.php Type error: Argument 1 passed to Grammar::parameterize() must be of the type array, integer given

Este error lo que te indica es que le has pasado un número entero, cuando en realidad se espera un arreglo.

Si por ejemplo tienes una función parecida a:

$allPosts = $post->whereIn('user_id',2)->get();

Lo que debes hacer es, donde estás pasando ese número entero, simplemente encerrarlo entre corchetes [], ya que así lo denota el sistema como arreglo.

$allPosts = $post->whereIn('user_id',[2])->get();

Es todo.

sábado, 22 de octubre de 2016

Cómo visualizar, ver o bajar la imagen de fondo de un video de Youtube

Si estás viendo, por ejemplo, un vídeo de pura música en Youtube y te ha gustado la imagen de fondo, tan sólo sigue estos sencillos pasos.

En Windows:

  1. Presiona las teclas CTRL + U (para visualizar el código fuente de la página)
  2. Ahora presiona las teclas CTRL + F (Para abrir un cuadro de búsqueda de texto)
  3. Teclea "thumbnailurl" (para llevarte a esa parte del código fuente en donde dice thumbnail)
  4. Da clic en esa dirección de internet o URL


En Mac:

  1. Presiona las teclas Command + U (para visualizar el código fuente de la página)
  2. Ahora presiona las teclas Command + F (Para abrir un cuadro de búsqueda de texto)
  3. Teclea "thumbnailurl" (para llevarte a esa parte del código fuente en donde dice thumbnail)
  4. Da clic en esa dirección de internet o URL


:)

viernes, 21 de octubre de 2016

Cómo acceder a múltiples bases de datos con Eloquent ORM Capsule

Estás utilizando Illuminate Database Eloquent de Laravel, por ejemplo, en otro framework tal como Slim o Code Igniter y te ves en la necesidad de utilizar una conexión adicional para hacer consultas a otra base de datos?

Aquí te digo cómo.

miércoles, 19 de octubre de 2016

Laravel no query results for model

Esto tiene que ver con Route Model Binding.

Si te ha salido este error es porque, por default, Route Model Binding utiliza el id de tu modelo. En tu URL prueba poner un número, por ejemplo, el 1. Verás con un dd($modelo); que sí está obteniendo una colección.

Por ejemplo, digamos que estás en el modelo de usuario (\App\User) y el error es:

NotFoundHttpException in Handler.php line 113:
No query results for model [App\User].

Y si en vez de quere utilizar el `id` como columna, quieres utilizar otra columna que se llame `username`,

Lo que tienes que hacer es ir al archivo php de tu modelo,  en este caso, \app\User.php en donde tendrás que especificar el route key name:
/* Route Model Binding */public function getRouteKeyName(){
    return 'username';//El nombre de la columna
}
¡Es todo!
 

Acerca de mí

Mi foto
I'm a computer engineer and polyglot =) i speak: Spanish, English, French, Swedish, Russian, and German. I like to dance bachata and kizomba. i have worked as an interpreter, guide, and tourist guide. At the moment i work as a computer engineer, and consultant. Visit my travel and photography blog on: http://surlaroute.com.mx/ ☺ And our street style from Mexico: http://streetstyle.mx

Tags