netPhotoGraphics release notes

Version 2.01.00.05

General

No change notes yet.

Version 2.01

General

The site will be automatically closed when the extract.php script is unzipping files. This is done by closing the site when there is an extract.php script present in the root folder of the installation. The extract process removes this script upon completion. BUT, if for some reason the script is left in the root folder, the site will be closed. The only way to access the administrative pages in that case is by using a direct file (not rewritten) link to npgCore/admin.php.

If the site has clone installations, running setup on the primary site will automatically launch setup for the clone sites. Many browsers will automatically block popups. This blocking will inhibit the clone site setup execution. You can typically enable popups for a particular site. You should add your primary site the the popups allowed list so that the clone installs can automatically be run.

As predicted, the zp-core and zp-extensions folders have been renamed to npgCore and extensions respectively. When used in URLs, the npgCore folder is simply npg and the user plugin folder is extensions.

PHP Thread management has been implemented. This is needed to prevent errors due to too many accesses to the database. There is a new Gallery option­—
Thread concurrency— that controls the number of concurrent PHP threads that will run. This value is limited by the MySQL Max Connections setting. With the Thread Concurrency option, the Image option Caching Concurrency is no longer needed and has been removed.

netPhotoGraphics is now compatible with PHP version 8.2 and MySQL 8.

E-Mails sent by netPhotoGraphics are now HTML encoded. In addition, there is now a customizable e-mail "form" that will be used when sending the mails. The standard template is a simple form with the sites branding logo (or the netPhotoGraphic logo if none is defined), the body of the e-mail, and "--The Administrator" as a signature. You can view and edit this template on the new "forms" option tab. If you update the form it will be stored in the plugins/forms folder and not overridden on subsequent updates. 

A "mail" button has been added for each user who has an e-mail address.  You can use this to send e-mail to individual users.

Album, Image and User editing

There is now a menu button in the upper right corner of the user edit pages, the multiple image edit pages, and the album masedit pages that allows you to hide and disable portions of the content of each object  This allows you to limit the editing to just those fields you want to change. Limiting these content portions will increase the number of objects you can successfully edit on the page. 

Note: plugins which attach to filters  for these pages must insure that their $_POST elements are present and enabled when processing the "save" else an error may occur when elements are deselected.

Image caching and serving

Support for webp has been enhanced to provide serving images in webp format while allowing browsers that do not support webp to fall back to the site selected cache as image format.

The parameters for several image serving functions have been revamped. They were a cumbersome list of image parameters that was easy to get our of order or omit a key item. Now the function calls should pass an array of the form array('size'=>500, 'height'=> 500, 'width'=>500, 'cx'=>500, 'cy'=>500... etc.). Individual items may be omitted so long as that makes functional sense. The order of the items is not important. Existing parameter list based function calls will continue to work, but they will be flagged as deprecated.

Language support

Many older language translations with low fidelity have been removed from the netPhotoGraphics distribution. A new repository has been created to hold these translations in case they might be of use to someone or if a volunteer takes on the task of updating the translation. The language system has been enhanced to allow languages to be stored in the plugins/locale folder so that they will persist over software update installs.

As part of the re-branding the names of the language files have been changed. You can ignore this unless you are planning to participate in localizing netPhotoGraphics

Themes

The zpFocus and zpSkeleton themes have been removed from the distribution and are no longer supported. The zpArdoise, zpBootstrap, zpEnlighten, zpMasonry, zpMinimal, and zpMobile themes have been renamed to Ardoise, Bootstrap, Enlighten, Masonry, Minimal, and Mobile respectively. If you use one of these themes your site will automatically migrate to the new name.

Note: If you have cloned your install and your server does not support symlinks you will need to re-clone the clones to copy the renamed themes.

Plugins

The following plugins have been deprecated:

class-WebDocs
disableAction
disableWatermark
filter-fileSearches
image_effects
no_show
overrideEXIFDesc
singleAlbum
text_watermark
themeEditor
tweet_news
wordpress_import

They have been moved to the Plugin folder and will be dropped from the netPhotoGraphics repository in a future release. When they are dropped, the Plugin will be added to the DevTools repository. At that point no effort will be made to keep them current with the netPhotoGraphic releases. If you are using any of these Plugins you should make plans to either keep them current or find alternative scripts to satisfy your needs.

ipBlocker

The plugin now looks for import lists within the pluginfolder. If your site has uploaded an import list to the uploadsfolder you will need to move it to the pluginsfolder for it to be available to the import list option. A list of the standard private IP address ranges in supplied with the distribution.

The plugin no longer monitors failed logins or 404 errors. 404 errors are a subset of denial of service attacks. You should use the accessThreshold plugin go protect against denial of service attacks. If you are experiencing login attacks you should block the IP address range from which the attacks originate.

swipe_gestures

A new plugin that allows using swipe left and right to move between pages in a sequence on touch screen devices.

class-AnyFile

The AnyFile class may now be extended so that you can supply custom rendering of the "image." Create a new php script in the plugins/class-AnyFile folder that extends the AnyFile class and overrides the getContents() method. This method provides your custom rendering of the file content on an image page.

Along with this change, the plugin no longer uses an option to specify the file suffixes it supports. Instead it will scan the plugins/class-AnyFile folder for scripts or default images to determine what suffixes it supports. See the plugin information for details.

class-textobject

With the deprecation of class-WebDocs, PDF files are now supported  by class-textobject using browser default rendering.

slideshow2

slideshow2 has been removed from the distribution and placed in the DevTools repository. The jquery.cycle2 scripts that this plugin use have not been updated in five years and are incompatible with jQuery version 3. 

tagURLs

Normally URLs stored in object fields such as the description or a zenpage object's content fields are transformed into site independent urls when stored in the database and restored to site links when the field is fetched from the object. This allows you to more easily move your site to a new domain. Unfortunately at some point a bug was introduced which prevented the conversion to the portable URL so your database may contain some  site explicit URLs. If you re-save objects with these URLs the conversion will take place properly with the current version of netPhotoGraphics. The tagURLs plugin has been added to the GitHub DevTools repository to automate this process. The utility will scan your images, albums, news articles, and pages and update any explicit URLs found. This may be a processor intensive action depending on the number of these objects on your site. The object's last change date and last change user will also be updated if a URL is changed.

panorama

This is a new plugin to show panoramic images on your site. It is based on based on Paver by terrymun

The plugin will display exceptionally wide images as a scrollable panorama. Images which fit into the image container will not be forced into panorama mode, so the function can replace printDefaultSizedImage() in your image.php script.

user_mailing_list

Users now have the ability to opt-out of the mailing list. The standard mailform now has a link to an opt-out page. Clicking on the link will take the user to that page which will add him to an unsubscribe list. There will also be an opt-out checkbox in the user's profile.

Emails may now be sent to all the members of a User Group.

Version 2.0

General

The scripts for the administrative scripts of netPhotoGraphics have been reorganized. They new folders have been created to store related scripts. This is not a functional change, but any third party themes or plugins which directly link to these scripts will need updating. Also note that for sites with mod rewrite enabled URLs to the administrative pages are now "rewritten" to be SEO friendly using the defined mod_rewrite suffix. The old direct links (e.g. zp‑core/admin.php) will still work but it is recommended that you update any saved links to the new format. In a future release the zp‑core and zp‑npgCore/extensions folders will be renamed and the legacy links will no longer work.

