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!

sábado, 8 de octubre de 2016

Laravel SQLSTATE[HY000]: General error: 1364 Field 'username' doesn't have a default value

Este error probablemente se deba a que, en este caso, mi columna llamada `username`, no esté especificada dentro del modelo, en este caso, User.php en la parte o en el arreglo $fillable.

Es decir:

Es todo.

jueves, 6 de octubre de 2016

Laravel Error: No supported Encrypter Found. The cypher and / or key length are invalid

Si te sale este error, es porque, si vas a tu archivo .env, verás que en donde dice:

APP_KEY=SomeRandomString

Y el error dice que la longitud de dicha cadena SomeRandomString es muy corta comparada con la cadena cifrada que deberías tener (en seguida verás por qué)
lo único que tienes que hacer es ejecutar el siguiente comando en tu consola:

$ php artisan key:generate

Puedes ahora volver al archivo .env y veras una cadena más larga.
Vuelve a ver tu sitio y el error ya habrá desaparecido.

Listo.

martes, 4 de octubre de 2016

laravel new curl error 6 could not resolve host cabinet.laravel.com

Acabas de  ejecutar el siguiente comando

$ laravel new NombreNuevoProyecto

para crear una nueva aplicación de Laravel en Homestead y te sale este error:

[GuzzleHttp\Exception\ConnectException]                                                        
  cURL error 6: Could not resolve host: cabinet.laravel.com (see http://curl.haxx.se/libcurl/c/  

  libcurl-errors.html)

Este error no sé por qué sucede, pero minutos después volví a intentar y ya funcionó (y ya jaló).

martes, 6 de septiembre de 2016

php artisan runtime exception changing columns for table requires Doctrine DBAL

Si quieres cambiar una columna en Laravel con php artisan y te sale el error
changing columns for table requires Doctrine DBAL
lo que tienes que hacer es instalar el paquete desde tu directorio raíz y ejecutar el siguiente comando:
$ composer require doctrine/dbal
Espera a que baje los archivos y que se instalen. Vuelve a correr el comando desde la carpeta raíz de tu proyecto:
$php artisan migrate
Es todo.

Slim Framework 2 Uncaught exception 'InvalidArgumentException' with message 'Route callable must be callable [SOLUCIONADO]

Este error se debe a que posiblemente dejaste incompleta la declaración de una ruta, llámese $app->get(); ó $app->post();

Revisa en tu código en donde hayas declarado esas rutas con esas funciones.

jueves, 25 de agosto de 2016

Solución al error str_word_count() expects parameter 2 to be long, string given

Este error se debe a que el segundo argumento debe ser un número entre 0 y 2 (además es opcional). Y el tercer argumento es, efectivamente, una cadena de caracteres.

miércoles, 24 de agosto de 2016

Averiguar la dirección IP en MAC

Para averiguar cuál dirección IP tiene tu Mac en la red WiFi, sigue los siguientes pasos:


  1. Da clic sobre el ícono de tu conexión a Internet (las conchitas u onditas) que está en la parte superior casi a la derecha. Normalmente del lado izquierdo del indicador de la batería.
  2. Da clic sobre la opción de hasta abajo "Abrir el panel de preferencias de red"
  3. En la nueva ventana que se llama "Red", da clic sobre el botón que está abajo que dice "Avanzado"
  4. Se abrirá otra ventana. Ahora selecciona la pestaña "TCP/IP"
  5. Tu dirección IP en el WiFi aparece justo donde dice "Dirección IPv4"

Listo, tu IP puede ser del tipo 192.168.1.10

Ahora para salir, en esa ventana dale en "Cancelar" y la otra ventana que queda ciérrala.

Cómo encontrar las palabras más repetidas de un texto con PHP

