Technical blog of COil: Symfony, PHP, PEAR & webdev

» Collapse all «

» symfony1 sfTCPDFPlugin 1-6-3 released

Last week I also released the 1.6.3 version of the sfTCPDFPlugin. It is just of small update to check that it works without problem with the last TCPDF library which is actually at version 5_9_120 (2011-09-22). (Note that the release strategy of this library is very fast with a lot of minor versions). You can check the CHANGELOG here.


PS: There is now more than 100 registered users for this plugin ! :)

See you. COil :)

» symfony1 sfTaskLoggerPlugin 1-0-3 released

Last week I released the 1.0.3 version of the sfTaskLoggerPlugin. It corrects several bugs and adds several features. The main improvement of this version is that it is bundled with a fully customized Doctrine admin generator module in order to manage and check the tasks launched by the plugin. You can check the changelog here. I hope that with this version the plugin will overtake the huge number of registered users of 8 ! :D


PS : Note that there is a bug in the partial that shows the task total length, use the svn trunk (which is actually stable et revision 33110) if you want to correct it.

See you. COil :)

» sfMyPlugins, 2 years later

Well, 2 years have passed since my post: "Writing symfony plugins is great... maintaining them is better !". I followed my own advices and all my plugins where updated for symfony 1.4 which will be the last major version of the 1.x branch. Now let's see how things evolved since 2 years:


  • User counts: 11 (+8 users since 12 apr 2009)
  • Available for: sf 1.4, 1.3, 1.2
  • Users feedbacks: 0
  • I like and use the sfDB4toPropelPlugin !
  • Want the Symfony2 bundle ? Send me an email ! ^^

I must admit I don't use this plugin any more. Because most of people are using Doctrine as it is the recommended ORM for symfony now. But it can be useful for a small project. I didn't had feedbacks about it, it just "do the job" as it should. (It's very stable because it was extensively used for 2 big 1.0 projects)


  • User counts: 55 (+39 users since 12 apr 2009)
  • Available for: sf 1.4, 1.3, 1.2, 1.1, 1.0
  • Users feedbacks: 1
  • I like and use the sfLightboxPlugin !

It's probably the most useless of my plugin, but I think it is used because it is well documented, very easy to use and available for all symfony major versions.


  • User counts: 93 (+84 users since 12 apr 2009)
  • Available for: 1.4, 1.3, 1.2
  • Users feedbacks: 4
  • I like and use the sfTCPDFPlugin !

This plugin had a very nice users boost since its creation, its my most popular plugin. Therefore I suppose that it works quiet well. :) It allows to avoid dealing with the unfriendly TCPDF constants with a help of a multi-configurations YAML file.


  • User counts: 8
  • Available for: 1.4, 1.3, 1.2, 1.1
  • Users feedbacks: 3
  • I like and use the sfTaskLoggerPlugin !

Even I think this is the most useful plugin I have done, it is also the most unpopular. It may be due to the large amount of plugins already dealing with tasks, crons, jobs-queues and so on... sfDoctrineCronManagerPlugin, axCronPlugin, sfMCronPlugin, sfJobQueuePlugin, sfGearmanPlugin. I must admit I didn't tried the others as mine fits my needs and the ones of the companies I worked for until now.


  • User counts: 27 (+27 users since 7 jan 2011)
  • Available for: 1.4, 1.3, 1.2
  • Users feedbacks: 7
  • I like and use the sfProjectAnalyserPlugin !

This is my last plugin (well "our" plugin as I was not the only to contribute, thanks to all the contributors !) This is probably the most interesting as people where quiet curious about it and we had quiet a lot of positive feedbacks. What is it for ?

The sfProjectAnalyserPlugin allows you to analyse your symfony project, it can raise several coding standards alerts. A YAML configuration file allows you to switch what to analyse and also allows you to parameter threshold for each alert. This plugin can be helpful in mainly two situations:

  • You quickly want to check the volumetry and code quality of a symfony project your are going to maintain.
  • While developing a project from scratch, as a continuous integration tool, to ensure that as the project grows, you keep on following the symfony coding standards you defined at the very beginning of your project.

Others plugins

  • RIP: sfJoomla15BridgePlugin, I gave the leadership of this plugin to another developer (but there is no more activity).
  • RIP: sfWorkbenchPlugin: The XML structure of the generated WB schema was quiet hard to parse and I didn't find time to finish its proof of concept. Nevertheless, I would be glad if someone could take over this plugin. It could be very useful and used by many "lazy" developers (Well like me !) :p

