¿Cómo trabajar con formularios de edición en Laravel?
¡Bienvenido a una nueva clase llena de aprendizaje! Hoy exploraremos cómo crear y configurar un formulario de edición en Laravel. Esto te ayudará a reforzar lo aprendido al crear formularios de creación. Reconstruiremos juntos el proceso de edición de un post en nuestra aplicación.
Comenzaremos por entender cómo llevar una página en blanco al retorno efectivo de un formulario de edición al hacer clic en el botón "Editar", integrando código de Laravel y PHP para potenciar nuestra aplicación.
¿Cómo configurar el controlador para una ruta de edición?
Primero necesitamos asegurarnos de que nuestro controlador devuelva la vista del formulario de edición. Para ello, configuraremos la ruta de manera adecuada:
Eliminar el método show en caso de que no se esté utilizando.
Retornar la vista "edit" dentro de la carpeta posts, de la siguiente manera:
returnview('posts.edit',compact('post'));
Crear la vista edit.blade.php en la carpeta correspondiente.
¿Cómo iniciar la configuración del formulario?
El siguiente paso implica la creación y configuración del formulario de edición en Laravel:
Crear la estructura básica del formulario:
Usa Form::open para indicar la ruta y método del formulario.
Utiliza POST con un campo oculto para indicar el método PUT.
Añadir el enctype para permitir la carga de archivos.
¿Cómo asegurar la funcionalidad del formulario de edición?
Para asegurarnos de que el formulario funcione correctamente en Laravel debemos:
Pasar la variable $post desde el controlador a la vista utilizando el método compact.
Verificar que la ruta y método cumplen con el uso correcto de PUT para actualizaciones.
¿Qué métodos utiliza Laravel para el manejo de rutas y formularios?
Laravel ofrece configuraciones automáticas para rutas tipo resource, abarcando CRUD completo:
GET para mostrar formularios de creación y edición.
POST y PUT para crear y actualizar respectivamente.
DELETE para eliminar registros.
Un comando útil en Laravel para revisar las rutas configuradas es:
php artisan route:list
Este comando te mostrará claramente qué rutas están configuradas y bajo qué método HTTP operan, garantizándote claridad y orden en tus procesos de desarrollo.
¡Sigue explorando y experimentando con el poder de Laravel para desarrollar aplicaciones robustas y dinámicas! El siguiente paso será actualizar los datos en nuestra base de datos. ¡Adelante, tu futuro en el desarrollo está cada vez más cerca!
Que helper me puede ayudar a poder mostrar mi imagen, en la carpeta storage?
En la carpeta public podemos utilizar
asset();
para mostrar imagenes en un archivo blade si estan guardadas en storage, debemos de usar el comando:
php artisan storage:link
Este comando creara un link simbolico desde la carpeta storage/public de tu app en Laravel a public/storage con esto tendras acceso a mostrar tus imagenes de forma publica
{{url('storage/app/images/'.$article->image)}}
ahora si ves tu carpeta public cuentas con una carpeta storage que es un link (reflejo) de la carpeta storage, asi que ahora puedes usar el helper url() para obtener la imagen de la carpeta storage DEL FOLDER PUBLIC, no a la ruta del sistema storage de tu app:
{{url(‘storage/posts/’.$post->image)}}
es imporante esta diferencia porque normalmente en produccion solo a tu carpeta public se puede y se debe acceder, no deberias dar permisos para que visualizen carpetas internas del app
Fernando, tu aporte me parecio genia, personalmente tuve que cambiar unas cosas para que me funcionase, las dejo aqui por si alguien tambien las necesita.
Lo primero en este codigo las comillas que estan crean conflicto, hay que poner unas simples.
{{url(‘storage/posts/’.$post->image)}}
Yo lo puse asi, y ademas como la imagen ya se guarda como posts/jhbiub8493874rh78.jpj lo que hice fue retirarlo de la ruta ya que creaba conflicto:
{{url('storage/'.$post->image)}}
Con esto me funciono perfecto y la verdad que es una gran truco gracias
Amigos no olviden escribir en la linea del form despues de la ruta el dato que se recibe desde el controlador, hasta la proxima amigos.
Genial
Funcion de editar posts
A)RUTAS
B)Controllers
C) views
A)ENLAVISTAINDEXENELBOTONDEEDITARESTAENLAZADOCONLARUTAPOSTS.EDITB)En el controller creamos el method edit
publicfunctionedit(Post $post){returnview("posts.edit",compact('post'));}C) resources/views/posts/edit.php<div class="card"><div class="card-header">EditarArticulo</div><div class="card-body"> @if(session('status'))<div class="alert alert-success" role="alert">{{session('status')}}</div> @endif
<form action="{{ route('posts.update', $post) }}" method="POST" enctype="multipart/form-data"><div class="form-group"><label >Titulo*</label>//<!--aparece lo que ya estaba escrito --><input type="text" name="title"class="form-control" required value="{{ old('title', $post->title) }} "></div><div class="form-group"><label >Imagen</label><input type="file" name="file"></div><div class="form-group"><label >Contenido*</label>//<!--aparece lo que ya estaba escrito --><textarea name="body" rows="6"class="form-control" required>{{old('body', $post->body)}}</textarea></div><div class="form-group"><label >Contenido embebido</label>//<!--aparece lo que ya estaba escrito --><textarea name="iframe"class="form-control" required>{{old('iframe', $post->iframe)}}</textarea></div><div class="form-group text-center"> @csrf
@method('PUT')<input type="submit" value="Actualizar"class="btn btn-lg btn-outline-success"></div></form></div></div>
Para el que quiera os dejo por aqui mi rep de github que voy actualizando a diario segun continuo el curso, si tienes cualquier problema o error puedes consultarme sin problema.
@if(!empty($post->image))<div class="col-12"><label>Imagen</label></div><div class="center"><img
src="{{ url('storage/'. old('image', $post->image)) }}" style="width: 60%; height: 80%"class="rounded mx-auto d-block" alt="image"></div> @else<div class="alert alert-secondary" role="alert">Este post no contiene imagen de portada!</div> @endif
Alguien ya lo ha hecho con laravel 8 ?
Tengo el problema de que en la ruta de edit no manda el parametro que señalo, use un dd para ver que es lo que envia pero no manda nadaMe pueden ayudar ?
Yo estoy realizando el curso con la versión de Laravel 8, este es el método desde el controlador
como podria hacer, si solo quiero actualizar una columna? por ejemplo: tengo una tabal con una columna llamada estado, donde activo es 1 e inactivo es 0 , quiero poder cambiar a uno o 0 cuando se a posible, como lo implementaria?
Deberas mandar la informacion mediante un formulario POST que implemente el metodo PATCH.
(similar a como el profesor creo el boton de delete)
asi:
<form method="POST" action="{{ route('ruta.update', $post) }}"> @csrf
@method('PATCH')(aqui deberias tener el elemento html con(name="estado") que sirva para que el humano modifique el estado, ejemplo un check list o un radio button)</form>
Y en el update del controlador (o la accion que hallas destinado para tal fin), hacer una actualziacion del registro buscandolo por id, pero solamente acctualizando el campo que necesitas asi:
Para ahorrar tiempo y código, ¿estaría bien hecho reutilizar la vista de create.blade.php y hacer un if que si la url es edit, diga: Editar Articulo y si es create que diga: Crear articulo y utilizar el operador ternario para condicionar que si existe la variable $post se coloque el contenido como titulo o body y si no existe esté vacío? o estaría mal hecho? espero me haya explicado correctamente
Sí, sería lo mejor.
En cuanto al if, lo que yo haría sería agregarle un parámetro a la vista, una variable llamada $titulo, o algo parecido, para que al momento de mandar a llamar a la vista, me mandes el texto que quieres que se muestre.
En cuanto al operador ternario, está bien.
Buenas noches bro.
Tienes ese código para ver como lo realizaste?
¿Cómo puedo evitar que un usuario pueda editar posts que no le corresponden?
Para mostrar los posts del usuario que se ha autenticado en el archivo PostController edite la función index:
pero si yo manualmente cambio la url por el id de un post que no es del usuario también lo puede editar, como se evita eso?
Primer deberias poner un where donde solo te traigas los post de autoria del usuario logueado, y segundo agregar una condicion en el método update qué si el post le pertenece lo puede editar y si no le pertenece pues no.
En los blogs se manejan diferentes usuarios tipo lo que se hace en wordpress, creo que seria una buena mejora para este proyecto pero si llevaría su tiempo jaja.
Espero haberte ayudado…
#NuncaParesDeAprender
Gracias por tu respuesta, ya estoy implementando el paquete laravel-permission para manejar roles y permisos en el proyecto. Saludos xD.
Excelente clase de actualizacion
Disculpen, podrán recordarme la razón de usar la función compact para enviar los datos a la vista del editar?
Es otra manera de enviar el array que se ha estado usando
Vamos bien, hacer un post es un buen ejemplo.
Gracias
momento, momento momenticoooooooo... mostro como poner la carga de los campos en el formualrio de editar con {{ old('tales') }}........... y la imagen que??' como se precarga??