flosy.info | Développement Web, Open source …

CAT | Développement

Je souhaitais utiliser la méthode copy de Doctrine_Record pour dupliquer un objet et les objets auxquels il est associé.
Pour cela il suffit de placer le paramètre $deep de la méthode copy à true, du moins c’est ce que je pensais.
Pour que cela fonctionne il faut charger au préalable les relations qui nous intéressent. (C’est très bien expliqué dans cet article http://david-gueye.fr/2010/02/02/dupliquer-ou-cloner-un-objet-doctrine-record/).

Voici un petit exemple :

  $groupe = Doctrine_Core::getTable("Groupe")->find(1);
  $groupe->loadReference("Utilisateurs");
  $copieGroupe = $groupe->copy(true);
  $copieGroupe->save();

Related Posts:

Je suis à la recherche d’une bibliothèque PHP qui me permette de créer des documents PDF. Commençons par une recherche des plugins PDF existants.

Une recherche dans la base de symfony remonte les plugins suivants :

  • sfTCPDFPlugin utilisé par 85 personnes
  • pmPDFKitPlugin utilisé par 2 personnes

Le choix de la bibliothèque sera conditionné par les attentes suivantes :

  1. les fonctionnalités proposées (au moins la gestion des images, des listes et des tableaux),
  2. la simplicité d’utilisation,
  3. la rapidité de mise en œuvre.

sfTCPDFPlugin

Le plugin est dans une version stable (1.6.2) et il repose sur la bibliothèque TCPDF.

Installation et configuration

Le plugin s’installe classiquement avec la commande « symfony plugin:install ».

Attention le plugin ne fournit pas TCPDF et vous devez le récupérer sur sourceforge. La version 5.9.044 est utlisée pour ce test.

La configuration est faite au travers d’un fichier pdf_config.yml à placer dans le répertoire config de l’application.

Pour effectuer rapidement un test de la bibliothèque, un module est fourni avec 2 exemples. Nous allons activer ce module pour réaliser les tests. Nous éditons pour cela le fichier settings.yml.

all:
  .settings:
    # Default modules  
    enabled_modules: [default, sfTCPDF]

Lors de mes essais quelque soit l’exemple j’obtenais une erreur fatale.

Fatal error: Maximum execution time of 30 seconds exceeded

Après quelques recherches la solution au problème tient au paramétrage de l’option « font subset » (Vous trouverez d’autres conseils d’optimisation dans le forum : http://sourceforge.net/projects/tcpdf/forums/forum/435311/topic/3785743).

Pour mettre en place la correction, après avoir instancié la classe sfTCPDF, utilisez la méthode setFontSubsetting.

<?php
  //create new PDF document (document units are set by default to millimeters)
  $pdf = new sfTCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true);
 
  $pdf->setFontSubsetting(false);
  ...
?>

Fonctionnalités

TCPDF est particulièrement complète parmi toutes les fonctionnalités disponibles voici celles qui m’ont paru utiles.

  • Gestion des entêtes et pieds de page.
  • Gestion des tableaux.
  • Transformation HTML vers PDF
  • Gestion des graphiques
  • Gestion des tables des matières
  • Gestion des images

pmPDFKitPlugin

Le plugin est en version stable (1.0.0) et il repose sur la bibliothèque wkhtmltopdf.

Installation et configuration

Le plugin s’installe classiquement avec la commande « symfony plugin:install ».

Il faut là aussi télécharger la bibliothèque tierce à cette adresse : http://code.google.com/p/wkhtmltopdf/downloads/list.

Ensuite nous activons le filtre du plugin dans le fichier filters.yml de l’application.

rendering: ~
security:  ~
 
# insert your own filters here
pm_pdfkit:
  class: pmPDFKitFilter
 
cache:     ~
execution: ~

Pour le paramétrage de l’application nous modifions la taille de la page pour qu’elle soit au format A4.

all:
  pm_pdfkit:
    page-size: A4

Enfin il faut modifier le fichier routing.yml de l’application pour prendre en compte les formats.

default_index:
  url:   /:module.:sf_format
  param: { action: index, sf_format: html }
 
default:
  url:   /:module/:action.:sf_format/*
  param: { sf_format: html }

Ceci permet de déclencher la génération PDF d’une action, à l’utilisation de du format pdf. Par exemple http://flosy.info/default/index.pdf.

Fonctionnalités

Le plugin transforme tout simplement une action en document PDF. Le plugin semble avoir un bug au niveau des CSS et des images.

Autres bibliothèques

En plus de ces 2 plugins et de leur bibliothèque respective, il sera intéressant de tester le composant Zend_Pdf du Zend Framework.

Related Posts:

· · · · ·

L’une des classes de mon modèle dispose d’un attribut default. Voici un extrait du schéma qui montre l’élément en question.

Group:
  columns:
    id:        { type: integer, primary: true, autoincrement: true }
    name:      { type: string(255) }
    default:    { type: boolean }

Lors de la création du modèle l’erreur suivante apparaît :

$ symfony doctrine:build --all
...
>> doctrine  generating sql for models
>> doctrine  Generated SQL successfully for models
>> doctrine  creating tables
 
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'default TINYINT(1), PRIMARY KEY(id)) ENGINE =
INNODB' at line 1. Failing Query: "CREATE TABLE group (id BIGINT AUTO_INCREMENT, name VARCHAR(255), default 
TINYINT(1), PRIMARY KEY(id)) ENGINE = INNODB". Failing Query: CREATE TABLE group (id BIGINT AUTO_INCREMENT, 
name VARCHAR(255), default TINYINT(1), PRIMARY KEY(id)) ENGINE = INNODB

Si nous observons le script SQL produit dans data/sql/schema.sql nous trouvons :

CREATE TABLE GROUP (id BIGINT AUTO_INCREMENT, name VARCHAR(255), DEFAULT TINYINT(1), PRIMARY KEY(id)) ENGINE = INNODB;

DEFAULT est un mot clé réservé aussi pour l’utiliser il nous faut échapper le nom du champ avec des backquotes.

Un ticket sur le trac du projet symfony explique ce problème (le ticket en question).

Nous utilisons la méthode configureDoctrine de ProjectConfiguration pour paramétrer doctrine.

class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
    $this->enablePlugins('sfDoctrinePlugin');
  }
 
  public function configureDoctrine(Doctrine_Manager $manager)
  {
    $manager->setAttribute(Doctrine::ATTR_QUOTE_IDENTIFIER, true);
  }
}

Cette fois le script SQL échappe les noms de champ.

CREATE TABLE `group` (`id` BIGINT AUTO_INCREMENT, `name` VARCHAR(255), `default` TINYINT(1), PRIMARY KEY(`id`)) ENGINE = INNODB;

Update

Dans le cas d’un nom de BDD avec un tiret, cette astuce est nécessaire (par exemple ma-bdd).

Related Posts:

· ·

Dans un formulaire de création de compte je souhaite effectuer un double contrôle sur le champ login. Pour cela il suffit d’utiliser le validateur sfValidatorAnd qui permet d’associer plusieurs validateurs à un même champ.

Voici un exemple de code :

class MyForm extends sfForm {
  /**
   * Configures the current form.
   * 
   * @return void
   * @access public
   */
   public function configure() {
     $this->setWidgets(
       array(
         "login" => new sfWidgetFormInputText(),
         "password" => new sfWidgetFormInputPassword(),
         "password_confirmation" => new sfWidgetFormInputPassword(),
       )
     );
 
     $this->setValidators(
       array(
         "login" => new sfValidatorAnd(
	   array(
	     new sfValidatorString() ,
	     new sfValidatorDoctrineUnique(
	       array(
	         "model" => "User", 
	         'column'=>'login'
	       )
	     ),
	   )
	 ),											
...
      )
   );
...
  }
}

Related Posts:

· ·

Papyrus est un plugin pour eclipse qui gère plusieurs langages de modélisation dont UML2. Le fait qu’il soit un plugin d’eclipse le rend portable et disponible dans les projets eclipse existants.

Avant d’envisager son installation, il est à noter que le projet fait partie des projets d’eclipse en incubation.

Dans ce post je présente l’installation à partir des mises à jour automatiques mais une version « all-in-one » est disponible.
Plusieurs versions de mise à jour sont également disponibles fonction du niveau de stabilité souhaité (voir la page relative).
Pour ma part j’ai choisi la branche stable (dans mon cas la version 0.7.0).

Une fois installé le plugin ajoute une perspective éponyme et 2 nouveaux éléments : Papyrus Project et Papyrus Model.

Le projet permet de créer un nouveau projet qui se rapporte à Papyrus, le second permet une intégration dans un projet existant.
Quelque soit votre choix vous arrivez sur la fenêtre suivante qui vous propose de choisir les diagrammes à utiliser.

La vue qui présente notre modèle permet de basculer d’un diagramme à un autre grâce à un système d’onglets.

Après avoir passer en revue les différents diagrammes, je trouve l’outil très complet mais il serait trop long de passer toutes les fonctionnalités en revue.

Aussi si vous souhaitez en savoir plus reportez vous au guide utilisateur (il est en cours de rédaction) disponible à l’adresse suivante.

Related Posts:

· ·

Lors d’une migration de Prototype vers jQuery il fallait garder la fonctionnalité de scroll dans la page.
La fonctionnalité existante est relativement simple, au clic sur un lien le navigateur se positionne sur un élément.
Passons le fait qu’il soit possible d’arriver à ce résultat en utilisant les ancres et concentrons-nous sur la migration.

Voici le code avec Prototype:

  <a onclick="new Effect.ScrollTo('add-content'); return false;" 
     href="#" class="polarize">
         Ajoutez votre contenu
  </a>

Nous le remplaçons par le code jQuery suivant :

  <a href="#" onclick="$('html, body').animate({scrollTop: $('#add-content').offset().top}, 800); 
     return false;">
       Ajoutez votre contenu
  </a>

Nous utilisons tout d’abord la méthode scrollTop() qui permet soit d’obtenir soit de fixer la position de la barre de défilement vertical fonction d’un élément.

Pour déterminer la position de l’élément nous utilisons la méthode offset() qui permet d’obtenir les coordonnées d’un élément.

Enfin grâce à la méthode animate nous pouvons définir la vitesse de défilement (dans notre exemple il est réglé à 800 ms).

Related Posts:

  • No Related Posts

·

Le débogage d’application PHP peut-être grandement facilité par l’utilisation d’outils adaptés. Eclipse PDT permet d’utiliser 2 debuggers PHP : Xdebug ou le Zend Server.
Dans cet article nous allons traiter de Xdebug.

Installation de l’extension Xdebug

root@developpement:$ yum install php-pecl-xdebug

Une fois l’extension installée, l’extension apparait lors de l’appel de la commande php -m

flosy@developpement:$ php -m
...
[Zend Modules]
Xdebug

Il reste à activer l’accès distant. Sur la Fedora le fichier /etc/php.d/xdebug.ini a été ajouté, ajouter le code suivant :

1
xdebug.remote_enable=On

Related Posts:

· · ·

La nouvelle version d’eclipse PDT est disponible est repose sur la version Helios d’eclipse.
Parmi les petites nouveautés bien pratiques :

  • Le marketplace pour rechercher les différentes plugins.
  • Un nouveau système de coloration syntaxique encore plus personnalisable.
  • Les bulles d’aide contextuelle avec des informations plus pertinentes.
  • Et biens d’autres encore (le détail ici).

Et pour ne rien gâcher une version 64 bits est disponible ;)

Related Posts:

· · ·

<< Latest posts

Theme Design by devolux.nh2.me