Sunday 15 May 2011

javascript - Trying to use prisimic and Node.js with express -



javascript - Trying to use prisimic and Node.js with express -

i have partially got starter kit prismic working, having problem modifying it. project outputs everything, , output different collections in different lists.

i new express, using. not sure how utilize prismic query in case output separate list each collection or @ to the lowest degree specified collections?

the predicate query according prismic api works [:d = at(document.tags, ["ktblog"])]

here ejs template list beingness outputted

<ul id="list"> <% for(var i=0; i<docs.results.length; i++) { %> <li> <a href="<%= ctx.linkresolver(ctx, docs.results[i]) %>"> <%= docs.results[i].slug %> </a> </li> <% } %> </ul>

there index.js file

var prismic = require('../prismic-helpers'); // -- display documents exports.index = prismic.route(function(req, res, ctx) { ctx.api.form('everything').set("page", req.param('page') || "1").ref(ctx.ref).submit(function(err, docs) { if (err) { prismic.onprismicerror(err, req, res); return; } res.render('index', { docs: docs }); }); }); // -- display given document exports.detail = prismic.route(function(req, res, ctx) { var id = req.params['id'], slug = req.params['slug']; prismic.getdocument(ctx, id, slug, function(err, doc) { if (err) { prismic.onprismicerror(err, req, res); return; } res.render('detail', { doc: doc }); }, function(doc) { res.redirect(301, ctx.linkresolver(ctx, doc)); }, function(not_found) { res.send(404, 'sorry, cannot find that!'); } ); }); // -- search in documents exports.search = prismic.route(function(req, res, ctx) { var q = req.query['q']; if(q) { ctx.api.form('everything').set("page", req.param('page') || "1").ref(ctx.ref) .query('[[:d = fulltext(document, "' + q + '")]]').submit(function(err, docs) { if (err) { prismic.onprismicerror(err, req, res); return; } res.render('search', { docs: docs, url: req.url }); }); } else { res.render('search', { docs: null, url: req.url }); } });

and there prismic helper file

var prismic = require('prismic.io').prismic, configuration = require('./prismic-configuration').configuration, http = require('http'), https = require('https'), url = require('url'), querystring = require('querystring'); // -- helpers exports.getapihome = function(accesstoken, callback) { prismic.api(configuration.apiendpoint, callback, accesstoken); }; exports.getdocument = function(ctx, id, slug, onsuccess, onnewslug, onnotfound) { ctx.api.forms('everything').ref(ctx.ref).query('[[:d = at(document.id, "' + id + '")]]').submit(function(err, documents) { var results = documents.results; var doc = results && results.length ? results[0] : undefined; if (err) onsuccess(err); else if(doc && (!slug || doc.slug == slug)) onsuccess(null, doc) else if(doc && doc.slugs.indexof(slug) > -1 && onnewslug) onnewslug(doc) else if(onnotfound) onnotfound() else onsuccess(); }); }; exports.getdocuments = function(ctx, ids, callback) { if(ids && ids.length) { ctx.api.forms('everything').ref(ctx.ref).query('[[:d = any(document.id, [' + ids.map(function(id) { homecoming '"' + id + '"';}).join(',') + '])]]').submit(function(err, documents) { callback(err, documents.results); }); } else { callback(null, []); } }; exports.getbookmark = function(ctx, bookmark, callback) { var id = ctx.api.bookmarks[bookmark]; if(id) { exports.getdocument(ctx, id, undefined, callback); } else { callback(); } }; // -- exposing helper in event of error (please edit prismic-configuration.js alter this) exports.onprismicerror = configuration.onprismicerror; // -- route wrapper provide "prismic context" underlying function exports.route = function(callback) { homecoming function(req, res) { var accesstoken = (req.session && req.session['access_token']) || configuration.accesstoken || undefined exports.getapihome(accesstoken, function(err, api) { if (err) { exports.onprismicerror(err, req, res); return; } var ref = req.query['ref'] || api.master(), ctx = { api: api, ref: ref, mayberef: ref == api.master() ? undefined : ref, oauth: function() { var token = accesstoken; homecoming { accesstoken: token, hasprivilegedaccess: !!token } }, linkresolver: function(ctx, doc) { homecoming configuration.linkresolver(ctx, doc); } }; res.locals.ctx = ctx; callback(req, res, ctx); }); }; }; // -- oauth routes var redirecturi = function(req) { homecoming req.protocol + '://' + req.get('host') + '/auth_callback'; }; exports.signin = function(req, res) { exports.getapihome(undefined, function(err, api) { if (err) { exports.onprismicerror(err, req, res); return; } var endpointspec = url.parse(api.data.oauthinitiate); endpointspec.query = endpointspec.query || {}; endpointspec.query['client_id'] = configuration.clientid; endpointspec.query['redirect_uri'] = redirecturi(req); endpointspec.query['scope'] = 'master+releases'; res.redirect(301, url.format(endpointspec)); }); }; exports.authcallback = function(req, res) { exports.getapihome(undefined, function(err, api) { if (err) { exports.onprismicerror(err, req, res); return; } var endpointspec = url.parse(api.data.oauthtoken), h = endpointspec.protocol == 'https:' ? https : http, postdata = querystring.stringify({ 'grant_type' : 'authorization_code', 'code': req.query['code'], 'redirect_uri': redirecturi(req), 'client_id': configuration.clientid, 'client_secret': configuration.clientsecret }); var postoptions = endpointspec; postoptions.method = 'post'; postoptions.headers = { 'content-type': 'application/x-www-form-urlencoded', 'content-length': postdata.length }; var postrequest = h.request(postoptions, function(response) { var jsonstr = ''; response.setencoding('utf8'); response.on('data', function (chunk) { jsonstr += chunk; }); response.on('end', function () { var accesstoken = json.parse(jsonstr)['access_token']; if(accesstoken) { req.session['access_token'] = accesstoken; } res.redirect(301, '/'); }); }); postrequest.write(postdata); postrequest.end(); }); }; exports.signout = function(req, res) { delete req.session['access_token']; res.redirect(301, '/'); };

you can specify collection in "form" call, instead of 'everything'. typically if have 'foobar' collection, can restrict query collection way:

ctx.api.form('foobar')...

you have create 1 phone call each collection want display.

javascript jquery node.js content-management-system

No comments:

Post a Comment