[silvatheme.renaissance][Emiliano D'Alterio] Added a pop-up cont...
[email protected] Wed, 25 Sep 2013 12:05:06 +0200
| Newsgroups | gmane.comp.web.zope.silva.cvs |
|---|---|
| Message-ID | <[email protected]> |
author: Emiliano D'Alterio
date: Wed Sep 25 12:04:54 2013 +0200
revision: 355:a3308ed9ace9 in silvatheme.renaissance
branch: 2.4
details: https://hg.infrae.com/silvatheme.renaissance?cmd=changeset;node=a3308ed9ace9
modified: src/silvatheme/renaissance/renaissance.py src/silvatheme/renaissance/renaissance_templates/header.cpt src/silvatheme/renaissance/renaissance_templates/layout.cpt src/silvatheme/renaissance/static/contact.css src/silvatheme/renaissance/static/js/contact.js
added: src/silvatheme/renaissance/static/contact.css src/silvatheme/renaissance/static/js/contact.js
removed:
log: Added a pop-up contact form using zeam.form and Jquery.
diffstat:
src/silvatheme/renaissance/renaissance.py | 72 ++++++++++++-
src/silvatheme/renaissance/renaissance_templates/header.cpt | 3 +
src/silvatheme/renaissance/renaissance_templates/layout.cpt | 3 +
src/silvatheme/renaissance/static/contact.css | 39 +++++++
src/silvatheme/renaissance/static/js/contact.js | 22 +++
5 files changed, 137 insertions(+), 2 deletions(-)
diffs (206 lines):
diff -r 3b4d9ef9a61a -r a3308ed9ace9 src/silvatheme/renaissance/renaissance.py
--- a/src/silvatheme/renaissance/renaissance.py Thu Jun 13 18:52:51 2013 +0200
+++ b/src/silvatheme/renaissance/renaissance.py Wed Sep 25 12:04:54 2013 +0200
@@ -2,12 +2,20 @@
# Copyright (c) 2002-2010 Infrae. All rights reserved.
# $Id$
+from zeam.form import silva as silvaforms
+
+from zope import interface, schema
+from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
+from z3c.schema.email import RFC822MailAddress
+
from datetime import datetime
from dateutil.relativedelta import relativedelta
from five import grok
from AccessControl import getSecurityManager
+from Products.Silva.mail import sendmail
+
from zope.cachedescriptors.property import Lazy
from zope.component import getUtility, queryMultiAdapter
from zope.interface import Interface, alsoProvides
@@ -15,7 +23,7 @@
from silva.core import conf as silvaconf
from silva.core.interfaces import IContainer, IRoot, IFeedEntryProvider
-from silva.core.interfaces import IGhost
+from silva.core.interfaces import IGhost, IViewableObject
from silva.core.layout.interfaces import ISilvaSkin
from silva.core.layout.porto import porto
from silva.core.layout.porto.interfaces import IPorto
@@ -43,6 +51,8 @@
silvaconf.resource(jquery)
silvaconf.resource('renaissance.css')
silvaconf.resource('content.css')
+ silvaconf.resource('contact.css')
+ silvaconf.resource('js/contact.js')
class IRenaissanceSkin(IRenaissance, ISilvaSkin):
@@ -206,7 +216,8 @@
content = version.get_haunted()
version = content.get_viewable()
if version is not None:
- details = queryMultiAdapter((version, self.request), IDocumentDetails)
+ details = queryMultiAdapter(
+ (version, self.request), IDocumentDetails)
if details is not None:
return details.get_text()
return None
@@ -302,3 +313,60 @@
grok.template('favicon')
+## Choices available for the subject in the contact form
+subjects = SimpleVocabulary([
+ SimpleTerm(value='Support Request', token='support',
+ title=u'Professional Support'),
+ SimpleTerm(value='Training Request', token='training',
+ title=u'Technical Training'),
+ SimpleTerm(value='Question', token='question',
+ title=u'Ask us a question'),
+ SimpleTerm(value='Feedback', token='feedback',
+ title=u'Give us your feedback'), ])
+
+
+class IContactFormFields(interface.Interface):
+ """Fields present in the contact form.
+ """
+ name = schema.TextLine(
+ title=u'Full Name', required=True)
+ company = schema.TextLine(
+ title=u'Company', required=False)
+ email = RFC822MailAddress(
+ title=u'Email', required=True)
+ phone = schema.TextLine(
+ title=u'Phone', required=False)
+ subject = schema.Choice(
+ title=u'Message subject', source=subjects, required=False)
+ message = schema.Text(
+ title=u'Message', required=True)
+
+
+class ContactForm(silvaforms.PublicContentProviderForm):
+ """The contact form.
+ """
+ grok.name('contactform')
+ grok.context(IViewableObject)
+
+ label = u'Contact us'
+ description = u"""You can contact us using this form.
+ Click outside this box to exit."""
+ fields = silvaforms.Fields(IContactFormFields)
+
+ @silvaforms.action(u"Send", identifier='contact', accesskey='c')
+ def contact(self):
+ data, errors = self.extractData()
+ if errors:
+ self.status = u'There are errors, please check again.'
+ return silvaforms.FAILURE
+
+ msg = u'%s\n\n %s\n %s\n %s\n' % (data['message'], data['name'],
+ data['phone'], data['company'])
+
+ sub = u'%s from %s' % (data['subject'], data['name'])
+
+ sendmail(self.context, msg, mto='[email protected]',
+ mfrom=data['email'], subject=sub)
+
+ self.status = u'Thank you for interest.'
+ return silvaforms.SUCCESS
diff -r 3b4d9ef9a61a -r a3308ed9ace9 src/silvatheme/renaissance/renaissance_templates/header.cpt
--- a/src/silvatheme/renaissance/renaissance_templates/header.cpt Thu Jun 13 18:52:51 2013 +0200
+++ b/src/silvatheme/renaissance/renaissance_templates/header.cpt Wed Sep 25 12:04:54 2013 +0200
@@ -23,6 +23,9 @@
<a href="${layout.root_url}/search" title="Search the site"
class="icon icon-search" id="searchtrigger">Search</a>
</li>
+ <li>
+ <a href="#" class="show-contact-form">Contact Us</a>
+ </li>
</ol>
</nav>
<form action="${layout.root_url}/search">
diff -r 3b4d9ef9a61a -r a3308ed9ace9 src/silvatheme/renaissance/renaissance_templates/layout.cpt
--- a/src/silvatheme/renaissance/renaissance_templates/layout.cpt Thu Jun 13 18:52:51 2013 +0200
+++ b/src/silvatheme/renaissance/renaissance_templates/layout.cpt Wed Sep 25 12:04:54 2013 +0200
@@ -5,3 +5,6 @@
<tal:forcenewline>
</tal:forcenewline>
<tal:footer tal:replace="structure provider:footer" />
+<tal:contactform>
+ <div id="contact-popup" tal:content="structure provider:contactform" style="display:none"></div>
+</tal:contactform>
\ No newline at end of file
diff -r 3b4d9ef9a61a -r a3308ed9ace9 src/silvatheme/renaissance/static/contact.css
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/silvatheme/renaissance/static/contact.css Wed Sep 25 12:04:54 2013 +0200
@@ -0,0 +1,39 @@
+ #masking-layer {
+ background: #000;
+ position: fixed;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ opacity: 0.8;
+ z-index: 999;
+ display: none;
+ }
+
+ #contact-popup {
+ color: #fff;
+ background: #333;
+ padding: 10px;
+ border: 2px solid #ddd;
+ float: left;
+ font-size: 1.2em;
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ z-index: 99999;
+ -moz-box-shadow: 0 0 20px #999;
+ -webkit-box-shadow: 0 0 20px #999;
+ box-shadow: 0 0 20px #999;
+ -moz-border-radius: 3px;
+ -webkit-border-radius: 3px;
+ border-radius: 3px;
+ display: none;
+ }
+
+ #contact-popup h3{
+ color: #fff;
+ }
+
+ #contact-popup .field {
+ margin: 2px 0;
+ }
diff -r 3b4d9ef9a61a -r a3308ed9ace9 src/silvatheme/renaissance/static/js/contact.js
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/silvatheme/renaissance/static/js/contact.js Wed Sep 25 12:04:54 2013 +0200
@@ -0,0 +1,22 @@
+$(document).ready(function() {
+ var popup_margin_top = ($('#contact-popup').height() + 24) / 2;
+ var popup_margin_left = ($('#contact-popup').width() + 24) / 2;
+
+ $('#contact-popup').css('margin-top', -popup_margin_top);
+ $('#contact-popup').css('margin-left', -popup_margin_left);
+
+ $('a.show-contact-form').click(function(event) {
+ $('body').append('<div id="masking-layer"></div>');
+ $('#masking-layer').fadeIn('slow');
+
+ $('#contact-popup').fadeIn('slow');
+
+ event.preventDefault();
+ });
+
+ $('#masking-layer').live('click', function() {
+ $('#masking-layer, #contact-popup').fadeOut('fast' , function() {
+ $('#masking-layer').remove();
+ });
+ });
+});