Laravel Jetstream
Jetstream proporciona componentes de blade prediseñados con cierta cantidad de clases, para que puedan ser utilizados en cualquier vista de laravel, lo que permite ahorrar tiempo en programar comonentes tales como inputs, tables, etc.
Publicar componentes de Jetstream
Para poder utilizarlos, es conveniente publicarlos y hacerlos visibles en el proyecto de laravel. Abrir la consola o teminal y ejecutar el comando
php artisan vendor:publish --tag=jetstream-views
Así creará los ficheros accesibles en la carpeta resources\views\vendor\jetstream\components
Todos los ficheros que se incluyen es la carpeta creada, son componentes de blade, y serán utilizados como tal.
Para ver como utilizar los componentes de Blade puedes seguir el enlace Laravel Blade Components
Reutilizar plantilla JetStream
Abrir el fichero de plantilla app.blade.php
resources\views\layouts\app.blade.php
Encabezado o header
El fichero app.blade.php hace referente al componente de JetStream navigation-menu.
@livewire('navigation-menu')
Este componente principalmente hay que destacar que tiene una parte de menú para escritorio y otra parte de menú responsivo para móvil.
Por lo tanto hay que tener en cuenta que al modificar una parte para añadir enlaces de menú, también hay que hacerlo en la parte mobile.
<!-- Primary Navigation Menu --> <div class="max-w-7xl mx-
auto px-4 sm:px-6 lg:px-8">
...
<!-- Responsive Navigation Menu --> <div :class="{'block': open, 'hidden': ! open}" class="hidden sm:hidden">
...
Pero esto se puede simplificar decarando los menús en un array, así solo habrá que añadir en un sitio.
Unificar Menu y Menu móvil
Al principio de la vista, se puede crear un array de arrays con los menú, y así poder utilizarlo en cualquier parte.
@php
$nav_links = [
['name' => 'Dashboard',
'route' => route('dashboard'),
'active' => request()->routeIs('dashboard')],
['name' => 'Prueba',
'route' => '#',
'active' => false]];
@endphp
También se puede utilizar un asterisco en 'active' => request()->routeIs('dashboard.*')
para indicar que todas las rutas con ese prefijo se evaluará el botón activo.
Una vez decladado los arrays de menús, utilizarlo con un foreach donde se desee mostrar, indicando en cada parte su valor correspondiente, como el nombre, el enlace o link, y si está activo el item.
@foreach ($nav_links as $nav_link)
<x-jet-nav-link href="{{ $nav_link['route'] }}" :active="$nav_link['active']">
{{ $nav_link['name'] }}
</x-jet-nav-link>
@endforeach
Publicar vistas de JetStream
Al utlizar los stack o posiciones de Livewire, que muestran código en ciertas partes de la plantilla o layout, es necesario publiar antes los componentes de Livewire.
Esto se hace con el comando
php artisan vendor:publish --tag=jetstream-views
que copia los ficheros de \vendor\laravel\jetstream\resources\views
a resources\views\vendor\jetstream
Modificar Logo
La vista llama al componente de jetstream
<x-jet-application-mark>
Con lo cual hay que modificar el fichero correspondiente para cambiar el logo.
resources\views\vendor\jetstream\components\application-mark.blade.php
Por ejemplo se puede poner el código para imagenes, haciendo referencia a una imagen colocada en una carpeta pública.
<img src="{{ asset('storage\logo\logo.jpg') }}" class="logo"/>
Enlaces en menú
La vista llama al componente de jetstream
<x-jet-nav-link>
Para poner un nuevo enlace en el menú, se utiliza este componente añadiendo la url y entre etiqueta de apertura y cierre, el nombre del enlace.
<x-jet-nav-link
href="{{ route('nombreruta') }}">
Nombre enlace</x-jet-nav-link>
Pagina principal home
Para que la página de inicio tenga la misma apariencia que el layout utilizado app-layout, hay que indicarlo en el fichero de rutas y en la vista principal.
Modificar enlace home
Para cambiar que al hacer clic en el logotipo vaya a la página pricipal en vez a ruta por defecto welcome, hay que cambiar varias cosas:
- Ruta: en web.php nombrar la ruta welcome a home.
Route::get('/', function () { return view('welcome');})->name('home');
- Componente correspondiente. En este caso el logotipo se muestra en el componente navigation-dropdwon, donde hay que cambiar la ruta dashboard por home.
<!-- Logo -->
<div class="flex-shrink-0 flex items-center">
<a href="{{ route('home') }}">
<x-jet-application-mark class="block h-9 w-auto" />
</a></div>
- Vista welcome, comentar o borrar todo lo que haya, porque ya no se va a usar, y poner el código de la plantilla principal welcome (resources\views\welcome.blade.php), a través de su componente AppLayout (app\View\Components\AppLayout.php).
<x-app-layout>
</x-app-layout>
Pero al quitar los enlaces de rutas, vistas y plantillas va a provocar un error, al intentar traer la imagen del usuario no autentificado. En concreto es "trying to get property of non object auth user" View: ...\resources\views\navigation-menu.blade.php
Vamos a ver como solucionar el error
Trying to get property id of non object laravel
El error se da en la parte de código que accede a mostrar la foto de perfil de usuario, y que emite el error Errorexception trying to get property of non object
Solución al error
Para solucionar el error hay que ir donde se está pidiendo la información, en en este caso es el fichero navigation-menu (resources\views\navigation-menu.blade.php).
Hay dos sitios en este fichero donde se llama a la función auth, origen del problema, la primera es en menú de escritorio y la otra en el menú móvil.Auth::user()->profile_photo_url }}"
Menú principal o Primary Navigation Menu
Al inicio del código se define los menús, para no tener que hacerlo par partida doble en menú de escritorio o desktop, y también en el menú mobile.
@php
$user_links = [
[
'name' => 'Login',
'route' => route('login'),
'active' => request()->routeIs('dashboard')
],
[
'name' => 'Registrarse',
'route' => route('register'),
'active' => request()->routeIs('dashboard')
]
];
@endphp
Después se coloca las directivas condicionales de autenticación de un usuario.
- Buscar donde aparece el código
<!-- Settings Dropdown -->
- Colocar la directiva @auth @else @endauth para condicionar si está el usuario logueado
- La primera parte de la condición es el propio código de la vista
La segunda parte de la condición es poner links a la ruta register y login. Para esto se puede reutilizar el código de la vista welcome.
Con un foreach se muestra los distintos items del menu, definidos previamente en un array:
@auth
... codigo propio de la vista ...
@else
<div>
@foreach ($user_links as $user_link)
<a href="{{ $user_link['route'] }}"
class="text-sm text-gray-700 dark:text-gray-500 underline px-2">
{{ $user_link['name'] }}
</a>
@endforeach
@endauth
Menú responsivo móvil o Responsive Navigation Menu
- Buscar donde aparece el código
<!-- Responsive Settings Options -->
- Colocar la directiva @auth @else @endauth para condicionar si está el usuario logueado
- La primera parte de la condición es el propio código de la vista
La segunda parte de la condición es poner links a la ruta register y login.
Aquí la diferencia con el menú de escritorio anterior, es que se usa un componente de JetStream responsive-nav-link para los links.
Con un foreach se muestra los distintos items del menu, definidos previamente en un array:
@auth
... codigo propio de la vista ...
@else
<div>
@foreach ($user_links as $user_link)
<x-jet-responsive-nav-link
href="{{ $user_link['route'] }}"
:active="$user_link['active']">
{{$user_link['name']}}
</x-jet-responsive-nav-link>
@endforeach
@endauth
Así con las condicionales de la directiva @auth se evita que se ejecute el código que lanza el error.
Deja una respuesta