2012-05-24 17 views
7

के साथ संपादन योग्य jQuery ग्रिड सिफारिशें सबसे पहले, मैंने पहले से ही "jQuery Grid Recommendations" प्रश्न पढ़ा है, लेकिन यह मेरे प्रश्न का उत्तर नहीं देता है।आरईएसटी एपीआई

जाओ सब equipements:

GET /equipements HTTP/1.1 
{{_id:key1, name:Test Document 1, plateforme:prod}, {_id:key2, name:Test Document 2, plateforme:prod}, ...} 

कुंजी के साथ equipement प्राप्त करें:

मैं एक छोटे से REST API with MongoDB Backend बस है कुंजी 1

GET /equipements/key1 HTTP/1.1 
{"_id": "key1", "name": "Test Document 1", "plateforme": "prod"} 

नई equipement जोड़े

PUT /equipements HTTP/1.1 {"_id": "key8", "name": "Test Document 3", "plateforme": "prod"} 
HTTP/1.0 200 OK 

अब, मुझे लैम्ब्डा उपयोगकर्ता को जोड़ने/देखने/डेल उपकरणों की अनुमति देने का एक आसान तरीका खोजने की आवश्यकता है। तो मुझे लगता है कि यूआई जैसे jQuery के साथ एक वेब इंटरफेस सबसे अच्छा है। triedSencha Rest Proxy के साथ लेकिन मुझे जावास्क्रिप्ट नहीं पता है और मैं उदाहरण को अनुकूलित करने में विफल रहता हूं।

मेरे आरईएसटी बैकएंड के लिए मेरे जावास्क्रिप्ट को कैसे ठीक करें?

और/या

आप Sencha बाकी प्रॉक्सी के लिए एक आसान विकल्प की सिफारिश कर सकते हैं? (जो मेरे बाकी बैकएंड साथ काम करता है)

उत्तर: jqGrid

और/या

क्या jQuery ग्रिड तुम मुझे सिफारिश करेंगे? (जो मेरे बाकी बैकएंड साथ काम करता है)

उत्तर: jqGrid

अंतिम सवाल: क्यों मेरी कोशिकाओं डबल क्लिक के साथ संपादित नहीं किए?

परिशिष्ट

सर्वर साइड (संपादित करें: methode पोस्ट जोड़े)

#!/usr/bin/python 
import json 
import bottle 
from bottle import static_file, route, run, request, abort, response 
import simplejson 
import pymongo 
from pymongo import Connection 
import datetime 



class MongoEncoder(simplejson.JSONEncoder): 
    def default(self, obj): 
       # convert all iterables to lists 
     if hasattr(obj, '__iter__'): 
      return list(obj) 
     # convert cursors to lists 
     elif isinstance(obj, pymongo.cursor.Cursor): 
      return list(obj) 
     # convert ObjectId to string 
     elif isinstance(obj, pymongo.objectid.ObjectId): 
      return unicode(obj) 
     # dereference DBRef 
     elif isinstance(obj, pymongo.dbref.DBRef): 
      return db.dereference(obj) 
     # convert dates to strings 
     elif isinstance(obj, datetime.datetime) or isinstance(obj, datetime.date) or isinstance(obj, datetime.time): 
      return unicode(obj) 
     return simplejson.JSONEncoder.default(self, obj) 



connection = Connection('localhost', 27017) 
db = connection.mydatabase 

@route('/static/<filename:path>') 
def send_static(filename): 
    return static_file(filename, root='/home/igs/restlite/static') 

@route('/') 
def send_static(): 
    return static_file('index.html',root='/home/igs/restlite/static/') 

@route('/equipements', method='PUT') 
def put_equipement(): 
    data = request.body.readline() 
    if not data: 
     abort(400, 'No data received') 
    entity = json.loads(data) 
    if not entity.has_key('_id'): 
     abort(400,'No _id specified') 
    try: 
     db['equipements'].save(entity) 
    except ValidationError as ve: 
     abort(400, str(ve)) 

