This release requires at least PHP version 5.6; please make sure you have this before upgrading.

You should rebuild your index due to the new Solr version and minor schema changes (see also the schema changelog).

Be sure to run a database upgrade to reflect newly added tables (see also the database changelog).

Newer versions of Zend Framework no longer support the ServiceLocatorAwareInterface. Many services in VuFind have been refactored to receive their dependencies through their constructors, and many factories have been adjusted accordingly. You should review any custom services/plug-ins you have built and adjust them as needed. Also note that getServiceLocator() should no longer be used in controllers; instead, access the serviceLocator property directly (or better yet, refactor controllers to use dependency injection so that they do not need direct service locator access at all). For some examples, see pull requests #900, #909, #910, #918, #919 and #929.

VuFind's built in statistics-gathering functionality has been removed; it is recommended that Google Analytics or Piwik be used instead, as these are more scalable and feature-rich. The old code can be restored from a legacy branch in Git if actually needed.

Row gateway objects are no longer constructed by table gateway objects; instead, they have their own plugin manager. If you have customized any database row classes, you may need to adjust your configuration.

A new RecordDataFormatter view helper has been introduced to help make displays of tabular record data more configurable. This should make many common customizations easier to maintain while also allowing more granular customization on a per-record-driver basis; however, it also adds a learning curve to customizing some templates. See the wiki page for technical details. If you have custom record driver templates, they may need to be updated. (See also this commit, which changes the way authors and their roles are rendered, and this commit, which finalizes the return format of the helper).

The UrlQueryHelper used for generating query parameters for VuFind searches has been significantly revised for more flexibility; see pull requests #850 and #851 for details. Most significantly, the removeFacet() method has had its parameter order changed, requiring adjustments to the TopFacets.phtml and SideFacets.phtml Recommend templates.

Some CSS styling and HTML structure has been revised in the Bootstrap-based theme to simplify markup; you should double-check your custom templates against the core versions to be sure they are in sync (see also, the css changelog).

Some HTML markup related to the search box has been changed; previous VuFind versions had some responsive design features that required two copies of the search box to be included on the page. This caused problems, so the box has been reduced to a singleton. See this pull request.

The data-lightbox-onclose and data-lightbox-onsubmit attributes no longer support arbitrary Javascript code; instead, for better security, you must pass in a function name. See the lightbox page and this pull request for more details.

Some HTML markup has been revised to use the form attribute to reduce the possibility of problems related to nested forms. See this commit for details.

Encryption functionality has been changed to use OpenSSL instead of the obsolete Mcrypt module. For most users, this should be a seamless change. However, if you are using a custom encryption method other than aes, blowfish, des, camellia, cast5 or seed, you will need to convert to one of these methods prior to upgrading. See pull request #895 for details.

Google Maps support has been removed; use the more robust OpenLayers functionality instead. Additionally, some Solr schema changes have been made related to geographic features.

The Voyager ILS driver now connects to the database more efficiently, and the $db property has been eliminated. If you subclass Voyager or VoyagerRestful, you must change all $this->db references to $this->getDb().

The Voyager/VoyagerRestful ILS drivers now block patron login if the barcode status code is not 1 or 4. If your Voyager installation uses non-standard codes, you can configure this in the relevant driver .ini file. See this commit for details.

The getAllSubjectHeadings record driver method has been given a new $extended parameter, and some implementations have been refactored to improve extensibility; if you have customized this method, see this pull request for details.

The format for search tab data used by the SearchBox view helper has changed slightly to accommodate placeholders; if you have customized tab functionality, you may wish to consult this commit.

Due to changes in the zend-mvc component, the 'viewmanager' service is no longer used to retrieve view-related dependencies; instead, relevant components are retrieved directly using direct service names: 'ConsoleRouteNotFoundStrategy', 'ViewResolver', 'ViewRenderer' and 'ViewHelperManager'.

Some integration details for the zend-eventmanager component have changed to support the 3.x version; see this commit for details.

Link Resolver Drivers have been restructured; the DriverInterface now supports some new methods, and an AbstractBase class has been introduced to provide useful default implementations. If you have a custom link resolver driver, you will likely need to update it.

