Mirmo Dynamics

Si tu kiffes pas reunoi, t'écoutes pas et puis c'est tout.

To content | To menu | To search

Monday 10 March 2008

Plugin "related by tags" pour dotclear 2, deuxième

Après de longs mois d'attente, le related by tags nouveau arrive enfin ! Au menu des réjouissances, une interface de configuration, ainsi qu'un widget font leur apparition. Vous disposez donc désormais de deux manières d'afficher les billets liés, directement en modifiant le template comme avant:

{{tpl:include src="_related_by_tags.html"}}

ou tout simplement en activant le widget correspondant, que vous pouvez configurer comme vous l'entendez. Bien sur, ce widget ne s'affichera que lors de la visualisation d'un billet.

Au chapitre des fonctionnalités / bugfix manquant(e)s, on notera le bug lié à l'utilisation de postgresql, ainsi que la traduction française, qui sera pour plus tard.

Encore une fois, n'hésitez pas à poster tous vos commentaires ici même.

Sunday 2 March 2008

Les pancakes pasquier

Bon voilà, j'ai décidé de prendre en main mon alimentation, et vu qu'il parait que le petit déjeuner est le repas le plus important de la journée, je commence par lui. Dans cette optique, j'ai acheté des pancakes de chez Pasquier. Je ne suis pas un expert en pancakes (mes deux seuls points de comparaisons sont des pancakes qu'on m'a fait quand j'étais au lycée et ceux de breakfast in america), mais franchement, ces pancakes sont une vaste plaisanterie. Ils sont vendus par dix, conditionnés dans des sachets fraicheur de deux pancakes chacun. La consistance de la chose est pour le moins décevante puisqu'au moindre mouvement un peu brusque, le pancake se disloque... Bon. Passé ce désappointement, on sort le sirop d'érable, et là, le drame se poursuit. Plus proche de l'éponge que du pancake, ce truc ne se rattrape même pas par son gout, qui, s'il n'est pas forcément mauvais, n'a rien a voir avec un pancake. Bref, à l'avenir, je cuisinerai mes pancakes moi même.

Wednesday 27 February 2008

Zend Framework 1.0.4 PEAR package is available

The package for the last 1.0.x release, 1.0.4, is now available on the phpmafia pear channel. Please report any issue in the comment of this post. The Zend_Locale's xml bug should now be fixed (they are now considered as php and thus put at the right place, which is not the best way to fix the bug I guess but at least it should work for now).

Monday 28 January 2008

R.I.P. T.C.W.

You have unsubscribed from "The Caribbean Weblog."

C'est con mais ça me rend un peu triste.

Monday 21 January 2008

Symfonians, un site pour les maestros en herbe

Les utilisateurs du framework symfony ont désormais leur cafet' dédiée pour aller prendre un ptit café ! Pour résumer, symfonians se propose de réunir la petite communauté symfony autour de fonctionnalités aussi conviviales qu'utiles, telles que la création d'un profile développeur symfony, des offres d'emploi, ce genre de choses quoi. Le projet est chapoté par NiKo, ce qui au moins est un gage de bonne qualité.

Wednesday 2 January 2008

Zend Framework 1.0.3 PEAR package

Just to say I packaged the 1.0.3 version of the zend framework on the phpmafia pear channel. It's a bit late I know, but at least it's here. Please note that I already have been notified of a problem regarding the Zend Locale's xml datafiles and that I hope to have worked out a solution for the next release (1.5 if all goes well).

Monday 24 December 2007

Breakfast in america in Paris

Hier matin je suis allé petit-déjeuner à Breakfast in america pas loin de saint paul. Je ne sais pas si c'est vraiment représentatif de ce qu'on peut trouver aux états unis, mais en tout cas c'était vraiment pas mal du tout. L'ambiance conviviale très bien servie par le mobilier qui fait très american movie, les serveuses completely bilinguals, la bouffe bien grasse à souhait avec les pommes de terre sautées, le bacon calciné, l'omelette connecticut, et surtout les pancakes gigantesques fourrés blueberry, tout était réuni pour se faire péter la panse dans la joie et la bonne humeur.

Monday 24 December 2007

Echec

Je voulais geeker un peu ce week end, et notamment travailler sur mon plugin "related by tags", mais malheureusement j'ai réactivé mon compte WoW. Autant dire que ma productivité globale est proche du zéro absolu. Mais je ne perds pas espoir, et je vais de ce pas inscrire quelques reminders bien sentis sur mon tableau blanc, et j'espère redresser la barre d'ici au jour de l'an.

