Skip to main content

A finder to search/select portal objects for Plone

Project description

Ajax popup to browse and select plone contents, suitable to any plone.formilb form (portlets, control panels, …)

This code is an extraction with some refactoring, of PloneArticle explorer used for referencables proxies.

The intent is to make it usable in various situations:

  • to store selected contents in plone.formlib based Plone forms (portlet or control panel forms as example)

  • for collective.ckeditor or any possible wysiwyg editor for referencing images or contents inside a rich text field, it’s also possible to upload files / images and create folders with this product (dependency to collective.quickupload)

  • for referencable fields inside AT edit forms (future)

  • for links fields (as remoteUrl in ATLink) to reference internal links (future)

This work has been started at Ingeniweb in 2007 by Christophe Bosse (for the jQuery code) and Jean-Mat Grimaldi (everything else) for PloneArticle product.

Requirements

  • Plone (tested with Plone 3.3.5 and Plone 4)

  • collective.quickupload

Installation

  • Nothing to do if you have installed collective.ckeditor (Plone 4 only today)

  • Otherwise install it as any Zope package using buildout :

    • add collective.plonefinder in your eggs section

    • add collective.plonefinder in your zcml section of the plone.recipe.zope2instance part definition if on Plone 3.0 or 3.1

    • Run bin/buildout

Nothing else.

How to use it as a reference widget in formlib forms

Basic usage

A reference widget for zope3 forms (zope.app.form) is provided with this product.

The widget can be used to store objects references in a sequence field.

Example of use in a portlet form for a Tuple field named target_contents:

from collective.plonefinder.widgets.referencewidget import FinderSelectWidget

target_contents = schema.Tuple(title=u"Browse for contents",
                               description=(u"Choose contents to display "
                                            u"with a plone finder window."),
                               default=()
                               )

form_fields['target_contents'].custom_widget = FinderSelectWidget

Tweaking some properties

You can use the FinderSelectWidget with some properties set using the update method in your AddForm or EditForm. In example for a portlet AddForm:

class AddForm(base.AddForm):
    """Portlet add form.
    """
    form_fields = form.Fields(IReferencesPortlet)
    form_fields['targets'].custom_widget = FinderSelectWidget
    label = u"Add References Portlet"

    def update(self):
        super(AddForm, self).update()
        self.widgets['targets'].typeview = 'image'
        self.widgets['targets'].forcecloseoninsert = 1

    def create(self, data):
        return Assignment(**data)

If you want, you can also pass a context as base for the widget, to get the current or parent folder open in the finder. Example in a portlet using the update method:

assignment = aq_parent(aq_inner(self.context))
self.widgets['targets'].base = aq_parent(aq_inner(assignment))

There are also two customized widgets for files and images. Look at the code to create your own specific widget.

Example of code for files referencing with files upload support:

from collective.plonefinder.widgets.referencewidget import FinderSelectFileWidget

target_files = schema.Tuple(title=u"Browse for images",
                            description=(u"Choose files to display "
                                         u"with a plone finder window. "
                                         u"You can upload new files."),
                            default=()
                            )

form_fields['target_files'].custom_widget = FinderSelectFileWidget

Example of code for images referencing with images upload support:

from collective.plonefinder.widgets.referencewidget import FinderSelectImageWidget

target_images = schema.Tuple (title=u"Browse for images",
                              description=(u"Choose images to display "
                                           u"with a plone finder window. "
                                           u"You can select different image sizes. "
                                           u"You can upload new images."),
                              default= ()
                              )

form_fields['target_images'].custom_widget = FinderSelectImageWidget

Note that in this last case the data store image uid and image thumb size like this:

'%s/%s' % (image.UID(), thumb_size_extension)

thumb_size_extension could be 'image_thumb' or 'image_preview'

So use something like this to display a referenced image:

uid, variant = data.split('/')
'<img src="%s/resolveuid/%s/%s" />' % (portal_url, uid, variant)

Full list of customization attributes

Attribute

Default value

Description

finderlabel

_(u'Browse for contents')

Customize the title of the Browser window. i.e. "Find the pictures"

moveuplabel

_(u'Move up')

Label associated with the up arrow widget that raises the order of the reference. i.e. "Increase priority".

movedownlabel

_(u'Move down')

Label associated with the down arrow widget that lowers the order of the reference. i.e. "Decrease priority".

deleteentrylabel

_(u'Remove item')

Label associated with the “Remove from list” widget. i.e. "Remove this video".

types

() # All types

List of selectable portal types to show in the selection panel. i.e. ['Document']

typeview

'file'