The names of many of the scripts have also been changed to allow for more intuitive organization of the software. As part of this reorganization, many of the netPhotoGraphic functions and global variables have been renamed. Some functions have been encased into new class definitions. In particular, the plugins cloneZenphoto, zpCaptcha, and zenphoto_sendmail have been renamed to clone, captcha, and simple_sendmail.

These changes will be transparent to you provided you do not use custom themes or plugins. The deprecated-functions and zenphotoCompatibilityPack plugins have been updated to provide a smooth upgrade. But you should run the DEVELOPMENT/LEGACY CONVERTER on your scripts to improve their performance. You may also notice that your custom themes and plugins show errors during the setup process. This is because the compatibility plugins are not enabled at setup time. These errors give you an indication of what scripts you need to convert.

netPhotoGraphics now supports the webp image format so long as your installation's graphics library also supports it. You can see what formats your graphics library supports on the admin Overview/Installation Information page. Note: some older browsers may not support this image format.

Of course, there are also the usual bug fixes and security enhancements included with this release.

Security

netPhotoGraphics will now use the PHP functions for password hashing and checking if they are available. These are more robust and better performing that the legacy algorithms. New algorithm choices have been added to the password hash algorithm option reflecting the new capabilities provided by these functions. As part of this improvement there is now a default selection for the option. Setting default as the option will automatically migrate the strength of your hashing algorithms as PHP adds new algorithms and changes its default setting. This is the recommended setting for the option.

The legacy password hashing algorithms are deprecated and will be removed in a future release. Any user with a password still hashed by these algorithms at that time will be forced to use the forgotten password paths to log into the site.

Part of this security enhancement is to require a new log-on for users whose passwords are hashed with a less robust algorithm than the current option setting. This logon will automatically update their saved password hash to the new algorithm.

The admin/user page will show administrators which users currently have the less robustly hashed passwords.

netPhotoGraphic will now log all actions involved with GDPR policy acknowledgement and CookieConsent.

Upgrade aids

Two new features have been added to streamline installing upgrades on your site. When a new version is made available there will now be two buttons in the admin utility functions. One is the familiar button to download the setup zip file to your computer. The new button will copy the extract.php file directly to your server's root folder then run the install. This button requires that either the PHP Curl extension is enabled or allow_url_fopen be enabled in your server's PHP.ini settings. If this is not the case you can still download the setup zip file, extract the extract.php.bin file and upload it to your server. Then the install button will then simply rename and run the extract.php file.

User control of "owned" images

Non-admin users now have the ability to edit images that they are the "owner" of. If a user owns any images he will see the admin tab My Images just below the My Profile tab. That link will take him to a page listing all the albums which contain images he owns. The links on that page will take him to the image edit page for those owned images.

Plugins

nanospell

This plugin has been deprecated and will be removed. The tinyMCE configurations now enable the browser's spell checker. nanospell required custom installations and special licensing. Modern browsers provide a more seamless spell checking solution

TinyMCE

TinyMCE has been updated to version 5. If you have implemented any tinyMCE plugins please see Migrating from TinyMCE 4 for migrating your code.

userlogin-out

A new choice has been added to the login form option. Colorbox inline will display the login form in a colorbox pop-up window directly (no need to click on the login link.) This allows a protected site to show its index page darkened out behind the login form when a visitor is not logged in. To do this index.php must be checked in the Unprotected pages Gallery option. There will be no button to close the pop-up without logging in, but be aware that if the visitor types an escape the form will close and your index page will be visible.

googleMap & opeanstreetmap

A new class has been added to theme support named simpleMap to simplify incorporating map display into themes. For most uses of map display you can use this class and your theme will not need to be cognisant of which map plugin (if any) is enabled. For a basc map you can call simpleMap::printMap(). It is also possible to collect a set of geo coordinate points using simpleMap::getGeoCoord($image) and pass an array of such points as the parameter to simpleMap::printMap(), If you need to know if a map plugin is enabled simpleMap::mapPlugin() will return the class name of the enabled plugin.

With this implementation, all distributed themes that included googleMap have been converted to use simpleMap so they will now also support openstreatmap. Also as part of this change, the googleMap functions getGeoCoord() and addGeoCoord() have been deprecated. 

Note: if both googleMap and simplestreetmap are enabled, googleMap will be the plugin reported and used to display maps.

googleTranslate

This is a new plugin to aid translating of Titles, Descriptions, and CMS content of an object. You can  use it to make a first path translation of the text associated with your locale into the site's other enabled languages. Note: the plugin is an AID in translation. You should expect to clean up its results prior to exposing the translations on your site.

rewriteRules

This plugin has been enhanced to allow defining netPhotoGraphics rewrite rules through a text file in the plugins folder. The plugin info has been updated to describe the "rules.txt" file format and to give some insight on how netPhotoGraphics process rewrite rules. Because of this enhanced functionality the category for rewriteRules has moved from Development to Admin.

The plugin has also assumed the handling and display of Rewrite Tokens. The rewriteTokens plugin has been consolidated with rewriteRules and removed from the distribution.

security-logger

You can now control finer details of what is captured in the security logs. Each security logger filter can be individually enabled or disabled.

Version 1.9

General

The standard .htaccess file has been updated to provide cache expiry headers. This, along with some script loading optimizations, will improve page load performance for your site. The possible down side to this is that is you change JS or CSS scripts you may need to purge your browser cache to see quickly the results of your changes. Standard CSS and JS scripts are now loaded by calling the scriptLoader() function. This function, in conjunction with the new DEBUG setting TESTING_MODE, will insure that these files will be re-fetched by the browser each time a page loads. If you use this function ito load your scripts the above caution is moot.

The suggested robots.txt file has also been updated. A crawl delay has been added and the rules have been enhanced to include any cloned sites reachable from the site root. In addition, sitemap-extended will now comment and un-comment the sitemap url line when you clear/generate the sitemap files. It is recommended that you switch to this version of the robots.text file by deleting your original and running setup. (You may also manually install an edited copy of the source file in the zp-core folder if you have needed additions to the standard rules.)

Site customizations: You now may change the netPhotoGraphics logo to an image of your choice on the General options page. You may also provide a "welcome message" that will be shown to users when they log onto your site.

Image metadata: The software will no longer truncate metadata strings. Even if the field exceeds the length specified by the standard the value will be stored.

The site administrator(s) may now “log on” as any user. This allows them to view the site as that user would see it.

Several themes and plugins have been updated, bug fixes applied, and security issues resolved.

The software will now retry connecting to the database (up to 10 times) if it receives a "Max user connections exceeded" error. This should allow recovery from peek database connection situations such as when setup is running.

The PHP MySQL support library is now marked deprecated. The PHP MySQL was deprecated in PHP 5.5.0 and has been removed from PHP 7.0. The netPhotoGraphics support code will be removed from the next release.

News articles and Pages

A user now may edit any article or page of which he is the author regardless of his managed page/category rights.

Plugins

daily-summary

A plugin which (along with a supporting theme script) will display a summary of images added to your site over a selectable time line. The summary is organized by date and shows which albums were updated. The actual display content is customizable.