VuFind no longer ships with BeanShell indexing scripts for SolrMarc; these are redundant now that the Java code for custom routines is bundled with VuFind and compiled on-the-fly. The Java code has been refactored for ease of maintenance/readability. See SolrMarc: Custom Java Best Practices for some advice on managing your own custom Java. Note that you can still use BeanShell scripts if you wish – but switching to Java will improve performance.

A new version of the ReCaptcha library used by VuFind has been installed; some details have changed, so custom ReCaptcha code may need to be adjusted; see this commit and this commit for details.

If you use the @parent_yaml setting in any of your YAML files, you must put the setting name in quotes – e.g. change @parent_yaml: “file” to “@parent_yaml”: “file”. This is necessary to comply with stricter syntax checking in the latest version of the Symphony/Yaml library.

VuFind's session cookie is now VUFIND_SESSION by default, instead of the generic PHP_SESS_ID. This can be configured through the session_name setting in config.ini. This will prevent data contamination during upgrades, since some Zend Framework objects have changed. See this commit.

A new service has been created for saving favorites, instead of allowing the record driver object to handle this functionality; see this commit for details.

The VuFind\Log\Logger is now built and configured by a factory; built-in self-configuration logic has been removed. If you have customized the logger, see this commit and rearrange your code accordingly.

The $left property of VuFind\View\Helper\AbstractLayoutClass and its subclasses has been renamed to $sidebarOnLeft for clarity. If you have created a custom subclass, you may need to make adjustments.

For clarity of naming and consistency with current Solr examples, the default Solr configuration has been changed so that the Terms component is accessible at a /terms URL instead of the old /term. This is only used for sitemap generation and should not cause any problems as long as your solrconfig.xml comes from the same version as the rest of your VuFind code.

Switching VuFind into “ILS offline” mode has been significantly redesigned to detect a broader range of possible problems; this should not introduce any backward compatibility breaks (unless you are overriding the VuFind\ILS\Connection class, which is unlikely), but it may cause VuFind to behave differently under some failure scenarios. See this commit for details.

Command line utilities now make better use of native Zend Framework routing, and the custom VuFind-specific filename-based router has been eliminated. See this pull request.

The logic for dealing with account blocks in the ILS driver has been revised. If your ILS driver uses the special 'block' value when handling requests (holds, recalls, etc.) it will need to be revised to implement the getRequestBlocks method instead. See this pull request.

The format of the data array returned by the \VuFind\ILS\Logic\Holds class (usually accessed through the getRealTimeHoldings record driver method) has been revised; it now contains 'blocks' and 'holdings' keys instead of simply consisting of holdings. Custom templates may need to be adjusted to match.

\VuFind\ILS\Driver\VoyagerRestful::getRemoteCallSlips has been renamed to getCallSlips and given a parameter to allow optional retrieval of local as well as remote slips. This should only affect you if you have subclassed the VoyagerRestful driver and customized functionality related to callslips.

\VuFind\ILS\Driver\Voyager::processHoldingData has had the default value of the $patron parameter changed from false to null; if you have subclassed the driver and overridden this method you should adjust to match. See this commit.

The “terms” method of the Solr search backend has been made more flexible, but it should be fully backward-compatible. See this commit for details.

Some no-longer-used custom indexing code/configuration related to an obsolete OCLC system serving LC name authority records has been removed. See this commit.

The default holdings_grouping setting in the [Catalog] section of config.ini has been changed from “holdings_id” to “holdings_id,location” for improved accuracy (most users will be unaffected).

The checkILLRequestIsValid / checkRequestIsValid / checkStorageRetrievalRequestIsValid ILS driver methods now can optionally return an array with a custom status message. This does not break backward compatibility with the old boolean return values.

Some status-related blocked*Action() controller methods have been eliminated, as they are no longer needed.

Release 3.1.2 - 1/16/2017

Release 3.1.1 - 10/31/2016

Release 3.1 - 9/26/2016

New optional mechanism to explore/sort facet lists (currently supported for Solr and Summon). See this pull request for details.