Possible values are 'file', 'image' and 'selection'. Tuning on selection panel layout.

imagetypes

('Image', 'News Item')

Sequence of portal types that can handle images (see Todo)

selectiontype

'uid'

Selected items are returned to the application (form) as UIDs. Other possible value is 'url'.

showsearchbox

True

Do we show the searchbox?

allowupload

False

Do we enable upload files through our widget if the user has appropriate permission? See Uploadding in custom folderish type

openuploadwidgetdefault

False

Do we display the upload widget by default?

allowaddfolder

False

Do we enable adding new folders through our widget if the user has appropriate permission?

allowimagesizeselection

False

If the image has multiple sizes, do we enable the selection of a particular size? (See the above note)

forcecloseoninsert

False

Do we close the finder when an element is selected?

base

None

The folderish object used as root of the finder when opening. None means the Plone site. Note that by nature, this attribute cannot be set statically, in a FinderSelectWidget personal subclass for example as other can be. See the example in simple customizations on how to change the widget base attribute dynamically from the form class code.

Developer Howto

How to use it in a WYSIWYG editor

The more easy way is creating a specific view, because you will often need to override the javascript method to select objects, and because each editor has its specific negociations with the browser.

See collective.ckeditor package as example.

Uploadding in custom folderish type

If you want to let the plone finder users upload files in your custom or third party folderish content types, you need to mark these types with the IFinderUploadCapable marker interface. As in this self-speaking ZCML sample:

<class class="my.content.folderish.MyFolderish">
  <implements
     interface="collective.plonefinder.browser.interfaces.IFinderUploadCapable" />
</class>

Out of the box, collective.plonefinder enables upload in the Plone site itself as well as in ATFolder and ATBTreeFolder.

Todo

  • Functional doctests

  • i18n support

  • Finder improvements:

    • Ajax opening/moving/resizing and all window effects inside the same browser window (in progress, need some js refactoring)

    • improve contextual actions menu (change workflow state, rename, delete, copy, paste …)

    • add a finder menu action to show/hide the current selection list in right panel

    • remove items from selection list in finder window

  • Improve zope3 reference widget properties

    • add option to hide/show or just mark selected items in finder browsing results (just need to store the finder blacklist in session)

    • add option to set a specific catalog query stored in session

    • add option to change finder catalog.

  • New zope3 widget to store urls (for a string field)

  • Archetypes support:

    • ATPloneFinderWidget for Reference fields (not a big challenge, just need to use ATReferenceBrowserWidget as base to start the work)

    • ATLinkWidget to store internal links

  • Dexterity support (z3c.form)

  • Supplement types and imagetypes attributes with others uning interfaces for a better flexibility.

  • Provide as parameter a factory that provides the results in the desired format. i.e You need a particular attribute of the target or some computed value.

  • Componentize the code for more flexibility.

Any contribution is welcome, contact support@ingeniweb.com.

Authors

Jean-mat Grimaldi - Alter Way Solutions

Code repository

https://github.com/collective/collective.plonefinder

Support

Changelog

1.2.1 (2016-07-25)

  • Add missing semicolons to avoid JS issue when portal_javascript is in prod mode. [gotcha]

  • Add check for when value is None (when you remove image after adding it). [spereverde]

  • Some refactoring for cleaner HTML in FinderImageWidget. [gotcha]

1.2.0 (2016-07-08)

  • Add formlib FinderImageWidget; use with

    # in interface class
    picture = schema.TextLine(title=_(u'Picture'),
                               description=_(u'Optional picture'),
                               required=False)
    # in form class
    form_fields['picture'].custom_widget = FinderImageWidget

    [gotcha]

1.1.4 (2016-03-30)

  • Fix bug in finder’s query form serialization with special characters. [pgrunewald]

1.1.3 (2016-03-24)

  • Added option openuploadwidgetdefault to be able to specify if we want the upload widget to be opened by default without having to click on the ‘Files quick upload’ button. [gbastien]

1.1.2 (2016-03-15)

  • Added option showsearchbox to be able to display/hide the search box easily. [gbastien]

1.1.1 (2016-02-23)

  • Reapply fixes from 1.0.2 that were lost maybe in the migration to github [gotcha]

1.1.0 (2016-02-16)

  • Use new way to get images. Call /@@images/image/preview instead of /image_preview. [bsuttor]

  • Add implmentation of plone.app.contenttypes.content.Folder by IFinderUploadCapable. [bsuttor]

  • basic support for plone.app.contenttypes images [kiorky]

