get parameters from url in laravel - php

I have some filters on my view and I want to get the parameters of my current URL and do something like edit any of my items in the page and go back with all the filters again after edit.
My example URL:
localhost:8000/equipamentos/filtro?filter_descricao=APARELHO+ULTRASSOM&filter_patrimonio=0
Then I choose any item to edit and go to:
localhost:8000/equipamentos/332/edit
After I change something I want to be redirected to the same URL with the filters in the beginning, like redirect and append filtro?filter_descricao=APARELHO+ULTRASSOM&filter_patrimonio=0
Thanks!

Use the Input facade:
// All
$data = Input::all();
// $_REQUEST['foo']
$data = Input::get('foo'); // null if foo doesn't exist
$data = Input::get('foo', 'bar'); // if foo doesn't exist, the value is bar
Then you can handle the redirection in the controller on in a filter.

I just drafted out the code and it is working.
Route::get('/query', function() {
return Redirect::route('result', Input::query());
});
Route::get('/result', [ 'as' => 'result', 'uses' => function() {
return Response::make(Input::all());
}]);
Either Input::all() or Input::query() should work to retrieve GET parameters.
I'm using Laravel 4.2.11

Related

how to extract a specified url parameter in laravel

Hello I have a specified URL https://www.example.com/doctor
I want to extract the parameter doctor from the URL so that I can compare that the URL has a doctor in it or not.
You should look at Laravel's Routing docs: https://laravel.com/docs/5.5/routing
Something like this to retrieve "doctor" out of your example url:
Route::get('{$item}', function ($item) {
return $item; // https://www.example.com/doctor => "doctor"
});

Validate field in form - check if "product" exists in CakePhp 3

I've got problem with field validation.
I would like to validate form through model. I want to check if field with some value exists.
I would like to block using some titles more than once.
For example
if field "Site" with title "Main" exists in database, you can't validate form.
If it doesn't exist, you can pass it.
I would like to allow user to add just one "Site" with title "Main", but he can add "Site" with any other title in any case.
Have you got some idea how to solve it?
I think you have two options.
(1) Setup an Ajax request to the server.
To do so:
Create a function, that responds to an Ajax request, in your SiteController named checkName()
public function checkName($name) {
// allow ajax requests
$this->request->allowMethod(['ajax']);
// perform your check within the db
$isExistent = [...];
// prepare the response
$response = ['name' => $name, 'isExistent' => $isExistent];
if ($this->request->isAjax()){
$this->autoRender = false;
$this->response->disableCache();
$this->response->type(['json' => 'application/json']);
$this->response->body(json_encode($response));
}
}
Add the route to your routes file with the option '_ext' => 'json'
Prepare your Javascript Ajax function that call the route you have defined and attach it on the onchange attribute of your input field. (see this link for a simple example: http://www.w3schools.com/jquery/ajax_ajax.asp)
(2) Make the 'name' field of the Site table unique.
To do so you could add the following function to your SiteTable class
public function buildRules(
RulesChecker $rules
) {
$rules->add($rules->isUnique(['name']));
return $rules;
}

jQuery pass a input field value to a get method redirect url laravel 5

I'm working a Order List using Laravel 5 and I have this Reject button which is like this
When it is clicked it will confirm if the user really want to reject then if yes it will redirected to a specified route like so
Route::get('reject-order/{ordernum}', 'OrderController#rejectCustomerOrder');
Then in my rejectCustomerOrder
public function rejectCustomerOrder($ordernum)
{
var_dump(Input::get('reject_reason')); exit;
CustomerOrder::where('order_number', '=', $ordernum)->update(['status' => 2]);
$data = CustomerOrder::where('order_number', '=', $ordernum)->get();
$user = User::find($data[0]->created_by_id);
Mail::send('emails.message-rejected', ['user' => $user->name, 'order_num' => $ordernum], function ($m) use ($user) {
$m->to($user->email, '')->subject('Custtomer Order Rejected');
});
Problem is i can't get the reject_reason input field. It's always null. When you click the x button (reject button) it will ask if you really want to reject and you need to put the reject reason on the text field. How can I get that or pass it in the route?
Try to pass the following parameter in this method.
rejectCustomerOrder($ordernum,Request $request)
the access this way:
$request->reject_reason
Fixed now. :) Was able to so by making it
<a class="btn btn-danger btn-ok" id="btnReject">Reject</a>
And adding
$("#reject_reason").keyup(function() {
var oldDataHref = $("#btnReject").attr('href');
var newDataHref = oldDataHref + $('#reject_reason').val();
$("#btnReject").attr('href', newDataHref);
});
If it's a "post" route you don't need the parameter in route definition. If it's a "any" or "get" type then it's ok to have it there.
So, if it's POST then you can get the value with Input::get('input_name') and if it's get you can simply get it trought the controller method parameter, in your case $ordernum.

accessing json input with laravel

I am using restangular to post a request to users/login
my laravel route is like so
Route::post('users/login', array('as' => 'login', function () {
$input = Input::all();
return Response::json($input);
}));
the data in the post header is formatted like so
{"input":["username":"un","password":"pw","remember":false]}
this dosn't work either
{"username":"un","password":"pw","remember":false}
this route is returning an empty array []. I am guessing my input is formatted incorrectly as from the laravel docs
Note: Some JavaScript libraries such as Backbone may send input to the
application as JSON. You may access this data via Input::get like
normal.
edit: it is working with this input ie. no quotes
{username:un,password:pw,remember:false]}
This is what you're looking for:
$input = Request::json()->all();
You can test it by returning the array directly from your route:
Route::post('users/login', array('as' => 'login', function ()
{
$input = Request::json()->all();
return $input;
}));

