Doctrine: quelques petits secrets

doctrine-secret Oui, je commence à parler de Doctrine de plus en plus vu que je commence à l’utiliser à grande échelle au boulot. Et il y a un détail où j’ai encore du mal, c’est l’opacité de cet ORM comparé à son prédécesseur dans Symfony, Propel.

On se rappelle tous (enfin je parle au passé, mais Propel n’est pas mort hein :p) qu’on avait tout à disposition dans le BasePeer de notre modèle, les accesseurs, les modificateurs et quasi toutes les méthodes dont on pouvait avoir besoin. Avec Doctrine, la donne a changé, tant cet ORM est codé différemment.

On se retrouve du coup un peu perdu parfois, sans trop savoir ce qu’on peut utiliser. Et là, il faut bien sûr jeter un œil à l’API Doctrine. Mais on le sait tous, on a pas toujours le temps! Du coup, au travers de mes recherches, j’ai trouvé quelques petites méthodes que j’utilise régulièrement et dont je vais vous parler.

Lire la suite

IE qui joue à cache cache avec l’ajax

applications-other Oui je sais encore un nouveau billet sans le nouveau thème. Mais il est bien fini à 90%. Il manque quelques tests et un petit module qui me tient à coeur.

Bref, en attendant, pas de raison que je ne publie pas! Voici donc une mini astuce, sur un problème rencontré cette semaine, qui m’aura un peu usé, surtout quand on voit la solution finale.

On va donc parler de IE et de l’AJAX.

Lire la suite

Symfony: Personnaliser le nom du fichier lors d’un upload avec sfWidgetFormInputFileEditable

system-software-update On emploie tous je pense, assez couramment maintenant, le widget sfWidgetFormInputFileEditable qui permet de rajouter quelques fonctionnalités à un widget d’upload classique, en l’occurrence visualisation et suppression. Le souci que j’ai rencontré récemment, c’est par contre la personnalisation du nom du fichier ainsi généré.

En effet, par défaut celui-ci est une empreinte sha1 généré aléatoirement, ce qui convient pour la majeure partie des cas, mais parfois ne suffit pas. Mais là encore Symfony étonne par le mécanisme mis en place pour contourner cette problématique, encore faut-il le savoir malheureusement.

Lire la suite

Symfony: Faites passer le message

accessories-text-editor Petit retour sur Symfony pour débattre d’un sujet que je traine dans mes cartons depuis le début de ce blog quasiment mais dont je n’avais jamais vraiment eu le temps de parler: La communication entre l’application et l’utilisateur.

Je profite donc de n’avoir pas de sujets brûlants à vous faire part, pour attaquer ce billet.

En effet, c’est souvent un détail qu’on oublie très vite et il n’y a qu’à voir les maquettes qu’on reçoit pour nos devs, je pense que les bon élèves qui pensent à faire un petit mockup d’un message utilisateur sont pas forcément légions. Et pourtant, dans une optique purement IHM, l’application se doit de communiquer avec l’utilisateur pour montrer qu’il comprend bien la requête.

Difficilement d’imaginer d’appuyer sur un bouton et ne pas savoir si l’application a bien saisi et effectué notre demande. Et pourtant ce n’est pas rare de croiser encore de telles applications même si la tendance s’est inversée depuis l’avènement du deux point zéro.

Le souci, c’est que c’est souvent un peu fastidieux à mettre en place. Heureusement, nous on utilise Symfony et il va nous simplifier les choses pour peu qu’on pose les bonnes bases.

Lire la suite

Symfony: Relation many-to-many sur la meme table avec Propel

system-search Beaucoup de boulot pour cette courte semaine (je suis en week end, ce soir :D) du coup, je n’ai pas eu le temps de faire le billet Symfony du mardi! Ca tombait bien en même temps, car je n’avais pas énormément d’idées.
Finalement, j’ai trouvé un petit quelque chose pour subvenir à vos besoins de nouveautés permanents. On va parler d’une petite faiblesse dans Propel, que je n’ai pas encore pris le temps d’analyser dans toute sa profondeur mais qui reste assez gênant: La gestion des relations many-to-many sur une même table.

Lire la suite

Personnaliser le code HTML d’un widget symfony

system-software-update Comme dit le proverbe, billet du mardi, billet symfony… Bon on va dire que c’est un nouveau proverbe mais pour le coup, on va continuer cet adage avec au programme aujourd’hui les possibilités offertes par symfony pour modifier le code HTML construit par ses fameux widgets de son système de formulaire.

