Commit 2cb08de61c7c6fb1f0df3976df906e64af4f4a3c
1 parent
8378203d
Exists in
master
and in
28 other branches
ActionItem160: search results divided into articles, communities, products, people and enterprises
git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@1471 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
6 changed files
with
34 additions
and
55 deletions
Show diff stats
app/controllers/public/search_controller.rb
... | ... | @@ -2,35 +2,10 @@ class SearchController < ApplicationController |
2 | 2 | |
3 | 3 | helper TagsHelper |
4 | 4 | |
5 | - SEARCHES = [] | |
6 | - | |
7 | - def self.search(&block) | |
8 | - SEARCHES << block | |
9 | - end | |
10 | - | |
11 | 5 | protected |
12 | 6 | |
13 | - ############################################# | |
14 | - # XXX add yours searches here | |
15 | - ############################################# | |
16 | - | |
17 | - search do |query| | |
18 | - Article.find_by_contents(query) | |
19 | - end | |
20 | - | |
21 | - search do |query| | |
22 | - Profile.find_by_contents(query) | |
23 | - end | |
24 | - | |
25 | - search do |query| | |
26 | - Product.find_by_contents(query) | |
27 | - end | |
28 | - | |
29 | - # auxiliary method to search in all defined searches and collect the results | |
30 | - def search(query) | |
31 | - SEARCHES.inject([]) do |acc,finder| | |
32 | - acc += finder.call(query) | |
33 | - end.sort_by do |hit| | |
7 | + def search(klass, query) | |
8 | + klass.find_by_contents(query).sort_by do |hit| | |
34 | 9 | -(relevance_for(hit)) |
35 | 10 | end |
36 | 11 | end |
... | ... | @@ -42,7 +17,8 @@ class SearchController < ApplicationController |
42 | 17 | def index |
43 | 18 | @query = params[:query] || '' |
44 | 19 | @filtered_query = remove_stop_words(@query) |
45 | - @results = search(@filtered_query) | |
20 | + @articles, @people, @enterprises, @communities, @products = | |
21 | + [Article, Person, Enterprise, Community, Product].map{ |klass| search(klass, @query) } | |
46 | 22 | end |
47 | 23 | |
48 | 24 | def tags | ... | ... |
app/views/search/_article.rhtml
app/views/search/_product.rhtml
1 | -<%# FIXME add photo if available %> | |
2 | 1 | <%# FIXME add more information %> |
3 | 2 | |
4 | -<div> | |
5 | - <%= icon('product', :style => 'float: left') %> | |
6 | 3 | <div class='search-result-text'> |
7 | - <%= image_tag(hit.image.public_filename(:minor), :style => 'float:right;') if hit.image %> | |
8 | - <strong> | |
4 | + <%= image_tag(hit.image.public_filename(:minor)) if hit.image %> | |
5 | + <strong> | |
9 | 6 | <%= link_to_product(hit) %> |
10 | - </strong> <br/> | |
11 | - <%= _('Price: %d') % hit.price %> <br> | |
12 | - <%= _('Suplier: %s') % link_to_homepage(hit.enterprise.name, hit.enterprise.identifier) if hit.enterprise %> <br> | |
13 | - <%= _('Category: %s') % link_to_category(hit.product_category) %> | |
7 | + </strong> | |
8 | + <ul> | |
9 | + <li> <%= _('Price: %d') % hit.price %> </li> | |
10 | + <% if hit.enterprise %> | |
11 | + <li> <%= _('Suplier: %s') % link_to_homepage(hit.enterprise.name, hit.enterprise.identifier) %> </li> | |
12 | + <% end %> | |
13 | + <li> <%= _('Category: %s') % link_to_category(hit.product_category) %> </li> | |
14 | + </ul> | |
14 | 15 | </div> |
15 | -</div> | ... | ... |
app/views/search/_profile.rhtml
1 | -<%# FIXME add photo if available %> | |
2 | 1 | <%# FIXME add more information %> |
3 | 2 | |
4 | -<div> | |
5 | - <%= icon('person', :style => 'float: left') %> | |
6 | - <div class='search-result-text'> | |
7 | - <strong> | |
8 | - <%= link_to_homepage(hit.name, hit.identifier) %> | |
9 | - </strong> | |
10 | - </div> | |
3 | +<div class='search-result-text'> | |
4 | + <%= image_tag(hit.image.public_filename(:minor)) if hit.image %> | |
5 | + <strong> | |
6 | + <%= link_to_homepage(hit.name, hit.identifier) %> | |
7 | + </strong> | |
11 | 8 | </div> | ... | ... |
app/views/search/index.rhtml
1 | 1 | <h2> <%= _('Search results for "%s"') % @query %> </h2> |
2 | 2 | |
3 | -<% @results.each do |hit| %> | |
4 | - <%= render :partial => partial_for_class(hit.class), :locals => { :hit => hit } %> | |
5 | - <br style='clear: left'/> | |
3 | +<% [ [@articles, _('Articles'), 'articles'], | |
4 | + [@people, _('People'), 'people'], | |
5 | + [@enterprises, _('Entreprises'), 'enterprises'], | |
6 | + [@communities, _('Communities'), 'communities'], | |
7 | + [@products, _('Products'), 'products'] ].each do |results, iname, name| %> | |
8 | + <% if results && !results.empty? %> | |
9 | + <div id="search-result-<%= name %>"> | |
10 | + <h3> <%= iname %> </h3> | |
11 | + <% results.each do |hit| %> | |
12 | + <%= render :partial => partial_for_class(hit.class), :locals => { :hit => hit } %> | |
13 | + <% end %> | |
14 | + </div> | |
15 | + <% end %> | |
6 | 16 | <% end %> | ... | ... |
test/functional/search_controller_test.rb
... | ... | @@ -16,9 +16,8 @@ class SearchControllerTest < Test::Unit::TestCase |
16 | 16 | get 'index', :query => 'teste' |
17 | 17 | assert_response :success |
18 | 18 | assert_template 'index' |
19 | - assert assigns('results') | |
20 | - assert assigns('results').include?(ent) | |
21 | - | |
19 | + assert assigns('enterprises') | |
20 | + assert assigns('enterprises').include?(ent) | |
22 | 21 | end |
23 | 22 | |
24 | 23 | should 'filter stop words' do | ... | ... |