El siguiente script de php lo que hace es lo siguiente:

  1. Almacenar el texto en una variable.  (Lo desplegamos para ver cómo se ve)
  2. Separamos el texto en palabras con la función str_word_count(), la cual, como parámetros lleva el texto, la opción 1 para que devuelva las palabras encontradas y un arreglo para que admita los acentos del idioma español.
  3. Contamos las frecuencias de cada palabra con la función array_count_values().
  4. Ordenamos el arreglo anterior de acuerdo a la frecuencia de apariciones de mayor a menor con la función arsort().
  5. Declaramos un arreglo que quite las palabras que no queremos, tales como artículos, preposiciones, etc. Dicho arreglo lo llamamos $stopwords (palabras vacías).
  6. Con la función array_map(), vamos aplicando a cada palabra el filtro del stopwords; Asimismo podemos aplicar otras restricciones tales como las de sólo mostrar aquellos términos que tengan una frecuencia mayor a 1.
Aquí va el código, el cual puedes probar en el sitio http://phptester.net/ y hacer tus propias modificaciones.




'; var_dump($words); /*3. Contamos las frecuencias de cada palabra*/ $words = array_count_values($words); echo '

'; var_dump($words); /*4. Ordenamos el arreglo anterior de acuerdo a la frecuencia de apariciones*/ echo '

'; arsort($words); var_dump($words); echo '

'; /*5. Declaramos un arreglo que quite las palabras que no queremos*/ //Stopwords: $stopwords = ['de','el','la','que','al','los','a','las']; /*6. vamos aplicando a cada palabra el filtro y mostrar aquellos términos que tengan una frecuencia mayor a 1*/ array_map(function($word,$index)use($stopwords){ /*Aplicar lo de stopwords*/ if(!in_array($index,$stopwords)){ if($word>1){ echo $word.' '.$index.'
'; return $word; } } },$words,array_keys($words));
Ciao!

martes, 16 de agosto de 2016

httpd-xampp.conf: Cómo permitir el acceso a una dirección IP externa aparte de localhost?

Primero localiza el archivo httpd-xampp.conf, suponiendo que estás en ambiente Windows, abre el XAMPP Control Panel, a la altura del módulo de Apache, haz clic en el botón config y selecciona el archivo httpd-xampp.conf .

Dentro del archivo httpd-xampp.conf, teclea y guarda lo siguiente:

# New XAMPP security concept
#

    Require local
    Require ip 10.0.0.1
ErrorDocument 403 /error/XAMPP_FORBIDDEN.html.var

La clave está en las palabras "require ip"

Si quieres poner otra dirección, simplemente en otra línea pones Require ip xxx.xxx.xxx.xxx.

sábado, 6 de agosto de 2016

Todo el alfabeto en una sola línea

Aquí está una cadena de todo el alfabeto para los programadores (cadena alfanumérica):
var possible = 'ABCDEFGHIJKLMNÑOPQRSTUVWXYZabcdefghijklmnñopqrstuvwxyz01234567890';

Ciao.

martes, 2 de agosto de 2016

Actualizar node js en Mac OS (y con XAMPP)

La manera más fácil es siguiendo los siguientes pasos (teclear los comandos en la terminal):

Vámonos al directorio raíz:
$ cd $HOME

1) $ sudo npm install -g n
2) $ sudo npm cache clean -f

Ahora, si tienes el XAMPP instalado en tu Mac, haz los siguientes pasos adicionales:
a) $ cd /Applications/XAMPP/xamppfiles/bin
b) $ sudo mv HEAD _HEAD

regresamos de nuevo al directorio raíz:
$ cd $HOME

Ahora, actualizar el node.js en tu Mac es simple:
1) $ sudo n stable

Para actualizar el npm en tu Mac, también es simple:
2) $ sudo npm i -g npm

Para los que tienen XAMPP, restaurar lo siguiente:
c) $ cd /Applications/XAMPP/xamppfiles/bin
d) $ sudo mv _HEAD HEAD

regresamos de nuevo al directorio raíz:
$ cd $HOME

Finalmente puedes verificar que el node.js se ha actualizado efectivamente:
5) $ node -v
6) $ sudo npm -v     ó tambien con 6b) $ sudo npm list -g npm

Es todo 😌.

Cómo actualizar node.js en Laravel Homestead en Mac OS

