No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de Introducción a Laravel 8

Curso de Introducción a Laravel 8

Profesor Italo Morales F

Profesor Italo Morales F

Creación de Campos Virtuales en Componentes con Tailwind CSS

12/21
Recursos

¿Cómo diseñar un componente visual eficiente?

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.

¿Qué son los campos virtuales y para qué se utilizan?

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:

  • Generar información derivada de otros campos existentes.
  • Alterar la visualización de datos sin modificar el esquema de la base de datos.
  • Ofrecer funcionalidades adicionales e interactivas en nuestros componentes.

¿Cómo crear una estructura base para nuestro componente?

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:

  • Una cuadrícula de tres columnas para distribuir visualmente los elementos.
  • Espaciado entre columnas con un nivel específico para mantener una organización visual adecuada.
  • Aplicación de márgenes alrededor para asegurar una separación clara entre componentes.

¿Cómo configurar la tarjeta de cada componente?

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:

  • Fondo Blanco: bg-white
  • Sombra: shadow
  • Bordes redondeados: rounded
  • Alineación de texto: text-center
  • Márgenes y rellenos específicos: px-4 py-6

La tarjeta debe funcionar como un enlace, permitiendo interactividad directa con los componentes visuales que contiene.

¿Cómo mostrar imágenes y texto en nuestro componente?

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.

¿Cómo se generan y utilizan los campos virtuales?

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.

¿Cómo se gestiona la personalización del avatar del usuario?

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.

¿Qué beneficios tiene el uso de componentes visuales individuales?

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:

  • Reducir la complejidad en los controladores.
  • Permitir mayor escalabilidad y modularidad en el código.
  • Facilitar el mantenimiento gracias a la separación de lógica y diseño.

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

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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 😄

Livewire: diseño del componente


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.

Accesores y mutadores

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.

Para los avatar usé el siguiente servicio: https://i.pravatar.cc/150?u=$email
```js
@foreach ($courses as $course) @endforeach
```

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