Symfony: Une utilisation du type array de Doctrine

check Oui, les billets Symfony commençaient à me manquer. Mais difficile de trouver et le temps et la ressource pour en faire. Mais voici une petite astuce illustrée qui permet de trouver une application au type array de Doctrine tout en simplifiant une problématique. Tout ce que j’aime.

Lire la suite

Symfony et les tests

Capture d’écran 2009-10-12 à 17.17.12
On entend partout que les tests unitaires sont indispensables, que si tu n’en fais pas c’est que tu es sale, voire même que tu codes sous Windows avec Wordpad (quoi il n’y a pas de rapport ?). Si vous aussi vous faites partie des gens qui sont persuadés que oui c’est bien (sinon je peux plus rien pour vous), mais je vois vraiment pas comment faire et par où commencer avec mon code, peut être que je vais pouvoir vous éclairer.

Lire la suite

Benchmark Apache: doctrine hydrate object vs array

clock Il faut se rendre à l’évidence, défendre une idée sans argument, c’est bien souvent très compliqué. Et quand il a fallu que j’arrive à quantifier le réel apport d’une hydratation en tableau plutôt qu’en object, c’était un peu difficile. Rappelez-vous, j’en avais parlé dans les secrets de doctrine.

Je me suis donc dis que j’allais tout simplement le benchmarker grosso modo, afin d’avoir une idée du gain qu’on peut avoir à passer par des tableaux. Car en fait, on sait très bien que le 2e est plus rapide, mais la question, c’est de combien.

Lire la suite

Tips : Configuration de serveurs

Tips : Configuration de serveurs

Pour bien configurer un serveur, il existe plusieurs façons, chaque administrateur ayant la plupart du temps sa propre conf en fonction de ses habitudes et celles de ses users.

Je vous propose ici quelques petits tips à mettre en place sur votre serveur pour voir un peu se qui s’y passe.

Lire la suite

Mini solution antispam, quand le CSS retourne l’envers du PHP

stop-spam
Dans le monde du web, un seul fléau uni tout le monde contre lui, le spam.

Rien à dire, en plus de ne pas être écologique, on a du mal à y voir un intérêt, pauvres humains que nous sommes. Mais quand vient le moment d’écrire son adresse mail sur un site web qui sera visible par tout le monde, on en tremblerait presque.

Du coup, il existe beaucoup de techniques, l’idéal étant encore de ne pas écrire son adresse mail en toutes lettres sur son site! Mais des fois, cela reste bien pratique. Voici donc une solution très simple à mettre en place, qui sans être parfaite, assure quand même le boulot dans la majorité des cas.

Lire la suite

Yahoo aspire Smushit

smushit SmushIt, j’en ai parlé à mes débuts, c’est un des services web que j’utilise régulièrement. Mais la semaine dernière, j’ai été étonné de voir que l’extension firefox ne fonctionnait plus, le site web aussi semblait dans les choux. La cause? A Yahoo qui avait un peu loupé sa redirection vers la nouvelle URL de ce service.

Lire la suite

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

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+