I have this code for form open :
{{ Form::model($user, array(
'route' => array('user_edit_put'),
'method' => 'PUT',
'role' => "form",
'class'=>'form',
'accept-charset' => 'utf-8'
)) }}
{{ Form::close() }}
but this always produces form with post method only, my question is how to create form with another http method in laravel ? why it's always give post method although I've set 'method' => 'PUT'?
If you look in the form there is a hidden field called _METHOD that will have the PUT method within it. This is to work around as form submission only supports GET and POST.
Here http://laravel.com/docs/html it says:
Note: Since HTML forms only support POST and GET, PUT and DELETE
methods will be spoofed by automatically adding a _method hidden field
to your form.
Related
I got a form which sends many input fields to be validated into a controller in Laravel 5, and among them there is the files name="arquivos[]" <input> field. I want to solve all the validantion in a single step as I was doing but it seems that it is failing by the fact that it is receiving and array of files and not a single one. The code of the form is:
{!! Form::open(['route' => 'posts.store', 'enctype' => 'multipart/form-data']) !!}
...other inputs
{{ Form::file('arquivos[]', array('class' => 'novo-post-form-item', 'required'=>'','multiple' => '')) }}
{!! Form::close() !!}
And in my posts.store function:
$this->validate($request, array(
'arquivos' => 'required|mimes:image/jpeg,image/png,image/gif,video/webm,video/mp4,audio/mpeg',
'assunto' => 'max:255',
'conteudo' => 'required|max:65535'
));
note: I don't know why in the validator I must specify the input name without the [] but it works that way...
This question is similar to some I found here at stack overflow but this time I'm asking if there is a solution for Laravel 5. As it seems, this validate methos is expecting a single file input field. Thanks in advance
Please read the Laravel documentation thoroughly. It's really helpful
To validate array field, you want this: https://laravel.com/docs/5.4/validation#validating-arrays.
Also I think you want to use mimetypes validation rule because mimes validation rule accepts file extensions as parameter: https://laravel.com/docs/5.4/validation#rule-mimetypes
And the solution to your problem:
$this->validate($request, array(
'arquivos.*' => 'required|mimetypes:image/jpeg,image/png,image/gif,video/webm,video/mp4,audio/mpeg',
'assunto' => 'max:255',
'conteudo' => 'required|max:65535'
));
i tried these two methods..
first one : MethodNotAllowedHttpException
Route::post('/settings/{id}/update/', 'HomeController#update');
Route::match(['put','patch'], '/settings/{id}/update/','HomeController#update') use this also..
{!! Form::model($user, ['method' => 'patch','action' => ['HomeController#update',$user->id]]) !!}
another one
{!! Form::model($user, ['method' => 'patch','route' => ['user.update',$user->id]]) !!}
please explain how to use route for update default auth users.
You should give a name to the route:
Route::patch('/settings/{id}/update/', 'HomeController#update')->name('user.update');
Or:
Route::patch('/settings/{id}/update/', ['as' => 'user.update', 'uses' => 'HomeController#update']);
I think you should just be specific about the method you want to use, be it put or patch and also If i remember correctly, if you have to use patch method referencing the answer from this post: Laravel form won't PATCH, only POST - nested RESTfull Controllers, MethodNotAllowedHttpException
<form method="POST" action="patchlink">
{!! method_field('patch') !!}
. . .
</form>
The method field is required because as I understood, Laravel uses this mechanism to handle patch request.
PS: What I just tried to highlight if I understood correctly is that, there should be an extra field to handle the patch method.
Hope this helps :)
Working on trying to get the following form's URL to populate properly. Been stumbling over this for some time so here for some help.
As you can see from the following code, I am opening the form - binding the model - and trying to set the URL dynamically. the full URL is something like {username}/account/cards/id so i need to pass it the username (which i would like to pass the authenticated user (as they would only have access to their own page) and the ID of the card they are trying to update.
{!! Form::model($card, ['method' => 'PATCH', 'action' => 'Account\CardsController#update', array(Auth::user()->username, $card->id) ]) !!}
Now this is all happening in blade (front end) so not 100% what i am doing wrong. I have tried action, url, route... I can not get anything to work for some reason. Error I am getting on this one specifically is a array to string error. But if I can't build an array how do i pass in multiple variables? So a bit confused here.
any help would be appreciated.
Thanks
Citti
This is an update to my previous answer. You can try this one:
{!! Form::model($card, ['method' => 'PATCH', 'action' => [ 'Account\CardsController#update', Auth::user()->username, $card->id] ]) !!}
You're just passing your route parameters as an option to the Form::model tag, not the route. Try:
{!! Form::model($card, ['method' => 'PATCH', 'action' => [ 'Account\CardsController#update', [Auth::user()->username, $card->id] ] ]) !!}
If you're still having trouble I would suggest you name your route and reference the named route in the action.
If I'm not mistaken, the action should be an array if you are passing variables through to the controller. Ex:
{!! Form::model($card, array('method' => 'PATCH', 'action' => array('Account\CardsController#update', Auth::user()->username, $card->id))) !!}
Not sure if you are using Larvel Collective HTML and Forms, but they are essentially the same as the Laravel version. This page: http://laravelcollective.com/docs/5.0/html#form-model-binding explains more about your particular use case.
Hope it helps.
P.S. Try adding:
{!! Form::hidden('_method', 'PATCH') !!}
...underneath the open tag instead of within it. This has to do with L5 method spoofing, and is generally necessary for anything that is not 'POST' or 'GET', I believe. (i.e., 'PUT', 'PATCH', and 'DELETE')
I am working with PHP and Laravel 4. Using the Form method to populate an edit form with a Model like below...
Form::model($timecard, array('route' => array("admin/timecard/edit", $id)))
My problem is, some of the text fields get populated with DateTime values from the Database and I need to be able to run some code on these certain fields before it populates the Form field.
Any ideas how to do that or if it's possible to do that while still using the Model to auto-fill the Form fields?
For example this form field below gets filed with a GET value, otherwise it gets field with the Data from the Database for column clock_in_datetime however I would like to run a PHP function on this field before it fills the form so that I can apply TimeZone or other formatting to it...
{{ Form::text("clock_in_datetime", Input::get("clock_in_datetime"), array(
"placeholder" => "2013-09-04 14:22:35",
'class' => 'form-control'
)) }}
I believe you can do the following:
{{ Form::text("clock_in_datetime", yourFormattingFunction(Form::getValueAttribute("clock_in_datetime")), array(
"placeholder" => "2013-09-04 14:22:35",
'class' => 'form-control'
)) }}
Form::getValueAttribute() is Laravel's way of deciding which value to use (previous Input, Session or Model). So you can apply your formatting function to the output of this function.
http://laravel.com/api/source-class-Illuminate.Html.FormBuilder.html#751-773
I'm building a really simple CRUD in laravel just to learn something about this framework.
It works all like a charm but I can't make the update function of a controller work properly.
Here my situation:
1) I build a resource controller using artisan command.
2) I build a form view using blade and I Open the form with this code:
<!-- Form -->
#if($mode=="edit")
{{ Form::model($task, array('route'=>array('task.update',$task->id),'files'=>true)) }}
#else
{{ Form::open(array('route'=>'task.store','files'=>true)) }}
#endif
It works great and every field are filled with the right data.
The generate url of the form's action is:
http://localhost/mysite/task/2
The problem is that when I submit this form I get this error:
Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException
Someone can understand why? Can I help you with more information?
You need 'method' => 'put'.
{{ Form::model($task, array('route' => array('task.update', $task->id), 'files' => true, 'method' => 'PUT')) }}
As you can see here.
http://laravel.com/docs/controllers#resource-controllers
Verb: PUT/PATCH
Path: /resource/{id}
action: update
route: resource.update
EDIT: To trigger the update()-action you must send a PUT or PATCH-request to the route resource.update, in your case task.update.
You have a problem with the form action. Assuming you have a route like this:
Route::post('task/update/{id}, function()
{
});
Then, your model-bound form should be:
{{ Form::model($task, array('url'=>array('task/update',$task->id),'files'=>true)) }}
The only error in your code is that you did not passed PUTor PATCH as HTTP method for your form submission to server.
Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException is triggered on such states.
a demo model form will be as
Form::model($name_model, array('action' => array('Controller_name#method', $argument), 'files' => true, 'method' => 'PUT'))
or with route name as
Form::model($name_model, array('route' => array('route.name', $argument), 'files' => true, 'method' => 'PUT'))