sfZ3950Plugin: Une nouvelle manière de se connecter
22/05/09
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.
En vrac 03
21/04/09
- 5 Simple Tricks To Bring Light and Shadow Into Your Designs
- MySQL: Le programmateur d’événements (Event Scheduler) (part 1/6)
- 6 Steps to a Better 404 Page
- Comment optimiser une vidéo pour les plateformes web
- Symfony: Merge embedded Form
- La pagination avec Doctrine
- MySQL: Démythifier le GROUP BY
- PayBox: La plate-forme de paiement multicanal
- JQZoom: Jquery plugin pour effectuer un zoom sur vos images
- Open Video Player: Lecteur multimédia web
- PHP Oracle FAQ: Wiki
- MySQL: Field Types
- Suisse: eGovernment Standards
- Interface Design Inspiration: 36 Beautiful Login Page/Form Designs
Symfony: Lister les modules d’une application
20/04/09
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
Le cache de résultat avec doctrine
19/03/09
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
Initialisation d’un projet symfony/doctrine sous subversion
19/03/09
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
Installation du module yaz pour php
17/01/09
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:

La documentation des commandes YAZ est disponible sur le site de php.net.
Un plugin pour symfony est en préparation.
Bonne découverte
Intégrer symfony dans un projet géré par subversion
18/12/08
Pour continuer dans la lancée du précédent article, je vais vous montrer comment intégrer les librairies de symfony directement dans votre projet. Pour cela, votre projet doit être sous subversion.
Nous allons intégrer la version 1.2 de symfony.
Avant de lancer ces commandes, assurez-vous que vous soyez à la racine de votre projet.
mkdir lib/vendor svn pe svn:externals lib/vendor symfony http://svn.symfony-project.com/branches/1.2 svn up
Vous avez maintenant toutes les bibliothèques de symfony dans votre projet.
Nous allons maintenant changer la configuration de notre projet pour pointer sur ces bibliothèques
// config/ProjectConfiguration.class.php require_once(dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php');
Dès maintenant, vous avez un projet autonome (sandbox).
Installer plusieurs versions de symfony sur votre machine
9/12/08
Une petite explication qui vous permettra d’installer plusieurs versions de symfony sur le même ordinateur. Ce tutorial est basé sur des commandes terminal. Si vous utilisez windows, je vous conseille d’utiliser TortoiseSVN.
Premièrement, nous allons construire notre réservoir symfony. Pour cet exemple, nous allons stocker les fichiers dans la structure /www
cd /www mkdir -p svn/symfony cd svn/symfony mkdir 1.0 1.1 1.2
Après la création de la structure, nous allons décharger les diverses versions de symfony:
cd 1.0 svn co http://svn.symfony-project.com/branches/1.0 . cd ../1.1 svn co http://svn.symfony-project.com/branches/1.1 . cd ../1.2 svn co http://svn.symfony-project.com/branches/1.2 .
Vous êtes maintenant prêt à initialiser des projets.
Initialiser un projet en version 1.0
cd /www/virtualhosts mkdir projet1.0 cd projet1.0 /www/svn/symfony/1.0/data/bin/symfony init-project monprojet10
Initialiser un projet en version 1.1
cd /www/virtualhosts mkdir projet1.1 cd projet1.1 /www/svn/symfony/1.1/data/bin/symfony generate:project monprojet11
Initialiser un projet en version 1.2
cd /www/virtualhosts mkdir projet1.2 cd projet1.2 /www/svn/symfony/1.2/data/bin/symfony generate:project monprojet12
Il vous suffit ensuite d’utiliser la commande symfony dans le root de votre projet.
Exemple de commande pour générer une nouvelle application (version 1.1 et 1.2)
./symfony generate:app frontend
Voilà. J’espère que les explications ci-dessous vous permettrons de développer vos projets selon la version de symfony que vous avez choisi.
Génération d’un index A-Z selon le contenu de ma base de données
15/10/08
Dans ce mini article, je vais vous montrer la manière utilisée pour réaliser une liste A-Z avec des hyperliens sur certaines lettres. Je réalise une requête sql me récupérant uniquement la première lettre de chaque titre et de manière unique puis je construis un tableau me permettant de contrôler l’existence de celle-ci dans ma boucle.
Index à produire:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
Fonction réalisée dans mon modèle:
$results = Doctrine_Query::create()
->select('r.id, SUBSTRING(t.name,1,1) letter')
->from('Resource r')
->where()
->orderBy('t.name')
->groupBy('t.name')
->execute();
$letters = array();
foreach($results AS $result)
{
$letters[] = $result->letter;
}
return $letters;
Je reçois en retour un tableau avec les lettres disponibles.
Génération de la liste dans mon Template:
<?php for($i = 65; $i < 91; $i++): ?> <?php $letter = strtoupper(chr($i)); ?> <?php echo (in_array($letter, $results)) ? link_to($letter, '/resources/index') : $letter; if($i < 91) { echo " "; } ?> <?php endfor; ?>
J’espère que cet exemple vous sera utile dans un de vos développements.
En vrac 02
17/09/08
- pacman, basé sur Yahoo User Interface (YUI)
- Simplicio, un jeu d’icônes gratuit
- Menu: Arrondi version CSS
- WordPress: thème et plugin iPhone
- CSS Speech Bubbles, des bulles à la mode chatte
- WeebBox, ligthbox
- Tooltips, Création des bulles d’aide simples et complexes
- HelpBallon, une deuxième série de bulles d’aide
- Des problèmes avec les maths, essayez Mathway
- Testez le design de votre site dans différents navigateurs
- Copyscape, rechercher le plagiat sur le net
- VirtualBox, Virtualisation de matériel X86 (version 2)
- Triple boot, Tutoriel pour l’installation sur MacBook