Plus mon nombre de projets défile sous Symfony et plus j’essaye d’éviter de faire des choses hors framework, mais plutôt de voir comment on pourrait le régler via le framework. Avant, quand un problème se présentait, j’optais souvent pour une solution alternative quitte à mettre de côté pour une petite fonction la philosophie Symfony. Mais voilà, je l’aime moi, cette philosophie et au fur et à mesure, j’ai décidé de mettre de plus en plus les mains dans la cambouis et les yeux dans le code source, pour résoudre mes problèmes.

Lire la suite

Symfony Admin generator: Transformer un filtre en multi filtre

applications-other Petit retour à un billet un peu plus technique le temps de préparer la suite sur twitter. Si il y a bien une chose dont on ne plus se passer une fois qu’on y a goûté dans symfony, c’est bien l’admin generator. Surtout que la doc couvre déjà pas mal de possibilités, mais avec un peu d’imagination on peut vraiment en faire ce qu’on veut.

Et ca tombe bien, parce que niveau idées tordues, nos chefs de projets ou clients sont rarement les derniers, vous serez d’accord avec moi ;)

Lors d’une présentation d’un back office récemment, on m’a demandé s’il était possible de choisir plusieurs valeurs lors du filtrage (en l’occurence des marques de produits). « Certainement » fut ma réponse, même si j’en avais aucune idée. J’ai donc jeté un coup d’oeil sur cette histoire et c’était finalement l’histoire de 2min.

Lire la suite

Mysql, Propel et l’UTF8 sont dans un bateau

edit-cut Un gros souci que j’ai toujours eu lors de mes projets symfony c’est la capacité de dire à Propel que je veux ma base en UTF8, j’ai beau mettre UTF8 un peu partout, database.yml, schema.yml, propel.ini rien n’y fait, mon build-all créé mes tables en ISO. D’ailleurs un peu déçu que Jobeet chapitre 3 n’aborde pas le sujet.

J’ai donc tenté de voir du côté de Mysql, pour mettre ce dernier par défaut en utf8, mais là aussi, on a beau remplir le my.cnf de utf8 dans toutes les options, rien de concret ne se produit.

J’en été donc resté à devoir rajouter à la main, dans mon .sql généré par symfony, le fameux « DEFAUT CHARSET=UTF8″. Mais devoir le rajouter à chaque modification de mon schema, cela peut devenir pénible dans des projets de tests.

Et puis par hasard au détour d’une conversation sur mysql dans une mailing-list (mea culpa j’ai pas noté l’adresse) je suis enfin tombé sur quelque chose qui fonctionne! A la création de la table, écrire:

CREATE DATABASE mydb CHARACTER SET utf8 COLLATE utf8_general_ci

Voilà, toutes les tables créés maintenant dans cette base seront en UTF8 par défaut.

Il y a sans doute mieux, mais pour l’instant je me contente de ça. Mais peut-être que quelqu’un a une meilleur solution? Comment gérez-vous vos tables en UTF8?

De l’art de bien configurer vos credentials dans Symfony

system-run J’ai été confronté récemment à un problème tout bête dans ma gestion de droits sous Symfony. En effet, je voulais pouvoir configurer dans mes security.yml, une autorisation d’accès pour un certain niveau d’utilisateur ou en étant admin.

Tout naturellement j’ai opté pour l’écriture:

editArticle:
credentials: [ admin, editor ]

Mais l’accès devenait impossible pour les deux, alors que l’un ou l’autre fonctionnait. J’ai donc décidé d’appliquer tous les groupes au groupe admin pour régler le problème, manque de temps pour me documenter. Après coup, le problème m’étant revenu pendant que je naviguais sur le site du framework, j’ai tenté une recherche et la forcément la réponse devant mes yeux.

Lire la suite

Effectuer un pré et/ou post traitement dans vos actions Symfony

dialog-information Dans le genre, méthode symfony dont on ne parle pas qui peuvent être utiles, voici preExecute et son copain postExecute toutes les deux, méthodes de sfAction.

Comme leur nom le laisse à penser, ce sont des méthodes qui seront appeler en amont et en aval de l’exécution d’une action. Je n’ai pas vraiment d’idée d’utilisation à l’heure où j’écris mais dans un souci de factorisation, je trouve le concept intéressant et c’est bien avec ce genre de méthodes que je trouve Symfony si bien pensé.

Quelqu’un s’en est déjà servi? Une utilisation intéressante qui gagne à être connue?

