2012-03-20 56 views
0


我在後端使用solr + haystack(django插件),搜索工作正常;
使用ExtJs4 Solr實時搜索

雖然Django(和Haystack)及其模板爲我做了一切(我的意思是配置和使用它非常簡單),但ExtJS4稍微複雜一些;

問題是如何使用ExtJS4使用Solr?

一個例子非常感謝;
感謝您的幫助和對我的英語感到抱歉;

+1

你嘗試過什麼嗎?你有什麼特別的代碼需要幫助嗎? – sha 2012-03-20 10:15:54

回答

1

由於ExtJS4是一個MVC框架,該解決方案就像MVC完成指定一個回調函數;

控制器/ Search.js

Ext.define('yourapp.controller.Search',{ 
extend:'Ext.app.Controller', 

stores:[ 
    'Searches' 
], 

views:[ 
    'search.Search', 
    'search.SearchList' 
], 

models:[ 
    'Search' 
], 

init:function(){ 
    this.control({ 
     "search":{ 
      'keyup':this.search,     
     }, 
    }); 
}, 

search:function(inputedTxt, e, eOpts){ 
    this.getSearchesStore().load({ 
     //When sending a request, q will rely to request.POST['q'] on server-side; 
     //inputedTxt.getValue() -- a value, entered in textfield (or whatever) 
     params:{ 
      q:inputedTxt.getValue() 
     }, 
     callback:function(result){ 
      if(result[0]){ 
       //do something with the result 
       //i'd been creating a window with a grid inside. "Grid"'s view is written below. 
      } 
     }    
    } 
}); 

模型/ Search.js

Ext.define('yourapp.model.Search',{ 
    extend:'Ext.data.Model', 

    fields:[ 
     {name:'name', type:'string'} 
    ] 
}); 

存儲/ Searches.js

Ext.define('yourapp.store.Searches',{ 
extend:'Ext.data.Store', 
storeId: "searchStore", 

model:'yourapp.model.Search', 

autoLoad: false, 

proxy:{ 
    type:'ajax', 
    // server-side url 
    url: '/searchlist/', 

    actionMethods:{create: "POST", read: "POST", update: "POST", destroy: "POST"}, 
    reader:{ 
     type:'json', 
     root:'searches' 
    } 
} 
}); 

視圖/搜索/ Search.js

//a Text field to input text; 
Ext.define('yourapp.view.search.Search',{ 
extend:'Ext.form.field.Text', 
alias: 'widget.search', 
id: "searchView", 

enableKeyEvents: true, 
initComponent:function(){ 
    this.callParent(arguments);  
} 
}); 

視圖/搜索/ SearchList.js

//a view for a result 
Ext.define('yourapp.view.search.SearchList',{ 
extend: 'Ext.grid.Panel', 

alias:'widget.searchlist', 
title: 'search result', 
store: 'Searches', 

columns:[ 
     { 
     header:'Name', 
     dataIndex:'name', 
     flex:1      
    } 
] 
}); 

某處在視圖/ Viewport.jsxtype: 'search',應插入用於要顯示的文本字段。

這就是ExtJS4的一部分。


在服務器端 - Django: 「草垛」和Solr應該安裝和配置(通過「配置」我的意思是:搜索應該在服務器端已經工作);

someapp/view.py

def searchlist(request):  
    from haystack.query import SearchQuerySet 
    # POST["q"] should be receivedt from our client-side 
    searchText = request.POST["q"] 

    sqs = SearchQuerySet().filter(name=searchText) 

    data = [] 
    for result in sqs:    
     data.append({"name": result.object.name}) 

return HttpResponse('{ success:true, searches:'+simplejson.dumps(data)+'}', mimetype = 'application/json') 

最後,在你的網址。PY你應該增加:

(r'^searchlist/','someapp.views.searchlist'),

這是它。最好的祝願。

P.S.
我知道這不是最大的答案,也沒有解釋,但對於我而言,我更喜歡代碼示例而不是口頭解釋。