Сомнения по поводу реализации поиска в playframework - PullRequest
0 голосов
/ 26 августа 2011

У меня есть веб-приложение, которое имеет 3 просмотра страницы.

1.an index страница, где перечислены все Item s в дБ, и показаны подробности только Item с последним creationDate.

2.На странице itemDetails, где отображаются сведения о выбранном элементе. На этой странице также перечислены все элементы в дБ.

При нажатии на указанный элемент откроется страница itemDetails.

(Эти две страницы также содержат поле ввода текста, где пользователь может ввести слово для поиска элементов, соответствующих именам.)

3.A search страница результатов, на которой показан список элементов, соответствующих поисковому запросу.

Я реализовал первые две страницы и создал статические общедоступные функции. Теперь я хочу реализовать поиск. Я создал функцию и страницу результатов, в которой перечислены результаты поиска.

Моя проблема в том, что, если я нажму на элемент из результатов поиска, он откроет страницу itemDetails, которая показывает детали этого элемента and a listing of all items in db, поскольку именно так была реализована функция itemDetails. Я бы предпочел иметь нажмите, чтобы перейти на страницу, которая показывает детали элемента and items which were results of the search query. Я знаю, что это невозможно в приведенной выше реализации, поскольку состояние не сохраняется между двумя запросами.

Итак, как мне это сделать? Я не могу ясно об этом думать. Можете ли вы пролить свет?

Код похож на

package controllers;
...
public class Application extends Controller {
    ...
    public static void index() {
        //all items
        List<Item> items = Item.find("order by creationDate desc").fetch();
        //the latest created item
        Item item = items.get(0);       
        render(items,item);
    }

    public static void itemDetails(Long id) {
        //selected item     
        Item item = Item.findById(id);
        //all items
        List<item> items = Item.find("order by creationDate desc").fetch();
        render(items,item);
    }
    public static void search(String keyword) {
        String kw = keyword.trim();
        String pattern = "%"+kw+"%";
        String query="select distinct item from Item item where item.name like :pattern";
        List<Item> items = Item.find(query).bind("pattern", pattern).fetch();
        render(items);
    }
...
}

index.html страница

#{extends 'main.html' /}
#{set title:'Home' /}
#{if item}
    //show the details of item
#{/if}
#{if items.size()>0}
    #{list items:items, as:'item'}
       <a href="@{Application.itemDetails(item.id)}">${item.name}</a>
    #{/list}
#{/if}
#{else}
        There are currently no items        
#{/else}
#{form @Application.search(keyword)}
  <input type="text" name="keyword" id="keyword" size="18" value=""/>
  <input type="submit" value="search"/>
#{/form}

itemDetails.html page:

похоже на страницу указателя .. пока я скопировал все содержимое страницы указателя.

страница поиска:

#{extends 'main.html' /}
#{set title:'search results' /}

#{if items.size()>0}
    #{list items:items, as:'item'}
       <a href="@{Application.itemDetails(item.id)}">${item.name}</a>
    #{/list}
#{/if}

#{else}
    <div class="empty">
        could not find  items with matching name here.
    </div>  
#{/else}

1 Ответ

1 голос
/ 26 августа 2011

Я вижу пару возможностей.Сначала вы можете добавить новое действие public static void itemSearchDetails(Long id, String keyword) на свой контроллер.Затем добавьте новую страницу itemSearchDetails.html.Наконец, измените ссылку на странице search.html на <a href="@{Application.itemSearchDetails(item.id)}">${item.name}</a>

. Вот такой подход я бы выбрал.Измените метод itemDetails (), добавив параметр ключевого слова.

 public static void itemDetails(Long id, String keyword) {
    //selected item     
    Item item = Item.findById(id);
    List<item> items;
    if (StringUtils.isNotBlank(keyword) ) {
      String query="select distinct item from Item item where item.name like :pattern";
      items = Item.find(query).bind("pattern", pattern).fetch();
    } else {
      items = Item.find("order by creationDate desc").fetch();
    }
    render(items,item);
}

Затем измените соответствующие вызовы в файлах HTML.

...