Para actualizar el node.js de tu laravel homestead en Mac OS, teclea (typea) los siguientes comandos:

Pasos previos:
1) Inicia tu laravel homestead: $ vagrant up
2) Entra a tu VM: $ vagrant ssh

Ahí viene lo de la actualización del node.js

3) $ sudo npm cache clean -f
4) $ sudo npm install -g n
5) $ sudo n stable

6) Sal de la VM: $ exit

Finalmente reinicia la máquina virtual (VM)

7) $ vagrant reload --provision
8) $ vagrant ssh

Verifica la versión de tu node.js:

9) $ node -v

Es todo.

jueves, 21 de julio de 2016

Laravel 5.2 no muestra los errores después de la validación (SOLUCIONADO)


Si has seguido los pasos, ya sea de la documentación de laravel o de los cursos de "Learn Laravel" y ves que simplemente no se despliegan los errores después de la validación, fíjate si en tu grupo de rutas tienes "middleware". Si es así, cambia en donde dice "middleware" por "middlewareGroups". Es decir:

De:

Route::group(['middleware'=>['web']], function(){
//El resto de tus rutas aquí
});

Cámbialo por:

Route::group(['middlewareGroups'=>['web']], function(){
//El resto de tus rutas aquí
});

Referencias:

http://stackoverflow.com/a/37532300/1883256

domingo, 17 de julio de 2016

Crear página de error 404 not found en laravel

Rápidamente, ve a la carpeta "resources/views/errors". Dentro de dicha carpeta "errors", crea un nuevo archivo que se llame "404.blade.php". Dentro de ese archivo coloca tu código HTML.
Por ejemplo, simplemente teclea "404" y ahora intenta navegar a una página que no exista.
Verás que ahora aparece lo que tecleaste.

Si no tienes plantilla, copia todo el HTML del archivo 503.blade.php y sustituye donde dice "Be right back" por 404.
Abajito puedes agregarle un párrafo con las etiquetas 'p' del html que diga "La página que usted está buscando no ha sido encontrada".

¡Listo!

miércoles, 13 de julio de 2016

Laravel arreglar el error 500

Si recientemente has instalado Laravel y recibes un error 500 al abrir la carpeta public en tu navegador, desde tu terminal en MAC, teclea el siguiente par de comandos:


  • $ sudo chmod -R gu+w storage
  • $ sudo chmod -R guo+w storage


Listo.

Encontrar el archivo Homestead.yaml en MAC

Para encontrar y editar el archivo Homestead.yaml necesitas teclear lo siguiente en tu terminal:


  • $ cd $HOME
  • $ cd .homestead
  • $ nano Homestead.yaml


Listo.

viernes, 1 de julio de 2016

Solución XAMPP Windows 7 move_uploaded_file(): failed to open stream: Permission denied

Normalmente lo que harías en MAC, Linux o en SSH sería lo siguiente:


  1. Ir al directorio en donde se encuentra la carpeta a donde quieres subir los archivos. Por ejemplo, un cd /ruta/a/tu/carpeta/
  2. Luego, para asegurarte de que dicha carpeta está a la vista, tecleas ls -la para visualizar los archivos y, sobre todo, tus carpetas.
  3. De ahí, se procede a cambiar los permisos de tus carpetas con el siguiente comando: chmod 767 Tu_Carpeta
  4. Y ya no tendrías ese problema de subir los archivos con la función php de move_uploaded_file
Para windows, es mejor que te bajes un programa de shell, por ejemplo el "Cygwin64 Terminal". Abres la terminal, y para ubicarte en tu disco duro C, simplemente teclea el comando cd /cygdrive/c o cd c:/

Ejecuta los comando enumerados al principio y listo. Habrás podido modificar los permisos de tu carpeta. ☻

martes, 21 de junio de 2016

Cómo pasar una consulta de MySQL compleja a Eloquent ORM

Si te encuentras en la situación en la que quieres pasar una consulta larga y compleja como la que sigue:

a Eloquent ORM.