Version 1.8

General

With this release, the name of the software has changed from ZenPhoto20 to netPhotoGraphics™.

We have invested in a new version of our language translation utility—­­­PoEdit. This version uses Microsoft Translator for web based automatic translations which should give a better mechanical translations. Still we encourage you to contribute bu reviewing your language in the PoEdit editor and submitting updates for inclusion with ZenPhotoGraphics.

This release fixes multiple bugs and improves performance. For details see the change log.

Plugins

googleTFA

This plugin is a handler for authentication via the Google Authenticator App. If a user has enabled Two Factor Authentication there will be an extra step added to his logon process. After his user name and password have been verified he will be asked to supply the token generated by the Google Authenticator App. If the token he enters is valid the logon will complete.

qrcode

A plugin to print QR code images.

Version 1.7

General

This release fixes multiple bugs and security holes. For details see the change log.

There has been a slight reorganization of the Administrative Overview section. The "Installation information" section is now a separate page accessible from the OVERVIEW fly-out. User information has been added to the Gallery stats display.

Security

The Security, Setup, and Debug logs can be encrypted. This provides additional protection of possible sensitive data in these files. The options to encrypt the logs is found on the Security options page. All encryption requires that the php_openssl extension is enabled.

Note: The log encryption depends on reading the state of an option. So if the log entry is generated before option handling is initialized the entries will NOT be encrypted. This could happen the database is not available such as in the early stages of page loading. In these cases your log may have a mixture of encrypted and unencrypted records. When these are displayed on the Logs page the unencrypted records will be garbled.

A further consideration is that encrypted records cannot be deciphered "off line." You should carefully consider which logs you encrypt.  For instance, the records of a site crash may not be available for analysis until the site is back up and running. This would make analyzing and correcting the problem more difficult. 

GDPR

Some tools have been added to help sites conform to the General Data Protection Regulation. There is a new general option, Usage policy, which if enabled will force viewers to acknowledge your site usage policy.  A new function, policySubmitButton(), will display a checkbox until the viewer has acknowledged the policy (by checking the box.) The "submit" button replaces this checkbox once the acknowledgement has occurred. 

