Revision history for 1.15
Release 1.15 (stable) contains libraries for the use under PHP 5. This version was
tested with versions greater than PHP 5.2.0.
This release contains API changes. Hence, the page Migration from 1.14 to 1.15 describes the necessary changes to be
applied to your source code to run those applications with the new version.
The following chapters list the main changes to version 1.15 (stable).
Evaluating selected options within simple select fields failed since selected options were overwritten by subsequent
options that have not been selected by the user.
The onchange attribute has not been defined within the whitelist. With this bug fix select fields can
now define this attribute.
Using the registration form of the user management module failed with an APF exception due to a illegal
For certain cases, media delivery using the StreamMediaAction failed. This is due to wrong variable
definition that led to configuration loading errors.
Empty directories caused the FilesystemManager to delete empty directories. This is because
glob() throws an error. With this bug fix, the implementation has been adapted to fulfill the method
Calling form_control::getMarker() resulted in an empty return value after refactoring. Release 1.15
fixes this problem.
Using numeric values in select fields may lead to unexpected behaviour. In case the selected option contained
0 as it's value the form control returned no selected option.
2. New features
The user management module has been enhanced in 1.15. Please refer to the subsequent list of changes:
The data model now contains relations between groups and rolls to ease configuration. Further, the
PermissionSet structure has been removed, because of lack of value.
The administration UI has been reworked massively. It now supports all functionality of the new data model.
Using the module has been documented for administrators and developers. You can now read about the configuration
and the usage of the module's components. Further chapters are scheduled for the next release.
The configuration of the software modules is now done by the DI container of the APF and is thus much
The internal data structure now uses the domain object feature of the Generic OR mapper. This means,
that all objects handled by the module are dedicated data types that are clearly understandable.
As of release 1.15 the module contains a ready-to-use component for user sign-up. After adding the necessary
configuration it can be easily included in your user management-based application. Among other features,
you can directly assign initial groups and roles to new users.
All features mentioned within this section have been integrated into the Sandbox and are
ready-to-use. Further, you can use this installation as a reference implementation for your application case.
The data model now includes a decription for each role and visibility definitions can be added access
attributes. These are read, write, delete and link.
The dependency injection container of the APF now contains these additional functionalities:
To clearly separate service implementations from the APFObject the interfaces APFService
and APFDIService have been added. This means, that services created with the container do only have
to implement those interfaces instead of extending the APF base class. This eases implementation and makes
the implementations more slim.
In several cases, services created with the DIServiceManager include dependencies to further
services of configuration parameters. This means, that initialization of the service itself is a difficult
issue. As of release 1.15 each service may define a setup method that is called after injection of all
other services and configuration parameters to control the initialization.
The Singleton and SessionSingleton implementations have been enhanced to support multiple
instances of the same implementation using instance names.
The FilterChain implementation now supports adding filters at runtime. Using the appendFilter()
method you can add filters at the beginning of the chain and invoking prependFilter() the applied filter
is added to the end of the chain.
In release 1.15 the <*getstring /> and <template:addtaglib /> tags have been integrated
into the core of the APF. Please refer to Migration from 1.14 to 1.15 for details on the migration to the
The database connection configuration now contains separate keys for ports and sockets. Further, creating database
connections with the DIServiceManager is supported. Please refer to the
for a sample configuration.
The contact form now supports configurable answer and notification texts. The appropriate templates can be defined
within the module's configuration file. Details can be taken from Contact form.
The Logger now supports further configuration switches. Using the logThreshold option you are
able to define thresholds for log file entries. Using the hostPrefix the Logger supports writing
host-dependent log files to shared file systems in clustered hosting environments. Details can be taken from
ErrorHandler and ExceptionHandler:
Within release 1.15 the global error and exception handling mechanism has been updated. The new implementation
eases configuration of custom routines as well as activating and deactivating the APF mechanism. Further, an
interface has been defined to simplify implementation of your own handling. Details can be taken from
Error handling and Exception handling.
The Generic OR mapper now supports loading tree structures. For this reason, the o/r mapper provides the
loadObjectTree() method. To create trees, the mapper uses self-references that have been introduced in
1.14. Details can be taken from Generic OR mapper - Custom domain objects.
Since this release, the APF contains a SOAP client implementation that encapsulates and enhances the PHP SOAP
extension. The service can be created and managed via the dependency injection container. Sample configurations
can be taken from the apf-configpack-* release file under /tools/soap/EXAMPLE_serviceobjects.ini.
The <html:iterator /> tag supports displaying ascending numbers. To do so, you may
define a place holder named IteratorNumber that is automatically filled with the number of the
appropriate entry. Sample:
Details can be taken from the documentation under Special-taglibs.
<item:placeholder name="IteratorNumber" />
PDO database connection:
Starting with 1.15 database connections can be created using PHP's PDO extension. For this reason, the
APF brings the PDOHandler implementing the DatabaseConnection interface. Details can be taken
The implementation of the <*:getstring/> tags has been moved to the APF-core. This eases inclusion of
multi-language texts in templates and forms. Please note the changes necessary to your code mentioned under
Migration from 1.14 to 1.15.
The import() function has been optimized regarding performance again. Thus, including custom components
is now faster compared to 1.14.
Since 1.15, all setPlaceHolder() methods support the fluent interface notation. Setting multiple
place holders at once is now easier. Details can be taken from API documentation.
The BenchmarkTimer has been added the getTotalTime() method to easily output the total rendering
time (e.g. HTML source, HTTP header).
The form control <form:date /> now uses PHP's DateTime API to avoid errors with parsing
invalid dates and to auto-correct implausible dates. Now, the user is no longer able to enter erroneous dates.
All usages of the dateTimeManager have been removed from the APF sources since the component has been
marked as deprected in 1.15. Please use PHP's DateTime implementation. The class will be removed in 1.16.
The present release brings several API changes:
AbstractFilterChain::addFilter() has been renamed to AbstractFilterChain::appendFilter().
Additionally, you may now use the AbstractFilterChain::prependFilter() method. Details can be taken
Support for the file attribute in document controller declarations ended with this release. This
means, that class and file names of APF components must be equal for document controllers, too.
stringAssistant has been renamed to StringAssistant.
stringEncryptor has been renamed to StringEncryptor.
Files with names like apf-codepack-* only contain the framework libraries, files with
names like apf-demopack-* the framework libraries plus a demo application and the
documentation site. For beginners it is recommended to download the demo packages. Release files
with a name like apf-configpack-* contain a set of example configuration files. There, you
can read some more hints on the configuration of the tools and applications.
The files apf-calc-example-*, apf-vbc-example-* And
apf-modules-example* contain running examples for the implementation of
- a calculator module (apf-calc-example-*),
- the view-based-caching concept (apf-vbc-example-*) and
- the inclusion of dynamic modules (apf-modules-example*)
using the APF. To setup the examples, please have a look at the SETUP.TXT file if
included for further instructions.
The offline documentation is delivered in three different archive types including a complete