Mettre de la couleur sur votre svn diff

Nous allons commencer par installer le package colordiff avec macport (Macintosh).

sudo port install colordiff

Ensuite, nous ajoutons un alias svnd dans le fichier /etc/profile

alias svnd='svn diff --diff-cmd /opt/local/bin/colordiff'

Nous allons recharger la configuration avec la commande suivante:

source /etc/profile

Vous avez également la possibilité de personnaliser la configuration de colordiff. Pour cela, nous allons copier colordiffrc dans notre home:

cp /opt/local/etc/colordiffrc ~/.colordiffrc

Nous pouvons dés maintenant éditer ce fichier et personnaliser les paramètres

Par défaut, nous avons les valeurs suivantes:

plain=off
newtext=blue
oldtext=red
diffstuff=magenta
cvsstuff=green

Nous allons les changer en:

plain=off
newtext=yellow
oldtext=red
diffstuff=magenta
cvsstuff=green

En tapant la commande suivante:

home$ svnd 19-Mastering-Symfony-s-Configuration-Files.txt

Vous devriez voir cela comme résultat final:

colordiff

  • Share/Bookmark
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Passage de votre site en maintenance lors de vos mises à jour

Prérequis: L’activation du plugin sfDoctrineGuardPlugin

Dans le cadre d’un développement, je cherchais à passer à mon application en mode maintenance pour un utilisateur normal mais que le super admin puisse continuer à visualiser les pages du site. La tâche symfony n’est pas satisfaisante dans ce cas car elle verrouille complètement l’accès à celui-ci. Voici donc ma solution:

Premièrement, j’ai activé le paramètre check_lock dans le fichier settings.yml de mon application.

Path: /apps/[NomApp]/config/settings.yml

all:
  .settings:
    check_lock:             on

Pour stocker mon fichier de verrouillage, j’ai créé un dossier « lock » dans le dossier data

mkdir data/lock

Attention: ce dossier doit être en écriture

J’ai ensuite inséré le code suivant dans ProjectConfiguration

Path: /config/ProjectConfiguration.class.php

class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
    ...
  }

  public function getApplicationLockFile()
  {
    return sfConfig::get('sf_data_dir').DIRECTORY_SEPARATOR.
               'lock'.DIRECTORY_SEPARATOR.$this->getApplication().'.lck';
  }
}

Vient maintenant la partie contrôle de l’accès. Pour cela j’ai créé un filtre que voici

Path: /lib/isApplicationActivatedFilter.class.php

class isApplicationActivatedFilter extends sfFilter
{
  public function execute ($filterChain)
  {
    if ($this->isFirstCall())
    {
      if (sfConfig::get('sf_check_lock'))
      {
        $context = $this->getContext();
        $config = $context->getConfiguration();
        $user = $context->getUser();

        $fileLock = $config->getApplicationLockFile();
        if (file_exists($fileLock) && !$user->isSuperAdmin())
        {
          $files = array(
            sfConfig::get('sf_app_config_dir').'/unavailable.php',
            sfConfig::get('sf_config_dir').'/unavailable.php',
            sfConfig::get('sf_web_dir').'/errors/unavailable.php',
            sfConfig::get('sf_symfony_lib_dir').'/exception/data/unavailable.php',
          );

          foreach ($files as $file)
          {
            if (is_readable($file))
            {
              include $file;
              break;
            }
          }

          die(1);
        }
      }
    }
    $filterChain->execute();
  }
}

Il reste maintenant à charger ce filtre dans notre application

Path: /apps/[NomApp]/config/filters.yml

rendering: ~
security:  ~

# insert your own filters here
isApplicationActivated:
  class:  isApplicationActivatedFilter

cache:     ~
common:    ~
execution: ~

Il faut suffit maintenant de personnaliser votre page de maintenance en créant le fichier unavailable.php dans votre dossier config.

Dès à présent, si vous créer un fichier [NomApp].lck dans le dossier lock, votre application passera en mode maintenance.