Sunday 2 December 2007

yaml, activerecord and acts_as_nested_set

I used to use this yaml_to_ar lib from christophe to load categories tree into my database, using acts_as_tree in the model that was perfect. Arrived the time when I felt the need to use acts_as_nested_set instead, for which I had to fill the lft and rgt columns. So I just rewrote the yaml_to_ar piece of code (put this in lib/yaml_to_ar.rb):

require 'yaml'
 
class YAML_to_AR
 
  def initialize(file, model)
    @data = File.open(file) { |yf| YAML::load( yf ) }
    @model = model
  end
 
  def process(data = @data, parent = nil)
    if data.is_a? Array
      data.each do |val|
        process(val, parent)
      end
    elsif data.is_a? Hash
      data.each do |key,val|
        parent = @model.create(:title => key)
        process(val, parent)
      end
    elsif data.is_a? String
      parent.add_child(@model.create(:title => data))
    end
  end
 
 end

This should handle both acts_as_tree and acts_as_nested. To ease things a bit further, I also wrote a rake task (to drop in lib/tasks/db_load_categories.rake for example):

namespace :db do
  desc "Loads categories defaults data"
  task :load_categories => :environment do
    require 'lib/yaml_to_ar'
    Category.delete_all
    categories = YAML_to_AR.new('db/categories.yml', Category)
    categories.process
  end
end

Now I just rake db:load_categories, and voila !

Wednesday 28 November 2007

my first rails plugin: named_resources

It's a simple plugin (2 lines of code beside class and modules declarations) which allows routes created via the map.resources mechanism to be customized. Say you have the following map:

map.resources :members

It will generate routes like:

/members
/members/:id
/members/new

No say you want to i18n your app, in french for example, what do you do ? You just can't out of the box. This is where my plugin enters into action, just add a :route_name parameter to the map.resources call and you're set:

map.resources :members, :route_name => 'utilisateurs'

will generate routes like:

/utilisateurs
/utilisateurs/:id
/utilisateurs/new

It shall also work for nested resources, although I did not test that.

The code is actually pretty simple:

module ActionController
  module Resources
    class Resource
      def path
        route_name = @options.include?(:route_name) ? @options[:route_name] : @plural
        @path ||= "#{path_prefix}/#{route_name}"
      end 
    end 
  end 
end

To install just use script/plugin:

script/plugin install http://tools.assembla.com/svn/riskle/rails/plugins/named_resources

or to install as an svn:external resource:

script/plugin install -x http://tools.assembla.com/svn/riskle/rails/plugins/named_resources

Wednesday 21 November 2007

Accessing raw post data in a controller

For some reason, $HTTP_RAW_POST_DATA does not seem to be set inside an action controller. You'll have to use the php://input stream wrapper to access raw http post data:

$raw_post_data = file_get_contents('php://input');

Wednesday 7 November 2007

Xbox 360

Bon voilà j'ai craqué la semaine dernière, j'ai acheté une xbox 360. Donc si ça vous tente, et que vous en avez une également bien entendu, mon gamertag est ubermuda, n'hésitez pas à venir m'humilier sur skate, burnout revenge ou autre gears of war :-) J'en profite pour dire aussi que bioshock est vraiment un des meilleurs jeux auquel j'ai jamais joué.

Monday 5 November 2007

Extending Zend_Controller_Router_Route: the singleton problem.

Today I ran into an issue while extending Zend_Controller_Router_Route. I wanted to add a little path pre/post processing in the match() and assemble() methods, so I just extended the Route class to add my tiny bits of code into the methods. Except it did not work at all. After a few debuging, it turned out that the Router uses Zend_Controller_Router_Route::getInstance() to retrieve a route object, which uses a new self(); statement to instantiate the route object. Problem is that self always refers to the current class definition we're in, if the method is called from a child class, without being overloaded, self will refer to the wrong class.

Example:

class Foo {
	public static function getInstance() {
		return new self;
	}
}
 
class Bar extends Foo {}
 
var_dump(Bar::getClass());

echoes something like:

object(Foo)#1 (0) {
}

Which is fscking wrong IMHO. A quick workaround is to overload the getInstance method, which is what I call pretty annoying as it does not follow the DRY principle.

Monday 22 October 2007

How I use the Zend Framework

Having started a few applications using the Zend Framework, I came out with a few practices that I tend to use over and over. In this post I'll quickly expose some of them and explain why I do things the way I do them. As you'll notice, most of them are already widely known and used over the ZF developer's community. Please remember that these practices are just what I do, and come with no garanty at all to be best practices.