New optional “asset pipeline” to combine and compress CSS and Javascript files for improved performance. Off by default; see the new asset_pipeline setting in config.ini (and this commit) for details.

The SolrMarc indexing tool has been upgraded to version 3.0.1, a major release that adds greatly improved performance and significant new features.

Indexing of MARC relator terms has been improved.

New optional feature (off by default) to dynamically embed full record information into search results and favorite lists instead of loading a separate record page. See this commit for details.

Improved geographic functionality: existing Google Maps functionality has been updated to reflect API changes, and new experimental OpenLayers-based modules have been added which include more robust features. See pull request #722 for details/history.

New (somewhat experimental) KohaILSDI ILS driver, which uses Koha's ILS-DI API for augmented functionality. The plain Koha driver still remains for users with older Koha systems that do not support the API.

New PAIA ILS driver, implementing the PAIA specification as an extension of the DAIA driver.

Optional setting to link displayed call numbers to a specific browse index. See this commit.

Added optional first/last navigation to supplement next/prev navigation on the record page (for moving through the current set of search results); see the first_last_navigation setting in config.ini.

Tag search now supports wildcards.

Support for faceting authority records using new RDA values.

Improvements to web accessibility within Bootstrap3 theme.

Sidebar facet lists now stay collapsed/expanded across searches/pages for more consistent user experience.

Frequently used record tabs may now be auto-loaded in the background to improve the user experience (this is off by default but can be configured through module.config.php – see this commit for details).

Optional support for the Solr MoreLikeThis handler allows similar item results to be displayed for sharded indexes; see this commit for details.

The Voyager and VoyagerRestful ILS drivers are no longer dependent on the poorly-supported PDO_OCI PHP module.

Search specification YAML files now support a @parent_yaml property for manually-chained inheritance.

Possible backward compatibility breaks:

The new release of SolrMarc has been designed with backward compatibility in mind, but because it is a major revision, watch carefully in case of backward-incompatible changes. As of this writing, the only known differences are some minor changes to the handling of punctuation in the topic and title_sort fields, both of which seem to improve results slightly. Also note that the log4j configuration has been adjusted, so if you have customized your own logging settings, these may need to be re-examined.

Indexing of relator terms has become more complex to support the rich data available in some records. If you see warnings during indexing time about “Unknown relators” you may need to make some adjustments to the author* settings in marc.properties and/or the synonym mappings in author-classification.ini. See comments in both of those files for details.

Removed getController() method from the Record view helper; this has served no purpose since VuFind 2.4.x, but some meaningless references to it have lingered in templates through 3.0.x. Remove any references from your local custom templates!

Search result and list templates (result-list.phtml and list-entry.phtml in record driver template directories, plus the wrapping templates/search/list-list.phtml) have been switched to use Bootstrap's media objects. Visual anomalies may occur if custom templates are not adjusted to utilize new styling. See this commit for details.

Tags are now case-insensitive (and displayed in all-lowercase) by default. This works around some strange MySQL behavior in previous releases, but it marks a change in behavior for PostgreSQL users. All database platforms are now capable of supporting either case-sensitive or case-insensitive tags. If this is important to you, to ensure proper data and configuration, it is recommended that you first run the upgrade script to upgrade the configuration only (skip the database step). Then select your desired case sensitivity setting in the [Social] section of config.ini. Finally, re-run the upgrade script, skipping the configuration step. You may be prompted to merge duplicate tags (if you are moving from a case-sensitive PostgreSQL instance to a case-insensitive configuration). See VUFIND-1187 for more history on this issue.

VuFind\View\Helper\Root\Record now has a dependency on VuFind\Cover\Router for thumbnail URL generation; if you have a custom subclass of this helper, make sure to adjust your factory to inject the additional dependency. See this commit for details.

VuFind's session handlers must implement a disableWrites() method. This is handled in the current abstract base handler. If you have a custom subclass of VuFind\Session\AbstractBase, you should rename your write() method to saveSession(). See this commit for details.

The formatCacheKey() ILS driver method introduced in release 3.0 has been renamed getCacheKey(). If you have a custom driver implementing this method, please rename it. See pull request #698 for details.

