2

伙计们。我有点卡在路线上

顶部导航中有一个搜索表单。

<form action="/search/" class="navbar-search pull-right">
    <input type="text" name="q" id="search-query" class="search-query span3" placeholder="Go for it...">
</form>

所以如果我提出请求,URL 看起来像

fuelphp.dev/search/?q=qwerty

这很好。使用该 URL,用户应该获得由他/她提供的请求的结果action_index()

但是如果用户去fuelphp.dev/search/(没有任何参数),他/她应该看到由提供的“高级搜索表单”action_advanced()

我已经创建了一个 Controller_Search

类/控制器/search.php(控制器)

class Controller_Search extends Controller_Hybrid
{
    public function action_index() {

        $this->template->title = 'Results for &raquo; '.Input::get('q');
        $this->template->content = View::forge('search/index.twig');
    }

    public function action_advanced()
    {
        $this->template->title = 'Search &raquo; Advanced Search';
        $this->template->content = View::forge('search/index.twig', array(
            'advancedForm' => true
        ));
    }
}

视图/搜索/index.twig(视图)

{% if advancedForm %}
    {% include 'advancedSearchForm.twig' %}
{% endif %}
<h4>Hello Template nesting :) </h4>

问题是 - 我不知道如何(重新)为此编写路线。

如果我添加'search' => 'search/advanced'到 routes.php 它不能正常工作。

Requestin也fuelphp.dev/search/?q=qwerty触发action_advanced()Controller_Search,而它应该触发action_index()

我应该如何重写我的路由(或者可能是控制器逻辑)以使其正常工作?

更新:

解决方案找到了!无需路由配置!

public function action_index() {
    if (Input::get('q')) {
        $viewTitle = 'Results for &raquo; '.Input::get('q');
        $viewData = null;
    }else{
        $viewTitle = 'Search &raquo; Advanced Search';
        $viewData = Array('advancedForm' => true);
    }

    $this->template->title = $viewTitle;
    $this->template->content = View::forge('search/index.twig', $viewData);
}

但是如果你们中的一个人有一个“更好”的方式,我会很高兴看到它

4

1 回答 1

1

尝试使用命名参数添加2 条路线

'search' => 'search/advanced',
'search/:q' => 'search/index/'

因此,当它有一些参数search/index与给定参数一起使用时,但如果你没有参数,它会路由到search/advanced

然后search/index你可以得到搜索参数(q$this->param('q')

于 2012-12-13T17:24:01.737 回答