That's 208 "regular" users for all these plugins, which is quiet a good score. I think my "symfony1 plugin developer career" is now over. I hope they have been useful for some of you. Obviously I will continue to maintain theme if big bugs were discovered. But don't except major new features. And now let's publish my first Symfony2 "bundle". ^^

» sfTaskLoggerPlugin updated for symfony 1.4

Wow, long time I didn't post, but that don't mean I am no more addicted with symfony. :p All my plugins were updated for symfony1.4. sfTaskLoggerPlugin was the last to be, in fact it was ok in svn but there wasn't the related pear package. Hope you'll give a try because the plugin is quiet unpopular (only 5 subscribers for now) but for sure it is the most useful of all my plugins. It is already used in production for a startup, a big company and for several other projects.

I must mention that there is a very nice review of the plugin on the blog of Tomasz Ducin. (many thanks ! ;) ) where you'll have an interesting feedback on why and how to use the plugin.

I tried to made a clean and quiet exhaustive documentation so you can see if the plugin feeds your needs or not, it's in the README tab.

Here is the change-log since the last PEAR release. (And don't forget the +1 please if you find it somewhat useful ^^):

  • Updated sample and purge tasks
  • Moved "env" and "application" options at the base task level
  • Updated package and README
  • Temporary logs stored into the log application of the project
  • Packages for symfony 1.1, 1.3 and 1.4
  • Plugin has now a YAML to configure if one must save the main output in a file, the database or both
  • Added new field to store the id of the last fully processed record
  • New option that allows to log only if there were thing processed by the task
  • New option to check if the task was already run once in a day
  • New option to check if the task is already running
  • New task to purge failed tasks still flagged as "is_running"
  • Re-factored a bit the code
  • Changed the plugin task namespace to "task-logger" instead of "sf_task_logger"
  • Modified the logSection function
  • Added the logSection method
  • Corrected the log functions
  • Fixed the log messages

See you. COil :)

» New 1.2 symfony plugin + tutorial: sfTaskLoggerPlugin

Hi symfonians ! ^^

Again, that's quiet a long i didn't post something on symfony. Well i suppose releasing a new is a good occasion for this. Let me introduce the sfTaskLoggerPlugin plugin:

The sfTaskLoggerPlugin plugin allows you to run tasks and store the results. Results are stored in the database in a specific table and also in a log file. Each task has its own log file, witch is stored in a specific directory depending on its namespace and name. (`/log/tasks/:TASK_NAMESPACE/:TASK_NAME`).

The database record stores the following informations:

  • Options of the task
  • Arguments of the task
  • An error code
  • Start and end time
  • A success flag
  • The log file path
  • Extra comments (for admin)

It's very useful, I've already used on several project i worked on (from 1.0 to 1.2). You to have a clean and "easy to access" historic (through an admin gen module for example) of all run tasks and their results. How to use it ? Well Very easy !!

Note: The plugin is Doctrine and Propel friendly, it you are using Doctrine, the /lib/config/doctrine/schema.yml will be used whereas using Propel the /lib/config/schema.yml will be used.


  • Install the plugin
       $ symfony plugin:install sfTaskLoggerPlugin

(or download it and unzip in your /plugins directory)

  • Clear you cache
       $ symfony cc


The plugin comes with a base task class witch is named sfBaseTaskLoggerTask Therefore your tasks must extend this one. Because there is no autoloading at the task level, one must include the base class manually:

   require_once(dirname(FILE). '/sfBaseTaskLoggerTask.class.php');

Note: Of course you will have to change this path depending on where is located your task. For example if it is located in the `/lib/task` folder of your project, the include directive should look like this:

   require_once(dirname(FILE). '/../../plugins/sfTaskLoggerPlugin/lib/task/sfBaseTaskLoggerTask.class.php');


1 - Create a new class that extends the plugin base class:

class sfTaskLoggerSampleTask extends sfBaseTaskLoggerTask

2 - Implement the configure() method as you would do with a standard task:

 * Main task configuration.
protected function configure()
    new sfCommandArgument('arg_1', sfCommandArgument::OPTIONAL, 'Test argument 1', 'arg_1_value'),
    new sfCommandArgument('arg_2', sfCommandArgument::OPTIONAL, 'Test argument 2', 'arg_2_value'),

    new sfCommandOption('env', null, sfCommandOption::PARAMETER_REQUIRED, 'Environment used', 'prod'),
    new sfCommandOption('application', null, sfCommandOption::PARAMETER_REQUIRED, 'Application used', 'frontend'),

  $this->namespace = 'sf_task_logger';
  $this->name      = 'sample';

  $this->briefDescription = 'This is a sample task !';

  $this->detailedDescription = <<<EOF