1.0.7 (2014-09-15)

  • Fix: with ckeditor, link to News item does not link to its image anymore. Fix from 1.0.4 was lost in 1.0.5. [gotcha]

1.0.6 (2014-03-05)

  • Fix bad quotted test. [bsuttor]

1.0.5 (2014-03-05)

  • Fix scope container when a object is created. Container is first non portal_factory object. [bsuttor]

  • Lots of code simplifications (yet not finished, grep for “FIXME:”) [glenfant]

  • More doc in the README (explain all releavant usages) [glenfant]

  • SVN marker in all possible files [glenfant]

  • Lots of optims (yet not finished, grep for “FIXME:”) [glenfant]

  • Commented obscure features in the code [glenfant]

  • Fix case where image field is of the type reference [toutpt]

1.0.4 (2013-09-09)

  • Fix: with ckeditor, link to News item does not link to its image anymore. [gotcha]

1.0.3 (2013-06-12)

  • Compatibility with Plone 4.3 [toutpt]

1.0.2 (2011-08-19)

  • Always show full site structure in navigation column. [spereverde, yulka, gotcha]

  • In breadcrumbs, avoid links to folders where the user does not have View permission. [spereverde, yulka, gotcha]

1.0.1

  • CSS IE7 fixes macadames - 2010/09/22

  • finder.pt : template fix doctype was missing macadames - 2010/09/22

  • finder.pt : Remove lang attribute on html tag- we don’t need it and it’s difficult to maintain between Plone3 / Plone4 macadames - 2010/09/26

1.0.0

  • use Plone Quick Upload as upload tool - new dependency to collective.quickupload added macadames - 2010/09

1.0.0-b2

  • fix unauthorized error in edit forms using FinderSelectWidget when user don’t have the permission to access some referenced contents. In this case object is not removed from list, but a message is displayed in place of object title : ‘%s : %s ‘ %(_(u”You don’t have permission to access this object”),uid)

  • added : close window when self.multiselect = False or self.forcecloseonsinsert = False

  • fix selectItem when there were quotes in titles

  • added a base attribute to reference widget used for finder opening folder.

  • use unicode chars for up and down arrows in reference widget.

  • allow change imagetypes using request and referencewidget

  • added a generated css for plone3 content-types icons

  • added new property self.filestypes in browser

  • added mime-type icons for filestypes in finder

  • FinderSelectWidget : do not raise an error anymore when object is not found but just returns a message in place of title (object with uid doesn’t exist)

  • Fix regression on allowupload (was never allowed) macadames - 2010/07/21

  • Fix enable/disable browsing using request or self.browse = False macadames - 2010/07/22

  • no search on another path, when browsing is disable macadames - 2010/07/22

  • title fields added to multiple upload using jquery.uploadify macadames - 2010/07/24

  • authentication for flash upload is done using cookie when possible (same method as collective.uploadify) otherwise using a ticket (method PloneFlashUpload) macadames - 2010/07/28

  • use standard archetypes method “invokeFactory”, to create new objects using uploaded files, to respect the complete plone createObject process. macadames - 2010/07/28

  • added new mediaupload key in request to set content-type for upload (very useful with jquery.uploadify) macadames - 2010/07/28

  • improve jquery.uploadify process with errors handling macadames - 2010/07/29

  • added new css class required to show icons on plone4 ‘icons-on’ macadames - 2010/07/31

  • fix upload buttons styles on plone4 macadames - 2010/07/31

  • fix some css styles on Plone3 or Plone4 + classic Theme macadames - 2010/07/31

  • design improvements macadames - 2010/07/31

  • french translation in progress macadames - 2010/07/31

  • use InavigationRoot for the finder root no more IPloneSiteRot macadames - 2010/08/01

  • design improvements blue is the new color macadames - 2010/08/01

  • added new view attributes root and rootpath used to change the browser root macadames - 2010/08/02

  • Added a real left navigation tree macadames - 2010/08/02

  • replace persistent objects in attribute views by a data dict ie self.data[‘root’] in place of self.root macadames - 2010/08/04

  • use topic queryCatalog when the scope is a topic macadames - 2010/08/04

  • added support for z3c.autoinclude macadames - 2010/08/20

1.0.0-b

  • images sizes displayed in finder are taken from portal properties imaging properties when exists

  • choose image sizes : contextual menus added

  • many IE fixes and cosmetic changes

  • plone4 icons style used also under plone3

  • reference objects widget added for zope3 forms (can be used in portlets)

1.0.0-a

  • Initial release

Download files

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

Source Distribution

collective.plonefinder-1.2.1.tar.gz (130.9 kB view hashes)

Uploaded Source

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page