PHVsPjxsaT48c3Ryb25nPndvb19hZHNfcm90YXRlPC9zdHJvbmc+IC0gdHJ1ZTwvbGk+PGxpPjxzdHJvbmc+d29vX2FkX2ltYWdlXzE8L3N0cm9uZz4gLSBodHRwOi8vd3d3Lndvb3RoZW1lcy5jb20vYWRzL3dvb3RoZW1lcy0xMjV4MTI1LTEuZ2lmPC9saT48bGk+PHN0cm9uZz53b29fYWRfaW1hZ2VfMjwvc3Ryb25nPiAtIGh0dHA6Ly93d3cud29vdGhlbWVzLmNvbS9hZHMvd29vdGhlbWVzLTEyNXgxMjUtMi5naWY8L2xpPjxsaT48c3Ryb25nPndvb19hZF9pbWFnZV8zPC9zdHJvbmc+IC0gaHR0cDovL3d3dy53b290aGVtZXMuY29tL2Fkcy93b290aGVtZXMtMTI1eDEyNS0zLmdpZjwvbGk+PGxpPjxzdHJvbmc+d29vX2FkX2ltYWdlXzQ8L3N0cm9uZz4gLSBodHRwOi8vd3d3Lndvb3RoZW1lcy5jb20vYWRzL3dvb3RoZW1lcy0xMjV4MTI1LTQuZ2lmPC9saT48bGk+PHN0cm9uZz53b29fYWRfdXJsXzE8L3N0cm9uZz4gLSBodHRwOi8vd3d3Lndvb3RoZW1lcy5jb208L2xpPjxsaT48c3Ryb25nPndvb19hZF91cmxfMjwvc3Ryb25nPiAtIGh0dHA6Ly93d3cud29vdGhlbWVzLmNvbTwvbGk+PGxpPjxzdHJvbmc+d29vX2FkX3VybF8zPC9zdHJvbmc+IC0gaHR0cDovL3d3dy53b290aGVtZXMuY29tPC9saT48bGk+PHN0cm9uZz53b29fYWRfdXJsXzQ8L3N0cm9uZz4gLSBodHRwOi8vd3d3Lndvb3RoZW1lcy5jb208L2xpPjxsaT48c3Ryb25nPndvb19hbHRfc3R5bGVzaGVldDwvc3Ryb25nPiAtIGN1c3RvbS5jc3M8L2xpPjxsaT48c3Ryb25nPndvb19hdXRvX2ltZzwvc3Ryb25nPiAtIGZhbHNlPC9saT48bGk+PHN0cm9uZz53b29fY29udGVudF9hcmNoaXZlczwvc3Ryb25nPiAtIGZhbHNlPC9saT48bGk+PHN0cm9uZz53b29fY29udGVudF9ob21lPC9zdHJvbmc+IC0gZmFsc2U8L2xpPjxsaT48c3Ryb25nPndvb19jdXN0b21fZmF2aWNvbjwvc3Ryb25nPiAtIDwvbGk+PGxpPjxzdHJvbmc+d29vX2ZlZWRidXJuZXJfdXJsPC9zdHJvbmc+IC0gPC9saT48bGk+PHN0cm9uZz53b29fZ29vZ2xlX2FuYWx5dGljczwvc3Ryb25nPiAtIDwvbGk+PGxpPjxzdHJvbmc+d29vX2xvZ288L3N0cm9uZz4gLSBodHRwOi8vd3d3LmFtaWNhbGVtZW50LXdlYi5uZXQvd3AtY29udGVudC93b29fdXBsb2Fkcy8zLWxvZ28ucG5nPC9saT48bGk+PHN0cm9uZz53b29fbWFudWFsPC9zdHJvbmc+IC0gaHR0cDovL3d3dy53b290aGVtZXMuY29tLzwvbGk+PGxpPjxzdHJvbmc+d29vX25hdl9leGNsdWRlPC9zdHJvbmc+IC0gPC9saT48bGk+PHN0cm9uZz53b29fcmVzaXplPC9zdHJvbmc+IC0gdHJ1ZTwvbGk+PGxpPjxzdHJvbmc+d29vX3Nob3J0bmFtZTwvc3Ryb25nPiAtIHdvbzwvbGk+PGxpPjxzdHJvbmc+d29vX3RoZW1lbmFtZTwvc3Ryb25nPiAtIFR5cGViYXNlZDwvbGk+PGxpPjxzdHJvbmc+d29vX3RodW1iX2hlaWdodDwvc3Ryb25nPiAtIDEwMDwvbGk+PGxpPjxzdHJvbmc+d29vX3RodW1iX3dpZHRoPC9zdHJvbmc+IC0gMTAwPC9saT48bGk+PHN0cm9uZz53b29fdXBsb2Fkczwvc3Ryb25nPiAtIGh0dHA6Ly93d3cuYW1pY2FsZW1lbnQtd2ViLm5ldC93cC1jb250ZW50L3dvb191cGxvYWRzLzMtbG9nby5wbmc8L2xpPjwvdWw+