Symfony:如何在多个模块上实现搜索功能?

时间:2010-01-20 18:04:20

标签: symfony1

我的应用程序中有一个名为“Books”的模块。 此外,我还有其他几个模块,我想使用“搜索书籍”功能(重复使用搜索表单)。

我怎样才能做到这一点?

我尝试为此创建一个组件并在其他模块模板中使用它,但我不知道如何从中返回找到的书籍ID(我使用了一些ajax,但没有运气)。或许这只是一种错误的方法。

有什么建议吗? 感谢。

3 个答案:

答案 0 :(得分:1)

组件或操作可以完美地完成工作,因为它们提供了您想要的可重用性!

这是一个非常基本的方法:

操作很简单,接受请求参数并执行搜索

/* books actions.class.php */
executeSearch($request){
    // clean search term
    $search = trim($request->getParameter('query'));
    // perform Query (Doctrine ORM)
    $books = Doctrine_Core::getTable("Books")->findByTitle($search);
    // Ajax Request ?
    if ($request->isXmlHttpRequest()){
        return $this->renderPartial('result', array("books" => $books);
    }
    else {
        // HTML Request
        $this->setTemplate("result");
        return sfView::SUCCESS;
    }   
}

搜索表单

/* books search.php */
<form action="<?php echo url_for('books/search') ?>">
    <input type="text" name="query"></input>
    <input type="submit"></input>
</form>

结果部分

/* books result.php */
<ul>
    <?php foreach($books as $book): ?>
        <li><?php echo $book; ?></li>
    <?php endforeach; ?>
<ul>

所以这是可以重复使用的,你可以做一个jQuery.load()或任何你想要的“ajax”,另一方面你可以执行旧式的HTTP搜索(渐进式增强!)。

PS:当然你可以通过sfLucense(来自jon的帖子)或其他全文解决方案进行搜索

答案 1 :(得分:0)

除非您想将部分渲染为流程的一部分,否则您不会真正使用组件。有了这个说你可以简单地在该局部视图中返回id的字符串,或者返回一个完整的json表示或者你需要的任何其他内容。

答案 2 :(得分:0)

您是否查看了sfLucene插件?

该插件允许您索引所需的模型,并根据需要进行加权。

从搜索结果中,您可以设置要显示的路线,这样您的结果就可以指向您需要的页面。

创建包含要添加到布局的搜索表单的部分内容相当容易,因此您可以在任何年龄的搜索框中使用。