Posts Tagged ‘eZ Publish’

What’s new in eZEnhancedDebug 1.2 ?

April 26th, 2010

I just released ezenhanceddebug 1.2, here are the new things I added :

Compatible with eZ Publish 4.3

If you read the changelog in the eZ Publish 4.3 release, you will notice :

- Implemented enhancement #16216: Deprecate templateInit()

Which is documented by

- kernel/common/template.php: templateInit()
Function will be removed in a future version, use eZTemplate::factory() instead.

This change has been implemented.

KCacheGrind support

There is two new configuration directives in ezenhanceddebug.ini.append.php :

[ProfilerSettings]
Profiler=enabled
ProfilerOutputDir=/tmp/ezenhanceddebug

If [ProfilerSettings]/Profiler is set to enabled, then anytime you generate a page you will get a KCacheGrind compatible file in [ProfilerSettings]/ProfilerOutputDir/url_alias_of_the_page.out

Here is how it looks like :

Each function follows the pattern : <template_name>::<template_function_or_operator>

There is no callgraph available, this is currently not implemented. Due to the anarchic way of calling templates from eZTemplate, it is very difficult to deduct a valid callgraph, maybe I will add this in the future if I find exactly what I am looking for in the template engine.

The full eZEnhancedDebug extension is now hosted at GitHub .

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

An alternative method to build eZ Publish configuration files with ANT and the C Preprocessor

October 18th, 2009

eZ Publish configuration files have a major problem : they are not context aware.
This means that you can not build them especially for production or development servers.

I thought about a solution to sort of workaround this problem by using the C preprocessor and macros in configuration files.

Let’s take a simple example. When you work with override.ini directives, you have to write a few configuration directives in order to load the correct template for the correct context, for example, a nodeID. But if this nodeID change between servers, you could have for example this on your development machine :

[foo_bar]
....
Match[node]=123

this on your staging machine :

[foo_bar]
....
Match[node]=456

this on your production machine :

[foo_bar]
....
Match[node]=789

When it comes to industrialize the process of creating correct configuration files with correct nodeIDs (or any other configuration directives) things become more and more complex.

It would be interesting to be able to include the correct values depending on the context in which you want to use your configuration files.

This is where the C preprocessor comes into play, by using specific macros like #include or #ifdef we can generate context aware configuration files without any problem, simply by including the correct configuration file and integrate it into the real eZ Publish one.

For example for override.ini.append.php, this gives the following override.ini.append.php file :

<?php /* #?ini charset="utf-8"?

[full_folder]
Source=node/view/full.tpl
MatchFile=full/folder.tpl
Subdir=templates
Match[class_identifier]=folder

[line_folder]
Source=node/view/line.tpl
MatchFile=line/folder.tpl
Subdir=templates
Match[class_identifier]=folder

// some comments
// in the ini file
// they will automatically
// transformed into correct
// eZINI comments

#ifdef CONTEXT_DEV
#include "override.ini.dev"
#endif

#ifdef CONTEXT_STAGING
#include "override.ini.staging"
#endif

#ifdef CONTEXT_PROD
#include "override.ini.prod"
#endif

*/ ?>

With the following included files

override.ini.dev

// global overrides
[my_dev_override]
Source=path/to/template.tpl
MatchFile=path/to/matchfile.tpl
Subdir=templates
Match[node]=11111

override.ini.staging

// global overrides
[my_staging_override]
Source=path/to/template.tpl
MatchFile=path/to/matchfile.tpl
Subdir=templates
Match[node]=22222

override.ini.prod

// global overrides
[my_prod_override]
Source=path/to/template.tpl
MatchFile=path/to/matchfile.tpl
Subdir=templates
Match[node]=33333

So when we run (note this is not that simple, but I took a few shortcuts in order to be quick)

 cpp -P -DCONTEXT_PROD=1 override.ini.append.php

We get the following result :

<?php /* #?ini charset="utf-8"?

[full_folder]
Source=node/view/full.tpl
MatchFile=full/folder.tpl
Subdir=templates
Match[class_identifier]=folder

[line_folder]
Source=node/view/line.tpl
MatchFile=line/folder.tpl
Subdir=templates
Match[class_identifier]=folder

# some comments
# in the ini file
# they will automatically
# transformed into correct
# eZINI comments
# global overrides

[my_prod_override]
Source=path/to/template.tpl
MatchFile=path/to/matchfile.tpl
Subdir=templates
Match[node]=33333

*/ ?>

As we can see, override.ini.append.php has been created with the correct production nodeID.

Since calling cpp is quite annoying with this ini syntax (mostly due to the presence of PHP comments) I decided to automate the process by wrapping everything into an Ant build script. With the script, building all configuration files should be as easy as running :

 ant clean && ant dev

or

 ant clean && ant staging

or

 ant clean && ant prod

You will find attached a tarball with a fake eZ Publish instance plus settings and context files.
By running of of the commands above, you can generate your configuration files in no time.

Here is an explanation of the ant script’s behaviour. First you have to have the following directory structure :

.
|-- build.xml
|-- common.xml
`-- fakeezinstance
    |-- build.xml
    |-- extension
    |   `-- myextension
    |       |-- build.xml
    |       `-- settings.orig
    |           |-- dbsettings.dev
    |           |-- dbsettings.prod
    |           |-- dbsettings.staging
    |           |-- site.ini.append.php
    |           `-- siteaccess
    |               `-- site.com
    |                   |-- override.ini.append.php
    |                   |-- override.ini.dev
    |                   |-- override.ini.prod
    |                   `-- override.ini.staging
    `-- settings.orig
        |-- override
        |   |-- override.ini.append.php
        |   |-- override.ini.dev
        |   |-- override.ini.prod
        |   `-- override.ini.staging
        `-- siteaccess
            `-- site.com
                |-- override.ini.append.php
                |-- override.ini.dev
                |-- override.ini.prod
                `-- override.ini.staging

As you can see any original settings are located into settings.orig directories. Each of them contains configuration files, I just created an example with override.ini and site.ini. But you can use any configuration file. For each .ini file I created a context file, dbsettings.dev/staging/prod for site.ini for example.

Once the configuration files are ready, we can simply run :

 ant clean && ant prod

And you will see that all settings folder will be created with the correct values.

If you want to add another extension in the build, the only thing you have to do is to copy the build.xml file available in extension/myextension and create a settings.orig directory structure. If you do not want your extension(s) to be processed by the build script, just do not copy the build.xml file and create the settings directory structure as you would normally do.

So one can say that there is a lot of blank lines in the files onces they have been preprocessed. That is true, but remember that those files are supposed to be read by eZ Publish only. If fakeezproject.taryou need to change anything, just update the file you want in settings.orig and rerun the build process, it takes less than 2 seconds.

Download the fakeezproject.tar archive, go in fakeproject ant run ant prod for example.

‘Hope that helps.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

Overriding kernel files in eZ Publish

August 12th, 2009

Here is a 30 seconds tutorial on how to override kernel files in eZ Publish.

The file used for this example is ezcontentobjecttreenode.php but you can use exactly the same method for any class of the kernel/ or lib/ directory.

cd path/to/ezpublish
mkdir -p extension/myextension/classes/kerneloverride
cp kernel/classes/ezcontentobjecttreenode.php extension/myextension/classes/kerneloverride
echo "define( 'EZP_AUTOLOAD_ALLOW_KERNEL_OVERRIDE', true );" > config.php
php ./bin/php/ezpgenerateautoloads.php -o

That is it.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)