jueves, 16 de febrero de 2017

Laravel Solución al error Missing required parameters for Route

Lo que este error quiere decir es que te está faltando al menos un parámetro en la ruta que estás llamando, es decir, seguramente tienes en tu vista blade algo como:

  • Liga o enlace


  • Ahora lo que debes hacer es completar el o los parámetros faltantes de acuerdo a como la declaraste en tu archivo de rutas, por ejemplo, en un web.php:

  • Liga o enlace


  • Es todo.

    sábado, 28 de enero de 2017

    Diferencia entre "sich freuen auf" y "sich freuen über"

    Cuando utilizas la frase "sich freuen" ... no sabes si utilizar "auf" o "über"

    1.- Con "sich freuen auf" se utiliza para indicar algo que esperas en el futuro. Un contexto anticipatorio:


    • Ich freue mich auf Sommerferien!
    • Ich freue mich auf  deinen Besuch! -> Ich freue mich auch darauf :)


    2.- Con "sich freuen über" es para indicar que estás emocionado acerca de algo. Un evento en el presente:


    • Ich freue mich über deinen Besuch!
    • Ich freue mich über deinen Anruf! -> Ich freue mich auch darüber


    Es todo!




    jueves, 26 de enero de 2017

    Cómo rellenar todas las columnas de abajo sin tener que arrastrar con el ratón en el puntito amarillo en Numbers de Mac

    Si necesitas copiar el contenido de uno o varios renglones para el resto de la tabla hacia abajo, normalmente lo harías poniendo el puntero del ratón sobre el puntito amarillo:



    Pero ¿qué pasa si tienes una tabla muy larga?

    martes, 24 de enero de 2017

    Cómo ver tus mensajes de facebook en tu celular sin la aplicación del messenger

    Yo no sé porqué las empresas no tienen esa conciencia de que, cualquier usuario, ya cuenta con demasiadas aplicaciones que sólo merman tanto en el desempeño como en la capacidad de almacenamiento de nuestros teléfonos.

    Cada aplicación actúa como si fuera la única que existe y que eso le da derecho a ocupar tanto espacio de tu teléfono como quiera y comerse el procesador.

    A veces uno se pregunta, ¿para qué una aplicación más si puedo verlo cómodamente en el navegador?

    Claro está que en algunas aplicaciones, la consulta de información es más cómoda ... ¿pero y si ya tengo un chorro de aplicaciones? ¿Para que una más?

    Facebook ahora te obliga a utilizar su aplicación de messenger para que puedas ver tus mensajes (escribir, contestar, etc).

    Yo estaba frustrado de eso y, por pura casualidad, averigué cómo:

    La respuesta simple es entrar a free.facebook.com y listo.

    * Obviamente no debes estar conectado al wifi. Sólo a la red de datos.

    Quién sabe cuánto dure este truco. Pero qué ganas de molestar a uno. Otros dirán, pues deja de usar el feis ... pues sí ...

    Lo que debes hacer después de haber actualizado el Whatsapp en iOS

    Cada vez que se actualizaba el whatsapp en el teléfono, notaba que las configuraciones de sonidos de alerta personalizados que tenía, volvían a los tonos por defecto.

    Era una lata porque tenía que volver a meterme en las configuraciones y elegir los tonos que ya había elegido para el whatsapp.

    Luego descubrí, por pura casualidad que, si apagas y prendes tu teléfono, las configuraciones de tonos y sonidos que tenía, volvían a como las tenía (las configuraciones).

    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.
     

    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