Dans cette article, je ne détaille pas la création et la suppression de ce fichier lck. Je vous laisse le soin de le faire avec votre propre gestion.

Pour tester le bon fonctionnement de ce procédé, vous pouvez créer deux comptes dans votre base de données:

  • Compte admin avec le flag is_super_admin: true
  • Compte user sans le flag is_super_admin

Vous vous identifiez avec le compte admin et ensuite vous créer le fichier [NomApp].lck dans votre dossier lock et vous vous rendez compte que vous avez toujours accès au page de votre site. Si vous répétez la chose avec le compte user, vous verrez apparaître la page de maintenance.

J’espère que ce code vous servira dans votre prochain développement.

Bonne découverte.

  • Share/Bookmark
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Intégration de phpexcel dans un projet symfony

Un petit article cette fois, pour vous expliquer la démarche à suivre pour intégrer phpexcel à votre projet symfony. Je suppose que votre développement est sous contrôle de version (subversion).

Nous allons commencer par créer notre dossier vendor dans notre dossier lib. Vous pouvez passer cette étape si vous possédez déjà votre dossier vendor (en général, c’est dans ce dossier que j’installe symfony en externals)

mkdir lib/vendor

Nous allons maintenant décharger les librairies phpexcel dans ce dossier avec un lien svn:externals

svn pe svn:externals lib/vendor
PHPExcel svn://svn.phpexcel.net/PHPExcel/branches/v1.6.7/Classes
svn up

A mesure que le projet phpexcel avance, vous avez la possibilité d’effectuer la mise à jour en changeant la chaîne « v1.6.7″ par celle de votre choix.

Attention: Ne pas oublier de vider votre cache

Il nous reste maintenant à ajouter un include path sur les librairies. Nous allons pour cela ajouter un peu de code dans le fichier ProjectConfiguration.class.php se trouvant dans le dossier config:

class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
     ...

    // Path sur les lib phpexcel
    sfToolkit::addIncludePath(array(
      realpath(dirname(__FILE__).'/../lib/vendor/PHPExcel'),
    ));
  }
}

Vous êtes maintenant prêt à utiliser les fonctions de phpexcel.

Vous pouvez récupérer la documentation, le code et des exemples sur le site http://www.phpexcel.net.

Bonne découverte.

  • Share/Bookmark
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Installation de mon environnement de développement web avec MacPorts

Ayant reçu mon nouveau portable Macintosh, je me suis posé la question suivante: « Faut-il tout recompiler mes éléments ou les installer avec macports ? ». J’ai décidé de choisir la seconde solution pour me faciliter les choses. Je vais vous détailler ci-dessous l’installation des éléments suivants:

  • MacPorts
  • Apache
  • Subversion et dav_svn
  • MySql
  • php

1. MacPorts
Vous trouvez l’installeur directement sur le site web macports. Vous avez plusieurs possibilités offertes. Il vous suffit de lire la page install du site.

2. Installation du serveur Apache

sudo port install apache2

Démarrage du serveur:

sudo /opt/local/apache2/bin/apachectl start

Pour lancer automatiquement le serveur au démarrage, il suffit de lancer la commande suivante:

sudo launchctl load -w /Library/LaunchDaemons/org.macports.apache2.plist

Il ne reste plus qu’à changer votre configuration en éditant le fichier httpd.conf.
Dans mon cas, j’ai décidé de mettre mon dossier root à la racine de mon disque (/www).
Nous en avons fini avec l’installation d’apache ;)

3. Installation de Subversion et dav_svn
J’ai décidé d’installer un serveur subversion directement sur ma machine pour pouvoir stocker le suivi des changement dans mes projets. Si vous ne voulez pas le faire, il suffit de supprimer l’option « +mod_dav_svn ».

sudo port install subversion +mod_dav_svn

Après l’installation des éléments, il nous suffit de charger le module dav avec la commande apxs:

cd /opt/local/apache2/modules
sudo /opt/local/apache2/bin/apxs -a -e -n "dav_svn" mod_dav_svn.so

L’installation est toujours aussi simple.

4. Installation de MySql

sudo port install mysql5-server

Installation des bases nécessaires à MySql:

sudo -u mysql mysql_install_db5

Démarrage du serveur:

sudo /opt/local/lib/mysql5/bin/mysqld_safe &

Configuration de mysql:

sudo /opt/local/lib/mysql5/bin/mysql_secure_installation

Pour lancer automatiquement le serveur au démarrage, il suffit de lancer la commande suivante:

sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist

Je vais maintenant personnaliser un peu mon installation pour fixer les paramètres par défaut. Pour cela , je vais créer un fichier my.cnf dans le dossier /etc avec le contenu suivant:

[client]
port=3306
default-character-set=utf8

[mysqld]
port=3306
default-character-set=utf8
collation-server=utf8_unicode_ci
default-collation=utf8_unicode_ci
default-storage_engine = InnoDB
default_table_type = InnoDB

Toujours aucun problème lors de l’installation de MySql.

5. Installation de PHP
Tous les options ci-dessous ne sont pas nécessaires. Vous pouvez choisir uniquement les paquets dont vous avez besoin.

sudo port install php5
sudo port install php5-curl php5-gd php5-iconv php5-imap php5-mbstring php5-mcrypt php5-mysql php5-sockets php5-solr php5-sqlite php5-tidy php5-zip

Nous allons choisir notre fichier php.ini. Comme je suis sur une machine de dev, je vais choisir le php.ini-dist

sudo cp /opt/local/etc/php5/php.ini-development /opt/local/etc/php5/php.ini

J’ai également changé quelques paramètres dans mon fichier php.ini:

short_open_tag = Off
post_max_size = 50M
magic_quotes_gpc = Off
upload_max_filesize = 50M
;extension_dir = "./" (ligne commentée)
pdo_mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock
mysql.default_socket = /opt/local/var/run/mysql5/mysqld.sock
date.timezone = Europe/Zurich

Il ne reste plus qu’à charger le module php dans apache:

cd /opt/local/apache2/modules
sudo /opt/local/apache2/bin/apxs -a -e -n "php5" libphp5.so

Si vous désirez de la couleur en ligne de commande php, vous devez ajouter un module additionnel:

sudo port install php5-posix

Dès à présent, vous retrouverez des commandes sexy ;)

6. Configuration Apache
Pour qu’Apache prenne en compte les extensions .php et .phps, nous allons inclure la ligne suivante dans le fichier httpd.conf

Pour charger la configuration des virtualhosts, il faut activer la ligne suivante:

Include conf/extra/httpd-vhosts.conf

Pour charger la configuration php, il faut ajouter la ligne suivante:

Include conf/extra/mod_php.conf

Dans le fichier httpd-vhosts.conf, j’ai laissé uniquement les choses suivantes:

NameVirtualHost *:80
Include conf/vhosts/*.conf

Nous pouvons maintenant créer le dossier vhosts dans le dossier conf d’apache pour y mettre nos fichiers domaines

cd /opt/local/apache2/conf
sudo mkdir vhosts
cd vhosts

Dans mon cas, j’ai choisi de mettre tous les fichiers des divers virtualhosts dans le dossier /www/vitualhosts/ à la racine de mon disque:

cd /
sudo mkdir -p /www/virtualhosts
chmod -R 777 /www

J’ai ensuite réaliser le virtualhost « default »:

cd /www/virtualhosts
mkdir default
chmod 777 default
cd /opt/local/apache2/conf/vhosts
touch default.conf

Voici le contenu de mon virtualhost « default »

<VirtualHost *:80>
  ServerName macbookpro.local
  DocumentRoot /www/virtualhosts/default
  DirectoryIndex index.php

  <Directory "/www/virtualhosts/default">
    AllowOverride All
    Allow from All
  </Directory>
</VirtualHost>

Remarque: macbookpro.local est le nom défini dans les préférences réseau

J’utilise ce domaine « default » par exemple, pour y mettre mon phpmyadmin.

Vous êtes maintenant prêt pour réaliser vos propres virtualhosts. Tous vos configurations localisées dans le dossier vhosts seront chargées au prochain redémarrage d’apache.

7. Optionnel
Modules additionnels pour php:

sudo port install php5-apc
sudo port install php5-xdebug

Dans mon domaine d’activités professionnelles, j’utilise également un client yaz qui est lui aussi interfaçable avec php:

sudo port install php5-yaz

Voilà. Mon installation est terminée. N’hésitez pas à me poser des questions avec le formulaire ci-dessous.

  • Share/Bookmark
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

sfZ3950Plugin: Une nouvelle manière de se connecter

Je viens de terminer la première version beta d’un nouveau plugin permettant la connexion à un serveur Z39.50. Ce protocole est surtout utilisé dans le domaine des bibliothèques pour rechercher des données bibliographiques. Le language d’interrogation est assez barbare. Un exemple de requête native:

@and @attr 1=1003 totok @attr 1=4 Handbuch

En utilisant ce plugin, la construction d’une requête sera facilitée. Il suffit pour cela de définir les index du serveur que l’on veut questionner. Exemple du fichier z3950.yml stocké dans le dossier config:

prod:
  connection_name:
    indexes:
      ti: 1=4
      au: 1=1003
      aw: 1=1035

Il faut également définir la connexion dans le fichier databases.yml de la manière suivante:

all:
  connection_name:
    class:          sfZ3950Database
    param:
      dsn:          yaz://user:pass@url:port/dbname
      options:
        protocol:   2
        group:      test
        cookie:     cookie_name
        proxy:      proxy_name
        persistent: false
        piggyback:  true
        charset:    UTF-8
        preferredMessageSize: 10240
        maximumRecordSize:  10240

Les options de la connexion ci-dessus ne sont pas obligatoires. Elles permettent d’affiner les réglages.

Maintenant, il vous suffit de définir une requête. Il se présente comme une requête SQL à la différence que dans la zone ‘from’, on insère le nom de la connexion:

$this->results = sfZ3950_Query::create()
->from('connection_name')
->where('au="totok" and ti="Handbuch"')
->orderBy('au ASC')
->execute();

Pour pouvoir utiliser ce plugin, vous devez au préalable avoir installé le client YAZ et le module PHP YAZ.

Vous pouvez trouver le plugin ici.

Vos retours seront le bienvenu pour améliorer encore ce plugin.

Bonne découverte.

  • Share/Bookmark
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Symfony: Lister les modules d’une application

Aujourd’hui un poste très court mais qui peut vous servir si vous voulez lister les modules d’une application. Pour cela, nous allons utiliser la classe sfFinder:

$modules = sfFinder::type('directory')
                     ->relative()
                     ->maxdepth(0)
                     ->in(sfConfig::get('sf_app_module_dir'));

Si vous voulez en savoir plus sur cette classe, je vous conseille la page API.

Bonne lecture

  • Share/Bookmark
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Le cache de résultat avec doctrine

Note préalable: Nous utilisons dans cette article le système de cache php APC. Vous devez installer celui-ci sur votre configuration pour que l’exemple ci-dessous fonctionne.

Doctrine a en standard la possibilité de mettre en cache les résultats d’une requête. Il propose entre autre Memcached, APC, Sqlite. Nous allons l’utiliser dans le cadre d’un exemple symfony.

Pour commencer, nous allons initialiser une variable contenant la durée de vie du cache dans le fichier app.yml de notre application:

all:
  cache:
    lifetime: 3600

Nous allons maintenant initialiser le cache APC de doctrine. Le code ci-dessous est à mettre dans la classe de configuration de votre application:

class frontendConfiguration extends sfApplicationConfiguration
{
  public function configure()
  {
  }

  public function configureDoctrine(Doctrine_Manager $manager)
  {
    /* Initialisation du cache Doctrine APC */
    $cacheDriver = new Doctrine_Cache_Apc();
    $manager->setAttribute(Doctrine::ATTR_QUERY_CACHE, $cacheDriver);
    $manager->setAttribute(Doctrine::ATTR_QUERY_CACHE_LIFESPAN, sfConfig::get('app_cache_lifetime'));
    $manager->setAttribute(Doctrine::ATTR_RESULT_CACHE, $cacheDriver);
    $manager->setAttribute(Doctrine::ATTR_RESULT_CACHE_LIFESPAN, sfConfig::get('app_cache_lifetime'));
  }
}

