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

TAG | PHP

Le but recherché est ici d’écrire une trace lors de la déconnexion de l’utilisateur.

L’une des solutions est de passer par un service qui sera appelé par le LogoutListener.

Souscription à l’évènement LogoutSuccess

Pour savoir comment gérer cela référons-nous à la documentation sur la configuration de la sécurité (http://symfony.com/doc/current/reference/configuration/security.html ).

Le firewall permet de préciser un service qui sera appelé en cas de succès de la déconnexion.


logout:
  path:   /logout
  target: /
  success_handler: flosy.user.logout.handler

Création du service

Il nous reste maintenant à créer ce service.
Pour cela créons le fichier LogoutHandler.php

< ?php
namespace Flosy\Bundle\UserBundle\Handler;
 
use Flosy\Bundle\CommonBundle\Model\EventLogManager;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\Security\Http\Logout\LogoutSuccessHandlerInterface;
 
/**
 * Ce Handler permet de gérer des actions lors de la déconnexion de l'utilisateur.
 */
class LogoutHandler implements LogoutSuccessHandlerInterface {
 
    protected $elm;
 
    public function __construct(EventLogManager $elm)
    {
        $this->elm = $elm;
    }
 
    /**
     * Opération réalisées suite à la deconnexion.
     * 
     * @param \Symfony\Component\HttpFoundation\Request $request
     * @return \Symfony\Component\HttpFoundation\RedirectResponse
     */
    public function onLogoutSuccess(Request $request)
    {
        $this->elm->add('Log de deconnexion');
 
        $response = new RedirectResponse($request->headers->get('referer'));
        return $response;
    }
}

La classe doit implémenter l’interface LogoutSuccessHandlerInterface et plus particulièrement la méthode onLogoutSuccess qui sera appelée par le LogoutListener.
Pour l’écriture nous faisons appel à un autre service que nous ne détaillerons pas ici.

Déclaration du service

Il nous reste à déclarer le service.
Nous éditons pour cela le fichier services.xml de notre bundle.

< ?xml version="1.0" ?>
 
<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
 
    <services>
        <service id="flosy.user.logout.handler" class="Flosy\Bundle\UserBundle\Handler\LogoutHandler">
            <argument type="service" id="flosy.common.eventlog.manager"></argument>
        </service>
    </services>
</container>

Maintenant à chaque déconnexion un log sera écrit.

Webographie

L’article suivant traite de la gestion des redirections à la connexion et à la déconnexion à l’aide de ses services.

http://www.reecefowell.com/2011/10/26/redirecting-on-loginlogout-in-symfony2-using-loginhandlers/

Related Posts:

· ·

Installation et configuration du serveur

Le serveur utilisé pour l’installation est une Fedora 15.
La première étape passe par l’installation de l’extension PHP.

# yum install php-pecl-xdebug

Le package crée automatiquement le fichier de configuration /etc/php.d/xdebug.ini.
Il reste à le compléter avec les valeurs fournies dans la documentation de NetBeans disponible ici.

zend_extension=/usr/lib/php/modules/xdebug.so
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000

Après avoir redémarré Apache, Xdebug apparait dans le phpinfo.

Configuration de NetBeans

Il reste à configurer le projet dans NetBeans de la façon suivante :

À partir de là Netbeans va vous permettre d’utiliser Xdebug.

Related Posts:

· · ·

WordPress et WordPress MU font plus qu’un. Nous allons voir comment mettre en place la version multisite avec la version 3.0.5.

Installation

Nous commençons par récupérer les sources de WP puis nous les décompressons dans le htdocs.
Nous installons ensuite WP de façon classique (Je ne détaille pas ces étapes, il suffit d’un bon RTFM).
Nous choisissons d’utiliser le NDD www.wordpress-ms.local, ce qui nous donne le virtualhost suivant :

<virtualhost *:80>
  ServerName www.wordpress-ms.local
  DocumentRoot "/var/www/html/wordpressMS"
</virtualhost>

Configuration

Nous allons suivre la procédure décrite dans le codex de wordpress http://codex.wordpress.org/Create_A_Network.

Modification du virtualhost

Nous modifions le virtualhost pour qu’il prenne en compte tous les sous domaines de wordpress_ms.local.

<virtualhost *:80>
  ServerName www.wordpress-ms.local
  ServerAlias *.wordpress-ms.local
  DocumentRoot "/var/www/html/wordpressMS"
</virtualhost>

Activation du multisite

Il faut ensuite ajouter le contenu suivant au fichier wp-config.php

  define('WP_ALLOW_MULTISITE', true);
 
  /* That's all, stop editing! Happy blogging. */

Suite à cet ajout vous devez trouver dans l’administration de WP une rubrique Tools > Network.

Installation du « Network »

Une mention nous recommande d’abandonner l’utilisation de www.wordpress-ms.local au profit de wordpress-ms.local.
Pour cela nous allons dans Settings > General et nous modifions « WordPress address (URL) » et « Site address (URL) ».

Nous revenons ensuite dans Tools > Network. Nous choisissons de gérer les sites de la plateforme à l’aide des sous domaines. Il reste à définir le titre de la plateforme et l’email de l’administrateur.
Nous lançons ensuite l’installation en cliquant sur Install.

Paramétrage du « Network »

Suite à l’installation une page nous indique la marche à suivre. Un contrôle est fait sur le domaine utilisé pour le réseau et dans mon cas il échoue (Ceci m’indique qu’il y a un problème de « wildcard DNS »). Si vous utilisez un domaine fictif comme dans cet exemple ne vous préoccupez pas de ce message.

Nous devons ensuite créer le répertoire wp-content/blogs.dir qui accueillera le contenu des différents blogs (Attention à bien donner les droits en écriture à Apache).

Nous modifions ensuite le fichier wp-config.php :

  define( 'MULTISITE', true );
  define( 'SUBDOMAIN_INSTALL', true );
  $base = '/';
  define( 'DOMAIN_CURRENT_SITE', 'wordpress-ms.local' );
  define( 'PATH_CURRENT_SITE', '/' );
  define( 'SITE_ID_CURRENT_SITE', 1 );
  define( 'BLOG_ID_CURRENT_SITE', 1 );
 
  /* That's all, stop editing! Happy blogging. */

Faites bien attention de placer le code PHP au dessus du commentaire indiqué et pas en fin de fichier. Vous gagnerez 2 bonnes heures passer à chercher quelle configuration du serveur ne convient pas. ;)