Lo que debes hacer es utilizar el método raw() como sigue:


$proyectosportipo = Capsule::select(Capsule::raw("
    SELECT tipo as Tipo, COUNT(tipo) AS Cantidad
    FROM projects
    WHERE situacion IN ('reiniciados','en proceso') OR
          (situacion IN ('finiquitados')
           AND COALESCE(fech_fin,fech_termino,fech_proptermino) BETWEEN '2015-08-01' AND '2016-08-01')
    GROUP BY Tipo
    "));


Sin embargo, lo malo de esto es que el valor devuelto es un arreglo con el que no se podrá utilizar otros métodos de Eloquent.

Ahora lo que tienes que hacer es convertir ese mismo resultado a una colección utilizando el método collect() como sigue:
$proyectosportipo = collect($proyectosportipo);

Es todo ☻

jueves, 16 de junio de 2016

Cambiar la dirección del sitio de tu Wordpress desde la base de datos

¿Cambiaste por error la dirección de tu sitio de Wordpress y ya no puedes acceder a tu panel de administración?

La solución que vamos a ver aquí es volver a poner la URL o dirección de tu sitio desde la base de datos de tu Wordpress.

Para ello necesitamos lo siguiente:


  1. Tus credenciales de acceso a la base de datos (nombre de usuario y contraseña). Este dato lo has de tener apuntado. Justo al momento de crear tu Wordpress se te proporcionó dicha información (o tuviste la oportunidad de elegir al momento de que se te pidió hacerlo).
  2. Acceder a la base de datos. Por lo general, puedes acceder a la misma a través del famoso phpmyadmin o cualquier otro programa que te permita acceder a tu base de datos para que puedas hacer consultas y modificaciones.
Ahora, lo que se debe hacer es lo siguiente:

  1. Busca y despliega la información de la tabla `wp-options`. En caso de que estés en una línea de comandos (SSH), teclea la siguiente:
  2. Ahora ve al renglón (generalmente es el primero) en donde la columna se llame `option_name` y cuyo valor sea `site_url`.
  3. Justo en la columna `option_value` encontrarás la dirección del sitio. Ponla con el valor que corresponda, en mi caso sería `http://misitio.com`.
  4. Guarda los cambios y ahora intenta volver al panel de administración de tu sitio.
Listo.

martes, 14 de junio de 2016

Solución al Recaptcha error: Invalid domain for site key

Normalmente este error viene porque probablemente tu sitio lo cambiaste a otro dominio. Por lo que tienes que especificar en la página del ReCaptcha (https://www.google.com/recaptcha/admin)  el nuevo dominio en donde estarás utilizando tu reCaptcha.

Registra tu dominio y ponle un nombre para futuras referencias
Una vez registrado el dominio, ahora sí, toma nota de tu site_key y de tu secret_key


Actualiza pues tu llave secreta (secret_key) en el backend (la parte lógica de tu programación o Controller) y tu llave pública (site_key) en la parte de tu formulario o frontend (en la vista ó view de tu aplicación) y listo.

Documentación: https://github.com/google/recaptcha/blob/master/examples/example-captcha.php


lunes, 28 de marzo de 2016

Traducir Google Charts al español

Para mostrar los títulos o información adicional de Google Charts en español (que, por default, se muestra en inglés), hay que agregar la siguiente opción justo al importar las librerías:
google.charts.load('current', {'packages':['corechart','table','timeline'],'language': 'es'});
es todo! ☺

miércoles, 9 de marzo de 2016

Cómo generar un certificado SSL en Windows con Let's Encrypt

Soy nuevo en este tema del let's encrypt. Ya hace rato había podido generar mi propio certificado SSL con OpenSSL no reconocido en mi máquina windows con IP real.

Iré actualizando este post conforme vaya avanzando.

De momento, lo que puedes hacer, es instalarte la consola de GIT a tu máquina windows. Bájala directamente desde aquí.

Había instalado el let's encrypt client tecleando en la consola de git lo siguiente:


$ git clone https://github.com/letsencrypt/letsencrypt

Entonces, siguiendo el tutorial oficial de la página de let's encrypt, apliqué el siguiente comando (nomás para probar que funcionara el comando let's encrypt):


$ cd letsencrypt/
$ ./letsencrypt-auto --help


Pero me encontré con el siguiente error:

"sudo" is not available, will use "su" for installation steps...grep: /etc/issue: No such file or directorySorry, I don't know how to bootstrap Let's Encrypt on your operating system!
You will need to bootstrap, configure virtualenv, and run a peep install manually.Please see https://letsencrypt.readthedocs.org/en/latest/contributing.html#prerequisitesfor more info.Checking for new version...Cannot find any Pythons; please install one!


Buscando en Google, encontré esta lista alternativa de programas o "clients" alternativos que pueden emitir certificados de let's encrypt.

De dicha lista, me llamó la atención el que se llama No Sudo Client (Python).

También observé que en el error también se me dice que no tengo instalado Python. Ya que, para ejecutar el client let's encrypt, dice que necesito Python y OpenSSL. Veamos si tengo también el segundo. Parece que sí, porque antes ya había generado un certificado SSL propio el cual me vino incluido cuando me instalé el XAMPP para windows.

Entonces, para saber y bajar el Python, he visitado las siguientes dos páginas. Ésta y finalmente desde ésta otra bajé el Python.


Actualización:

Ya logré obtener los certificados Let's Encrypt (LE). La idea fundamental es que LE te pide demostrar que tienes realmente acceso a tu dominio colocando una cadena alfanumérica larga en una carpeta que tú puedas crear para tu dominio. Es decir, en http://tudominio.com/.well-known/acme-challenge. Así que deberás crear esas dos carpetas.

Al momento de pedir los certificados, LE te pedirá que, al momento de visualizar ese dominio con esas carpetas, se emita la cadena. Una vez verificado, LE te emitirá los certificados guardándolos en tu máquina local.

... seguiré actualizando este post ...
... comenta si puedes ayudarnos ...

lunes, 7 de marzo de 2016

Obtener el trimestre a partir de una fecha con Jquery Javascript

Aquí les paso una función en javascript o jQuery para obtener el trimestre a partir de una fecha del tipo datetime yyyy-mm-dd hh:mm:ss
/*Función para obtener el trimestre a partir de una fecha dada (Originalmente pensada para el anteproyecto)*/
        function trimestral(datetime){
            var parts = datetime.match(/(\d+)/g);
            var month = parts[1]; console.log('El valor del mes es: '+month);
            var trimestre = Math.floor((month-1)/3)+1;
            return trimestre;
        }
Es todo.

viernes, 4 de marzo de 2016

Cómo obtener el trimestre a partir de una fecha con PHP

A continuación os presento una función que he mejorado de este sitio (ya que no lo calcula a partir de una fecha, sino desde el mes) para la obtención del trimestre a partir de una fecha del formato 'aaaa-mm-dd hh:mm:ss'. Por ejemplo: '2016-01-01 10:00:00'
public function trimestre($datetime)
    {
        $mes = date("m",strtotime($datetime));//Referencias: http://stackoverflow.com/a/3768112/1883256
        $mes = is_null($mes) ? date('m') : $mes;
        $trim=floor(($mes-1) / 3)+1;
        return $trim;
    }
Puedes aplicarla de la siguiente manera:
$fecha = '2016-01-01 10:00:00';
$trimestre = trimestre($fecha);
Es todo

jueves, 25 de febrero de 2016

Solución al problema Uncaught ReferenceError: Hh is not defined

Quién sabe.

He notado que al ir cambiando el código en mi Javascript, sale este error y desaparece si vuelvo a poner el archivo original. No sé si tenga que ver con espacios en blanco adicionales o si sea el editor de texto.

No he podido encontrar gran cosa al respecto en Internet.

Si alguien quiere comentar al respecto, por favor hágalo.

martes, 23 de febrero de 2016

Solución al problema Uncaught Error: Type mismatch. Value 3 does not match type number in column index 1 en Google Charts

Este error se soluciona aplicando una función llamada parseInt(); Entonces, si tienes este problema tienes que aplicar esta función:

valor = parseInt(valor);

Es todo.

martes, 16 de febrero de 2016

Cómo hacer los google charts responsive

Si estás programando un sitio o aplicación web responsive en donde estés utilizando los Google charts y ves que no son responsive, es decir, que el tamaño de las gráficas no se va adaptando al tamaño del dispositivo, lo que tienes que hacer es lo siguiente:

Justo al final de tu función drawChart() debes agregar lo siguiente:
function resizeHandler () {
            chart.draw(data, options);
        }
        if (window.addEventListener) {
            window.addEventListener('resize', resizeHandler, false);
        }
        else if (window.attachEvent) {
            window.attachEvent('onresize', resizeHandler);
        }
También, en el div, elimina si tienes el style. Yo sé que en el style pusiste el tamaño del gráfico.

Más bien, para configurar el tamaño del gráfico, tienes que hacerlo dentro de la misma función drawChart() en la sección de options, por ejemplo:
var options = {
            title: 'Número de proyectos vigentes por área de investigación',
            backgroundColor: { fill:'transparent'},
            height: 500,
            width: 900,
        };
Referencias:
http://stackoverflow.com/a/18984903/1883256
¡Salud!.

lunes, 15 de febrero de 2016

Solución al error de Eloquent " A facade root has not been set"

Suponiendo que estás utilizando el paquete o package de Eloquent y  ahora quieres utilizar el query builder de Eloquent para hacer un query como:

DB::table('tu_tabla');

Y también quieres utilizar la función RAW:

select(DB::raw('DISTINCT valor, COUNT() AS cantidad'));

Lo que pasa es que no hay que llamarlo como DB:: Sino como Capsule::

Entonces, primero utiliza la librería dentro de tu controlador o ruteador:

use Illuminate\Database\Capsule\Manager as Capsule;

Y ya puedes hacer una consulta o query como sigue:

$proyectosporarea = Capsule::table('projects AS p')    ->select(Capsule::raw('DISTINCT a.area AS Area, COUNT(a.area) AS Cantidad'))    ->leftJoin('areas AS a','p.area_id','=','a.id')    ->where('p.status','in_process')    ->where('a.area','<>','NULL')    ->orderBy('Cantidad','desc')    ->groupBy('a.area')    ->get();

Y ya debe funcionar.

Pero si ahora, te encuentras con el siguiente error:

Fatal error: Call to a member function connection() on null in \vendor\illuminate\database\Capsule\Manager.php on line 86

Lo que tienes que hacer es, donde pusiste los parámetros de conexión a la base de datos, debes agregar lo siguiente:

/*Make this Capsule instance available globally via static methods*/$capsule->setAsGlobal();//Tuve que agregar esto para que funcionara el DB (Capsule)

Esto mismo está descrito en la documentación

Listo.

Cómo borrar o eliminar múltiples registros en Eloquent ORM

Probablemente, al intentar borrar múltiples registros, o una colección de datos, te haya salido el siguiente error: Call to undefined method Illuminate\Database\Eloquent\Collection::delete()

Esto es porque delete() funciona cuando has obtenido un sólo registro ya sea con el metodo find() o con first();

Sin embargo, cuando necesitas obtener varios datos, utilizas el método get();

Entonces, lo que he hecho es, a partir de un get, realizo un foreach, del cual extraigo sólo los identificadores (IDs) y al final aplico el método destroy(arreglo IDs);

El método destroy() funciona ya sea con un ID específico o con un arreglo de IDs.

Por ejemplo, selecciono los registros que quiero eliminar utilizando x condición:

$registros=Modelo::where('condicion','tal')->get();

Ahora, para cada registro, obtengo el ID y lo almaceno en un arreglo:

foreach($registros as $registro){
    $ids[]=$registro->id;
}

Finalmente procedo a eliminar esos registros:

$eliminados = Modelo::destroy($ids);

Listo.

miércoles, 10 de febrero de 2016

Solución al error en Eloquent ORM "Object of class Illuminate\Database\Eloquent\Relations\BelongsTo could not be converted to string"

Cuando se te aparece este error, lo más probable es que te falte hacer un loop for o foreach.
Igualmente te puede faltar más profundidad. Por ejemplo, mostrar la simple cadena
{{ string }} puede requerir de que se muestre la columna a manera de propiedad:
{{string.nombre}}, etc.

lunes, 1 de febrero de 2016

Cómo solucionar el mensaje de error en composer.json Fail: no license specified

Si este mensaje te ha aparecido después de ejecutar el comando composer diagnose, hay que especificar, en el archivo composer.json, el tipo de licencia que tiene tu proyecto.

Si tu proyecto es totalmente libre y abierto a cualquier otra persona, basta con que coloques dentro de las llaves {} del archivo composer.json la siguiente línea:

{
    //dentro de las llaves {} de tu composer.json
    "license": "MIT",
}

Si tu licencia es de otro tipo, consulta aquí las demás posibilidades.

Cómo solucionar el error de composer "update failed: the "/usr/local/bin/composer" file could not be written"

Si acabas de ejecutar en tu consola el comando "composer self-update" o "composer selfupdate" y te sale el error "update failed: the "/usr/local/bin/composer" file could not be written", es porque necesitas permisos de administrador.

Entonces ejecuta:

sudo composer self-update

Después de ejecutar dicho comando, en tu consola se te pedirá la contraseña y listo.

viernes, 29 de enero de 2016

Cómo verificar si un valor es un número en Twig

No existe una manera directa para verificar si un valor es un número o no en Twig.

Pero se puede hacer mediante una expresión regular, entonces, para verificar si un valor es efectivamente un número se tiene:

{% if tu_variable matches '/^\\d+$/' %} TU INSTRUCCIÓN {% endif %}

Por otro lado, si quieres hacer una acción cuando no es un número, hazlo después de un "else":

{% if tu_variable matches '/^\\d+$/' %}{% else %} TU INSTRUCCIÓN {% endif %}

Es todo.

viernes, 22 de enero de 2016

Cambiar el nombre de una columna que es la llave primaria con phpmyadmin

Resulta que deseas cambiar el nombre de la llave primaria de una tabla en phpmyadmin, pues esto no es posible directamente. Pero puedes hacerlo de la siguiente manera:

1) Crea una columna nueva con el nombre que deseas que tenga tu llave primaria.
2) Copia los datos de la columna de la llave primaria a la nueva columna que acabas de crear.
3) Borra la columna de la llave primaria original
4) Pon a la nueva columna como llave primaria.