Laravel overrides named route and takes wrong one

I have this defined in my routes.php file
Route::post('gestionAdministrador', array('as' => 'Loguearse', 'uses' => 'AdministradorController#Login'));
Route::post('gestionAdministrador', array('as' => 'RegistrarAdministrador', 'uses' => 'AdministradorController#RegistrarAdministrador'));
And in my login.blade.php file, the form starts as this
{{ Form::open(array('route'=>'Loguearse'))}}
I dont know why when i submit the form takes the second route instead the first one, even though I am pointing to the first one.
There must be a way to go to the same url from two different forms, that is what I want.
If you have two routes with the exact same URI and same method:
Route::post('gestionAdministrador', array('as' => 'Loguearse', 'uses' => 'AdministradorController#Login'));
Route::post('gestionAdministrador', array('as' => 'RegistrarAdministrador', 'uses' => 'AdministradorController#RegistrarAdministrador'));
How can Laravel know the difference between them when something hit /gestionAdministrador?
It will always assume the first one.
The name you set 'as' => 'RegistrarAdministrador' will be used to create URLs based on that route name, only, when something (browser, curl...) hit the URL the only ways to differentiate them is by
1) URL
2) URL parameters (which is basically number 1 plus parameters)
3) Method (GET, POST)
So you could change them to something like:
Route::post('gestionAdministrador/loguearse', array('as' => 'Loguearse', 'uses' => 'AdministradorController#Login'));
Route::post('gestionAdministrador/registrar', array('as' => 'RegistrarAdministrador', 'uses' => 'AdministradorController#RegistrarAdministrador'));
EDIT 2
What you really need to understand is that the name you give to a route ('as' => 'name') will not be part of your url, so this is not something that Laravel can use to differentiate your two URls, this is for internal use only, to identify your routes during the creation of URLs. So, those instructions:
$loguearse = URL::route('Loguearse');
$registrar = URL::route('RegistrarAdministrador');
Would generate exactly the same URL:
http://yourserver.dev/gestionAdministrador
EDIT 1 - TO ANSWER A COMMENT
Redirecting in Laravel is easy, in your controller, after processing your form, in any of your methods you can just:
return Redirect::to('/');
or
return Redirect::route('home');
Having a route like this one:
Route::get('/', array('as' => 'home', 'uses' => 'HomeController#index'));
So, your controller would look like this:
class AdministradorController extends Controller {
public function RegistrarAdministrador()
{
...
return Redirect::route('home');
}
public function Login()
{
...
return Redirect::route('home');
}
}
Actually you have only one route in your route collection, because:
You have following routes declared:
Route::post('gestionAdministrador', array('as' => 'Loguearse', 'uses' => 'AdministradorController#Login'));
Route::post('gestionAdministrador', array('as' => 'RegistrarAdministrador', 'uses' => 'AdministradorController#RegistrarAdministrador'));
Both of these used post method and this is post method:
public function post($uri, $action)
{
return $this->addRoute('POST', $uri, $action);
}
It calls addRoute and here it is:
protected function addRoute($methods, $uri, $action)
{
return $this->routes->add($this->createRoute($methods, $uri, $action));
}
Here $this->routes->add means Illuminate\Routing\RouteCollection::add() and the add() method calls addToCollections() and it is as follows:
protected function addToCollections($route)
{
foreach ($route->methods() as $method)
{
$this->routes[$method][$route->domain().$route->getUri()] = $route;
}
$this->allRoutes[$method.$route->domain().$route->getUri()] = $route;
}
The $routes is an array (protected $routes = array();) and it's obvious that routes are grouped by methods (GET/POST etc) and in each method only one unique URL could be available because it's something like this:
$routes['post']['someUrl'] = 'a route';
$routes['post']['someUrl'] = 'a route';
So, in your case, the last one is replacing the first one and in this case you may use different methods to declare two routes using same URL so it would be in different array, something like this:
$routes['post']['someUrl'] = 'a route';
$routes['put']['someUrl'] = 'a route'; // Route::put(...)
There must be a way to go to the same url from two different forms
Yes, there is a way and it's simply that you have to use the same route as the action of your form and therefore, you don't need to declare it twice.
What you want to do is a bad idea, you shouldn't be logging in and registering from the same route. With that said what you are saying isn't really possible. Routing in Laravel is first come first served. Basically it checks the route until the URI matches one and then calls that method on the controller or executes the callback. Your routes have to be the other way in your routes file. This will be fixed by changing the url.

Categories