我有一个搜索,通过网址传递多个参数 - 城市,美食,功能,以及你所在的页面(谢谢你的分页)
如果用户在第2页 - ...索引/页面:2并点击城市“纽约”,他们应该去...索引/页面:2 /城市:纽约
然后,如果他们然后点击休斯顿,他们应该去...索引/页面:2 /城市:New York_Houston
有没有简单/内置的方法呢?我已经开始编写我的代码来分解$ this-> passedArgs,并重建它 - 但到目前为止这是一个痛苦的事情,似乎我正在为我希望的东西编写大量代码有办法处理。
示例:
用户位于餐馆列表的第2页 - 索引/页面:2
用户点击“纽约”,页面刷新索引/页面:2 / city:New York
用户点击“圣地亚哥” - 页面刷新索引/页面:2 / city:New York_San Diego
用户再次点击“纽约”(取消切换),页面刷新索引/页面:2 / city:San Diego
我尝试创建可以进行此类切换的城市链接列表:
最大的问题不是我不能这样做(下面的代码有效),但1)它没有考虑任何其他查询选项,如页面,美食,功能......等等 - 2)做一些简单的事情感觉就像一堆代码。
我不太关心任何真正轻微的代码错误,更多关注这个问题的整体最佳方法。 (随时可以评论任何问题 - 我总是喜欢听到更好的方法来做任何事情/一切)。
非常感谢您提前寻求帮助!
$passedCities = explode("_", $this->passedArgs['city']);
foreach($cities as $city):
$city_name = trim(ucwords(strtolower($city['City']['name'])));
$cityExists = in_array($city_name, $passedCities);
$queryCities = $passedCities;
if($cityExists) {
unset($queryCities[array_search($city_name, $queryCities)]);
} else if($city_name != "") {
array_unshift($queryCities, $city_name);
}
$urlSuffix = "";
if(count($queryCities) > 0) {
$urlSuffix = "city:";
foreach($queryCities as $c) {
$urlSuffix .= trim($c) . "_";
}
}
$urlSuffix = substr($urlSuffix,0,-1);
echo "<li>" . $this->Html->link($city_name .
" (" . $city[0]['count'] . ")", array($urlSuffix)) . "</li>";
endforeach;
答案 0 :(得分:2)
我会以这种方式工作,假设您的型号名称为Restaurant
我会创建“Get'
类型的搜索表单echo $form->create('Restaurant', array('type' => 'get', 'action' => 'index', 'class' => 'search-form'));
echo $form->input('city');
echo $form->input('cuisine');
echo $form->input('feature');
echo $form->end('Search');
在餐厅控制器中,在行动指数
中function index() {
$this->redirectToNamed();
$conditions = array();
$params = $this->params['named'];
if (!empty($params['city'])){
$conditions['Restaurant.city LIKE'] = '%'.trim($params['city']).'%';
}
if (!empty($params['cuisine'])){
$conditions['Restaurant.cuisine LIKE'] = '%'.trim($params['cuisine']).'%';
}
if (!empty($params['background'])){
$conditions['Restaurant.feature LIKE'] = '%'.trim($params['feature']).'%';
}
//refill the form with args
$this->data['Restaurant'] = $params;
$restaurants = $this->paginate('Restaurant', $conditions);
}
function redirectToNamed() {
$urlArray = $this->params['url'];
unset($urlArray['url']);
if( !empty($urlArray) ){
$this->redirect($urlArray, null, true);
}
}
如果我没有忘记任何事情,你的搜索表格将会保留以前的参数。
答案 1 :(得分:1)
也许您可以在用户会话中保存包含所选城市的数组。 可以使用会话组件将数据写入会话。请查看相应的CakeBook章节。
将城市存储在数组而不是URL中的优势在于您无需拆分搜索字符串。
答案 2 :(得分:0)
我将以无答案回答。
对我而言,改变城市就像执行新搜索一样,所以我会在那之后显示第1页。另外,因为通过更改搜索参数,您可能没有相同的页数。如果用户在第6页,更改参数,搜索只返回4页,会发生什么?
答案 3 :(得分:0)
我创建了一个Helper,它具有创建链接的功能(我称之为“过滤器”,似乎更合适)。对于该函数,我将传递元素列表(城市,美食,功能等)和passArgs变量的副本(我不确定帮助者是否可以直接访问passedArgs):
function createFilters($ elements,$ copyPassedArgs,$ filterName){
这个函数的想法是像你在你的例子中那样创建链接,只需改变你的代码:
/*$urlSuffix = "";
if(count($queryCities) > 0) {
$urlSuffix = "city:";
foreach($queryCities as $c) {
$urlSuffix .= trim($c) . "_";
}
$urlSuffix = substr($urlSuffix,0,-1);
}*/
$filter = implode("_",$queryCities);
echo "<li>" . $this->Html->link($city_name .
" (" . $city[0]['count'] . ")", array_merge($copyPassedArgs,array($filterName => $filter)) . "</li>";
您可能需要更改此代码,但主要想法是: