Relation OneToMany et ManyToOne des entités Doctrine

Logo DoctrineSuite du tutoriel sur la création des relations entre entités pour leur persistance en base de données avec Doctrine.

Dans cette partie nous traiterons de OneToMany et sa réciproque ManyToOne

Shchéma merise d'une relation OneToMany ManyToOneUne région possède zéro ou plusieurs départements.
Un département appartient à une et une seul région. Continuer la lecture

Publié dans Doctrine, PHP, Symfony 2 | Un commentaire

Lire un fichier Microsoft Excel (.xls) avec PHP

Logo de la librairie PHPExcelCe tutoriel ce veut simplisme. On va juste voir comment lire un fichier Excel afin de le représenter au format HTML.

Pour cela on va utiliser la librairie PHPExcel de CodePlex.
Contrairement au tutoriel précédent, cette librairie est maintenue et ne pose pas de problème d’encodage.
La librairie est bien documentée et un grand nombre d’exemples sont fournis et elle est utilisée dans PhpMyAdmin.

require_once '.Classes/PHPExcel/IOFactory.php';

// Chargement du fichier Excel
$objPHPExcel = PHPExcel_IOFactory::load("unFichierExcel.xls");

/**
* récupération de la première feuille du fichier Excel
* @var PHPExcel_Worksheet $sheet
*/
$sheet = $objPHPExcel->getSheet(0);

echo '<table border="1">';

// On boucle sur les lignes
foreach($sheet->getRowIterator() as $row) {

   echo '<tr>';

   // On boucle sur les cellule de la ligne
   foreach ($row->getCellIterator() as $cell) {
      echo '<td>';
      print_r($cell->getValue());
      echo '</td>';
   }

   echo '</tr>';
}
echo '</table>';

Voila. C’est tout. Rien de compliqué.

Par contre si vous voulez aller plus loin, la librairie regorge de fonctionnalités pour la lecture et l’écriture de fichier. Et elle ne se contente pas du format xls elle prend aussi en charge le xlsx d’Excel 2007.

Publié dans PHP | 3 commentaires

Mappage des entités avec les annotations de Doctrine.

Logo DoctrinePetit tutoriel sur le mappage des entités (que l’on appel Entity) avec doctrine et son système d’annotation.

On ne verra que quatre types de relation (je ne sais même pas s’il y en existe d’autre) :

Et pour que le choses soit un peu plus graphique et compréhensible, je vous met un exemple pour chaque avec le code SQL des tables créés, les classes PHP en découlant et un schéma Merise basique.

Pourquoi Merise ? Alors qu’il faudrait lui préférer l’UML qui est quand même plus approprié pour les constructions de base de données objets. Simplement parce que les habitudes ont la vie dure et que l’on va encore manger du Merise pendant un grand nombre d’années. Continuer la lecture

Publié dans Doctrine, PHP, Symfony 2 | Un commentaire

Personnalisation avancé des pages d’erreurs, Symfony 2

La documentation de Symfony 2 est assez claire sur la personnalisation des pages d’erreur avec Twig : http://symfony.com/doc/current/cookbook/controller/error_pages.html

Le petit apport que je voudrais faire par rapport à la documentation concerne l’affichage de la page de débogage original de Symfony.

Il serait bien que les nouvelles pages d’erreurs aient deux comportements en fonction de l’environnement d’exécution de l’application.
Un pour l’environnement de production (Votre template à vous), et un autre pour l’environnement de développement. Dans ce second cas, on aimerais avoir la page de débug original de Symfony, qui sera bien plus explicite que la page d’erreur que l’on réserve à nos futurs utilisateurs.

Pour palier à cela, il suffit d’ajouter ce code dans votre template twig.

{% if  app.environment == 'dev' %}
{% render 'TwigBundle:Exception:show' with{'exception':exception, 'logger':logger, 'format':format} %}
 {% else %}
ICI Votre template d'erreur personalisé
{% endif %}

En gros, si vous êtes en environnement de développement, c’est la page de débug original qui est utilisé et non celle que vous avez définit.

Publié dans PHP, Symfony 2 | Laisser un commentaire

Windows XP/Seven pour un dépot Mercurial en SSH