The LBS4 ILS driver is now a subclass of the DAIA driver in order to allow more complete/reliable functionality; some additional configuration in LBS4.ini will be necessary to enable communication with the DAIA API.

The Piwik view helper has been improved to track lightbox behavior in the Bootstrap3 theme; if you have customized the helper, you may need to make adjustments.

Due to changes to the Google Maps API, all existing map-related functionality has been revised to require an API key in config.ini. See the googleMapApiKey setting in the [Content] section.

VuFind's OAI-PMH harvester has been moved to a separate project. It is still included with VuFind as a Composer dependency, so no functionality has changed. If you have customized the harvest code, however, you may need to adopt a different strategy.

The display of the format list in the Bootstrap-based themes has been significantly simplified. Custom templates might need minor adjustments.

Release 3.0.3 - 8/1/2016

Release 3.0.2 - 7/5/2016

Release 3.0.1 - 5/27/2016

Expanded translation support (including new full Bengali translation).

Minor bug fixes.

Possible backward compatibility breaks:

The Feedback controller and related templates were significantly changed to fix broken functionality.

Some details of the Javascript autocomplete control were adjusted to resolve bugs.

Release 3.0 - 4/25/2016

New features:

Optional record cache to improve speed/integrity of favorites by keeping local copies of records in the database.

Optional “privacy mode” to disable storage of personally identifying information in the database (disables many features).

More detailed and flexible indexing of author (and other creator) information.

Improved ipv6 support in permission system.

Dynamic debug mode: by defining the access.DebugMode permission in permissions.ini, selected users may be allowed to turn on debug with ?debug=true in the URL.

The combined search module now supports column-specific filtering, and multiple columns using the same search backend. Search tabs also support multiple tabs using the same search backend for compatibility with combined search. This allows tabbing between different filtered views of a single index.

New “RemoveFilters” recommendation module (see this commit) for recommending that users remove filters to obtain more results; this is now on by default for no-results searches.

New “SwitchTab” recommendation module (see this commit) for recommending that users try a different tab (when multiple tabs are enabled).

New optional “delimited facets” feature to allow greater control over Solr facet display and ordering (see this commit).

