diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index baa6b6c780b..6b14a16c9aa 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -129,6 +129,13 @@ class Website(openerp.addons.web.controllers.main.Home): values = { 'path': path, } + try: + module, xmlid = path.split('.', 1) + IMD = request.registry.get("ir.model.data") + obj = IMD.get_object_reference(request.cr, request.uid, module, xmlid) + values['main_object'] = request.registry[obj[0]].browse(request.cr, request.uid, obj[1]) + except Exception: + pass try: html = request.website.render(path, values) except ValueError: diff --git a/addons/website/models/ir_ui_view.py b/addons/website/models/ir_ui_view.py index aaf25511fde..1b680549164 100644 --- a/addons/website/models/ir_ui_view.py +++ b/addons/website/models/ir_ui_view.py @@ -10,6 +10,9 @@ class view(osv.osv): 'inherit_option_id': fields.many2one('ir.ui.view','Optional Inheritancy'), 'inherited_option_ids': fields.one2many('ir.ui.view','inherit_option_id','Optional Inheritancies'), 'page': fields.boolean("Whether this view is a web page template (complete)"), + 'website_meta_title': fields.char("Website meta title", size=70, translate=True), + 'website_meta_description': fields.text("Website meta description", translate=True), + 'website_meta_keywords': fields.char("Website meta keywords", size=70, translate=True), } _defaults = { 'page': False, diff --git a/addons/website/static/src/js/website.js b/addons/website/static/src/js/website.js index e524edfb389..1f4e54b43df 100644 --- a/addons/website/static/src/js/website.js +++ b/addons/website/static/src/js/website.js @@ -109,9 +109,13 @@ website.ready = function() { if (!all_ready) { var tpl = website.load_templates(templates); - // var session; - // var trads = openerp._t.database.load_translations(session, ['website'], website.get_context().lang); - all_ready = $.when(dom_ready, tpl); + all_ready = dom_ready.then(function () { + if ($('html').data('editable')) { + website.session = new openerp.Session(); + var modules = ['website']; + return openerp._t.database.load_translations(website.session, modules, website.get_context().lang); + } + }).then(tpl).promise(); } return all_ready; }; diff --git a/addons/website/static/src/js/website.seo.js b/addons/website/static/src/js/website.seo.js index 945b0ed353d..e5bdc517b36 100644 --- a/addons/website/static/src/js/website.seo.js +++ b/addons/website/static/src/js/website.seo.js @@ -1,6 +1,6 @@ (function () { 'use strict'; - + var website = openerp.website; website.templates.push('/website/static/src/xml/website.seo.xml'); @@ -9,7 +9,7 @@ 'click a[data-action=promote-current-page]': 'launchSeo', }), launchSeo: function () { - (new website.seo.Configurator()).appendTo($(document.body)); + (new website.seo.Configurator(this)).appendTo($(document.body)); }, }); @@ -241,24 +241,29 @@ return hashIndex >= 0 ? url.substring(0, hashIndex) : url; }, title: function () { - return $('title').text().trim(); + return ($('title').length > 0) && $('title').text() && $('title').text().trim(); }, changeTitle: function (title) { + // TODO create tag if missing $('title').text(title); this.trigger('title-changed', title); }, description: function () { - return $('meta[name=description]').attr('value').trim(); + var $description = $('meta[name=description]'); + return ($description.length > 0) && $description.attr('value') && $description.attr('value').trim(); }, changeDescription: function (description) { + // TODO create tag if missing $('meta[name=description]').attr('value', description); this.trigger('description-changed', description); }, keywords: function () { - var parsed = $('meta[name=keywords]').attr('value').split(","); - return parsed[0] ? parsed: []; + var $keywords = $('meta[name=keywords]'); + var parsed = ($keywords.length > 0) && $keywords.attr('value') && $keywords.attr('value').split(","); + return (parsed && parsed[0]) ? parsed: []; }, changeKeywords: function (keywords) { + // TODO create tag if missing $('meta[name=keywords]').attr('value', keywords.join(",")); this.trigger('keywords-changed', keywords); }, @@ -364,7 +369,8 @@ } var htmlPage = this.htmlPage; - // desactivated as too complex for end-users + // Add message suggestions at the top of the dialog + // if necessary.... // if (htmlPage.headers('h1').length === 0) { // tips.push({ // type: 'warning', @@ -390,15 +396,60 @@ $input.val(""); }, update: function () { + var self = this; var data = { - title: this.htmlPage.title(), - description: this.htmlPage.description(), - keywords: this.keywordList.keywords(), - images: this.imageList.images(), + website_meta_title: self.htmlPage.title(), + website_meta_description: self.htmlPage.description(), + website_meta_keywords: self.keywordList.keywords().join(", "), }; - console.log(data); - // TODO Persist changes - this.$el.modal('hide'); + self.saveMetaData(data).then(function () { + self.$el.modal('hide'); + }); + }, + getMainObject: function () { + var repr = $('html').data('main-object'); + var m = repr.match(/.+\((.+), (\d+)\)/); + if (!m) { + return null; + } else { + return { + model: m[1], + id: m[2]|0 + }; + } + }, + loadMetaData: function () { + var self = this; + var obj = this.getMainObject(); + var def = $.Deferred(); + if (!obj) { + // return $.Deferred().reject(new Error("No main_object was found.")); + def.resolve(null); + } else { + var fields = ['website_meta_title', 'website_meta_description', 'website_meta_keywords']; + var model = website.session.model(obj.model); + model.call('read', [[obj.id], fields, website.get_context()]).then(function (data) { + if (data.length) { + var meta = data[0]; + meta['model'] = obj.model; + def.resolve(meta); + } else { + def.resolve(null); + } + }).fail(function () { + def.reject(); + }); + } + return def; + }, + saveMetaData: function (data) { + var obj = this.getMainObject(); + if (!obj) { + return $.Deferred().reject(); + } else { + var model = website.session.model(obj.model); + return model.call('write', [[obj.id], data, website.get_context()]); + } }, titleChanged: function () { var self = this; diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml index dd7a10370fb..7b90052f0ff 100644 --- a/addons/website/views/website_templates.xml +++ b/addons/website/views/website_templates.xml @@ -13,13 +13,24 @@