Enfin nous éditons le fichier .htaccess (dans mon cas le fichier n’existait pas).

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
 
# uploaded files
RewriteRule ^files/(.+) wp-includes/ms-files.php?file=$1 [L]
 
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule . index.php [L]

Attention à bien activer le mod_rewrite d’Apache sous Fedora j’ai dû modifier la directive « AllowOverride » du htdocs. Éditez le fichier /etc/httpd/conf/httpd.conf :

<directory "/var/www/html">
...
    AllowOverride FileInfo
...
</directory>

Pour terminer l’installation il suffit de cliquer sur le lien « Log In » qui va déclencher la reconnexion.
Une fois reconnecté un nouveau menu « Super Admin » apparait au dessus du Dashboard et la plateforme est prête à être utilisée.

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:

· ·

Nous utiliserons la version 13 de Fedora comme distribution.
L’installation est relativement simple nous commençons par nous rendre à l’adresse suivante : http://files-source.zend.com/help/Zend-Server-Community-Edition/zend-server-community-edition.htm#rpm_installation.htm.

Nous ajoutons comme indiqué le code suivant dans le fichier /etc/yum.repos.d/zend.repo

[Zend]
name=Zend Server
baseurl=http://repos.zend.com/zend-server/rpm/$basearch
enabled=1
gpgcheck=0
 
[Zend_noarch]
name=Zend Server - noarch
baseurl=http://repos.zend.com/zend-server/rpm/noarch
enabled=1
gpgcheck=0

Nous lançons ensuite l’installation du Zend Server CE.

  # yum install zend-server-ce-php-5.3

Le Zend server est maintenant installé est disponible à l’adresse http://localhost:10081/ ou https://localhost:10082/.

Note sur la CLI

Après l’installation du Zend Server la commande php utilise toujours la CLI du paquet Fedora.

$ php -v
PHP 5.3.3 (cli) (built: Jul 22 2010 15:37:02)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

Éditez le fichier .bash_profile de l’utilisateur pour modifier le PATH.

PATH=/usr/local/zend/bin:$PATH:$HOME/bin:.

La CLI utilise maintenant la version fournie avec le Zend Server.

$ php -v
PHP 5.3.3 (cli) (built: Nov 14 2010 12:02:04) 
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
    with Zend Extension Manager v5.1, Copyright (c) 2003-2010, by Zend Technologies
    - with Zend Data Cache v4.0, Copyright (c) 2004-2010, by Zend Technologies [loaded] [licensed] [disabled]
    - with Zend Utils v1.0, Copyright (c) 2004-2010, by Zend Technologies [loaded] [licensed] [enabled]
    - with Zend Optimizer+ v4.1, Copyright (c) 1999-2010, by Zend Technologies [loaded] [licensed] [disabled]
    - with Zend Debugger v5.3, Copyright (c) 1999-2010, by Zend Technologies [loaded] [licensed] [enabled]

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:

· · ·

La version 1.4 de symfony avec Doctrine fournit des méthodes pour utiliser la classe DateTime dans le model.
La classe DateTime ainsi que DateTimeZone sont disponibles depuis PHP 5.2.0.
Elles permettent de fournir un support Objet pour les dates, heures et fuseaux horaires.
Attention tout de même la méthode DateTime::diff fait appel à l’objet DateInterval disponible seulement depuis la version PHP 5.3.0.

Related Posts:

· ·

Theme Design by devolux.nh2.me