Continue reading...

Thursday 4 October 2007

Plugin "related by tags" pour dotclear 2

update: nouvelle version disponible

Allez hop, j'ai codouillé rapidement aujourd'hui un plugin dotclear 2 pour afficher une liste des billets ayant le ou les mêmes tags que le billet en cours de lecture par l'internaute. Il est téléchargeable dès maintenant sous forme d'archive tar gzipée ou directement de package dotclear. Pour l'utiliser, rien de plus simple, il suffit d'ajouter le tag suivant dans votre template, à l'endroit où vous souhaitez afficher la liste des billets:

{{tpl:include src="_related_by_tags.html"}}

Et voilà c'est tout :-)

Bon par contre, il faut faire gaffe a comment on tag ses billets (genre pour celui là j'ai preferré ne pas le taguer php histoire d'avoir des résultats plus pertinents).

ps: si quelqu'un connait un moyen d'éviter d'avoir a rajouter un bout de code au template je suis preneur (mais j'ai la flemme de chercher là tout de suite).

Monday 1 October 2007

PDO not throwing an exception when it should

Today I ran into an issue that I already ran into a few weeks ago when I did not have time to dig up, but today I had this time (this plus it's a really annoying issue as you'll see). The main symptom is that PDO does not throws exceptions when you'd expect it to. It's very annoying. The reason, in my case, seems to be that I am querying an old mysql (3.23.x in my case but any 4.x will do according to this bug report). I was not able to find any info from google, so I'm posting this here so that people know :-)

Monday 1 October 2007

New home for pagination component documentation

For those caring, I just posted some quick documentation for the pagination component at my assembla space. More docs will follow (including extensive phpdoc docblocks I hope).

Sunday 30 September 2007

Zend Framework 1.0.2 PEAR package is available

A PEAR package for the 1.0.2 version of the Zend Framework is now available from the PEAR PHPMafia channel. As usual, to install just issue the following:

pear channel-discover pear.phpmafia.net
pear install phpmafia/Zend

Sunday 30 September 2007

Bugfixes release of Zend Framework pagination component

I just released on riskle's assembla space a new version of my pagination component for the Zend Framework which you can download right now:

Riskle Paginate r122

This release fixes a nasty bug in Riskle_Db_Table::fetchCols which prevented from retrieving the right count of cols involved in the query.

The table component has also been slightly rewritten following Erik's suggestion to move the parent mapping into _fetch. The parent mapping itself has been improved to allow "multi level" table joining. This will be best explained with an example:

Say you have three table, Foo, Bar and Quux, and you would like to execute the following query:

SELECT * FROM Foo JOIN Bar ON Foo.bar_id = Bar.id JOIN Quux ON Bar.quux_id = Quux.id

This is now possible with the following mapping (in Foo's class of course):

array(
    'Bar' => array('local' => 'bar_id', 'remote' => 'id'),
    'Quux' => array('local' => 'quux_id', 'remote' => 'Quux.id'),
);

Easy heh ?

As usual, any comments are appreciated, and please note that this code is released under the same license as the ZF itself, the new-bsd license.

Sunday 23 September 2007

Of controller plugins and directory layout

When anyone on #zftalk ask about where controller plugins should be kept, we usually responds something like have your own library namesapce alongside Zend/ and put it in it like YourNamespace/Controller/Plugin/YourPlugin.php. But what about application specific controllers ? There's a time where you have to write a plugin that relies on the application at such a level that using it elsewhere would make no sense. In that case, where can we store this plugin ? The question arised this morning, and we ended up to the fact that having a controller-level plugin directory would not hurt, after all. So one could have the following directory layout (simplified on purpose):

/application/modules/default
    /controllers
    /library/Plugin
        MyPlugin.php

The drawback is that in order to use autoload you would have to have each modules Plugin dir in the include path, which is a bit of a hassle. Instead, we could have the much more simple folloing layout:

/application
    library/Controller/Plugin
        MyPlugin.php

Which is simpler but does not allow for modules specific plugins. Anyway, the former layout would require a bit more logic in the bootstrap in order to extract every modules path as plugins are registered pre-dispatch.

Hope it helps with directory layout organization :-)

UPDATE

What I've finally decided to do is the following:

/application
    library/App/Controller/Plugin
        MyPlugin.php

So that application specific code gets prefixed with the App_ namespace.

- page 4 of 38 -