Pour cette exemple, j’utilise le modèle suivant:

---
dUser:
  tableName:  d_user
  columns:
    id:
      type: integer(3)
      primary:  true
      autoincrement:  true
    fullname:
      type: string(160)
      notnull:  true
    street:
      type: string(160)
    zip:
      type: string(10)
    city:
      type: string(80)
    country:
      type: string(60)

Dans la classe du modèle ci-dessus, nous allons utiliser le cache. La directive useResultCache est ajouté à la requête.

class dUserTable extends Doctrine_Table
{
  public function findFullnameOrderByAsc()
  {
      return $this->createQuery('u')
                         ->select('u.fullname, u.city')
                         ->orderBy('fullname')
                         ->useQueryCache()
                         ->useResultCache()
                         ->execute();
  }
}

Il vous suffit ensuite d’exécuter votre requête dans votre action avec le code suivant pour récupérer le résultat.

$this->users = Doctrine::getTable('dUser')->findFullnameOrderByAsc();

Si vous utilisez la debug toolbar, vous constaterez qu’à la première requête, vous aurez 1 appel à la base de donnée mais que si vous rechargez votre page html, aucune nouvelle requête n’est lancée. Le cache fonctionne.

J’espère que ce point de départ vous aidera dans vos découvertes. N’hésitez pas à poster vos découvertes dans les commentaires.

Merci à [MA]Pascal pour la piste de configuration.

Références:
- Documentation Doctrine sur le cache
- La documentation du cache PHP alternatif APC
- L’extension php apc

Article:
- Performance Tuning in PHP

  • Share/Bookmark
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

Initialisation d’un projet symfony/doctrine sous subversion

La première phase consiste à créer notre dossier http. Mon path par défaut pour cette exemple est /www/virtualhosts. Les noms entre crochets sont utilisés pour un élément variable.

mkdir /www/virtualhosts/[projet]

Nous allons maintenant nous déplacer dans ce dossier et le déchargement de la base depuis subversion

cd /www/virtualhosts/[projet]
svn co http://[svn.server]/repos/[project]/trunk .

Nous pouvons maintenant installer le framework symfony dans notre dossier http

/www/svn/symfony/1.2/data/bin/symfony generate:project [NomDuProjet]

Nous allons maintenant configurer la base de donnée avec doctrine:

./symfony configure:database --name=doctrine --class=sfDoctrineDatabase "mysql:host=localhost;dbname=database" user pass

Modification du fichier databases.yml:

cd config/
Suppression des lignes concernant Propel dans le fichier databases.yml
(ne laisser que la config doctrine)

Nous renommons le fichier databases.yml avant de l’inclure dans le repository

mv databases.yml databases.yml_dist

Activation du plugin sfDoctrinePlugin

Ouvrir le fichier ProjectConfiguration.class.php et changer sfDoctrinePlugin par sfPropelPlugin

Suppression des fichiers inutiles

rm -fr propel.ini
rm -fr schema.yml

Création du dossier doctrine qui va recevoir les fichiers schéma

mkdir doctrine

