Skip to main content

Picture In Picture (lightbox/greybox) support for Plone

Project description


PIP = Picture in Picture

pipbox = picture boxes in Plone

Products.pipbox provides JQuery Tools support in Plone. This allows lightbox-style popups that may be loaded as images, AJAX html, or iframes.

The goal is that this support will be available via methods that wrap the Javascript implementation (currently JQuery Tools) so that it can change if necessary.

pipbox currently does two things:

  1. loads JQuery Tools and its supporting images;
  2. provides a framework for connecting JQuery Tools bling to CSS selectors without JavaScript.

Site setup for pipbox is table-driven, with settings in the table allowing you to specify DOM elements via jquery selectors. These are usually going to be <a href… /> or <img src… /> elements. You specify how the URL should be loaded (as an image, ajax or iframe). You may also optionally supply a regular expression search/replace pair for the URL and additional arguments for the JS engine. Options are specified with JSON object notation. I anticipate that this will become GS profile driven.

Let’s say, for example, that you want to make clicking on news-item photos open a lightbox-style larger version of the image. To do this, you’ll need to specify:

  • A jquery style selector for a Plone element, e.g., “.newsImageContainer a”
  • “image” for the load method (“ajax” and “iframe” are other alternatives)
  • A regular expression search/replace to transform the href or src URL. In this example, we’re changing the URL to point to the preview-sized image. So, our search/replace pair is “/image_view_fullscreen” and “_preview”.
  • You could also specify additional overlay configuration parameters.

Site setup for pipbox is table-driven, with a lines field in portal_properties.pipbox_properties. In this table, each line is a JSON object specification, So, all of the above will need to be a line like:

{type:'overlay',subtype:'image',selector:'.newsImageContainer a',urlmatch:'/image_view_fullscreen$',urlreplace:'_preview'}

Another quick example, one that provides full-image popups for images placed via kupu:


What’s different? We’re targeting <img … /> tags, which don’t have href attributes. pipbox picks up the target URL from the src attribute, so that we can have a popup view of image elements that aren’t linked to that view. Note also that we’re using a real regular expression in the search/replace so that we can strip off image_preview, image_mini, etc.

And, a configuration to put the site map in an iframe popup with expose settings, picking up the target from an href:

{type:'overlay',subtype:'iframe',selector:'#siteaction-sitemap a',config:{expose:{color:'#00f'}}}

The complete options list:

  • type: ‘overlay’ (other JQuery Tools effects coming)
  • subtype: ‘image’ | ‘iframe’ | ‘ajax’
  • selector: the JQuery selector to find your elements
  • urlmatch: Regular expression for a portion of the target URL
  • urlreplace: Replacement expression for the matched expression
  • config: JQuery Tools configuration options in a dictionary


Setup the test framework:

>>> from zope.component import getMultiAdapter
>>> from Products.Five.testbrowser import Browser
>>> browser = Browser()
>>> portal_url = 'http://nohost/plone'

We should already be installed, so there should be a product in the Products space:

>>> from Products import pipbox

And, quickinstaller should know about us:

>>> portal.portal_quickinstaller.isProductInstalled('pipbox')

Property Sheet Installation

We’ll use a portal_properties property sheet to store site setup:

>>> 'pipbox_properties' in portal.portal_properties.objectIds()

It’s selector_specs field should contain an automatic activation specification. Here’s what’s pre-installed:

>>> my_props = portal.portal_properties.pipbox_properties
>>> my_props.selector_specs
("{type:'overlay',subtype:'image',selector:'.newsImageContainer a',urlmatch:'/image_view_fullscreen$',urlreplace:''}",)

Stylesheet View

Popup windows require style support. We should have our stylesheet available as a view:

>>> view = getMultiAdapter((portal, app.REQUEST), name=u'pipbox.css')
>>> mycss = view()
>>> mycss.find('PIPBox Stylesheet') > 0

For ease of interpolating plone style properties, it’s a dtml document, and should be interpreted as such:

>>> mycss.find('<dtml') == -1

The stylesheet should be installed in the CSS registry:

>>> 'pipbox.css' in portal.portal_css.getResourceIds()

Javascript Resource and View

We should have two items in the JS registry:

>>> jsreg = portal.portal_javascripts
>>> ids = jsreg.getResourceIds()
>>> '++resource++pipbox.js' in ids and 'pipboxinit.js' in ids

Open the main JS code item as a resource:


And, make sure it’s got our code in it:

>>> print browser.contents
   PIPbox tools for attaching JQuery Tools bling to CSS with option
   parameter strings.

We have initialization code for our settings in a view:

>>> view = getMultiAdapter((portal, app.REQUEST), name=u'pipboxinit.js')

This should contain the specifications from our propery sheet:

>>> print view()
pb.doSetup({type:'overlay',subtype:'image',selector:'.newsImageContainer a',urlmatch:'/image_view_fullscreen$',urlreplace:''});



  • Adapt to use with JQuery Tools rather than ThickBox


  • Initial commit

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Files for Products.pipbox, version 0.2dev
Filename, size File type Python version Upload date Hashes
Filename, size Products.pipbox-0.2dev.tar.gz (260.3 kB) File type Source Python version None Upload date Hashes View hashes

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page