¡Listo! ☺

Cómo copiar datos de una columna a otra en la misma tabla en MySQL

Para copiar los datos de una columna a otra dentro de otra tabla, debes ejecutar la siguiente sentencia:
UPDATE `la_tabla` SET `columna_destino`=`columna_origen`
¡Es todo! ☺

jueves, 21 de enero de 2016

Cómo hacer que un botón de bootstrap tenga un link o enlace a otra página

Originalmente, un botón bootstrap se hace con el siguiente código:



Para hacer que este botón enlace a otra página, simplemente hay que encerrarlo entre las etiquetas html

lunes, 18 de enero de 2016

Problema con la altura de bootstrap switch

Me he encontrado con el problema de que, después de validar un formulario, el bootstrap switch aparece muy alargado o con demasiada altura de unos 550px.

Bootstrap switch Problemas con la altura del botón


El problema está en el CSS, en donde dice height:100%;

Entonces, quitando esa parte del código (posiblemente, en tu caso, en la ubicación bootstrap-switch-master/dist/css/bootstrap3/bootstrap-switch.min.css),

Bootstrap switch Problemas con la altura del botón - ubicación en el código css


se soluciona el problema y el botón bootstrap switch ahora me aparece de tamaño normal .

Referencias: https://github.com/nostalgiaz/bootstrap-switch/issues/433
 

Tags