The task [sf_task_logger:sample|INFO] doesn't do that much.
It logs itself in the database and in the file system:

  [./symfony sf_task_logger:sample --env=prod|INFO]

Now there are 2 specific methods to implement:

3 - checkParameters()


         * Advanced check of task parameters.
        protected function checkParameters($arguments = array(), $options = array())
          /* // Stupid example test
          if ($this->args['arg_1'] != 'arg_1_value')
            throw new InvalidArgumentException('The value for argument 1 is not valid ! Check the help of the task.');
          return true;

Note: This method can be usefull if you have advanced controls to do on task parameters or arguments. Just return `true` if you don't have to use it.

4 - doProcess()

         * Main task process.
        protected function doProcess()
            $this->printAndLog(' - This is a log info !!');
          catch (Exception $e)

Note: This is the main method of your task process. `$this->task` is the database object that will be saved. As you can see the `setOk()` and `setNOk` methods allow to set the flag of the record automatically depending on the success or failure of the task.

If you want more control on the task process you can also re-implement the `execute()` method of the base class witch is responsible for calling all others sub functions:

     * Global process of the task.
     * @see sfTask
    protected function execute($arguments = array(), $options = array())
      $this->setParameters($arguments, $options);
      $this->checkParameters($arguments, $options);


The plugin is bundled with a sample task: `/lib/task/sfTaskLoggerSampleTask.class` witch can be run with the following command:

   ./symfony sf_task_logger:sample


  • Include Propel and Doctrine admin generator module


Please report bugs or feature request on this post.


See you. COil ^^

PS: I have published this tutorial quiet quickly, please help me by reporting typos and errors.
PS2: The official README file is far more readable
PS3: As always, any contribution will be welcome !

» sfTCPDFPlugin v1.6.1 released

This new release for symfony 1.2 is quiet interesting as it introduces a new custom configuration handler witch allows you to manage all the TCPDF constants through YAML files and you can also manage multiple configurations. If you are using the plugin don't forget to use the "I USE AND LIKE THIS PLUGIN" on the symfony plugin website. ^^


  • Corrected config loader
  • Converted README to Markdown syntax
  • Added a method to get the final TCPDF configuration
  • New plugin configuration handler that allows you to use multiple configugurations for different actions and pdf
  • Reorganized svn structure of the plugin, created 1.0, 1.1 and 1.2 branch
  • New version for symfony 1.2

» Writing symfony plugins is great... maintaining them is better !

Wow, that's quiet a long time i didn't blogged !! Let see if i can write something interesting ! :) As you have probably noticed, the symfony plugin count has recently reached the 500. This is really huge ! To celebrate this, Fabien has added an interesting functionality "I use this plugin" which allows you to tell the plugins you use in yours projects. This "plugin users count" will show which are used and work, so you don't have to waste time on a plugin which does not work at all... Like the sfNadaPlugin... :p Moreover i think there will be another good side effect of this new functionality, is to encourage the plugins authors to update their plugin more frequently or to convert them for the different major versions of symfony. That's what i did the last week.



sDB4toPropelPlugin is a plugin that adds to symfony a new task: propel:db4-to-propel that allows you to convert a DB4 schema (a DBDesigner4 schema) into a valid Propel schema.yml file, with this plugin you can just forget the boring work of building your schema.yml by hand. ;)
This is probably the most interesting of my plugins and i am quiet surprised there is only 3 guys who use it :/ (including me). The last interesting functionality that was added with the 1.0.3 version is that you can declare tables as "external", that means that inside your DB4 schema you can make links to plugins tables, like sf_guard_user. This is very practical, i used it since more than 2 years (the 1.0 and 1.1 versions were never published) so that why i am quiet surprised this plugin doesn't have more success... Perhaps it just get lost among the 500 others. ;) If you use and like this plugin and want to help me in giving it more visibility on the symfony website, click on the following link :D


I will start soon the development of the worthy successor of this plugin, the sfWorkbenchPlugin, any help will be welcome ! :) This time i'd like to make the plugin Propel and Doctrine friendly, which would be very interesting for all symfony users.



sfLightboxPlugin is a symfony plugin that provides an easy to use wrapper for the Lightbox2 javascript library.



The sfTCPDFPlugin provides abstraction for the TCPDF library. The main interest of this FPDF "fork" resides in the fact that it handles any UTF8 strings which the native encoding format used by symfony.

I have just updated this plugin, this new version for symfony 1.2 introduces a new interesting functionality , it's a handy config handler to manage several TCPDF configurations with a YAML file, so you don't have to set the TCPDF constants. So this version is far more practical that the old one.



This was an experimental plugin, but i shamefully abandoned it... But there's a reason; it's because this old plugin was for symfony 1.0 and the old Joomla 1.0 version. Now there is a new plugin the sfJoomla15BridgePlugin for symfony 1.2 and Joomla 1.5.x which is based on my previous code, so i have joined the dev team of this plugin. Even if have abandoned the plugin i have updated its description to invite the users not to use this one but the new one, so they don't waste their time on it. (i have received several mails about it from users who didn't saw the new 1.5 plugin... :x)


I already have several ideas for my next plugins. One that was never published and one about tests... But this will be part of another post. I wish i could find some time to post a little more frequently.

  • You can find all my plugins here

See you. symfoniquement votre. ++ COil :)

» Jobeet: An alternative tutorial for Day 3

Hi symfonians ! ^^

Well, i didn't post very often during these last months. So let's try to write something interesting. In this post i will show you an alternative way to build your database with symfony, propel and the DB4 tool. This tutorial is not really an "alternative" to the official tutorial. :) Let's say that we will just see another way to build our database, i won't be as exhaustive as Fabien did in the Jobeet Day 3 tutorial, therefore, for all details please refer to the official Jobeet tutorial.


  • Having done at least day 1 and 2 of the Jobeet tutorial. (or you already know symfony, in this case you will need a fresh symfony 1.2 project)
  • Not being too angry with Propel :p

What you will learn:

  • Using the sfDB4toPropelPlugin to build your schema.yml without writing a single line of this file.

What you will NOT learn:

  • How wonderful symfony is. For this, read the official Jobeet tutorial of Fabien. :)

So let's go... We will start at this part of the Jobeet 3 tutorial.


1 - Plugin installation

First we will install the sfDB4toPropel plugin, i did not released any package for the symfony 1.2 version yet, so we will install it via SVN. (edit: i've just released the 1.0.2 version for sf 1.2.0)

   $ cd plugins
   $ mkdir sfDB4toPropelPlugin
   $ cd sfDB4toPropelPlugin
   $ svn co

Be careful not to check out the root of the plugin but the branch related to the symfony version you want to use, actually 1.1 or 1.2)

(PS: You can also set an svn external to the plugin if your project already uses a svn repository)


Continue reading...

» New symfony 1.1 / 1.2 plugin + tutorial : sfDB4toPropelPlugin

1 - sfDB4toPropelPlugin presentation

I've just released a new plugin, it is called sfDB4toPropelPlugin, what is this ? Can it make coffee ? Not yet. ;) Well this one add to symfony a new task: propel:db4-to-propel that allows you to convert a DB4 schema (A DBDesigner 4 schema) into a valid propel schema.yml file. It can handle:

  • I18n tables
  • Foreign keys
  • phpNames of tables
  • Name of propel connection
  • Comments for all fields
  • Name of target schema
  • Lib package name
  • And several other options...

You can read a complete tutorial for this plugin in the full version of this post.
Of course, i'll be glad to have some feedback here, to know what you like / dislike and what could be improved.

See you. COil ;)

Related posts:

PS: Reading the related posts, it seems that i did not use the "last version", so i'll check what can be included in the next version of the plugin.


Continue reading...

» Allomatch V3 powered by symfony !

Well the V2 was also powered by symfony (V1.0) and the V1 was powered by Joomla. ;) What is Allomatch ? It's a website where you can see the pubs where you can see sports events on television, like actually with the Eurocup 2008. You've got a match, then you have the google map of France, you just have to click on the region or to enter your address to see what is the closest pub were you will be sure to be able to see the match. This V3 mainly adds some "community features", for example you can tell to others members where you will see the match, give you thought on the "match wall", if you like a bar... and so on.

It was a pleasure to work with you, thanks to Fabrice and Benoit and i wish you the best for the future. :)

PS: The Hall's beer tavern the pub of the Paris "sfPot" is one of the Allomatch pubs ! ;)
PS2: Try and test the "Pouet" feature (the counters), one of the most addictive of the site ! ;)


- page 2 of 5 -