@route('/equipements', method='POST') 
def post_equipement(): 
    data = request.forms 

    if not data: 
     abort(400, 'No data received') 
    entity = {} 
    for k,v in data.items(): 
     entity[k]=v 

    if not entity.has_key('_id'): 
     abort(400,'No _id specified') 
    try: 
     db['equipements'].save(entity) 
    except ValidationError as ve: 
     abort(400, str(ve)) 


@route('/equipements/:id', methodd='GET') 
def get_equipement(id): 
    entity = db['equipements'].find_one({'_id':id}) 
    if not entity: 
     abort(404, 'No equipement with id %s' % id) 
    return entity 

@route('/equipements', methodd='GET') 
def get_equipements(): 
    entity = db['equipements'].find({}) 
    if not entity: 
     abort(404, 'No equipement') 
    response.content_type = 'application/json' 
    entries = [entry for entry in entity] 
    return MongoEncoder().encode(entries) 

run(host='0.0.0.0', port=80) 

संपादित करें: JQGrid:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>Rest Proxy Example</title> 
    <link rel="stylesheet" type="text/css" href="/static/css/ui.jqgrid.css" /> 
    <link rel="stylesheet" type="text/css" href="/static/css/jquery-ui-1.8.20.custom.css" /> 

    <script type="text/javascript" src="/static/js/jquery.js"></script> 
    <script type="text/javascript" src="/static/js/jquery.jqGrid.min.js"></script> 
    <script type="text/javascript" src="/static/js/grid.locale-fr.js"></script> 
    <script type="text/javascript"> 
     jQuery(document).ready(function(){ 
      var lastsel; 

jQuery("#list2").jqGrid({ 
    url:'equipements', 
    datatype: "json", 
    colNames:['Id','Name', 'Plateforme'], 
    colModel:[ 
     {name:'_id',index:'_id', width:50, editable:true}, 
     {name:'name',index:'_id', width:300, editable:true}, 
     {name:'plateforme',index:'total', width:200,align:"right", editable:true}, 
    ], 
    rowNum:30, 
    rowList:[10,20,30], 
    pager:'pager2', 
    sortname: '_id', 
    viewrecords: true, 
    width: 600, 
    height: "100%", 
    sortorder: "desc", 
    onSelectRow: function(_id){ 
     if(_id && _id!==lastsel){ 
      jQuery('#liste2').jqGrid('restoreRow',lastsel); 
      jQuery('#liste2').jqGrid('editRow',_id,true); 
      lastsel=_id; 
     } 
    }, 
    jsonReader: { 
     repeatitems: false, 
     id: "_id", 
     root: function (obj) { return obj; }, 
     records: function (obj) { return obj.length; }, 
     page: function (obj) { return 1; }, 
     total: function (obj) { return 1; } 
    }, 
    editurl:'equipements', 
    caption:"Equipements" 
}); 
jQuery("#list2").jqGrid('navGrid','#pager2',{edit:true,add:true,del:true}); 
}); 
    </script> 
</head> 
<body> 
    <table id="list2"></table> 
    <div id="pager2"></div> 
    <br /> 

</body> 
</html> 
+0

"मुझे जावास्क्रिप्ट नहीं पता" - यदि आप एक आरईएसटी क्लाइंट के लिए फ्रंटएंड बनाने की कोशिश कर रहे हैं तो उसे बदलना होगा। जावास्क्रिप्ट सीखने के लिए समय ले लो; यह अंत में भुगतान करेगा और यह एक बहुत मुश्किल भाषा नहीं है। – RustyTheBoyRobot

+0

यह केवल आंतरिक टीम के लिए है और वेब फ्रंटेंड लिखना मेरा काम नहीं है। एक दिन, मैं जावास्क्रिप्ट सीखूंगा। लेकिन अब, मेरे पास बहुत अधिक महत्वपूर्ण चीजें हैं। – Yohann

उत्तर

7

आप अपने RESTfull सेवा के साथ संवाद करने jqGrid उपयोग कर सकते हैं। jqGrid पेड़ संपादन मोड का समर्थन करता है: सेल संपादन, इनलाइन संपादन और फ़ॉर्म संपादन। इसके अलावा इनलाइन संपादन को विभिन्न तरीकों से शुरू किया जा सकता है। उदाहरण के लिए एक onSelectRow या ondblClickRow कॉलबैक के अंदर editRow विधि कॉल या बटन navigator उपकरण पट्टी में जोड़ने के "हटाएँ" करने के लिए navGrid का उपयोग करें और inlineNav जोड़ने "जोड़ें" और "संपादित करें" बटन कर सकते हैं। एक और तरीका ग्रिड के एक कॉलम में "संपादन" बटन शामिल करने के लिए formatter: "actions" का उपयोग करना होगा। आप the official jqGrid demo में सभी तरीके पा सकते हैं। अधिक तकनीकी कार्यान्वयन विवरण जो आप the answer में पा सकते हैं।

मुझे व्यक्तिगत रूप से महत्वपूर्ण लगता है कि आप वेब फ्रंट-एंड में रीस्टफुल सेवाओं के उपयोग के एक और महत्वपूर्ण पहलू को समझते हैं। समस्या यह है कि मानक RESTfull API डेटा की सॉर्टिंग, पेजिंग और फ़िल्टरिंग के लिए कोई मानक इंटरफ़ेस नहीं है। मैं नीचे की समस्या को समझाने की कोशिश करता हूं। उसके बाद मुझे आशा है कि यह स्पष्ट मानक होगा जो मौजूदा मानक RESTfull API को अतिरिक्त विधियों के साथ विस्तारित करने के लिए है, जिसमें अतिरिक्त पैरामीटर हैं और जो सॉर्टिंग, पेजिंग और फ़िल्टरिंग कार्यक्षमता प्रदान करते हैं।

यदि आपके पास बड़ा डेटासेट है तो समस्या को समझना बहुत आसान है। ग्रिड में प्रदर्शित करने के लिए इसका कोई मतलब नहीं है उदाहरण के लिए डेटा की 10000 पंक्तियां एक बार में। उपयोगकर्ता बिना स्केलिंग या पेजिंग डेटा के बिना स्क्रीन पर डेटा देखने में असमर्थ है। इसके अलावा, उसी कारण से को सॉर्टिंग और डेटा को फ़िल्टर करने का अर्थ है। तो शुरुआत में डेटा के केवल एक पृष्ठ को प्रदर्शित करना और डेटा को पेजिंग के लिए उपयोगकर्ता को कुछ इंटरफ़ेस देना अधिक व्यावहारिक है।

: jqGrid के मानक pager जो

enter image description here

उपयोगकर्ता "अगली" पर जा सकते हैं जैसे, "पिछले", "पिछला" या "सबसे पहले" पृष्ठ लग रहा है या पेज आकार का चयन में enter image description here

अतिरिक्त उपयोगकर्ता नया पृष्ठ के प्रत्यक्ष इनपुट द्वारा इच्छित पृष्ठ निर्दिष्ट कर सकते हैं और की Enter दबा कर:

enter image description here

उसी तरह कॉलम के आधार पर ग्रिड डेटा को सॉर्ट करने उपयोगकर्ता किसी भी कॉलम के शीर्षक पर क्लिक कर सकते हैं:

enter image description here

एक अन्य महत्वपूर्ण यूजर इंटरफेस तत्व (उपयोगकर्ताओं बिंदु से महत्वपूर्ण देखने के लिए) कुछ फ़िल्टरिंग इंटरफ़ेस जैसे here उदाहरण के लिए या here जैसे इंटरफ़ेस खोज सकते हैं।

मैं आपको jqGrid से उदाहरण देता हूं, लेकिन मुझे समस्या सामान्य है। मैं जोर देना चाहता हूं कि RESTfull सेवा आपको डेटा सॉर्टिंग, पेजिंग और फ़िल्टरिंग के लिए कोई मानक इंटरफ़ेस नहीं देती है।

उपयोग jqGrid के मामले में RESTfull url डिफ़ॉल्ट अतिरिक्त पैरामीटर से प्राप्त होगा। यह बताया गया है: page, rows जो पृष्ठ संख्या और पृष्ठ आकार जो सेवा से कहा जाएगा, sidx और sord मानकों जो छँटाई स्तंभ और छँटाई दिशा और _search और filters निर्दिष्ट (पिछले the format में है) जो समर्थन करने की अनुमति देता निर्दिष्ट छानने। यदि jqGrid के prmNames विकल्प का उपयोग कर आवश्यक हो तो पैरामीटर का नाम बदल सकते हैं।

मैं आपको यूआरएल के एन्कोडिंग के बारे में पूछे जाने वाले प्रश्न पर the answer पढ़ने की सलाह देता हूं। मुझे लगता है कि भाग _search=false&rows=20&page=1&sidx=&sord=asc संसाधन से संबंधित नहीं है और इसलिए पैरामीटर के रूप में जानकारी भेजना बेहतर है और यूआरएल के हिस्से के रूप में नहीं।

जो मैं मुख्य रूप से अपने उत्तर में व्यक्त करना चाहता था वह यह है कि शुद्ध शास्त्रीय RESTfull API का उपयोग अच्छा उपयोगकर्ता इंटरफ़ेस लागू करने के लिए पर्याप्त नहीं है। आपको पेजिंग, सॉर्टिंग और फ़िल्टरिंग के लिए इस्तेमाल किए गए अतिरिक्त पैरामीटर के साथ इंटरफेस का विस्तार करना होगा या आप प्रदर्शन करने वाले और उपयोगकर्ता के अनुकूल वेब जीयूआई बनाने में सक्षम नहीं होंगे।

+0

इस लंबे उत्तर के लिए धन्यवाद। बिट यह मेरे प्रश्न का उत्तर नहीं देता है: असल में, मेरे आरईएसटी बैकएंड के साथ जेक्यूजीड का उपयोग करना संभव नहीं है। jQGrid एक विशिष्ट jsojn प्रारूप का उपयोग करें: '{कुल: xxx, पृष्ठ: yyy, रिकॉर्ड: zzz, पंक्तियां: [ {name1:" Row01 ", name2:" पंक्ति 11 ", name3:" पंक्ति 12 ", name4:" पंक्ति 13 ", नाम 5:" पंक्ति 14 "}, ...' – Yohann

+0

@ योहान: नहीं! jqGrid लगभग * किसी भी * JSON प्रारूप को पढ़ सकता है, आपको केवल संबंधित [jsonReader] (http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data#json_data) का उपयोग करना चाहिए। आपने अपने वर्तमान डेटा प्रारूप का विस्तृत वर्णन नहीं किया है, लेकिन मुझे लगता है कि निम्नलिखित 'jsonReader' आपके मामले में काम करेगा:' jsonReader: {repeatitems: false, id: "_id", root: function (obj) {return obj; }, अभिलेख: कार्य (ओबीजे) {वापसी obj.length; }, पृष्ठ: फ़ंक्शन (ओबीजे) {वापसी 1; }, कुल: कार्य (ओबीजे) {वापसी 1; }} ' – Oleg

+0

@Yohann: इनपुट डेटा का मानक प्रारूप थोड़ा अजीब दिखता है, लेकिन यदि आप * नाम * गुणों के बजाय तारों के सर्वर सरणी से भेजते हैं तो आप सर्वर और क्लाइंट के बीच स्थानांतरित डेटा के आकार को कम कर सकते हैं। इसके अलावा उपयोगकर्ता को प्रत्येक पंक्ति के * अद्वितीय * 'आईडी 'निर्दिष्ट करने की आवश्यकता होती है क्योंकि आईडी को' '-' पंक्ति 'के आईडी आईडी के रूप में उपयोग किया जाएगा। – Oleg

संबंधित मुद्दे