The acknowledged state is persistent. For a registered user it remains until cleared by the administrator. For anonymous visitors it is retained by a cookie so will persist until the cookie expires. (If gallery sessions is enabled it persists for the visitor's session.)

Standard forms, such as the comment form, which may capture user data, implement this button. There is also a new plugin, GDPR_required, that allows you to redirect first time viewers to your site usage page for confirmation before they can view any other content.

GDPR and cookies

Your site usage policy should include a statement about the use of cookies. For best viewing experience ZenPhoto20 uses cookies to save browsing state via the viewer's web client. These are used for such things as remembering logins, policy page acknowledgements, search parameters, form data, etc. Cookies will expire based on the setting of cookie duration. (Some will persist for shorter periods.). A visitor always has the option of viewing and clearing cookie data via his browser settings. None of this cookie information is saved on the web server. It exists only in the web client and fleetingly during page generation on the server.

If use of cookies is an issue for your site they may be avoided by using gallery sessions. With this option in use state that would normally be in a cookie in the client browser will be contained in a PHP session variable. (Note: PHP session handling actually uses a cookie in the web client in order to identify the session variable.) PHP sessions will normally expire when the web client closes, but may persist for less time. Usually using PHP sessions for client viewing state provides an unsatisfactory user experience.

GDPR and IP addresses

The GDPR states that IP addresses should be considered personal data as it enters the scope of ‘online identifiers’. See the description of personal data.

Your site usage policy statement may need to address these uses. They are described below:

Security uses*:

  1. The accessThreshold plugin records site visit frequency by IP address for the purpose of blocking denial of service attacks.
  2. The IP_blocker plugin allows an administrator to manually enter an IP address that is to be denied (allowed) access to the site.
  3. The security log contains the IP address of site which caused the security log entry†.
  4. In the logging of 404 errors to the debug log.

†Except for the security log, there is no direct link between and IP address and a user. Encrypt the content of the security log for further protection of this data.

Uses as a unique identifier*: 

  1. Cached searches
  2. Search statistics
  3. Rating
  4. Recorded comments

*If the php_openssl library is enabled the IP address will be encrypted.

jQuery

We have migrated to jQuery version 3.3 with this release since older versions of jQuery are no longer in support. jQuery v3.3 has several deprecations that require script upgrades. See the jQuery Core 3.0 Upgrade Guide for details. ZenPhoto20 now has provisions to support the jQuery Migrate Plugin or revert (for themes) to jQuery v1.12 via options in the Debug plugin. You may need to set these options to run or update incompatible scripts.

Tags

Tags may now be classified as "private." Within tag administration, private tags are indicated by a highlight, e.g. aTag. Only users with TAGS_RIGHTS will have visibility to private tags. This means they will not show up in tag suggestions, tag clouds, or search results for the general public or for users who do not have TAGS_RIGHTS

Private tags may be used for such things as identifying images for dynamic albums without exposing this organization to the site visitors. For custom search results you may invoke the class search method setSearchPrivateTags() to cause private tags to be found.

Searches

Processing of search strings has been enhances. You may now use the backslash (\) character to escape a quotation thus rendering the mark a literal character rather than the delimiter for a string sequence. For example searching on 123"45&67"890 would normally render a search string of 12345&67890. (The & is treated as part of the string, not the AND operator.) 123\"45&67\"890 would result in two target strings, 123"45 and  67"890, both of which must be present (because of the &.)

There is now a search property named specialCharacters. it is an array containing indexed by character (quotation marks and backslash) If you set the value of a character to false it will have no special meaning in the parsing of search strings. (E.g. $search_engine->specialCharacters['\\]=false; will disable the escape character and treat it simply as a backslash.

Specifying search fields with a bit mask has been deprecated. It is unlikely that this feature is used anywhere as it was from the early days of zenphoto. If a use is detected, a deprecated message will be placed in the debug log.

Plugins

defaultCodeblocks

There are now individual codeblock sets for each object (gallery, image, album, article, news category, and page.) This enables a different default for each. The codeblocks set from prior releases will be imported into each of the object codeblocks that were checked in the Objects option.

GDPR_required

A plugin to require that visitors view and acknowledge a site policy page upon the first visit to your site. The plugin requires a zenpage page object or a custom page script which states the site usage policy. See the plugin usage information for implementation details.

The plugin contains a method GDPR_required::button() that may be placed in a codeblock of your zenpage page or as part of your custom page script. This method will display a policySubmitButton that will redirect to the site index page.

rating

The Disguise IP option has been removed as it is now redundant. The IP address is now always encrypted. It is suggested you clear ratings with this update since old ratings cannot be associated with the originator.

zenpage

There is now an option, News label, to set the "name" of news items. This will allow you to show a different name, for instance "Blog," on your website. The option also changes the rewrite token for news to match. For multilingual sites, the token will be set from the site language string for the option if present. If not it will default to the string for the current locale, the en_US string, or the first language string, which ever is present.

Note: Themes should now use the define NEWS_LABEL instead of gettext("News"). The distributed themes have been updated to use NEWS_LABEL in places where the text "news" appeared. These changes include theme custom menus, but existing custom menus must be deleted and repopulated before the new structures will be used.

zoomImage

Provides a function to displays a zoomable image based on jQuery Zoom by Jack Moore. The viewer may zoom in on the image using mouse or touch/press actions. There are four behaviors for the zooming.

cookieconsent

A plugin ported from the legacy zenphoto to add a cookie notify dialog to comply with the EU cookie law and Google's requirement for Google Ads and more https://www.cookiechoices.org. This is a "light-weight" alternative to the GDPR_required plugin dealing with cookies only.

openstreatmap

A plugin for showing OpenStreetMap maps using LeafletJS for images, images from albums with embeded geodata, or from custom geodata. Ported from legacy zenphoto.

scriptless-socialsharing

A plugin portedc from legacy zenphoto that provides numerous social media buttons. The specific buttons displayed are selectable by plugin option.

Themes

Gray_highlights

This theme has been removed from the ZenPhoto20 distribution,

Basic

The Basic theme now has support for Articles and Pages. Of course, the support is "basic."

Version 1.6.0

General

This release fixes multiple bugs and security holes. For details see the change log.

ZenPhoto20 now provides a fall-back translation facility for cases where a site does not have the PHP gettext module or where translations are otherwise not working. This facility is invoked when ZenPhoto20 notices that the function gettext() is not present. You can disable the gettext module by editing your PHP.ini file. Find the line which reads extension=php_gettext.dll and place a semicolon in front of the text, e.g. ;extension=php_gettext.dll. Note: the PHP module is the preferred translation facility. Using the fall-back comes with some performance loss. Also note that number formatting is controlled by the locale settings, not gettext. If PHP gettext does not work because of locale issues your number formatting may not be correct

Tags

The language tag implementation has been enhanced so that language specific translations of tags can be organized under a "master:" tag. (Presumably this would be the tag in the administrator's native language.) These language "subtags" will be ordered by language and indented under the master tag. When there is a checkbox, the master tag checkbox will also apply to the language subtags.

If the multi-lingual option is set and you create a new tag with a language specified or assign a language to a tag which was previously language independent then subtags for each of the site active languages will automatically be created. The initial value of the tag will be the master tag text with a language indicator postpended. Once created you can edit the subtag text to provide the translation.

Notes:

Tags uniqueness now includes the language. That is the same tag spelling is possible so long as the assigned language is different. Thus it is now possible to have both  the English tag "table" and the French tag "table." However, only unique tags are listed for objects as there is no language association there. So if in the example above, only one instance of "table" will be listed.

plugins

VideoJS

The plugin provides support for the Video.JS video player (videojs.com). It will play video natively via HTML5 in capable browsers. if the appropiate multimedia formats are provided. It will fall back to flash in older browsers. The player size is responsive to the browser size and is is capable of switching between HD and SD video files.

cacheManager

The cacheManager plugin has been updated to properly handle theme options such as thumb crop.Tthe appropriate cache sizes will be registered for the theme based on these options. Prior to this enhancement the themes were assuming cropped images, for instance. In addition, cache sizes will be registered for themes assigned as an album theme. The options for album themes may differ from the basic theme, so separate registration is needed. Album themes will automatically be checked as is with the current theme.

zenpage

The "Truncate at pagebreak" checkbox has been removed from the article edit page. This setting is redundant as content shortening will always occur at a page break so long as there is one before the truncation limit. The article methods getTruncation() and setTruncation() are also removed. These were for internal use only and not needed.

New zenpage links now will have the mod rewrite suffix appended to better conform with SEO friendly URLs. Existing articles and pages will left as they were. However should you want to migrate all titlelinks the titlelinkMigration plugin will provide that function. Coincident to this change, changing the mod_rewrite_suffix on the general options page will also update the titlelinks. See also the note on the titlelinkMigration plugin. Also the unique images option has been decoupled from the mod rewrite suffix .

titlelinkMigration

This utility will add the mod rewrite suffix to all article or page titlelinks that do not already have it as a suffix. NOTE: migration may result in duplicated titlelinks. If that would be the case, the titlelink will not be changed. This occurrence will be logged in the debug log. Should a migrated object be accessed with the old link without the mod_rewrite_suffix the browser will be permanently redirected to the new suffix form. 

reCaptcha, reCaptcha_v2

Google has updated its reCAPTCHA scripts to version 2 and has disabled the old reCAPTCHA methods. ZenPhoto20 now supplies the reCaptcha_v2 plugin which works with Google's new implementation. The reCaptcha plugin has now been removed. 

You will need to register new credentials for reCaptcha_v2 and switch to this plugin. The hidden theme of reCAPTCHA v2 requires modifications to the submit button on the form to function. See the register_user_form script for details on this implementation.

piwik

The name of this plugin has been changed to Matomo in accordance to the same change made by the developers. See the developer's notice. Any settings you have made for piwik will migrate to the new plugin.

lazyImage

This is a new plugin that implements lazy loading of images. Lazy loading is a design pattern commonly used in computer programming to defer initialization of an object until the point at which it is needed. It can contribute to efficiency in the program's operation if properly and appropriately used.  The plugin integrates lazy-load-xt with ZenPhoto20 theme page images. 

class-video

MP3 and MP4 file formats are now (optionally) rendered directly by the plugin using the HTML5 video and audio tags rather than via a multimedia plugin.

Themes

zenFluid by James Brown is now part of ZenPhoto20. This is fluid theme based on the original ZenPage theme.

zpBootstrap has been updated to version 2.0.

Version 1.5.0

General

Several security fixes have been applied. In addition, ZenPhoto20 now traps and logs fatal PHP errors. It an error occurs during setup of a plugin, that plugin is disabled so that the error cannot prevent loading of the administrative pages.

ZenPhoto20 development testing is now limited to PHP version 7. While PHP version 5.2 is still supported, version level compatibility issues may find their way into the source. Zend Technologies support for PHP version 5.6 will terminate at the end of 2018. All earlier versions are already past their support life. (PHP version 6 was never released.) You are strongly urged to move your site to PHP version 7 as soon as practical. We reserve the right to deprecate support for PHP version 5 whenever supporting it becomes unmanageable.

ZenPhoto20 will now check for new releases on GitHub. If a release is found that is newer than the one installed, a download button will appear in the Admin utilities functionss button area. Note: this feature requires that you are using PHP version 5.5 or later.

The register user notify option has been move to the general options page. This option is used by multiple plugins so a global setting is more appropriate.

The backup folder has been relocated to within the data folder.

The shortenContent() function has been rewritten. It will now count only text characters in shortening the string. Before HTML tags were counted as part of the allowed total. Page break handling is now incorporated in the function. Truncation will prefer to happen at a page break indication (<-- pagebreak -->.) This allows for simplification of getContentShorten() which had been including HTML tags in its character count when deciding what page break to select. The $forceindicator parameter has been removed. It really made no sense and was used only by getContentShorten() when it rolled back to a page break. It was also not applied if no shortening was done even though that was the promise in the comment block.

Warnings about configuration changes will no longer be displayed on theme pages. In addition, when the warning is displayed on an admin page a button will be included to dismiss the warning. If you are comfortable that the change does not impact your site you may dismiss it and it will no longer be shown.

Trans-BMP character

The MySQL utf8 encoding supports only Basic Multilingual Plane (BMP) characters. Many recently defined Emoji characters are coded in with trans-BMP codes. E.g. 🎃, 🎭, 💰. etc. For MySql to handle these the data field character set must be set to utf8mb4. Existing ZenPhoto20 installations encode all text fields as utf8 so trying to store a trans-BMP character will result in data truncation at that character as it is not valid in utf8.

New ZenPhoto20 installations will use utf8mb4 encoding on text fields so long as the MySql version of the site supports that encoding. For existing installation that wish to be able to use these Emoji it will be necessary to migrate the database. See the utf8mb4Migration plugin below.

MySQL software version MUST be 5.5.3 or greater is required for support of utf8mb4 encoding.

Social Media Login

Plugins have been added to allow login via Facebook, Google, Instagram, Linkedin, and Twitter. These a drop-down selector on the login form will take you to the respective authorization pages. Alternatively, there are functions for each that will place a login button on your web page wherever you like. E.g. facebookLogin::loginButton(); will place a button on your page that allows the user to login via Facebook. (You can place a button for the normal ZenPhoto20 login via Zenphoto_Authority::loginButton();)

Language translations

We have updated to Poedit version 2 for translating the gettext() strings. This version has a "pre-translate" feature which provides automated translation of strings that have not been manually translated. We have applied these pre-translations to the language files, so more strings will be translated. However the since the translations are mechanical they may not be as appropriate as ones translated by native speakers. As always we encourage native speakers to provide proper translations. 

Admin pages

The tab based menu system has been replaced by a vertical menu bar with pop-out sub menus. NOTE: the name of the back-end css file has been changed to admin‑pages.css. This is because many servers cache css pages, sometimes for days. It would be really hard to use the new back-end menu system with with the old css file. Changing the name insures you get the proper menu system. 

As part of this implementation features have been organized by kind of function. The utilities buttons on the overview page are now limited to "single action" functions, e.g. Reset Ratings. So you will find OVERVIEW sub-menus all provide "statistics" about the site, ADMIN sub-menus provide the general management of the site, etc.

The icons used on the administrative pages have been updated to a more minimal look and feel. In most cases the prior PNG image file has been replaced by a Unicode symbol. Thus the image loads have been eliminated during page rendering. All icons have been reviewed and made internally consistent.

News articles

The Previous and Next article links on theme news pages will now honor the category of the article. If you view a list of articles in a news category and click on the link to a specific article the previous and next article links for the article will show only articles within the originating category.

plugins

utf8mb4Migration

This plugin has been provided for sites that wish to migrate to utf8mb4 encoding on text fields such as the Description field. A button to perform migration will be placed in the Development area of the admin home page.

You should always backup your database before attempting this migration. utf8 is a subset of utf8mb4 so all data should migrate successfully. HOWEVER it is possible that the database contains characters which are invalid in utf8mb4. This could cause the migration to fail or to lose data.

menu_manager

A new menu item type has been added so that menu html can be generated dynamically. This allows links to use constructs that need to be evaluated when the page is being viewed like, for instance, language dependencies. Menu type dynamiclink allows you so specify PHP code for the link. This code is evaluated when the link is generated. The result of the evaluation should be a well formed URI.

rating

Rating now has an option to use a binary like/dislike system. If this option is chosen, visitors may vote "like" which will give a rating vote of one or "dislike" which will give a rating vote of zero. Needless to say, if you switch to this rating system you should first reset your previous ratings if you used more than one star.

You may also choose between small, medium, and large voting icons.

elFinder

elFinder will now properly deal with case sensitivity. Image suffixes are case insensitive and for case insensitive files systems so are file/folder names. File and folder visiblity issues have been fixed for users who do not have ADMIN or FILE rights.

tinyMCE

The problem whereby page and news forms were deemed dirty if tinyMCE was enabled has been mitigated. The fix requires that the form be "Reset" after tinyMCE is done rendering the the text. This may take some time and the form will look dirty until the rendering is complete. So if you try to leave the form too quickly after it is rendered you will still get the warning. If this is still too sensitive you can exclude tinyMCE from Dirty Forms check via an option on the General Options page.

federated_logon

This plugin has been removed and replaced by individual login plugins. federated_logon was implemented using a version of OAuth that is no longer supported by the major players. It is now available in the ZenPhoto20 development repository for anyone who still wishes to use it. Place the files in the user plugin folder as with other example plugins.

Themes

effervescence+, garland, zenpage, and zpEnlighten

Themes that created custom menus did not provide for language translations of the title of the links.

In addition, he effervescence+ default custom menu generated static RSS links. This was inappropriate for visitors viewing the site in a language different from the site default language. This have been corrected by using the new menu manager dynamiclink items.

These fixes will not be automatically applied in case you have made modifications to the custom menu. If you have made no modifications, you can simply delete the theme menu and view the theme's option page which will cause the custom menu to be regenerated. If you have modified the or duplicated the menu and use RSS feed links you will need to make the appropriate changes to your custom menu.

Version 1.4.0

General

This is mostly a bug/security fix release.

The Zenphoto20 site configuration details HTML comment is no longer displayed unless the build is marked as a Debug Build.

Various JavaScript scripts have been updated to their current versions. 

Zenphoto20 no longer uses (or displays) the GitHub release id. The current release methodology insures that the version number changes whenever there is an update made to the master.

Admin pages

The admin pages have been made a bit more responsive. There is also now a "back to top" button that will float down the right hand side if you scroll the page. This lets you easily scroll back to the page start.

The presentation of multi-lingual edit fields has been re-done to make editing more convenient. Instead of a list of languages that you must scroll to the one you wish to change a drop-down of language selections will be presented over a single editable field. Select the language you want to change and its content will be in the editable field.

Note: All the enabled language flags will be shown. As of the 1.4 release this is nineteen languages. You should disable any languages you are not translating in order to reduce the languages shown. (Reducing the number of languages will also speed up admin page loads, specially when the TinyMCE plugin is enabled since there will not be so many fields to render.)

As a result of the above change, the $ullist parameter to print_language_string_list() has been deprecates as there is no longer an UL list of language fields.

The colorpicker custom option has been updated to use a newer more compact color pallet picker JavaScript.

The erroneous "Are you sure you want to leave..." action for when a form has not been changed has been fixed.

Themes

PARADIGM by Olivier Ffrench has been added to the theme distribution.

Several themes which have selectable "theme colors" have been enhanced so that themeSwitcher will allow selection of the color.

Plugins

downloadList:

Added the ability to download images found by a search.

googleMaps:

Add option for the googleMaps API key.

purgeOptions:

Improved the layout of the Options:Purge tab for better space usage. Added posting a Setup request when options for an active (not missing) element are purged so that the element may re-establish its default options.

themeSwircher:

When a theme does not have a script for the current page the selector for it in the drop down list will be disabled. This avoids the 404 error if the theme were selected. Duplicate theme names are more gracefully handled by showing the version in the drop down.

user_mailing_list:

The messages will be sent asynchronously to each user selected. There will be a delay between sending each mail to minimize load on the  mail server and reduce the possibility that the mail stream will be flagged as SPAM.

Version 1.3.0

Performance

The number of SQL requests executed on a front-end page load have been significantly reduced. Frequently executed query have been cached so that the results are delivered without re-executing the query. Default options are set only when setup is executed. Checking for scheduled object publish state changes now happens on the cache-expiry frequency.

If a page is loaded from the cache there will be only the hand full of queries needed to establish the page context.

As part of this implementation a new mechanism is provided to force image processing on any un-cached image link that is found during cache processing of a page. When the page is next loaded it will be "clean" and therefore a cache image will be created.

Setup

Plugins and themes are now passed a &from=version parameter giving the version number of the previously installed release. This can be used to condition such things as migrating to new theme/plugin features.

The mechanism for migrating database changes had been improved to speed up the setup process. The ZenPhoto20 package now includes a template of how the database should look. Previously whenever a change was made to the database the code in setup had to be manually changed to reflect the changes both to fresh installations and to updates. Over time the list of SQL statements setup needed to execute to insure that the database was correct had become excessive. The queries were executed each time setup was run but in general did nothing since the database structure has been stable for several releases.

Now when updating an installation there will not be any SQL statements issued unless there truly has been a change to the database structure in the new version of the software. 

There are now comments set for any database field used by ZenPhoto20. For a "normal" site all the database fields will have comments. It is possible that your database contains fields used by previous instances of the software. If that is the case, these fields will have not have a comment. You can safely drop any such field that you did not specifically create. (If you did create such a field manually you should consider using the customFieldExtender mechanism to implement the additions so that they conform to the new paradigm.)

Plugins

accessThreshold:

If you are experiencing denial of service attacks from specific networks this plugin may help mitigate the problem. The plugin monitors front-end page requests and tallies them by IP address (or sub portion thereof.) If the request threshold is exceeded script loading will stop without sending a response.

fieldExtender:

The base class has been extended to allow custom field extender plugins to assert that fields should be added to the search list by default. Fields may also be added to bulk action drop-down lists. See the fieldExtender comment for details. The "get" and "set" methods for custom fields are now defined for the object. E.g. you can use $obj->getXXX(); and $obj->setXXX('data'); to access and update the fields.

customData:

This plugin has been moved to the User Plugins folder and is no longer actively supported as a ZenPhoto20 plugin. If you have need of custom fields in your database you should create a version of the customFieldExtender plugin to define unique fields for your use.

seo_locale:

This plugin is now merged with the dynamic-locale plugin. This consolidates language selecting link options in one location for easier management.

LDAP_auth:

Implements logon to ZenPhoto20 using an LDAP server. Options allow mapping of LDAP posix style groups to ZenPhoto20 groups.

NOTE: plugin based authentication scripts are not enabled during Setup processing. You will need to define and maintain a ZenPhoto20 master user to install ZenPhoto20.

Version 1.2.0

Plugin option edit tab

There is now a link to the next and previous plugins (alphabetically) at the bottom of the plugin option page.

Admin tab consolidation

The Debug plugin subtabs have been consolidated with the Development subtabs to reduce the number of administration tabs. In addition, the plugin categories have been revisited. MacroList, rewriteRules, and rewriteTokens have been moved to the development category.

tinyMCE:obj insertions

The object insertion mechanism has been extended to add inserting MEDIAPLAYER and SLIDESHO macros. MEDIAPLAYER macro insertion is available for video type images. SLIDESHOW macro can be inserted from album selections.

News articles

The state of being not categorized is really also a category. ZenPhoto20 now recognizes this in the category selection drop down on the news tab. Selecting Un-categorized will show all articles that do not have a category assigned. Un-categorized is now also a managed news category.

Restrictions have been added to prevent users without appropriate management rights from creating news articles in a category they do not have management rights to. This includes the un-categorized category.

Display Character Set

Websites will now use the UTF-8 character set exclusively. This simplifies a number of things and keeps users from "getting in trouble" if they attempt to change the characterset option setting. If it is really necessary for a site to display with a character set other than UTF-8 you may define the display character set in the configuration file.

Theme appearance improvements

The link that exposes the admin toolbox has been changed to a gear icon to minimize its presence on theme pages. Likewise the themeSwitcher plugin now shows a menu icon rather than the full selector. Clicking on the menu icon exposes the theme switching selections.

Third party themes which style the admin toolbox may need to change their styles for the main link to take full advantage of this appearance improvement. If the theme is relatively "standard" all that is needed is to delete the #admin and #admin_data styles from the theme CSS as ZenPhoto20 will load a default CSS for the toolbox.

As with other theme oriented files, themes can place custom versions of images/gear.png and themeSwitcher/menu.png in the theme folder to customize the icons shown. There is also a new filter--iconColor-- to allow selection of different colored menu and gear icons if the theme has configurable background colors. An example of this filter can be found in the basic theme and the effervescence+ theme.

Album sort order selection

Album and subalbum sort order may now be chosen from a selector on the album tabs.

Tag handling for albums mass-edit and multiple image tabs

The ability to add tags to albums and images has been extended to the multiple item tabs. Previously this function was removed due to problems with some PHP installations where the amount of data "posted" when the apply button was pressed exceeded the capacity defined by the server. This resulted in not being able to save from these pages unless the number of items per page was reduced. (An option not available for the album mass-edit tab.)

It is now possible to add tags to items on these pages.No list of possible tags is shown since that might cause some of the above issues. But tag_suggest will make suggestions from the existing tag list and you can create new tags by simply typing them in the add tag field. Individual tags cannot be removed. However you can elect to clear existing tags so only those you add will be present after the apply button is pressed.

Database storage for image metadata fields

ZenPhoto20 now allows for database columns for image metadata to be optional. You can reduce the size of image database records by marking the ones you do not need do not process on the image options tab. When setupis run it will add or remove fields based on this setting. There is an additional checkbox on that tab, Mark unused fields do not process, that will cause ZenPhoto20 to examine the database for metadata columns that have not had any data stored. These are then marked do not process. Before using this option you should insure that you have a representative set of images and have refreshed their metadata so as to not remove columns that you might want.

The class-video and xmpMetadata plugins will create database columns for their metadata only if they are enabled when setup is run.

You may see a "configuration change" notice when you change the state of these options. This will indicate that a setup request has been made (and by what process.) This is a reminder that the change will not take effect until you have run setup so data that might be stored in these fields may not be saved to the database.

Plugins

cloneZenphoto:

This plugin is now presented by an administrative tab rather than a Utilities button. The tab will list links to existing site clones for easy reference.

galleryArticles:

The body of the article created is dynamically fetched from the description of the object. Previously it was captured at the time the article was published so did not track changes to the object's description. In order to accomplish this galleryArticles declares a macro named GALLERYARTICLEDESC.

tagsFromMetadata:

This plugin will allow you to select specific metadata items from an image and set the values of these items as tags for the image. So, for instance, you can select EXIFMake and all your images will be tagged with the camera manufacturer's name (provided that camera does record that metadata item.) Tags will be created in each enabled language provided there is a unique translation in that language for the item.

tagFromSearch:

This plugin provides a means to tag objects found by a search. In addition, it (optionally) forces searches by visitors and users without Tags rights to be limited to the tags field.

Thus you can apply a unique tag to results of a search so that they are "related" to each other. If you have selected the optional Tags only search normal viewers are limited to searching for defined tags.

debug:
markRelease:

The markRelease plugin has been consolidated into the debug plugin. In addition the functionality of the Mark release button is extended by plugin options to allow you to refine the debugging options that are set.

ipBlocker:

The plugin has been extensively rewritten to improve both performance and reporting of its actions. A new capability is added to monitor 404 errors and suspend ip address that generate them too quickly.

tinyZenpage:

This plugin is permanently removed. Its functionality was replaced by the tinyMCE:obj plugin.

Image rotation fixes

The original zenphoto code that handled image rotation was confused about the meanings of each of the EXIF orientation values. This was originally mitigated by also being confused as to how the GD library rotations worked. These two errors offset each other. But then the Imagic library was implemented. It rotated images in the opposite direction from the GD library.

Then someone noticed that GD rotated in the opposite direction from zenphoto's assumptions and "fixed" the code. This broke situations where a camera recorded the image rotation instead of just rotating the image as is normal.

We have now fixed the implementation to be true to the specification. Camera set rotations now will work correctly. Unfortunately the downside of this is if you have "fixed" your images on the prior software they may now be improperly rotated. You should re-import the image metadata or select the correct image rotation on the image tab.

News article sort order selections

You may now select ordering by Published date, Last change date, and Expiry date in addition to the original creation date and title orders. Creation date (or Last change date) are now shown in addition to the Published date.

Security

Plugins are now required to register functions they wish to be called via the admin utility button action. The function name must be stored in the $_zp_button_actions array. Actions not registered will be ignored.

Tightened up the PHP theme editor so that it is restricted to editing only files within the theme.

Fixes a hole whereby a hacker could cause your setup scripts to become unprotected.

Fixes VN: JVN#68452022 / TN: JPCERT#95351432

Fixes some strings that were not encoded before display.

Version 1.1.0

New theme

zpBootstrap—a responsive theme by Vincent Bourganel has been added to the distributed themes set.

Tag lists will reflect published state of the object

Tag suggestion lists and html_meta_tags keywords will not be gated by the published state of objects. Specifically, if the site viewer is not logged-in then tags associated with objects marked unpublished will not be included in the counts. This means, for instance, that if a tag is associated only with unpublished objects it will not be included in these lists. Note: object hierarchy is not applied in this for performance reasons. Thus for instance tags of published images in an unpublished album will be included.

Rationalization of published states

The show() method of all objects now correctly reflects if the object is currently published. The show() method for objects which have a future publishing date will return false until the publishing date has occurred. At that time true will be returned. For objects that have expiry dates, once that date has passed the object will become unpublished and the show() method will return false.

If you explicitly publish an object that has expired or whose publish date is in the future then the expiry and publish dates will be cancelled.

This means that the database show column is the sole arbitrator of whether an object should be visible to the general public.

Dynamically translatable image metadata strings

Prior to this change, when metadata was imported from an image, text strings describing the data were translated in the language of whomever was viewing the image when it was first discovered. This data was then stored into the database for future display. The result of this defect was that these strings were often in the "wrong" language for the current viewer.

The string translation is now delayed until the data is about to be displayed. This insures that the current language will be used for the translation.

Please note that metadata collected before this change will have been statically translated and cannot be re-translated. You should perform a "Refresh Metadata" operation to get existing metadata updated to the dynamically translatable form.

Tag handling improvements

Stored tags no longer are quoted if they contain special characters. This allows them to be suggested by typing the fist character. The database is automatically updated during setup and metdata importation will insure that tags are not quoted.

The tag_suggest target tag selection algorithm has been re-written for performance improvements. You would see these as browser slow-downs when you type in the textbox of the search form or the tags textbox on the admin pages.

There is also an option for tag suggestions on theme pages. This option allows you do filter tags so that only frequently used ones are suggested. You set the option to the threshold usage count and only tags used at least that number of times will be offered as suggestions.

Spelling correction in tinyMCE

A plugin is provided to enable use of nanospell with any tinyMCE editor window. NOTE: nanospell is NOT included with ZenPhoto20. Use of nanospell requires a specific license for use so you must select the appropriate license/download. Instructions for installing nanospell are included with the plugin documentation.

Search tag selection

An "all" checkbox has been added to the search form to more conveniently select a small number of fields from a larger list.

ZipArchive

ZipArchive is a PHP module for processing Zip files. If this module is configured in a sites PHP build ZenPhoto20 will use it rather than loading third party Zip file handlers.

Extended security question foils

Security question foils (those questions asked that were not supplied by the user) are an important security feature. If only valid security questions are presented then hackers can tell if they have successfully guessed a user id and will know that there is an answer to the question. Thus it is only a matter of guessing the answer which can often be done by examining publicly available information about the user.

There are two enhancements to security questions implemented now. First, the administrator may create as many foils as he wishes to increase the work a hacker must do to try to hack an answer. Second, security questions provided by other users may be presented, again increasing the work of hackers.

Checkbox toggle for search fields

The search form now has a toggle to check/un-check all search fields. This makes it easier to search on a limited number of the possible fields.

Mouse click minimization

When you "apply" changes on admin edit tabs you will now be returned to the page that launched the edit. That is if you use the front-end admin toolbox to edit an image the apply button will return you to the image page. If you got there from the "Edit all image data" link you will return to the page of images. This behavior is cancelled if any errors occur.

Performance enhancements

Code optimizations have been applied as indicated by the XDebug profiler.

New dropdown selector on the news articles page

There is now a drop-down selector to allow showing articles of a specific author. In addition, the "data" selector has been fixed to work when a category is also selected.

Added support for tablets

The touchPunch plugin is now available to enable touch drag and drop for image, album, and page sorting.

Dynamic album enhancement

There is now a facility to manually create a dynamic album. In this case an administrator directly enters the search criteria rather than capturing it from a search.

Wireless Application Protocol Bitmap support (GD library)

The GD library will now recognize wbmp (wbm) files. This change removes bmp (which the library does not support) from its list.

Favorites plugin enhancements

A new function, favorites::listWatchers(), is available to assists in output of users watching an object. The plugin now uses a DL list to show the watchers on the administrative tabs.

Resizable language string input areas

If the Multi-lingual option is selected text input areas such as page and article content fields can be expanded by dragging on the resize handle at the lower right of the field. If tinyMCE is enabled the individual language edit boxes expand giving the ability to see multiple language translations at a time.

TinyMCE language directionality

Normally TinyMCE will set the language directionality based on the language in effect. E.g. if the language is Persian, Arabic, Hebrew, Hindi, or Urdu the language direction will be right-to-left. Otherwise it is left-to-right. There is now an option to override this setting and force right-to-left for those cases where this selection is not appropriate. In addition the tinyMCE editor has buttons (where selected) and tool settings to change the text direction.

Download for dynamic albums and favoitied

The downloadList plugin now supports "album zips" for dynamic albums and for the user's favorites.

Sub-rights for pages and news categories

Users may now be given "view-only" rights to pages and news categories by un-checking the edit sub-right of the object in the managed objects list. You can also allow users to view un-published items that are members of a category or offspring of a page by checking the view unpublished checkbox (either for the managed object or the global setting.)

Optional Object Fields

Many of the fields associated with album, image, article, and page objects are now optional. The standard configuration is provided by the optionalObjectFields plugin. If you want none of these fields, simply disable the plugin. If you want your own subset of the fields you can make a copy of the optionalObjectFields plugin in the plugins folder. Edit the array in the fields() method to remove the elements of the fields you do not want supported. Run setup and the fields will be gone.

Multi-llingual custom field npgCore/extensions

The custom field extension feature now supports multi-lingual fields. It also allows you to provide custom formatting on the admin tab and custom processing of the "saves" data.

User management improvements

User and group lists are now sorted via a case insensitive natural sort. In cases where there are check boxes, those users with the box checked are shown at the top of the list.

Cloning improvements

When you clone an installation ZenPhoto20 will automatically setup the configuration and initial user of the clone. The initial user will be the user who executed the clone operation. He his logon to the clone install will be identical to the his logon to the master when the clone was created.

If setup is run on the master it will provide a set of links to allow setup to be run on the clones as well. Thus the setup of a site is better automated. (We did try automatically running setup on the clones but ran into several browser issues such as pop-up blockers that were not circumventable.)

When you change the site state of the master site (close, close for test, open) the change will be applied to the clone sites as well.

Canonical URLs

ZenPhoto20 _rewrite_ processing will now cause a "301 permanently moved" redirect if it receives a link that does not conform to the Canonical standard it implements. Basically this means that links that "look" like indexes to sub-items (albums and the News index, for instance) will end with a trailing slash. Items which are interpreted as "final destinations" (An image or single news item, for instance) will not have a trailing slash.

New plugins

Bug Fixes

As usual, I have fixed bugs found while implementing these features and ones reported on the Zenphoto.org forum that were applicable to ZenPhoto20.

Version 1.0.0

Fresh start

ZenPhoto20 has been forked from the Zenphoto.org 1.4.6 release. Some cleanup of code and fixes have been applied and some small new features added. Themes and plugins that are compliant with Zehphoto 1.4.6 (without use of the deprecated-functions plugin) will work with this software.

Note: part of this cleanup was to purge the deprecated functions for a fresh start. Lingering calls to these functions will now result in a PHP fault. If you have a custom theme it is recommended you first use the check deprecated use button in the Zenphoto 1.4.6 admin utilities to be sure that you are not using one of the functions which is no longer available.

Eliminate the concept of "supported" unsupported themes and plugins

Instead of having a repository for "unsupported" scripts and themes we will include then in the package. Example plugins will reside in the plugins folder. New themes will, of course, be found in the themes folder.

Newly included themes: gray_highlights (an albums only theme), zpArdoise, zpEnlighten, zpfocus, zpminimal, zpmasonry, and zpskelleton.

Newly included example plugins: cacheHeader, cookieInvalidator, create_album, customFieldExtender, disableAction, disableWatermark, filter-fileSearches, galleryToken, headConsolidator, no_show, pluginEnabler, showNoUserRights, single_album, and text_watermark.

Inclusion of other themes and plugins will be considered by request.

New release packaging

Each "tagged" release includes a zip file containing a self-extracting installation script. This file is about one third the size of the individual source files (of which there are about 2000.) So uploading a new release is considerably faster.

Running the script extracts the release source scripts and then starts the setup process. This work flow is less prone to such things as mis-matched versions of the individual files or overwriting album files.

Suffix-less image links

If you use mod_rewrite with a mod_rewrite suffix and your image names are unique in their prefix you can select the option Unique images on the general options tab so that your image page links will not include the image suffix. For instance if your mod_rewrite suffix is .htm then the link to the image myalbum/myimage.jpg will have the link myalbum/myimage.htm.

 

tinyMCE:obj plugin

This plugin replaces tinyZenpage as the preferred means for inserting ZenPhoto20 objects into tinyMCE editor windows.

On the back end each object has a "pick" icon (add) that you use to select the object. The overview lists also have a pick icon for each object, so it is not necessary to browse all the way to the object's tab.

Click on the icon to select the object for pasting. Then go to your tinyMCE editor window, place the cursor where you want the insertion, and select either the tinyMCE:obj paste button on the toolbar or the tinyMCE:obj dropdown from the Insert menu item. This will bring up the tinyMCE:obj handler. Select any options you wish and press the paste button.

You can even paste custom sized/cropped images. When you have selected an image object a link is included that takes you to a "cropping" page. Set up the image crop as pleases you, click on the "Done" button and you will be back in the tinyMCE:obj window with your custom cropped image ready to insert.

Copy-able object links for all objects

A side benefit of the tinyMCE:obj implementation is that you can also use your clipboard to copy and paste links to spots other than tinyMCE editors.

The administrative tabs for Page, News articles, category, Image, and Album objects now provide link text that can be copied to the clipboard and pasted wherever desired. (For instance into the content of a News article.) In the case of Images, the crop image function will give a link that will produce the cropped version of the image. These latter are easily inserted into your News article and Page contend by the tinyMCE:obj insert image feature.

Purge option for theme and plugin options

This feature provides a convenient means to remove options of deleted and forgotten themes and plugins. Of course it also allows you to "start from scratch" on current ones.

Custom option handler NUMERIC type option.

Allows themes and plugins to specify that an option be numeric. This allows a shorter input field. Also the data is validated as numeric when updated.

Favorites albums

Create albums from your favorites that can be viewed by others. Favorites albums are essentially "dynamic" albums with the criteria being the selected favorites instance.

Improved deprecated function handling

Use of deprecated functions is now logged rather than indicated by a PHP notice. This of course presumes that the deprecated functions plugin is enabled.

These errors are logged in a new deprecated log to separate them from other issues and make them easily findable. Only one instance of any particular use of a deprecated function is logged, so the log is not cluttered.

Improved "dirty form" handling

We have switched the JavaScript that detects form changes and warns if you leave the page. This script better integrates with the tinyMCE editor. This implementation also recognizes "clean" links--that is links that do not actually leave the page. You will not be warned unnecessarily when clicking these links.

elFinder Theme editor

If enabled elFinder will be used to edit themes.

Image metadata transformation option

There is now an option to allow newlines in image metadata to be converted to <br /> tags. This option applies to any metadata destined to the ZenPhoto20 description or title database fields. The raw metadata is left unchanged. This transformation occurs when a new image is discovered or if medadata is refreshed.

Plugin tabs

The tab categories of plugins have been reorganized and simplified. In addition, a new tab "enabled" has been created to list all enabled plugins regardless of their category.

Language specific tags

Tags may now be assigned a language on the tags tab. If a tag is associated with a language it will not be displayed unless the viewer's language matches the tag language. The default is for tags to be visible in all languages.

Along with this change comes two new sorting orders for the tags tab. Tags can be sorted by language and most recently added as well as alphabetically and by use count.

General unification of objects and names

There was considerable inconsistency in both the naming and the methods used in zenphoto objects. We have made progress in making things more uniform. But don't fret. If you have custom plugins or themes from zenphoto version 1.4.6 or later there is a zenphotoCompatibilityPack plugin that will keep them running just fine.

General bug fixes

I have fixed multiple bugs discovered either in my efforts to provide the above or from discussions on Zenphoto forums and tickets.

New plugins