CakePHP - 如何添加/编辑$ this-> passedArgs

时间:2011-04-11 05:28:23

标签: php mysql cakephp cakephp-1.3

我有一个搜索,通过网址传递多个参数 - 城市,美食,功能,以及你所在的页面(谢谢你的分页)

如果用户在第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;

4 个答案:

答案 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>";

您可能需要更改此代码,但主要想法是:

  • 使用implode代替foreach。
  • 使用array_merge合并passArgs和您的值 想要改变链接
祝你好运!