Some changes have been made to the resource table of the database; records previously stored with a 'source' value of 'VuFind' are now stored with a value of 'Solr' (for improved consistency). This breaks database compatibility with VuFind 1.x, so you can no longer share a database between 1.x and 3.x – use a 2.x release if you need this capability. You MUST run the web-based update tool (http://your-vufind-url/Upgrade) to adjust database structure and contents when upgrading from a previous release (unless you prefer to manually alter the default value and contents of the resource table's source field).

Some other, lesser, database changes have also been made; see the database changelog for full details.

All of VuFind's YAML Solr search specification files have been adjusted to favor the eDisMax handler when appropriate. This should result in better, more consistent search results. All legacy configurations will continue to function, but if you have customized searchspecs.yaml or one of its sibling files, you may wish to revise it to match the new defaults in order to take full advantage of eDisMax.

The getResourceSource() method of the record drivers is now deprecated; use getSourceIdentifier() instead.

VuFind's representation of authors has been made significantly more flexible, leading to several record driver changes:

getCorporateAuthor() has been replaced by getCorporateAuthors()

getHighlightedAuthor() has been replaced by getPrimaryAuthorsWithHighlighting()

Use of getPrimaryAuthor() is now discouraged in favor of getPrimaryAuthors()

The Javascript code in the bootstrap3 theme has been significantly revised. Custom Javascript and templates in your own theme may need to be adjusted to match.

The vufind.sh/vufind.bat control scripts for Solr have been replaced with solr.sh/solr.bat for greater naming clarity.

Session handling has been made more efficient. If you use \Zend\Session\Container objects in your custom code, be sure that you inject them with the correct session manager instance upon construction. If you make use of \VuFind\Controller\AbstractBase::writeSession() in a custom controller, note that it has been replaced by \VuFind\Controller\AbstractBase::disableSessionWrites().

Hidden filter functionality has been moved from the Search Options classes into the Search Params classes; any custom code calling getHiddenFilters or addHiddenFilter will need to be adjusted accordingly.

The SearchTabs view helper has been significantly refactored; local customizations will need to be adjusted.

The “Editions”/“WorldCatEditions” related record modules (previously on by default) and all related support functions have been removed due to the shutdown of OCLC's xID services. See VUFIND-1142 for details.

The GetLastSearchLink view helper has been removed, replaced by a new SearchMemory helper that contains additional functionality.

Functionality related to remembering user search parameters has been moved from \VuFind\Search\Base\Options to \VuFind\Search\Memory; thus, Options::getSession(), Options::rememberLast*() and Options::getLast*() methods no longer exist. See pull request #576 for more detail/background information.

Some changes have been made to the Solr schema which will require reindexing – see the Schema Changelog for details.

The default Apache configuration has been changed to use a <Location> section instead of a RewriteBase directive. This makes directory-based multi-site configuration easier. See this commit.

The Debian package has been renamed from vufind2 to vufind, and the default path in some places has been changed from /usr/local/vufind2 to /usr/local/vufind. Keep this in mind if upgrading using packages – you can install the new “vufind” package, move over your customizations from your “vufind2” installation, then uninstall “vufind2.”

In config.ini, the [BulkExport] enabled/options settings are now deprecated in favor of an expanded syntax in the [Export] section. If you have customized these settings, please update your configuration accordingly.

The cover loader now accepts an array of settings in place of a long parameter list. The old parameter list is still accepted for backward compatibility, but if you have added custom parameters in a subclass, you will need to adjust the code. See this commit.

The Primo Central backend configuration now uses the standard VuFind permissions system for authentication/authorization instead of its old custom IP regular expression logic. Additionally, the apiId and port settings have been replaced by a single url setting for connecting to the API. VuFind's configuration upgrade tool will automatically adjust for all of this, but if you use Primo and are upgrading manually, you will need to update your Primo.ini and permissions.ini appropriately. Details in this commit and this commit.

The holdings data passed to RecordTab/holdingsils.phtml is now formatted slightly differently for simplicity; see this commit.

The config.ini cache_dir setting in the [Cache] setting has been replaced by a VUFIND_CACHE_DIR environment variable in httpd-vufind.conf. If you use this setting, please relocate it from config.ini to httpd-vufind.conf. See this commit.

The SwitchQuery recommendation module no longer supports “transform” methods. Now, everything is a “check” method, and a property controls which checks are opt-in and which are opt-out. Subclasses with custom transform methods will need to be adjusted. See this commit.

If you used makeDynamicCovers = 'solid' in your config.ini file and want things to look the same as before, you should look at the new [DynamicCovers] section of the configuration and adjust some settings to replicate the old behavior.

The controller method “preDispatch” has been changed to have more descriptive names in all of the places where it is used; this prevents inheritance from causing unanticipated conflicts between event handlers. See this commit for details.

The “notes” element in the return value of getHolding in ILS drivers has been deprecated in favor of separate holdings_notes and item_notes elements. Not all drivers support this yet; for now, the old “notes” field is treated as an alias of “hodlings_notes.”

\VuFind\Db\Table\Search::setSavedFlag() has been removed.

The signature of \VuFind\Db\Table\Search::saveSearch() has changed slightly.

\VuFind\Search\Memory::retrieve() has been deprecated in favor of \VuFind\Search\Memory::retrieveSearch().

\VuFindSearch\Backend\Solr\Response\Json\NamedList::remove has been removed – it was only used in one place and did not work correctly, so this is unlikely to affect anyone (see this commit).

The \VuFind\ILS\Driver\VoyagerRestful::getRemoteHolds() method has been replaced by getHoldsFromApi(). It is unlikely that anyone relies on this in a custom subclass, but if anyone does, adjustments will need to be made.

New “high availability” options (multiple Solr URLs may be specified in config.ini to allow failover; a new AJAX system status endpoint has been introduced to assist load balancers).

Upgraded to Solr 4.10.4.

Upgraded to Zend Framework 2.4.6.

Upgraded bootstrap3/bootprint3 themes to version 3.3.4 of the Bootstrap library.

OAI-PMH harvester is now more error-tolerant and can resume an interrupted harvest.

Possible backward compatibility breaks:

As noted under release 2.4, the old Blueprint theme has now been removed.

A new \VuFind\Search\SearchRunner class has been added to manage the process of setting up Options/Params/Results objects to perform a search. See this commit for details. Possible impacts:

Recommendation module handling is now driven by an event system. The interface of the modules has not changed, but the way they are configured and loaded is now more streamlined. Customizations of recommendation logic in existing Options/Params/Results classes will need to be adjusted and calls to obsolete methods such as Params::recommendationsEnabled() will need to be removed.

The signature of the SearchObject abstract recommendation module's constructor has changed. This may impact customizations to CatalogResults, SummonResults and WebResults, or local custom modules extended from this base.

Due to the Solr upgrade, all records should be reindexed after upgrading.

Due to the Solr upgrade, the SolrMarc “direct write to index on disk” feature is no longer available; all indexing must be done over HTTP. (This has been the default VuFind behavior for the entire 2.x release series, so few if any users should be affected).

OpenURL handling has been significantly rewritten. The OpenUrl view helper has taken on more responsibility in order to simplify templates using OpenURLs, a new configuration file has been added which may remove the need for some custom record driver code, the “embed counter” has been eliminated, and several record driver methods related to OpenURLs have been added, removed or renamed. Renamed methods have changed “OpenURL” to “OpenUrl” for greater consistency with function naming conventions in Zend Framework 2. If you have done any OpenURL customization, you should review it in light of these changes. See this commit for key details (with some further adjustments here, here, here and here).

The advanced search templates have been significantly revised in the bootstrap3/bootprint3 themes. Users with customized advanced search screens may need to rework local code.

ReCaptcha support has been updated to use the latest version of Google's API. This eliminates some functionality from the previous version (including several themes, and the ability to create a custom theme). If you use a theme option unsupported by the new version, you will get the new default instead.

The \VuFind\Hierarchy\TreeDataSource\Solr class has been substantially refactored for improved performance. Any customizations to this class will have to be refactored to match. The new implementation uses raw Solr data instead of record drivers to reduce overhead (at the cost of some slightly redundant code) and uses separate formatter classes to produce JSON and XML output with less redundant logic.

In the Browse module, the data sent back from the controller now has separate 'value' and 'displayText' keys instead of a single 'result' value to properly account for translation. If you have custom templates, they need to be updated. See this commit.

The DAIA ILS driver configuration changed in release 2.4, and legacy support for the previous configuration format has been removed. If you have an old DAIA configuration, please update it. Additionally, the constructor signature has changed, so if you have overridden the driver with a local subclass, some adjustments may be needed.

The PICA ILS driver has been removed; it seems likely that no one has ever used it, and the code was never well-maintained in the VuFind 2 code base.

The \VuFind\I18n\Translator\TranslatorAwareTrait has been restructured to add support for text domains.

Related to the TreeDataSource refactoring, the getHierarchyPositionsInParents() and getTitlesInHierarchy() record driver methods are no longer needed and have been removed to prevent confusion.

The marcRecord property of the SolrDefault record driver has been deprecated. Use the getMarcRecord() method instead. This may affect custom subclasses of SolrDefault and WorldCat record drivers.

The [Delimiters] section of MultiBackend.ini is no longer used; configurable delimiters never worked correctly, so the feature has been removed.

The addition of the coversize setting (see this commit) has introduced template refactoring related to thumbnail display. Prior code should continue to work, but custom templates should be updated to use the new mechanism in order to take advantage of configurability.

This version will require at least PHP version 5.4, a higher requirement than previous releases.

The blueprint theme is now deprecated and will be removed in a future release; it is strongly recommended to revise your local theme to derive from either bootstrap3 (a bare-bones base theme) or bootprint3 (a more fleshed-out theme resembling blueprint) in order to make future upgrades easier.

The AJAX authentication mechanism now sends base64-encoded passwords to solve a Unicode compatibility problem. If users have an old cached version of common.js (in bootstrap3) or lightbox.js (in blueprint) the upgrade may cause login problems.

Call number improvements required changes to the Solr schema, so records must be reindexed after an upgrade. See the index schema changelog for more details.

Zend Framework 2.3 changes the structure of the translator classes; any references in custom code to \Zend\I18n\Translator\Translator should be replaced with \Zend\I18n\Translator\TranslatorInterface.

Spelling suggestions are now displayed through a recommendation module rather than being hard-coded into the search results templates. This offers greater flexibility and configurability, but requires some configuration changes to ensure that spelling suggestions to not disappear. The automatic upgrade script should fix this, but if you are upgrading manually, see this pull request for details on the changes you'll have to make to custom Summon.ini and searches.ini files.

The VuFind\Auth\Manager has been significantly refactored. If you have customized it, or classes that directly depend on it, some adjustments may be needed.

VuFind\Auth\LDAP has been significantly refactored and custom subclasses will likely need to be rewritten.

The constructor signatures of \VuFind\Cart and the UpgradeController have changed to reflect centralized cookie handling functionality (see this commit). This will affect custom subclasses.

\VuFind\QRCode\Loader::getQrCode() is now \VuFind\QRCode\Loader::getImage() for consistency with \VuFind\Cover\Loader.

\VuFind\Code\ISBN has been extracted to a separate library and renamed to \VuFindCode\ISBN. If you depend on this class, you may need to update use statements.

The WorldCat view helper has been eliminated; it was only used by the WorldCatHoldings record tab, so the functionality was moved into \VuFind\RecordTab\WorldCatHoldings.

Renamed and refactored \VuFind\Sitemap to \VuFind\Sitemap\Generator.

The XCNCIP ILS driver has been removed (this was experimental and built for an obsolete version of the XC NCIP Toolkit; users should upgrade to use the more feature-complete XCNCIP2 driver, which works with the newer version of the toolkit and is still fully supported).

If you need to translate the names of locations provided by your ILS driver, you should prefix them with “location_” in your language file – i.e. location_Main Stacks = “Main Stacks”. Previous versions of VuFind did not uniformly apply this prefixing convention. If you do not need to translate location names, no action is necessary.

The Google/HathiTrust/OpenLibrary preview code has been refactored. If your record driver included a custom preview.phtml template, you will need to make some changes to reflect the new model.

The \VuFind\Cover\Loader determines the location of its cache files slightly differently (it no longer appends '/covers' to the directory provided to the constructor, instead assuming that the full path will be passed in).

The search backend for EBSCO Discovery Service has been significantly refactored.

The authentication modules now implement a validateCredentials() method which is designed to be a no-side-effects alternative to authenticate(). If you have a custom authentication module that maintains an internal state, you may need to implement a custom validateCredentials() method. See ChoiceAuth for an example of how this is used.

Release 2.3.1 - 11/17/2014

Several large-scale fixes to the Bootstrap3 theme have introduced significant template changes; if you are using this theme, be sure to double-check compatibility with local custom templates and Javascript.

The \VuFind\RecordDriver\SolrMarc::getFieldData() method no longer uses its second parameter (due to refactoring in support of the VUFIND-1034 bug fix). This should be a seamless change, but in the extremely unlikely case that you have overridden the method, be sure you do not rely on $value.

Storage retrieval requests (aka “call slips”) and Interlibrary Loan (aka “universal borrowing”) are now supported by the VoyagerRestful ILS driver (and infrastructure is in place so that equivalent functionality can be added to other drivers in the future).

“Visual” view featuring treemap navigation (off by default).

Configurable citation formats (including new support for Chicago Style).

Social features (comments/tags/favorites) may now be turned off via configuration.

Added support for loading cover images based on ISSN, UPC and/or OCLC number (note that UPC numbers may now be indexed into the upc_str_mv field of the Solr index).

The getHoldUrl() method of the RecordLink view helper has been deprecated in favor of getRequestUrl() and some other changes to improve flexibility of holdings display have been made (see this commit); custom holdingsils.phtml templates should be updated.

Third-party content loading (book covers/reviews/excerpts) has been significantly refactored to make the code more pluggable. If you have customized the VuFind\Cover\Loader or the Reviews/Excerpt view helpers (which no longer exist in the new architecture), you will need to rework your changes to fit the new system. See this pull request for details of the changes.

If you are using a custom Voyager/VoyagerRestful driver, be aware that the protected processHoldingData and makeItemRequests methods have changed their signatures. There have been many Voyager improvements in this release, so a general review of custom subclasses would be wise.

If you have a custom citation list in your record driver and wish to support the new configurable citation options, rename your public getCitationFormats() method to protected getSupportedCitationFormats().

The \VuFind\Cover\Loader::isn property has been renamed to isbn to allow it to be differentiated from issn. If you have a custom subclass, you will need to revise it. fetchFromISBN() has been renamed fetchFromAPI().

The side effect that \VuFind\Controller\AbstractRecord::createViewModel() would omit the record driver from the view model if loadRecord() was not called first has been eliminated; createViewModel now always includes a record driver.

\VuFind\Search\Base\Results::spellingTokens() has been moved to \VuFind\Search\Solr\SpellingProcessor::tokenize(), and the interface of \VuFind\Search\Solr\SpellingProcessor::processSuggestions() has been changed to accept a raw search string rather than a tokenized array – this better encapsulates spelling logic.

View templates have been updated to use the escapeHtmlAttr helper instead of escapeHtml when escaping text within HTML attributes. Custom templates should be updated to match.

The latest Solr browse handler does not work with Java 1.6. If you have problems starting Solr or generating browse indexing after your upgrade, you may want to upgrade to Java 1.7 or try manually recompiling the .jar files as documented at the browse handler's GitHub page.

The /update/json endpoints exposing the solr.JsonUpdateRequestHandler in the biblio and website Solr cores have been removed. The JsonUpdateRequestHandler has been deprecated and is no longer necessary. The removal of this endpoint should not affect any core VuFind functionality but may require reconfiguration for users running the RecordManager tool.

All module.config.php files have been rewritten to avoid the use of closures. This improves the possibility of caching configurations. If you have local modules with their own configurations, it would be wise to make similar changes there. However, failing to make this change shouldn't break anything.

All Solr DateField types have been changed to TrieDateField. This means that you should completely rebuild your index to avoid search problems. See VUFIND-546.

Templates used for the authentication (login/account creation) interface have been changed to support the new ChoiceAuth option; custom login forms may need to be readjusted to reflect new template names and layouts.

Spellcheck behavior in the Solr search backend and related search classes has been significantly refactored (see VUFIND-840 and this commit).

Lucene query manipulation logic has been moved from the Solr query builder to its own helper class; this also affects the Summon query builder, which now makes use of the shared helper (see VUFIND-937 and this commit).

In the Options/Params/Results search classes, Results::createBackendParameters() has been replaced by Params::getBackendParameters() for all modules using the VuFindSearch system (see this commit).

The Solr “stats” core (used for collecting statistics) is now disabled by default. Collecting stats in Solr is not recommended, but if you wish to use this mechanism, you must now turn it on in solr/solr.xml first.

The VuFind\Search\Memory class is now accessed as a Zend Framework service rather than being used statically (see VUFIND-883).

Default record tabs can now be set from within module.config.php; the old $this→defaultTab in record controllers has become $this→fallbackDefaultTab; see VUFIND-777.

The Sitemap generator's constructor parameters have changed; see VUFIND-656.

The Aleph ILS driver's constructor parameters have changed.

The code which represents user lists using VuFind's internal facet mechanism has been removed in favor of a simpler solution for rendering the “Your Lists” section of the MyResearch menu.

Searches are now fully customizable through configuration files – you don't need to change any code. See Search Customization for details.

Template inheritance – you can now customize only the templates you need to change for your local setup and inherit the rest from one of the default themes. See Theme Inheritance for more details.

Updated SolrMarc importer with support for custom BeanShell scripts (for localized import behavior without needing to recompile the whole program) and external translation maps (so you can edit the files without having to open the SolrMarc .jar file).

Expanded favorites handling – create multiple distinct named lists of favorite records. Keep them private for personal use or make them public to share with others.

New default theme – a whole new user interface look and feel, without losing the option to retain the original “classic” look.