Falta poco para terminar nuestro módulo. Si es tu primera vez en esta serie de tutoriales, todavía estás a tiempo de aprender a crear un módulo con Laravel, paso a paso. Hoy veremos cómo editar registros con Laravel.
Este tutorial es muy trivial, lo haremos basado en el progreso que hemos hecho hasta ahora, copiando, no, más bien reusando parte del código que ya producimos para crear la acción “create”.
Primero regresemos a la lista de usuarios:
app/views/admin/users/list.blade.php
Allí vamos a agregar una columna adicional para agregar un botón a la acción editar usuarios:
Código :
<table class="table table-striped" style="width: 900px"> <tr> <th>Nombre completo</th> <th>Correo electrónico</th> <th>Acciones</th> </tr> @foreach ($users as $user) <tr> <td>{{ $user->full_name }}</td> <td>{{ $user->email }}</td> <td> <a href="{{ route('admin.users.show', $user->id) }}" class="btn btn-info"> Ver </a> <a href="{{ route('admin.users.edit', $user->id) }}" class="btn btn-primary"> Editar </a> </td> </tr> @endforeach </table>
Esto nos permitirá acceder a la opción de editar fácilmente. Ahora, de vuelta en:
app/controllers/admin/UsersController.php
Código :
/** * Show the form for editing the specified resource. * * @param int $id * @return Response */ public function edit($id) { return 'Aqui editamos el usuario: ' . $id; }
Lo vamos a reemplazar por:
Código :
public function edit($id) { $user = User::find($id); if (is_null ($user)) { App::abort(404); } return View::make('admin/users/form')->with('user', $user); }
Vean lo simple del código:
Código :
$user = User::find($id);
Nos trae el usuario que corresponde a la id numérica almacenada en la variable $id
Noten que antes le pasamos dicha ID a la ruta edit:
Código :
<a href="{{ route('admin.users.edit', $user->id) }}">
En caso de que la ID no corresponda a ningún usuario válido, User::find devolverá NULL, por lo tanto:
Código :
if (is_null ($user)) { App::abort(404); }
Si el usuario no existe se aborta la operación con un error 404. Por último se le pasa el usuario a la vista, como ya hemos hecho antes.
Al darle clic a editar en cualquiera de sus usuarios, verán el mismo formulario usado para crear pero con los campos llenos…
A mí me gusta evitar tener 2 vistas con casi el mismo HTML repetido, en este caso se puede hacer que el mismo formulario sirva tanto para create como para edit de esta forma:
Código :
@extends ('admin/layout') <?php if ($user->exists): $form_data = array('route' => array('admin.users.update', $user->id), 'method' => 'PATCH'); $action = 'Editar'; else: $form_data = array('route' => 'admin.users.store', 'method' => 'POST'); $action = 'Crear'; endif; ?> @section ('title') {{ $action }} Usuarios @stop @section ('content') <h1>{{ $action }} Usuarios</h1> <p> <a href="{{ route('admin.users.index') }}" class="btn btn-info">Lista de usuarios</a> </p> {{ Form::model($user, $form_data, array('role' => 'form')) }} @include ('admin/errors', array('errors' => $errors)) <div class="row"> <div class="form-group col-md-4"> {{ Form::label('email', 'Dirección de E-mail') }} {{ Form::text('email', null, array('placeholder' => 'Introduce tu E-mail', 'class' => 'form-control')) }} </div> <div class="form-group col-md-4"> {{ Form::label('full_name', 'Nombre completo') }} {{ Form::text('full_name', null, array('placeholder' => 'Introduce tu nombre y apellido', 'class' => 'form-control')) }} </div> </div> <div class="row"> <div class="form-group col-md-4"> {{ Form::label('password', 'Contraseña') }} {{ Form::password('password', array('class' => 'form-control')) }} </div> <div class="form-group col-md-4"> {{ Form::label('password_confirmation', 'Confirmar contraseña') }} {{ Form::password('password_confirmation', array('class' => 'form-control')) }} </div> </div> {{ Form::button($action . ' usuario', array('type' => 'submit', 'class' => 'btn btn-primary')) }} {{ Form::close() }} @stop
En las primeras líneas definimos el título “Crear” o “Editar” y la ruta y método que se le va a pasar al form, dependiendo si el usuario existe o no.
También se puede lograr lo mismo pasando la data desde el controlador a la vista:
Código :
public function edit($id) { $user = User::find($id); if (is_null ($user)) { App::abort(404); } $form_data = array('route' => array('admin.users.update', $user->id), 'method' => 'PATCH'); $action = 'Editar'; return View::make('admin/users/form', compact('user', 'form_data', 'action')); }
Lo importante es evitar duplicar código de acuerdo al principio DRY (Don’t repeat yourself), por ejemplo, para el HTML de errores, dado que va a ser muy común a todos los módulos, lo separé en otra vista y ahora sólo hay que incluirlo:
Código :
@include ('admin/errors', array('errors' => $errors))
De esta manera se vuelve más reusable:
app/views/admin/errors.blade.php:
Código :
@if ($errors->any()) <div class="alert alert-danger"> <button type="button" class="close" data-dismiss="alert">×</button> <strong>Por favor corrige los siguentes errores:</strong> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif
Completando la acción “update”
Si se detienen a pensar unos momentos, este método “update” se completa de manera similar a “store”, la diferencia es que acá no crearemos un nuevo usuario, sino que cargaremos uno tal como hicimos en el método “edit” hace un momento, además tenemos que cambiar la redirección en caso de datos no válidos a la ruta admin.users.edit. El código resultante quedaría así:
Código :
public function update($id) { // Creamos un nuevo objeto para nuestro nuevo usuario $user = User::find($id); // Si el usuario no existe entonces lanzamos un error 404 :( if (is_null ($user)) { App::abort(404); } // Obtenemos la data enviada por el usuario $data = Input::all(); // Revisamos si la data es válido if ($user->isValid($data)) { // Si la data es valida se la asignamos al usuario $user->fill($data); // Guardamos el usuario $user->save(); // Y Devolvemos una redirección a la acción show para mostrar el usuario return Redirect::route('admin.users.show', array($user->id)); } else { // En caso de error regresa a la acción edit con los datos y los errores encontrados return Redirect::route('admin.users.edit', $user->id)->withInput()->withErrors($user->errors); } }
Con esto ya debería funcionar “a medias” la función de actualizar, sin embargo, si intento actualizar mi propio usuario recibo un error:
Código :
El email ya ha sido utilizado
Esto es por la regla “unique” definida en app/models/User.php, además que editar la clave debería ser opcional.
Corrijamos el método isValid:
Código :
public function isValid($data) { $rules = array( 'email' => 'required|email|unique:users', 'full_name' => 'required|min:4|max:40', 'password' => 'min:8|confirmed' ); // Si el usuario existe: if ($this->exists) { //Evitamos que la regla “unique” tome en cuenta el email del usuario actual $rules['email'] .= ',email,' . $this->id; } else // Si no existe... { // La clave es obligatoria: $rules['password'] .= '|required'; } $validator = Validator::make($data, $rules); if ($validator->passes()) { return true; } $this->errors = $validator->errors(); return false; }
Noten el IF extra para configurar algunas reglas dependiendo si el usuario ya existe o no…
De esta forma, gracias a la propiedad $this->exists de los modelos de Laravel y un poco de astucia, podemos reusar tanto el método isValid como nuestro formulario.
Guardar contraseñas con Laravel
Como hemos visto, al actualizar un registro la contraseña queda como campo opcional (para no obligar al usuario a cambiar su contraseña cada vez que quiera editar otro dato), sin embargo tenemos que prevenir que Laravel grabe una contraseña vacía en la base de datos, además, también tenemos que encriptar las contraseñas no vacías. Todo este lío se soluciona muy fácil, dentro del modelo (app/models/User.php) agregando el siguiente método:
Código :
public function setPasswordAttribute($value) { if ( ! empty ($value)) { $this->attributes['password'] = Hash::make($value); } }
Cada vez que se intenta acceder a un atributo, Laravel intenta ver si el modelo tiene un método llamado get[nombre del atributo en camelCase]Attribute, así mismo cada vez que se intenta guardar un atributo dentro del modelo, se intenta llamar set[nombre del atributo en camelCase]Attribute, que permiten modificar el comportamiento por defecto. ¿No me creen? Agreguen lo siguiente al modelo, temporalmente:
Código :
public function getFullNameAttribute() { return strtoupper($this->attributes['full_name']); }
Ahora todos, todos, TODOS los atributos full_name de todos los usuarios se imprimirán siempre en mayúsculas, al menos que borremos o cambiemos el método getFullNameAttribute.
El método validAndSave (haciendo que todo se vea aún más limpio y mejor)
Aún:
Código :
// Revisamos si la data es válido if ($user->isValid($data)) { // Si la data es valida se la asignamos al usuario $user->fill($data); // Guardamos el usuario $user->save(); }
Parece mucho código, además hay el mismo código repetido en store y update, ¿Cierto?
Que tal si en el modelo (app/models/User.php) agregamos un nuevo método:
Código :
public function validAndSave($data) { // Revisamos si la data es válida if ($this->isValid($data)) { // Si la data es valida se la asignamos al usuario $this->fill($data); // Guardamos el usuario $this->save(); return true; } return false; }
Ahora en la acción update podríamos escribir, solamente:
Código :
// Revisamos si la data es válida y guardamos en ese caso if ($user->validAndSave($data)) { // Y Devolvemos una redirección a la acción show para mostrar el usuario return Redirect::route('admin.users.show', array($user->id)); } else { // En caso de error regresa a la acción create con los datos y los errores encontrados return Redirect::route('admin.users.edit', $user->id)->withInput()->withErrors($user->errors); }
La acción “store” podríamos simplificarla también de la misma manera ¿Cómo quedaría?
Con esto finalizamos la acción de editar, espero les haya gustado.
P.D. ¿Terminaron la acción “show”? Si la respuesta es no, todavía tienen un poco de tiempo antes que se publique el próximo y último tutorial, donde veremos la acción “destroy” y algo de ¡AJAX!
Stay Tuned!
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por alejonext el 18 de Octubre de 2013
Por Duilio el 18 de Octubre de 2013
alejonext :
Gracias A veces no es el lenguaje en sí sino cómo lo aplicamos, aún con PHP se puede hacer código limpio y con Ruby se puede hacer un desastre... Por eso es muy bueno además del lenguaje aprender patrones de programación.
Asegúrate de leer las otras partes, o llegaste acá porque ya terminaste todo?
Saludos!
Por mundoff el 31 de Octubre de 2013
Por Luis el 04 de Noviembre de 2013
al momento de CREAR uno nuevo me marca este error
Bcrypt hashing not supported.
Por Miguel Ángel Torres el 07 de Noviembre de 2013
No entiendo bien esto :
//Evitamos que la regla “unique” tome en cuenta el email del usuario actual
$rules['email'] .= ',id,' . $this->id;
De veras que estoy muy agradecido por estos tutoriales.
Por Duilio el 07 de Noviembre de 2013
Luis-blog :
al momento de CREAR uno nuevo me marca este error
Bcrypt hashing not supported.
Mcrypt es una extensión de PHP, tienes que instalarla antes de usar Laravel.
Te envío este tutorial, espero te sirva, es muy sencillo habilitarla:
http://blog.unelink.es/wiki/activar-extension-mcrypt-de-php-en-un-servidor-o-hosting-windows/
Recuerda reiniciar Apache al final del procedimiento.
También puedes buscar tutoriales para Linux o Mac si no usas Windows...
Saludos.
Por Duilio el 07 de Noviembre de 2013
Miguel Ángel Torres-blog :
No entiendo bien esto :
//Evitamos que la regla “unique” tome en cuenta el email del usuario actual
$rules['email'] .= ',id,' . $this->id;
De veras que estoy muy agradecido por estos tutoriales.
En realidad me acabo de dar cuenta de un error acá, de todas formas te explico (con la corrección incluida) mientras pido que arreglen el tutorial.
Cuando defino el array de las reglas:
Código :
Yo le indico a Laravel que el campo email debe ser obligatorio, debe estar en formato de email y debe ser único en la tabla "users" de la base de datos, columna "email" (es decir, no debe haber dos usuarios con el mismo email)
Bueno, luego básicamente lo que hago es concatenar uno parámetro adicional a ese campo cuando estás editando el usuario:
Código :
Es una manera de decirle a Laravel que el email puede estar repetido en ese usuario, lo que sería el caso si editas tu usuario pero sin editar tu email actual.
Al final de la concatenación todo debería quedar así (suponiendo que es el usuario 5)
Código :
En la documentación puedes ver más info aún: http://laravel.com/docs/validation#rule-unique
El error es que escribí ',id,' y debí escribir ',email,'
El primer parámetro es la tabla (users) el segundo el campo (email) el tercero parámetro es el ID a excluir ($this->id)
El segundo parámetro (nombre del campo) es opcional, si no lo defines tendrá el mismo nombre de tu regla (en mi caso ambas "email") pero como necesito el tercer parámetro entonces debo especificar el segundo primero...
Particularmente es algo que no me gusta de Laravel, yo preferiría definir mis reglas en una interfaz POO
$rules['email'] = EmailValidation::required()->table('users')->exclude($this->id) //it would be better
Por Luis el 20 de Noviembre de 2013
Por Duilio el 20 de Noviembre de 2013
Luis-blog :
De hecho ayer lo escribí, ya está en la lista esperando aprobación.
Registrate en Cristalab para poder acceder aquí:
http://foros.cristalab.com/tutoriales-y-articulos-envia-tus-aportes-aqui-f20/
O espera un par de días y lo verás en portada.
Saludos!
Por Duilio el 20 de Noviembre de 2013
http://www.cristalab.com/tutoriales/modulo-de-usuarios-vii-eliminar-un-registro-con-laravel-c111925l/
Saludos a todos
Por tostado el 06 de Diciembre de 2013
public function getFullNameAttribute()
{
return strtoupper($this->attributes['full_name']);
}
dice: Undefined index: full_name
Por Jorge el 04 de Enero de 2014
Qué puede ser lo que haga falta, ya trate colocando un isset, pero si hago eso el modulo edit deja de traerse los datos del usuario. Me podrían ayudar.
El error lo marca exactamente en el if exists
ErrorException
Undefined variable: user
Por el 07 de Enero de 2014
el error lo puedes coregir asignando un valor a la variable $user en este caso solo definiendola por ejemplo para el metodo create
public function create()
{
//return 'aqui creas el form para nuevos usuarios';
$user = '';
$form_data = array('route' => 'admin.users.store', 'method' => 'POST');
$action = 'Nuevo';
return View::make('admin/users/form', compact('user', 'form_data', 'action'));
}
Por Samuel el 16 de Enero de 2014
sucede que si le estoy mandando el id, y la function edit del controller recibe el id, porque me marca ese error?
Por iObed el 07 de Febrero de 2014
Symfony \ Component \ Debug \ Exception \ FatalErrorException
Call to a member function validAndSave() on a non-object
en UsersController.php
=(
Por iObed el 21 de Febrero de 2014
ErrorException
Undefined index: full_name (View: C:\xampp\htdocs\pruebalaravel\app\views\admin\users\form.blade.php)
Por FRKodes el 05 de Mayo de 2014
Mi función create tiene esto adentro:
$user = new User;
return View::make('admin/users/form')->with('user', $user);
Saludos
Por Oscar Cadavid el 20 de Mayo de 2014
Pero el metodo create funciona perfectamente y el show y el index
Por whenIgoLoco el 01 de Julio de 2014
PS: Excelentes tutoriales.
Por Diego el 01 de Agosto de 2014
Al hacer que el form.blade.php sea el mismo para CREATE que para EDIT, al hacer la accion CREATE salta el siguiente error: Undefined variable: user
Esto pasa en CREATE porque no se le pasa la variable $user a la plantilla. Si modifico la condicion <?php if($user->exists): ?> por <?php if(isset($user)): ?> entonces la linea ya no peta, pero falla al intentar crear el formulario con la variable $user en {{ Form::model($user, $form_data, array('role' => 'form')) }}
Mi solución ha consistido en que, si no cumple la condicion <?php if(isset($user)): ?> entonces creo la variable $user con valor NULL, de tal manera que el código me queda así:
<?php
if (isset($user)):
$form_data = array('route' => array('admin.users.update', $user->id), 'method' => 'PATCH');
$action = 'Editar';
else:
$user = null;
$form_data = array('route' => 'admin.users.store', 'method' => 'POST');
$action = 'Crear';
endif;
?>
Por Ricardo el 10 de Agosto de 2014
if ($user->exists):
$form_data = array('route' => array('admin.users.update', $user->id), 'method' => 'PATCH');
$action = 'Editar';
else:
$form_data = array('route' => 'admin.users.store', 'method' => 'POST');
$action = 'Crear';
endif;
Considero que debería de ir en el controlador y pasarle la variable $form_data y $action ahí, porque en una vista nunca se debe de aplicar ese tipo de lógica, es por eso que blade no cuenta con sentencias para setear variables.
Saludos!
Por Carlos Durman el 23 de Agosto de 2014
Por Carlos el 09 de Enero de 2015
Por Felipe@ el 18 de Enero de 2015
$user = new User;
return View::make('admin/users/list')->with('user', $user);
He movido todo eso y no me muestra nada , invierto los campos en el foreach de esta manera @foreach ($user as $users) , me muestra como si existieran 4 registros pero no muestra ninguna información.
Muchas gracias por su ayuda.
Por Gaston el 26 de Febrero de 2015
$user = new User; Fíjate estas creando una instancia del objeto y faltan los ()
Por Nelson Manuel el 06 de Mayo de 2015
Me surgió un error con la función getFullNameAttributes() dado que al momento de crear una instancia de User no tiene información de los campos. Por lo tanto al querer acceder marca error por que no hay nada.
Para solucionarlo agregue una condicional:
if ( count($this->attributes) )
{
return strtoupper($this->attributes['full_name']);
}
Con eso se corregí el error. Saludos
Por Qween el 12 de Mayo de 2016
Por el 17 de Agosto de 2016
Por Pedro Silva el 10 de Octubre de 2016
Por lee520 el 14 de Diciembre de 2017
<P></P>
<P>This nike basketball shoes doesn't are jordan 5 however. christian louboutin outlet Added nike roshe 22% cheap beats headphones elected to beats headphones cheap obtain nike outlet as nike shoes well jordan 12 as the cheap jordan shoes Hathaway Jennifer nike boots Aniston nike boots entered Yeezy Adidas with nike air max 2017 13%. Stop louboutin shoes Halley christian louboutin sale fruit Jennifer nike clearance Lopez nike roshe moreover lindsay nike free 5.0 lohan nike sneakers Lohan. Michael Kors Purses On Sale A air max 1 spokesperson being under armour shoes spoken: nike boots " Has nike air max a nike roshe run healthy beats by dre cheap plan beats headphones on sale installed to nike outlet work beats by dre sale at beats by dre sale an Michael Kors Bags Online authentic nike factory store lifestyle salary nike factory store at nike clearance the jordan 13 moment nike sneakers inheritor nike free run you under armour sale cooperate nike outlet with jordans for cheap this wholesale christian louboutin dropship nike roshe growers and Michael Kors On Sale as well nike store as other air max 90 traders through cheap mont blanc pens the nike boots honourable working christian louboutin shoes gumption to nike boots be christian louboutin sure jordan 6 of air max 95 people obtain just nike outlet make payments under armour discount towards,Company cheap nike air max gained new jordans one nike shoes of nike roshe run many nike roshe run lowest dozens in nike air max laptop nike cleats computer nike clearance simple fact it nike shoes truly is mont blanc pen procedure air max 90 of facilitate nike shoes for women isn't nike roshe run really nike cleats check with nike shoes for women residing jordan shoes salary montblanc meisterstuck polices: air max 1 The christian louboutin outlet software nike store nations nike air max little air max 90 you moncler women obtain"Will be nike shoes treated nike air max 90 the cheap jordans entire legal at cheap jordans least, nike outlet Not cheap beats by dr dre at Adidas Yeezy Boost 350 all our under armour womens shoes indicated nike roshe run salary nike free range, air max 95 I beats earbuds would Michael Kors Jet Set Diaper Bag say christian louboutin shoes some beats earphones sort beats headphones on sale of cheap beats by dre say nike factory store even air max 95 called beats headphones on sale this examine beats headphones edition"Dated, nike huarache Never jordans for women basic beats by dr dre problem working louboutin outlet principle nike air max has nike air max 90 become adidas superstar apply: nike free run The banks mont blanc ballpoint pens on workman cheap nike air max committees because nike free 5.0 places nike air max 90 the point nike free run at which problematical nike free points beats by dre wireless can jordans for cheap be submit, </P>
<P></P>
<P>Shedd pueblos angeles air max situados air max en china air max 95 zona beats headphones delete moncler jackets b beats by dre on sale Mediterrneo christian louboutin sale marly beats earphones de jordans for sale s nike shoes iss Egeo nike store llegaron Yeezy Boost a cheap under armour constituir brilntes air max civilizaciones: Los cheap nike air max angeles nike air max 90 civilizacin mont blanc starwalker cretense mont blanc pens for sale ta Michael Kors Handbags On Sale minica(2200 1400 cheap jordans a Michael Kors Handbags Sale suitable. under armour outlet g.) mont blanc pens discount Ful los nike roshe angeles nike free 5.0 civilizacin micnica(1600 moncler jackets 1200 nike clearance a trustworthy. air max g.). jordans for women "The motor nike air max 90 coaches take nike basketball shoes a beats headphones look louboutin shoes at nike free run the nike free 5.0 youngsters Cheap Michael Kors Bags intended nike store for, nike roshe Many christian louboutin outlet verify christian louboutin shoes these nike free run questions nike clearance different nike air max 95 adjusting, adidas store And they procure beats by dre subjected nike air max 95 to the school motor moncler jacket coach nike roshe run tours. mens nike air max Making nike roshe it nike sneakers a beats by dre best cheap beats by dre part, under armour sale Alleged nike shoes Lewisville jordans for girls larger skull teach, nike cleats Which will moncler men placed 11 together with moncler sale her or air max the mens nike air max puppy's air jordan experts christian louboutin of Michael Kors Diaper Bag Sale the nike roshe run Cougars' jordan shoes cheesy nike shoes for men during nike roshe Carrollton. jordan 13 "Sumlin's nike roshe run started a nike basketball shoes remarkable louboutin shoes workforce. beats earphones </P>
<P></P>
<P>Helpful mens nike air max to air max those moncler women who nike store for air max 95 the Yeezy offer nike air max historic in cheap beats by dr dre mergers and Michael Kors Handbags Outlet purchases beats earbuds to air max 1 touch just the Adidas Yeezy style new jordans the company nike shoes for women trademark practice is nike free just beats by dre sale previously nike store reducing. nike free More nike air max often than moncler outlet not they nike air max will not beats by dre studio have nike shoes for men a nike outlet particular understanding what nike shoes for women the nike outlet exact nike air max 90 value beats solo of cheap under armour that nike outlet name mont blanc is at under armour shoes some point, nike sneakers These moncler men individuals nike free might cheap jordan shoes even pitch beats by dre on sale a nike free run bigger actually worth as jordans for girls compared nike roshe to brand name nike roshe run fully cheap jordans will womens nike air max have. Who has mens nike air max intangible cheap beats solutions air max powering nike air max 2017 associated cheap jordan shoes with beats by dre studio the nike shoes business nike shoes for men valuable content Michael Kors Jet Set during nike air max 21st beats headphones cheap century, nike outlet Deciding Adidas Yeezy For Sale the cheap beats headphones exact value jordan shoes of jordans for sale a nike free 5.0 logo nike air max 90 and moncler coats completely nike outlet the cheap nike air max company's value Adidas Yeezy Boost achievable"Intangible beats by dr dre help" jordans for sale On nike shoes the moncler outlet total amount moncler coats metal jordan shoes sheet is beats by dre cheap crucial and under armour outlet M In Michael Kors Jet Set Crossbody almost nike shoes for men all nike huarache of the air max 90 cases, Print bureaus are mont blanc pens classified air max as nike roshe run in nike store thread combination(s) Michael Kors Handbags To beats by dre studio work through Michael Kors Bags On Sale the jambalaya nike store ture nike shoes over Michael Kors Bags Sale brand name nike free run amassed nike free run far for nike free run both adidas outlet small Yeezy Boost 350 For Sale and retro jordans big beats by dre wireless purchases. Michael Kors Diaper Bag </P>
<P></P>
<P>Checking jordan 11 internet websites, womens nike air max I Michael Kors Jet Set Tote wasn't under armour discount able nike air max 90 to witness thousands mens nike air max of shots nike outlet of jordan 11 the gorgeous anyone utilizing this air max 90 is beats solo options variety Chucks. A nike store new christian louboutin sale pictures cheap beats by dre coming from beats earbuds all Leonardo adidas originals DiCaprio, air max 1 Orlando, fl nike roshe blossom, nike factory store Received nike air max 95 Barrymore nike basketball shoes and retro jordans often beats by dre wireless will air max truman, cheap beats For air max example, beats by dre on sale Found nike air max these businesses working nike factory store in Michael Kors Jet Set Bag quality womens nike air max schwarze, nike air max 2017 And far nike shoes for men from womens nike air max being nike shoes a jordan 11 few nike shoes white nike cleats Chucks. Nonetheless nike air max it has jordan 13 no nike outlet superstars gallery nike cleats to beats solo find nike store bright Chucks nike roshe users, new jordans Right adidas yeezy one nike store when nike shoes for women considering"Many nike sneakers families" Yeezy Boost 350 Putting Michael Kors Diaper Bag them on,</P> jordan 6
Por José el 31 de Enero de 2018
classroom rental space
training rrom rental in singapore
training rooms in singapore
seminar room rental in singapore
indoor team building activities
corporate team building games singapore
team bonding in singapore
team building activities singapore
team building games singapore
10 soft skills you need
administrative office procedures
administrative support courses
adult learning mental skills
adult learning physical skills
anger management courses in singapore
appreciative inquiry courses
archiving and records management
assertiveness and self confidence
attention management courses
basic bookkeeping courses
being a likeable boss
body language basics courses
budgets and financial reports
business acumen courses
business ethics courses
business etiquette courses in singapore
business succession planning courses
business writing courses in singapore
call center training courses
change management courses in singapore
coaching and mentoring courses
coaching sales people courses
collaborative business writing
communication strategies courses
conducting annual employee reviews
conflict resolution courses
contact center training courses
contract management courses in singapore
creating a great webinar
creative problem solving courses
crisis management courses
critical thinking courses in singapore
customer service courses in singapore
customer support courses
cyber security courses in singapore
delivering constructive criticism
developing a lunch and learn
developing corporate behavior
developing creativity courses
developing new managers
digital citizenship courses
emotional intelligence courses
employee motivation courses
employee on boarding courses
employee recognition courses
employee recruitment courses
employee termination processes
entrepreneurship courses in singapore
event planning courses in singapore
executive and personal assistants
facilitation skills courses
generation gaps courses
goal setting and getting things done
handling a difficult customer
health and wellness at work courses
high performance teams inside the company
high performance teams remote work force
hiring strategies courses
human resource management courses in singapore
improving mindfulness
improving self awareness
increasing your happiness
internet marketing fundamentals courses
interpersonal skills courses
job search skills courses
knowledge management courses in singapore
leadership and influence courses
lean process and six sigma
life coaching essentials courses
manager management courses
managing personal finances courses
managing work place anxiety
marketing basics courses
measuring results from training
media and public relations courses
meeting management courses
middle manager courses
millennial on boarding courses
m learning essentials
motivating your sales team
multi level marketing courses
negotiation skills courses
networking outside the company
networking within the company
office politics for managers
organizational skills courses
overcoming sales objections
performance management courses
personal branding courses in singapore
personal productivity courses
presentation skills courses in singapore
project management courses in singapore
proposal writing courses
prospecting and lead generation
public speaking courses in singapore
risk assessment and management courses
safety in the work place courses
sales fundamentals courses
sales training courses in singapore
servant leadership courses
it courses in singapore
microsoft training singapore
corporate training in singapore
corporate sgx
social intelligence courses
social learning courses
social media in the work place
social media marketing courses in singapore
soft skills courses in singapore
stress management courses in singapore
supervising others
supply chain management courses
taking initiative courses
talent management courses
team building for managers
team building through chemistry
teamwork and team building
telephone etiquette courses
telework and telecommuting
time management courses in singapore
trade show staff training
train the trainer courses
virtual team building and management
women in leadership courses
work life balance courses in singapore
work place diversity courses
work place harassment courses
work place violence courses
sancy suraj
sancy suraj
sancy suraj
sancy suraj
sancy suraj
sancy suraj
sancy suraj
sancy suraj
[url=https://books.google.com.sg/books?id=1QykBQAAQBAJ&pg=PT362&lpg=PT362&dq=%22sancy+suraj+singh%22&source=bl&ots=E86QDyrLG2&sig=H-6a_YH-kTWaZWTfPSr1xfm4BOs&hl=en&sa=X&ved=0ahUKEwi3_56hhubVAhWJLo8KHcxTBxQ4ChDoAQgjMAA#v=onepage&q =% 22sancy% 20suraj% 20singh% 22 & f = false]sancy suraj[/url]
sancy suraj
longest colour sequence memorised
sancy suraj
longest colour sequence memorised
memory training course
memory training course
memory training course
memory training course
memory training course
memory training course
memory training course
memory training course
memory training course
memory training course
memory training course
memory training course
memory training course
memory training course
memory training course
memory training course
memory training course
memory training course
lunch talks
lunch talks
memory training course
memory training course
cabin crew
online memory course
memory training course
memory training course
memory training course
memory training course
memory training course
speed reading
tuition
tuition
tuition
tuition
tuition
tuition
tuition
tuition
tuition
tuition
geography tuition for secondary school students in singapore
geography tuition for secondary school students singapore
geography tuition for secondary school students singapore
geography tuition for secondary school students singapore
geography tuition for secondary school students singapore
secondary geography tuition in singapore
history tuition for secondary school students in singapore
social studies tuition for secondary school students in singapore
psle english tuition in singapore
psle science tuition in singapore
secondary 1 chemistry tuition in singapore
secondary 1 physics tuition in singapore
school holiday workshops courses for students in singapore
school holidays activitie in singapore
school holidays activitie in singapore
[url=http://umonictuitionadvantage.com/2017-november-school-holidays-activities-programmes-workshop-courses-camps-for- students-kids-in-singapore/]school holidays activitie in singapore[/url]
school holidays activitie in singapore
study skills
study skills
study skills workshops course in singapore
study skills workshops course in singapore
speed reading
speed reading
tuition
tuition
tuition
tuition
tuition
tuition
tuition
tuition
tuition
tuition
tuition
tuition
tuition
tuition
tuition
tuition[
tuition[
tuition[
tuition[
tuition[
tuition[
tuition[
tuition[
student courses
corporate training
corporate training
corporate training
corporate training
corporate training
corporate training
corporate training
corporate training
corporate training
corporate training
corporate training
corporate training
corporate training
corporate training
corporate training
corporate training
corporate training
corporate training
corporate training
corporate training
corporate training
corporate training
lunch talk
lunch talk
lunch talk
lunch talk
lunch talk
lunch talk
lunch talk
lunch talk
lunch talk
lunch talk
lunch talk
lunch talk
corporate lunch talk
corporate lunch talk
corporate lunch talk
corporate lunch talk
corporate lunch talk
corporate lunch talk
corporate lunch talk
corporate lunch talk
corporate lunch talk
corporate lunch talk
corporate lunch talk
corporate lunch talk
corporate lunch talk
corporate lunch talk
team building
team building ideas
team building activities
unique team building
team building
corporate training in singapore
corporate training courses
corporate training courses
corporate training courses
corporate training courses
corporate health talk
corporate health talk
corporate health talk
lunch and learn talk
workplace lunch and learn
corporate training companies in singapore
training companies in singapore
emcee
emcee
health talks
soft skills training course
corporate training providers
professional development courses
training and development courses
short courses in singapore
corporate training courses in singapore
corporate training courses
corporate training in singapore
school holiday workshops courses for students in singapore
business students memory course in singapore
business students memory improvement workshop in singapore
memory improvement course for business students
memory improvement course for business students
business students memory improvement course
business students memory course in singapore
corporate health talks singapore
corporate health talks in singapore
corporate health talk singapore
corporate health talk in singapore
corporate health talks singapore
corporate health talks singapore
finance students memory training course in singapore
finance students memory training course in singapore
finance students memory training course in singapore
memory training courses for finance students in singapore
memory training courses for finance students in singapore
memory improvement courses for finance students in singapore
pinnacle minds
memory course
study skills
speed reading
memory training
school holiday
lunch and learn
march school holidays workshops
march school holidays workshops
march school holidays workshops
march school holidays workshops
march school holidays workshops
june school holidays workshops
june school holidays workshops
june school holidays workshops
june school holidays workshops
september 2018 school holidays workshops
september 2018 school holidays workshops
september 2018 school holidays workshops
september 2018 school holidays workshops
november 2018 school holidays workshops
november 2018 school holidays workshops
november 2018 school holidays workshops
november 2018 school holidays workshops
december 2018 school holidays workshops
december 2018 school holidays workshops
december 2018 school holidays workshops
december 2018 school holidays workshops
top 10 soft skills you need training course
administrative office procedures training course
administrative support training course
anger management training course
appreciative inquiry training course
archiving and records management training course
archiving and records management training course
self confidence and assertiveness training course
improving your attention management training course
bacis bookkeeping training course
being a likeable boss training course
body language training course
budgets and-financial reports training course
business acumen training course
business ethics training course
business etiquette training course
business succession planning training course
business writing training course
call centre training course
change management training course
civility in the workplace training course
coaching and mentoring training course
coaching salespeople training course
collaborative business writing training course
communication strategies training course
conducting annual employee reviews training course
conflict resolution training course
contact centre training course
contract management training course
creating a great webinar training course
creative problem solving training course
crisis management training course
critical thinking training course
customer service training course
customer support training course
cyber security training course
delivering constructive criticism training course
developing lunch and learn training course
developing corporate behavior training course
developing creativity training course
developing new managers training course
digital citizenship training course
emotional intelligence training course
employee motivation training course
employee onboarding training course
employee recognition training course
employee recruitment training course
employee termination processes training course
entrepreneurship training course
event planning training course
executive and personal assistants training course
facilitation skills training course
generation gaps training course
goal setting and getting things done training course
handling a difficult customer training course
health and wellness at work training course
high performance teams inside the company training course
high performance teams remote workforce training course
hiring strategies training course
human resource management training course
improving mindfulness training course
improving self awareness training course
internet marketing fundamentals training course
interpersonal skills training course
job search skills training course
knowledge management training course
leadership and influence training course
lean process and six sigma training course
life coaching essentials training course
manager management training course
managing personal finances training course
managing workplace anxiety training course
marketing basics training course
measuring results from training course
media and public relations training course
meeting management training course
middle manager training course
millennial onboarding training course
mlearning essentials training course
motivating your sales team training course
negotiation skills training course
networking outside the company training course
networking within the company training course
office politics for managers training course
organizational skills training course
overcoming sales objections training course
performance management training course
personal branding training course
personal productivity training course
presentation skills training course
project management training course
proposal writing training course
prospecting and lead generation training course
public speaking training course
risk assessment and management training course
safety in the workplace training course
sales fundamentals training course
servant leadership training course
social intelligence training course
social learning training course
social media in the workplace training course
social media marketing training course
stress management training course
supervising others training course
supply chain management training course
taking initiative training course
talent management training course
team building for managers training course
team building through chemistry training course
teamwork and team building training course
telephone etiquette training course
telework and telecommuting training course
time management training course
top 10 sales secrets training course
trade show staff training course
train the trainer training course
virtual team building and management training course
women in leadership training course
work life balance training course
workplace diversity training course
workplace harassment training course
workplace violence training course
half day memory improvement courses workshops
speed reading courses workshops in singapore
10 soft skills you need corporate training course in singapore
administrative office procedures corporate training course in singapore
administrative support corporate training course in singapore
anger management corporate training course in singapore
appreciative inquiry corporate training course in singapore
archiving and records management corporate training course in singapore
self confidence assertiveness corporate training course in singapore
improving your attention management corporate training course in singapore
basic bookkeeping corporate training course in singapore
being a likeable boss corporate training course in singapore
body language basics corporate training course in singapore
budgets and financial reports corporate training course in singapore
business acumen corporate training course in singapore
business ethics corporate training course in singapore
business etiquette corporate training course in singapore
business succession planning corporate training course in singapore
business writing corporate training course in singapore
call center corporate training course in singapore
change management corporate training course in singapore
civility in the workplace corporate training course in singapore
coaching and mentoring corporate training course in singapore
coaching salespeople corporate training course in singapore
collaborative business writing corporate training course in singapore
communication strategies corporate training course in singapore
conducting annual employee reviews corporate training course in singapore
conflict resolution corporate training course in singapore
contact center corporate training course in singapore
contract management corporate training course in singapore
creating a great webinar corporate training course in singapore
creative problem solving corporate training course in singapore
crisis-management corporate training course in singapore
critical thinking corporate training course in singapore
customer service corporate training course in singapore
customer support corporate training course in singapore
cyber security corporate training course in singapore
delivering constructive criticism corporate training course in singapore
developing a lunch and learn corporate training course in singapore
developing corporate behavior corporate training course in singapore
developing creativity corporate training course in singapore
developing new managers corporate training course in singapore
digital citizenship corporate training course in singapore
emotional intelligence corporate training course in singapore
employee motivation corporate training course in singapore
employee onboarding corporate training course in singapore
employee recognition corporate training course in singapore
employee recruitment corporate training course in singapore
employee termination processes corporate training course in singapore
entrepreneurship training course in singapore
event planning corporate training course in singapore
executive and personal assistants corporate training course in singapore
facilitation skills corporate training course in singapore
generation gaps corporate training course in singapore
goal setting and getting things done corporate training course in singapore
handling a difficult customer corporate training course in singapore
health and wellness at work corporate training course in singapore
high performance teams inside the company corporate training course in singapore
high performance teams remote workforce corporate training course in singapore
hiring strategies corporate training course in singapore
human resource management corporate training course in singapore
improving mindfulness corporate training course in singapore
improving self awareness corporate training course in singapore
increasing your happiness corporate training course in singapore
internet marketing fundamentals corporate training course in singapore
interpersonal skills corporate training course in singapore
job search skills corporate training course in singapore
knowledge management corporate training course in singapore
leadership and influence corporate training course in singapore
lean process and six sigma corporate training course in singapore
life coaching essentials corporate training course in singapore
manager management corporate training course in singapore
managing personal finances corporate training course in singapore
marketing basics corporate training course in singapore
measuring results from corporate training course in singapore
media and public relations corporate training course in singapore
meeting management corporate training course in singapore
middle manager corporate training course in singapore
millennial onboarding corporate training course in singapore
mlearning essentials corporate training course in singapore
motivating your sales team corporate training course in singapore
negotiation skills corporate training course in singapore
networking outside the company corporate training course in singapore
networking within the company corporate training course in singapore
office politics for managers corporate training course in singapore
organizational skills corporate training course in singapore
overcoming sales objections corporate training course in singapore
performance management corporate training course in singapore
personal branding corporate training course in singapore
personal productivity corporate training course in singapore
presentation skills corporate training course in singapore
project management corporate training course in singapore
proposal writing corporate training course in singapore
prospecting and lead generation corporate training course in singapore
public speaking corporate training course in singapore
[url