laravel 4通过参数传递更改url结构

时间:2014-11-19 07:35:12

标签: forms url laravel get

我只是laravel框架的初学者。我创建了一个简单的表单和控制器方法。我认为默认情况下,表单方法是post。但现在我需要将其作为get方法,并且还希望将所选输入传递给控制器​​并在URL中显示该参数。目前我确实喜欢下面但失败了。

index.blade.php

<?php echo Form::open(array('url' => 'home/find','method' => 'get')); ?>
 <select class="location" id="location" name='location'>
<?php                                                
                       $id1 = /* get user db details based on locations*/  
                        $location_id_drop_down='';                       
                        foreach($idl as $lrow)
                        {
                            $city_name=Location::where('location_id','=',$lrow['loc_id'])->first();
                            if($city_name==array()) continue;
                            if(Input::old('location')==$lrow['loc_id'])
                            {
                                $location_id_drop_down.="<option value='" . $city_name['location_name'] . "' selected='selected'>" .$city_name['location_name'] . "</option>";
                            }
                            else
                            {
                                $location_id_drop_down.="<option value='" . $city_name['location_name'] . "'>" . $city_name['location_name']. "</option>";
                            }
                        }
                        echo $location_id_drop_down;                  
                    ?>
                </select>
 <input type="submit" name="search" id="search_submit" class="search_submit" value="Search" />
 {{ Form::close() }}

HomeController.php

public function anyFind($s='',$d='',$l='') {
if(Input::get('search'))
             {

                $location=Input::get('location');
             }
             else
             {

                 if($l!='~')
                    $location=$l;
             }

/* queries to get the user details and images based on selected location and list them*/
}

routes.php文件

Route::get('/find/{location}','HomeController@anySearch');

但是这会将网址显示为mysite.com/home/find?location=Test&search=Search

我需要mysite.com/home/find/location

我的代码中有任何错误吗?

修改

作为实验的一部分,我尝试了这种方法。我在控制器函数anyfind()

的末尾给出了如下所示的重定向
return Redirect::to('/home/find/'.$location);

但是这会重定向我,但有人知道如何使用此自定义URL加载search.search_new.blade.php吗?

2 个答案:

答案 0 :(得分:0)

使用Laravel根本无法在您的网址(不是查询字符串)中使用表单中的字段。你可以做的只是使用javascript。

首先让占位符放在动作网址

<?php echo Form::open(array('url' => 'home/find/%location%','method' => 'get')); ?>

的jQuery

$('form').on('submit', function(){ // you maybe need to be a bit more precise with the selector here
    var location = $('#location').val();
    $(this).prop('action', $(this).prop('action').replace('%location%', location));
});

Vanilla Javascript(如果你不能/不想使用jQuery)

document.getElementsByTagName('form')[0].onsubmit = function(e){
    var location = document.getElementById('location').value;
    e.target.setAttribute('action', e.target.getAttribute('action').replace('%location%', location));
};

顺便说一下:你问题中的代码还有一些奇怪的东西。我只是假设因为复制粘贴等而发生这种情况。所以,如果它仍然不起作用,请确保发布正确代码

答案 1 :(得分:0)

在HomeController.php中的方法结尾处插入anyFind(),您可以在其中设置页面视图:

 if (Input::get('location') != '') {
        return Redirect::route('home.findByLocation',Input::get('location'));
 }

 return View::make('home', compact('location));

同样在routes.php中添加以下代码:

Route::get('home/find/{location?}', array('as'=>'home.findByLocation', 'uses'=>'HomeController@anyFind'));