Petit how-to pour installer Mercurial sur un poste Windows et pouvoir l’utiliser avec une connexion ssh (si ça c’est pas du sadisme pur).

Ce tutoriel est réalisé dans le cadre d’une connexion d’un poste Windows (XP/Seven) à un serveur Debian où est installé un dépôt Mercurial.

Dans un premier temps il faut télécharger ces petits programmes :

  • mercurial-X.X.X-x86.msi (ou celui compatible avec votre version de Windows)
  • puttygen.exe : va permettre de générer une paire de clé public/privé
  • TortoiseHg  : va permettre à Mercurial d’utiliser le protocole ssh
  1. On installe Mercurial à la mode Windows (suivant, suivant, …, finish)
    penser à cocher la case « Add the installation path to the search path »
  2. On installe TortoiseHg à la mode Windows (suivant, suivant, …, finish).
  3. Générer une clé public avec puttygen.exe.
    1. Ouvrir puttygen.exe
    2. Sélectionner le bouton radio « SSH-2 DSA »
    3. Bouger la souries dans la zone vierge, grâce à vos mouvement il va générer une clé aléatoire (génial non ?)
    4. Vérifier que les champs « Key passphrase » et « Confirm passphrase » soient vide.
    5. Sauvegarder la clé publique (où vous voulez, on ne vas pas s’en servir ici mais elle pourrais vous être utile)
    6. Sauvegarder la clé privé dans C:\Program Files\Mercurial\mercurial.ppk (Là où est installé mercurial)
  4. Éditer le fichier « Mercurial.ini » qui se trouve à la racine du dossier d’installation de Mercurial.
    1. Penser à remplacer le nom du user et son email (et enlever le « ; » devant, sinon ça reste commenté)
    2. Ajouter en dessous de la ligne « ;ssh = C:\cygwin\bin\ssh » cette ligne
      ssh = "C:\Program Files\TortoiseHg\TortoisePlink.exe" -ssh -2 -i "C:\Program Files\Mercurial\mercurial.ppk" 
    3. On sauvegarde le fichier (évident ?)

C’est finit !

Pour paramétrer Ecplise, c’est comme d’habitude :
1. Aller dans « Help » puis « Eclipse marketpalce… »
2. Rechercher « mercurial » et sélectionner « MercurialEclipse (was HGEclipse) »
3. L’installer
4. Le paramétrer

Publié dans Eclipse | Laisser un commentaire

Connaitre l’environnement d’exécution dans un DataFixture

Rapel : Le système de DataFixture proposé par Doctrine dans le framework Symfony2 offre la possibilité de créer des tâches initialisant le contenue d’une base de données. Cela permet lors du développement de recouvrer une base de données opérationnel en un minimum de temps et d’effort. Personnellement je m’en sert aussi pour initialiser une base de données destiné à passer sur un serveur de production.

Symfony 2 ne dispose pas de système de DataFixture contrairement à la version 1.x du framework. Il est cependant possible d’ajouter cette fonctionnalité (suivez le lien).

Fin du rappel !

A mon goût il manque une chose dans le système de DataFixture proposer. Comme la possibilité de connaître le type d’environnement dans le quel il s’exécute (dev, prod, …).
Il peut être utile d’avoir cette information si l’on veux différencier deux types de traitement dans une même classe. Dans un environnement de développement je zap certaine insertion en base de données et j’en ajoute d’autre afin d’avoir du contenue à traiter (tambouille perso !).

Donc voici un petit script a ajouter dans chaque classe où il y en a besoin. Ce script ne fonctionne que si le DataFixture a été lancé en ligne de commande :

$:php app/console doctrine:fixtures:load

le script :

$env = "dev";
if($_SERVER['argv']) {
  reset($_SERVER['argv']);
  while(next($_SERVER['argv'])) {
   if(current($_SERVER['argv']) == '--env') {
   $env = next($_SERVER['argv']);
  }
 }
}
Publié dans Doctrine, PHP, Symfony 2 | Laisser un commentaire

[Firefox] disparition des icones des dossier

