Introducción
Curso Renovado de Laravel: Nuevas Herramientas y Conocimientos
Proyectos modernos con Laravel 8 y JetStream
Curso de Laravel 6: Soporte a Largo Plazo y Migración a Nuevas Versiones
Instalación y uso de JetStream en Laravel con Blade y TailwindCSS
Proyecto con Laravel 8
Creación de Proyecto Web con Laravel 8 y Tailwind CSS
Instalación y Configuración de Laravel 8 con Tailwind CSS
Creación de Datos Semilla en Laravel con Faker
Configuración de Rutas y Vistas en Laravel con JetStream
Creación de Plantillas Web con Blade y Tailwind CSS en Laravel
Configuración de Plantillas Blade en Visual Studio Code
Creación de Componentes Dinámicos con Livewire en Laravel
Creación de Campos Virtuales en Componentes con Tailwind CSS
Creación de Controladores y Rutas en Laravel 8
Rutas dinámicas y maquetación de cursos en PHP con Laravel
Configuración de Listado de Lecciones en Visual Studio
Configuración de Cursos Similares en Visual Studio
Creación y Uso de Componentes Blade en Laravel
Personalización de Elementos en JetStream con Visual Studio
Conclusión
Personalización de Vistas en Laravel con JetStream y Livewire
Desarrollo de Aplicaciones con Laravel 8 y JetStream
Bonus
Consejos para Dominio de Laravel y Desarrollo Profesional
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
El diseño de componentes visuales es crucial cuando estamos estructurando aplicaciones web, especialmente si deseamos una interfaz atractiva y funcional. En esta clase, nos adentramos en la creación de campos virtuales, un elemento poderoso cuando queremos manipular datos más allá de lo que nos ofrece nuestras tablas base.
Los campos virtuales son atributos que no existen dentro de nuestras tablas en la base de datos, pero que creamos de forma programática para facilitar nuestro trabajo de visualización y procesamiento de datos. Son útiles para:
Para comenzar con nuestro diseño, ubicamos el componente dentro de Visual Studio Code en la carpeta de vistas. La estructura base de nuestro componente incluye:
Dentro de la tarjeta crearemos un div con las siguientes configuraciones:
<div class="bg-white shadow rounded px-4 py-6 text-center">
<!-- Contenido de la tarjeta -->
</div>
Se aplican clases de Tailwind CSS para estilizar rápidamente los elementos:
bg-white
shadow
rounded
text-center
px-4 py-6
La tarjeta debe funcionar como un enlace, permitiendo interactividad directa con los componentes visuales que contiene.
Primero configuramos la imagen principal del curso y su respectiva clase CSS para el diseño visual:
<img src="{variable_imagen}" class="rounded-md mb-2" />
Luego, incluimos un h2 con el título del curso, seguido del campo virtual del extracto de la descripción:
<h2 class="text-lg text-gray-600 uppercase line-clamp-1">{titulo}</h2>
<p class="text-sm text-gray-400">{extracto}</p>
Aquí, line-clamp-1
se utiliza para asegurarse de que el título no se extienda a más de una línea.
La generación de campos virtuales ayuda a personalizar las características de los datos. Por ejemplo, podemos crear un método para un extracto del curso utilizando el inicio de la descripción:
public function getExtractoAttribute()
{
return substr($this->descripcion, 0, 80) . '...';
}
Este método obtiene los primeros 80 caracteres de la descripción del curso y añade tres puntos para indicar que es un extracto.
Para mostrar un avatar personalizado, utilizamos la herramienta Gravatar para crear un hash del email del usuario y vincularlo con un avatar:
public function getAvatarAttribute()
{
return "https://s.gravatar.com/avatar/" . md5(strtolower(trim($this->email)));
}
Utilizar este método no solo brinda una imagen personalizada para cada usuario, sino que ayuda a mantener la interfaz dinámica y atractiva.
Al utilizar componentes visuales individuales en una vista, obtenemos la capacidad de integrar múltiples secciones sin complicaciones adicionales en la lógica de controladores. Esta técnica es preferida para:
Con todo esto, puedes seguir experimentando y mejorando tus diseños en futuras lecciones, aprovechando al máximo la potencia de los campos virtuales y la modularidad de los componentes visuales.
Aportes 26
Preguntas 8
Para los que depronto el sistema de columnas no les funcione deben hacer lo siguiente:
npm run development
luego
php artisan serve
y listo, ya se pueden visualizar las columnas
Para generar AVATARES FAKE usen esta linea de codigo de https://pravatar.cc/ . Asi a pesar e que el correo sea fake se ligara siempre a un avatar fake.
Espero que les sea útil
public function getAvatarAttribute()
{
//gravatar
$email = md5($this->email);
return "https://i.pravatar.cc/150?u=/$email";
}
Toca leer bien como es eso de Gravatar. Por otro lado, queda claro que livewire ahorra lineas de codigo.
Les comparto el archivo CourseList.php
<div class="grid grid-cols-3 gap-4 mt-8">
@foreach ($courses as $course)
<div class="bg-white shadow-lg rounded-lg px-4 py-6 text-center">
<a href="#">
<img src="{{ $course->image }}" class="rounded-md mb-2" alt="">
<h2 class="text-lg text-gray-600 truncate uppercase">{{ $course->name }}</h2>
<h3 class="text-md text-gray-500">{{ $course->excerpt }}</h3>
<img src="{{ $course->user->avatar }}" class="rounded-full mt-4 mx-auto h-16 w-16" alt="">
</a>
</div>
@endforeach
</div>
Les comparto una extensión para Tailwind muy útil si planean usar este framework frontend para desarrollar
Eso es cierto, he visto que muchas plataformas usan gravatars, la primera vez que lo vi fue como: “what the is this?!!” A final tuve que crearme uno xD De hecho me parece que la página de npmjs funciona con gravatars también 🤔
.
Por cierto, los campos virtuales son geniales porque te permiten de alguna forma “customizar” lo que quieres que te retornen, es decir, puedes definir simplemente una propiedad y puedes definir qué quieres que retorne esa propiedad, prácticamente puedes aplicar cualquier tipo de lógica al definir lo que va a retornar esa propiedad 😄
Esto son campos virtuales, esto quiere decir que no existen pero a través del modelo generamos creamos cualquier tipo de lógica para crearlos.
public function getAvatarAttribute()
{
// gravatar
$email = md5($this->email);
return "https://s.gravatar.com/avatar/$email";
}
Los campos virtuales también llamado “accesores”:
Accesores - get(nombre del accesor), Atribute asi debe llamarse el accesor.
Ej: getStockAttribute()
A lo que el profesor llama un campo virtual, es un accesor. Lo que hacen los accesores es tomar un atributo y transformar su valor al momento de obtenerlo/leerlo. También existen los mutadores, que lo que hacen es modificar el valor del atributo al momento en que se va a guardar.
Min 7:50… Yo simplemente hago Str::limit($variable,77)
No se si me lo perdí, pero pueden colocar el comando siguiente para que Tailwind se compile de forma automática cada vez que realizamos un cambio.
npm run watch
Course.php
public function getExcerptAttribute()
{
return substr($this->description,0,80) . "..." ;
}
User.php
public function getAvatarAttribute()
{
$email=md5($this->email);
return "https://s.gravatar.com/avatar/$email";
}
Gravatar
Para ver las imágenes en gravatar de esta forma
O de esta
.
Sin tener que registrar una cuenta en gravatar se haría de la siguiente forma:
public function getGetEmailHashAttribute()
{
$hash = md5($this->email);
return "https://www.gravatar.com/avatar/{$hash}?s=48&d=identicon";
}
.
Así generarian una imágen de Gravatar con cualquier correo electrónico sin importar que este no esté registrado en Gravatar.
Les comparto el codigo de course-list.blade.php
<div class="grid grid-cols-3 gap-4 mt-8">
@foreach ($courses as $course)
<div class="bg-white shadow-lg rounded-lg px-4 py-6 text-center">
<a href="#">
<img src="{{ $course->image }}" class="rounded-md mb-2">
<h2 class="text-lg text-gray-600 truncate uppercase">{{ $course->name }}</h2>
<h3 class="text-md text-gray-500">{{ $course->excerpt }}</h3>
<img
src="{{ $course->user->avatar }}"
class="rounded-full mx-auto h-16 w-16"
>
</a>
</div>
@endforeach
</div>
Para seguir aprendiendo cree un componente llamado corseCard, e hice de courseList una lista de courseCard.
Me sirvió para aprender como pasar datos entre componentes y aprender sobre la función mount() de un componente 😄.
Animo a mis compañeros a intentarlo!
Para no estar ejecutando
npm run development
Cada vez que actualizan el codigo, recomiendo ejecutar
npm run watch
El cual quedará mirando los cambios y actualizará los estilos de Tailwind cada vez que guardes esos cambios.
Si así como yo utilizaste el facade Storage debes tener en cuenta que para poder mostrar las imágenes debes utilizar un host virtual, de lo contrario no encontrara la ruta de dicha imagen.
<div class="grid grid-cols-3 gap-4 mt-8">
@foreach ($courses as $course)
<div class="bg-white shadow-lg rounded-lg px-4 py-6 text-center">
<a href="#">
<img class="rouded-md mb-2" src="{{ Storage::url($course->image) }}"
</a>
</div>
@endforeach
</div>
En este caso me salen las imágenes tan pequeñas por que a la hora de generar el Factory coloque erróneas las medidas de las imágenes.
Para Gravatar desarrollé una librería para PHP, puede serles útil https://github.com/jruedaq/gravatar-url
Para los que tengan duda de como funciona gravatar al igual que yo lo estaba:
Básicamente gravatar es un programa en el cual tu creas tu cuenta con un correo y subes la imagen de perfil que tu quieres sea visualizada dentro de todas las aplicaciones que usan la api de gravatar, en general son bastantes y en su mayoria son usadas por apps de wordpress. Es como si subieramos una foto de perfil general para que los desarrolladores las apliquen en sus apps simplemente con el correo.
**Ponganle a la url de gravar el parametro identiicon **
https://www.gravatar.com/avatar/00000000000000000000000000000000?d=identicon
Que diferencia habría entre los mutators/accessors y los campos virtuales? A mi parecer son lo mismo.
SI necesitamos desarrollar una logica mas extensa sobre el negocio, lo hacemos sobre la clase del objeto y ya no utilizamos mas los viejos controlller???
A alguien más le salio este erro?
Trying to get property ‘avatar’ of non-object
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?