Suppression du dossier sfPropelPlugin du dossier web et activation du dossier sfDoctrinePlugin

cd ../web/
unlink sfPropelPlugin
cd ..
./symfony plugin:publish-assets

Prochaine étape, vider les dossiers cache et log

rm -fr cache/*
rm -fr log/*

Ajout de notre projet dans subversion

svn add *

Nous allons ignorer les fichiers des dossiers cache et log

svn pe svn:ignore cache
> *
svn pe svn:ignore log
> *

Nous mettons également le fichier databases.yml en ignore pour ne pas tenir compte de la configuration locale

svn pe svn:ignore config
> databases.yml

Création du dossier sql recevant les fichiers sql de doctrine. Je considère que ces fichiers ne sont pas à versionner. Nous allons également les ignorer.

mkdir data/sql
svn pe svn:ignore data/sql
> *

Nous allons inclure symfony dans notre projet

svn mkdir lib/vendor
svn pe svn:externals lib/vendor
> symfony http://svn.symfony-project.com/branches/1.2

Transfert de notre structure initiale sur le serveur subversion

svn ci -m 'Projet initial'

Nous allons maintenant lancer un update pour charger le framework symfony qui a été précédemment accroché dans le dossier lib/vendor

svn up

Nous allons changer le chemin d’accès aux librairies symfony en modifiant le fichier ProjectConfiguration.class.php du dossier config du projet

Changer:
require_once '/www/svn/symfony/1.2/lib/autoload/sfCoreAutoload.class.php'
Par:
require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';

Nous allons publié notre modification sur le serveur subversion

svn ci -m "Changement de la configuration"

Il nous reste une dernière chose à faire pour que notre projet fonctionne. Nous allons copier le fichier databases.yml_dist et le renommer avant de le modifier pour tenir compte de notre configuration locale

cp config/databases.yml_dist config/databases.yml

Il ne reste plus qu’à initialiser notre application avant de pouvoir développer

./symfony generate:app frontend --csrf-secret=CrSfS3Cr3t --escaping-strategy=on

Ajout de l’application à subversion

svn add test/functional/frontend apps/frontend web/frontend_dev.php web/index.php

Publication sur le serveur subversion

svn ci -m "Initialisation de l'application frontend"

J’espère que cette démarche vous permettra de simplifier l’installation de vos projets. Je reste à votre disposition si vous avez des questions sur le sujet.

Références:
- Le Framework Symfony
- l’ORM Doctrine
- Subversion

  • Share/Bookmark
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...
yaz

Installation du module yaz pour php

Petite explication pour commencer. Yaz-client permet d’effectuer des connections avec le protocole Z39.50. Celui-ci est utilisé principalement sur des systèmes de bibliothèques. Vous trouvez plus d’informations sur les liens suivants:

Nous allons maintenant télécharger les sources du client yaz sur le site d’intexdata.

L’archive est disponible à l’adresse suivante: http://www.indexdata.dk/yaz/. Il vous suffit ensuite de la décompresser et de l’installer:

./configure
make
make install

Comme nous n’avons pas indiqué de path sur le configure, le client yaz sera installé dans /usr/local/bin.

Continuons par l’installation du module php:

sudo pecl install -f yaz-1.0.14

Lors de mon installation, j’ai rencontré un problème avec l’autodetect. J’ai donc indiqué le chemin sur le client. Pour cela j’ai utilisé l’option 1 lors de la compilation.

Path: /usr/local/bin

Pour activer l’extension ci-dessus, il suffit insérer cette nouvelle ligne dans votre fichier php.ini

extension=yaz.so

Il vous suffit de relancer apache pour avoir les commandes yaz disponibles dans php. Si l’installation c’est bien passée, vous devriez vous ceci dans notre phpinfo:
yaz

 

 

 

 

 

 

La documentation des commandes YAZ est disponible sur le site de php.net.

Un plugin pour symfony est en préparation.

Bonne découverte

  • Share/Bookmark
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...