Suite à l’installation du dernier Firefox sur Ubuntu, les icônes de dossier associées aux marques pages avaient disparut. Après une courte recherche, voilà ce que j’ai trouvé.
Effectivement ça fonctionne, et avec ça j’ai même les icônes de tout les menus des différents logiciels qui sont apparut!

menu sans icône

menu avec icônes

La méthodes à suivre :
[alt+F2]
saisir : gconf-editor

dans la fenêtre qui s’ouvre cocher la case :
/desktop/gnome/inerface/menu_have_icons

Publié dans Ubuntu | 2 commentaires

[Symfony 2] Comment accéder à Doctrine depuis un test unitaire

Il est possible que durant votre développement avec le framework Symfony 2 (version BETA 5 à l’heure où j’écris) vous ayez besoin d’accéder à vos Entities depuis vos tests unitaires.

Il n’a pas été facile de trouver le moyen de communiquer avec Doctrine depuis ces foutus test unitaire ! C’est pour cela que je vous livre mon code, enfin celui d’un test unitaire.

Donc cette classe montre comment accéder a l’ORM de doctrine depuis une classe de test unitaire qui va donc, normalement, être exécuté avec PHPUnit !

namespace Waldo\ModelBundle\Tests\DataFixtures;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; // Très important, c'est grâce à lui que l'on peut utiliser la méthode "$this->getKernelClass()"

class DataFixturesTest extends WebTestCase {

    public function __construct() {

        $kernelNameClass = $this->getKernelClass(); // Récupération du nom de la classe qui sert de kernel
        $kernel = new $kernelNameClass('test', true); // Instanciation de la classe et exécution du kernel dans un environnement de test avec débogage
        $kernel->boot(); // On boot le kernel (comme un pc ^^)
        $this->em = $kernel->getContainer()->get('doctrine.orm.entity_manager'); // On récupère entity manager
    }

    public function testPurgeData() {
       //...
       // On peut maintenant appeler les méthodes de l'ORM de Doctrine
       $query = $this->em->getConnection()->query('SELECT * FROM UNE_SUBLIME_TABLE');
       $this->assertEmpty($query->fetchAll());
    }

}
Publié dans Doctrine, PHP, Symfony 2 | Laisser un commentaire

[htaccess] Redirection permanente sans paramètre dans l’url

Petit truc pour faire des redirection permanente d’un domaine vers un autre sans conserver les paramètres qui se trouverais dans l’url, grâce à un fichier .htaccess .

RewriteEngine on
RewriteRule ^.*$ http://www.addresse-vers-laquelle-rediriger.com/? [R=301,L]

En gros une redirection de www.vieux-site.com vers www.nouveau-site.com :
www.vieux-site.com/mabellepage.html => www.nouveau-site.com
www.vieux-site.com/?param=1&param=2 => www.nouveau-site.com

Publié dans Faites du Web | Laisser un commentaire

un Bug dans Spring Tool Suite (STS)

Spring Tool Suite

Spring Tool Suite

un bug dérangeant du à Spring Tool Suite (STS) plugin d’Eclipse.

Si dans un de vos projet incluant le framework Spring vous utilisez Spring Tool Suite avec Eclipse, il est possible qu’un de vos Beans (fichier xml de configuration) soit marqué comme comportant une erreur. Bien que ce ne soit pas le cas. Ce qui vous en conviendrez est fâcheux, car à chaque compilation Eclipse vous rappel qu’il y a une erreur dans votre projet…

illustration du bug

illustration du bug

Pour ma part cette erreur est la suivante :
« Error occured processing XML ‘Provider org.apache.xerces.parsers.XIncludeAwareParserConfiguration could not be instantiated: org.apache.xerces.impl.dv.DVFactoryException: DTD factory class org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl does not extend from DTDDVFactory.’ »

La solution se trouve à cette adresse : http://forum.springsource.org/showthread.php?p=351964

Je vous la retranscrit :
Ouvrez le Dashbord (tableau de bord) de STS, allez dans l’onglet « Extention« , sélectionner le patch « Patch for issue STS-1672 » et cliquez sur Install.

Une fois Eclipse redémarré, sélectionner le dossier racine de votre projet et faite « F5« 

Publié dans Java | Laisser un commentaire