On voit de plus plus de règles particulières pour sécuriser un code. Des bons conseils ou bonnes pratiques mais qui demandent un travail énorme.
Il y a 2 ans, Claroline commençait à être la cible de pirates. Il fallait faire quelque chose.
Bien sûr tout changer d'un coup allait prendre du temps. Plus un code est chaotique plus la tâche est ardue.
Voilà quelques recettes pour retravailler le code.
Premier boulot de fou.
Si le code à été écrit pour un register_global ON il faut fouiller le code pour trouver les variables utilisées "en espérant" qu'elles ont été initialisées par register_global.
On va les traquer et les remplacer par des $_REQUEST.
Pourquoi $_REQUEST ? il y a $_POST, $_GET, $_COOKIES ... dans tout les cas ces valeurs sont suspectes autant utiliser $_REQUEST qui vous donnera celle qui gagne selon les règles de priorité que vous aviez pour le register global. Note : Tout le monde n'est pas de cet avis. L'argument des autres est qu'il faut aussi maîtriser d'où vient l'information. Pour moi elle ne vient que d'un endroit, un endroit douteux.
Un truc pourri c'est d'utiliser un extract de $GLOBALS mais ce qui n'est que contourner le problème.
Pire c'est masquer le problème.
Une solution pour travailler en transition c'est de mettre le serveur en register global à off et à la racine un .htaccess qui dit register global à on.
là on a rien corrigé. mais on peut commencer et progressivement modifier le htaccès pour faire porter le global ON au de moins en moins de script jusqu'a en avoir fini avec lui.
Depuis bientôt un an déjà, le forum Orion fait ses premiers pas, doucement , gentillement mais surement.
Outre que le concept est déjà bien connu, cette compilation basée sur un forum de type phpBB 2.0.22 est livrée avec une quantité de mods non négligeable et d'excellente qualité.
Produit et livré par www.Cback.de, le forum Orion ne renie pas ses origines allemandes, signe de très bonne qualité comme nous pouvons le constater dans la plupart des cas.
D'une sécurité exemplaire, Orion vous en ferait même oublier que dessous se cache un phpBB ( et c'est vrai ), beaucoup d'ajax en simplifie la gestion et l'approche, ainsi que des utilitaires réellement indispensables.
Le tout fait de ce phpBB prémodé une référence actuelle en matière de forum phpbb compilé de la sorte.
Ce jour est livré la version 2.4.3 française comprenant de nouveaux additifs de sécurité ainsi que des correctifs dits de maintenance.
Si vous hésitiez encore pour votre projet, et/ou futur projet, sachez qu'Orion est à forum à prendre en compte dans votre choix.
Nécessite le couple PHP/MySQL pour fonctionner !
Nota: le forum Orion est basé essentiellement sur la sécurité et la facilité de gestion d'un site internet, regroupant portail, téléchargement, faq, base de connaissance, calendrier, galerie ...
Support et renseignements sur www.phpbb-premod.com
Proposé par Cyril Levert
L'équipe de PHP Québec est fier de s'associer avec High-Touch Communications afin de vous présenter le codeFest PHP Québec 2007. Le CodeFest PHP Québec: À pour objectif principal est de faire participer les membres de la communauté PHP Québécoise au développement d'applications OpenSource, afin de démontrer le dynamisme de la communauté au Québec. Lors de cette première éditions, nous intégrerons le support OpenID. | ![]() |
La version alpha de MySQL 6.0.0 est disponible au téléchargement.
Cette version de MySQL, anciennement connue sous le nom de MySQL 5.2, apporte une unique nouveauté par rapport à la version 5.1 mais celle-ci n'est pas des moindre: il s'agit de l'intégration du nouveau moteur Falcon. En effet ce moteur transactionnel, qui vient rejoindre les classiques MyISAM et InnoDB sans les remplacer, devrait être plus performant sur les architectures matérielles récentes (64 bits), supporter les transaction ACID, et offrir un système de récupération des données en cas de crash.
Pour en savoir plus sur le moteur Falcon, je vous invite à visiter la FAQ correspondante sur le site de MySQL.
Rappelons tout de même qu'il s'agit là d'une version alpha, qui ne doit être utilisée que pour expérimenter le nouveau moteur de stockage Falcon.
MySQL 6.0
La nouvelle version stable de ce système de publipostage en PHP est disponible depuis lundi.
Cette release n'apporte pas de réelle nouveauté, mais corrige près d'une trentaine de bogues de la version précédente.
Consultez le changelog pour plus d'information sur les corrections apportées.
Le site officiel
Le site Refreshinglyblue, propose une petite étude comparative de ces deux langages.
Si l'auteur commence par résumer les points communs entre PHP et Ruby, c'est pour mieux insister ensuite sur leurs différences.
Premièrement les frameworks: là ou Ruby se trouve très bien associé à Rails, PHP est lui doté d'une dizaine de frameworks aux qualités diverses, comme CakePHP ou Symphony, mais qui, d'après l'auteur, ne sont souvent pas aussi avancés que Rails, et n'offrent pas le même confort de développement.
Ensuite, l'article nous rappelle que Ruby supporte les espaces de noms, ce que PHP ne permet pas encore nativement, mais qu'il est beaucoup plus facile et économique d'héberger des applications PHP qui pourront être maintenues par FTP, quand les applications Ruby, elles, nécessiteront un hébergement plus onéreux et accessible en SSH. De même, pour tout ce qui concerne la documentation, celle offerte sur le site officiel PHP est plus claire, et plus fournie en exemples que celle de Rails.
L'auteur conclut néanmoins que, malgré les défaut de Ruby/Rails (notamment la complexité de l'hébergement), Ruby est l'un des language les plus expressifs et concis qu'il ait eu l'occasion d'utiliser, et que l'efficacité apportée par Rails pour Ruby, ne se retrouve actuellement pas dans les frameworks PHP.
PHP vs Ruby - Practical Language Differences
QOTD :
À trop procrastiner, on s'y casse le nez.
Bon, je suis en train de sortir des cartons tout ce que je n'ai pas encore releasé. Voici une première fournée, sous la forme de deux plugins pour le framework Symfony :
Ces plugins sont releasés sous licence MIT. Enjoy.
Bon, c'est pas fini, d'autres choses vont suivre très prochainement.
QOTD :
À trop procrastiner, on s'y casse le nez.
Bon, je suis en train de sortir des cartons tout ce que je n'ai pas encore releasé. Voici une première fournée, sous la forme de deux plugins pour le framework Symfony :
Ces plugins sont releasés sous licence MIT. Enjoy.
Bon, c'est pas fini, d'autres choses vont suivre très prochainement.
Le site ZDNet nous propose un état des lieux des solutions de gestion de contenu les plus utilisées sur Internet.
Dans le domaine de la gestion de contenu, l'article fait tout d'abord la différence entre les solutions de type CMS (Content Management System) et les solutions ECM (Entreprise Content Management), ces dernières étant, comme leur nom l'indique, destinées tout particulièrement aux entreprises, leur offrant ainsi des systèmes de personnalisation de la structure même du contenu, et des fonctionnalités de gestion de workflow.
La grande majorité de ces outils sont écrits en PHP ou en java, mais l'article note que peu d'outils java sont à l'heure actuelle en "open-source", là ou leurs homologues écrits en PHP le sont presque tous. Néanmoins, ces outils java vont généralement bien plus loin dans l'ECM que les outils PHP, et entrent désormais en concurrence directe avec les outils des industriels du secteur comme Microsoft ou IBM.
En guise de conclusion, l'article fournit un petit comparatif rapide de différents outils de gestion de contenu.
Pour aller plus loin: le site 01net, a réalisé un dossier sur "bien choisir son CMS" dont nous vous parlions il y a peu.
L'article de ZDNet : Gestion de contenu : l'offre open source arrivée à maturité
Publication hier du framework PHP symfony 1.0.7
La version 1.0.7 de symfony vient d'être publiée, celle-ci n'apporte rien de nouveau mais corrige de nombreuses anomalies liées au propel-dump-data.
Pour rappel symphony est un cadre d’application libre pour PHP5. Disponible depuis un an, ce framework a réussi à s’imposer comme une référence parmi la multitude de solutions disponibles pour ce langage. S’inspirant de Ruby on Rails, Symphony s’appuie sur une architecture de type Modèle-Vue-Contrôleur. Il implémente l’utilisation du langage de description YAML ainsi que l’Ajax.
Annonce
This short article is a reminder for me, I hope it will save me hours next time.
In a PHP script, to fetch content object nodes you can use eZContentObjectTreeNode::subtree or eZFunctionHandler::execute . The second is very practical because its syntax is similar to content fetch functions in templates . But there's one difference : when writing an attribute filter condition you have to put your condition array in another array even if there's only one condition. For example, in templates you can write :
{def $tree=fetch(content, tree, hash(parent_node_id, 2, attribute_filter, array( 'name', 'like', '*ez publish*' ) ) )}
So, in a PHP script, I was thinking that I could write :
$tree = eZFunctionHandler::execute('content','tree', array('parent_node_id' => 2, 'attribute_filter' => array( 'name', 'like', '*ez publish*' ) ) );
But it does not work, you have to use this instead :
$tree = eZFunctionHandler::execute('content','tree', array('parent_node_id' => 2, 'attribute_filter' => array( array( 'name', 'like', '*ez publish*' ) ) ) );
In fact, in the documentation of the template fetch list function about attribute filtering (parameters for fetch list and fetch tree are mostly the same), you can read :
The "attribute_filter" parameter must be an array. The first element may be set to either "and" or "or" - this controls how the matching specified in the upcoming elements should be carried out. If this parameter is omitted, the system will default to "and". The rest of the elements are arrays, each array specifies a match.
So, the first and the second examples are not correct even if the first works in templates ! Damn, this took me almost 2 hours...
Un petit tutorial explique les fonctions de bases pour créer des fichiers PDF avec Zend framework.
Zend Framework est un framework PHP gratuit développé par la société Zend. Il a pour principal but d'accélérer le développement et de faciliter la maintenance d'application web. Parmi les fonctionnalités offertes par Zend Framework, vous avez la possibilité de manipuler des fichiers PDF grâce au module Zend_Pdf. Le tutorial proposé sur le site de Zend, vous propose de créer et d'enregistrer des documents et de manipuler du texte et des images à l'aide de ce module.
TutorialLe site SitePoint propose un dossier pour découvrir l'univers du mashup, à travers des exemples concrets utilisant les possiblités offertes par Yahoo!.
Le terme de mashup, popularisé par l'arrivée du Web 2.0, désigne une application web que l'on pourrait qualifier d'hybride en ce sens qu'elle s'appuie sur d'autres sites, pour fournir un nouveau service. En effet certains sites mettent gratuitement des API (Application Programming Interface) à disposition des développeurs, leur permettant ainsi d'utiliser leurs services web pour créer un nouveau site. On sitera notamment Google, Yahoo, Flickr, ou Amazon, dont les services web sont régulièrement utilisés dans le cadre du mashup.
Le dossier de SitePoint offre une initiation à la création de mashup en PHP5, en prenant comme exemple l'utilisation des différents services web proposés par Yahoo!. On apprend ainsi à utiliser, pour son propre site, les services Yahoo! Search et Yahoo! Maps.
L'article : Whip Up a Yahoo! Mashup Using PHP
A noter sur VNuNet un article consacré à Claroline, la plate-forme Open Source de formation à distance et de travail collaboratif développée en PHP.
L'article détaille les fonctionnalités et possibilité de ce logiciel francophone et cite quelques références parmi lesquelles l'Université Paris VIII, les Écoles Centrales, l'Université d'Auvergne à Clermont-Ferrand, l'Université de Lille2, l'Université de Provence, Université Jean Monet à Saint-Etienne, etc.
La version 5.0.48 du serveur de base de données MySQL vient de sortir.
Cette version n'apporte pas de nouveautés, mais corrige de nombreux bugs. On notera que l'erreur d'auto_increment avec des tables de type InnoDB a été corrigée et l'ajout d'une option de démarrage du serveur, pour ne pas réécrire le fichier .MYD existant lors de la création d'une table de type MyISAM.
ChangelogLe Rewrite_mod pour apache ou la réécriture url est plutôt à la mode ces temps-ci, une des raisons les plus marquantes est le référencement, là ou les moteurs de recherche ont du mal à suivre des url exotiques comme “www.monsite.org/?page=mail&action=envoyer” l’utilisation du rewrite_mod coupler à un MVC (Model View Controler) (voir framework zend) en Php permet d’obtenir des url bien plus parlantes “www.monsite.org/mail/envoyer”
L’installation est en fait assez simple, il suffit d’ajouter la ligne “LoadModule rewrite_module /usr/lib64/apache2-prefork/mod_rewrite.so” dans le fichier de configuration des modules d’Apache2 pour OpenSuSE
Donc: En root (commande: su) on édite le fichier /etc/apache2/sysconfig.d/loadmodule.conf et on ajoute la ligne LoadModule rewrite_module /usr/lib64/apache2-prefork/mod_rewrite.so
Redemarrage d’ Apache2 : apache2ctl restart
Les documents XML sont de plus en plus utilisés que ce soit dans le monde du web, avec de nouveaux protocoles tels que l’AJAX, ou encore dans les logiciels. XML sert de base pour tout langage balisage.
SimpleXML permet la lecture d’un document XML trÚs simplement, on fait appel pour cela la méthode “simplexml_load_file()” qui charge le document XML, ensuite SimpleXML gÚre chaque noeud du document comme un objet, une autre fonction permet de dérouler son document XML “asXml()”
La création d’un noeud est réalisé avec la fonction “addChild()”
Une petite application simple, histoire de mettre en pratique nos acquis (:,
un lecteur RSS partir d’une url… bon on est loin d’un Google Reader …m’enfin avec une feuille de style bien conçue…
En conclusion on peut s’apercevoir que SimpleXML transforme le document XML en un assemblage d’objets, et le principe consiste parcourir les objets.
sources

L'équipe de PHP Québec est fière d'annoncer la sixième édition de la Conférence PHP Québec, qui aura lieu du 12 au 14 mars 2008 à Montréal (Québec, Canada). Nous sommes à la recherche d'experts PHP francophones et anglophones désireux de partager leur expertise avec les professionnels du Canada et des États-Unis.
Le PHPLab favorisera la communication entre les conférenciers et les participants autour des sujets répondant aux problématiques actuelles du marché. Lors de la conférence, des sujets destinés aux programmeurs, chefs de projets et directeurs seront abordés. Parmi les sujets: les dernières techniques de développement avec PHP5 et PHP6, XML, services web, bases de données, etc.
Les organisateurs attendent vos propositions originales et inédites. Pour plus d'informations, visitez le site web de la conférence: http://conf.phpquebec.com
Jelix est un framework pour PHP 5.1, qui comporte de nombreux composants et repose sur des modèles connus comme MVC, DAO, etc, tout en restant léger et performant. La version 1.0 beta 3 qui vient de sortir apporte des nouveautés importantes.
Ces nouveautés sont :
* un système de formulaire qui permet de gérer automatiquement les erreurs, la validation aussi bien côté client que coté serveur, ainsi que la génération automatique du code HTML et javascript. Tout ceci à partir d'un simple fichier descriptif en XML.
* un contrôleur générique pour faire de la gestion de données très rapidement (type CRUD)
* un module pour faire des tests unitaires aisément
* une uniformisation dans l'organisation des divers types de plugins
* de nombreuses améliorations dans la plupart des composants du framework.
Et bien sûr, comme dans les versions précédentes, Jelix 1.0 beta 3 propose une architecture modulaire, un moteur de template performant, des composants pour gérer l'authentification, les droits, l'internationalisation, ou encore faire du mapping relationnel-objet et de la communication inter-module. Le framework peut prendre aussi en charge les urls significatives, les thèmes, l'UTF-8, XML-RPC, JSON, RESTFull et bien d'autres choses. Sans oublier des scripts en ligne de commande qui permettent de développer rapidement.
À noter aussi les améliorations sur le site et les gros efforts qui ont été fait sur la documentation. Enfin l'ouverture d'une forge pour les développeurs de modules, plugins, et outils pour Jelix, qui comporte notamment un projet de plugin pour Eclipse, jelixeclipse, facilitant le développement d'applications pour Jelix.
Jelix 1.0 beta 3 est utilisé sur plusieurs sites, dont un à très forte audience (l'une des plus grosses plateformes de blog en France), et de ce fait peut être considéré comme très stable. C'est d'ailleurs la dernière beta avant la version 1.0.
Jelix est disponible en deux éditions : l'édition "developer" pour la phase développement d'une application, et l'édition "optimized" (facultative), optimisée pour les serveurs en productions.
* Site web
* Téléchargement
* Liste détaillée des changements
Proposé par Laurent Jouanneau
Publications de version de maintenance du SGBD libre PostgreSQL.
Le PostgreSQL Global Development Group a annoncé la mise à jour de l'ensemble des versions de PostgreSQL. Il s'agit essentiellement de correction, de failles de sécurité mineures. Les versions les plus à jour sont désormais les suivantes: 8.2.5, 8.1.10, 8.0.14, 7.4.18, 7.3.20.
So well, I've been busy these days working on my own implementation of a form component in the ZF spirit. This post is to help me see where I'm at with this component, as well as planning future evolution. I'll try my best to describe what it does and does not, and what it could do in the future.
Of course, while this is more of a personnal pense-bete than anything else, any comments are welcome.
Forms are build using the factory, which ensures each form has a unique name so that two forms can't conflict when used on the same action. Each element of the form is materialized by an instance of Riskle_Form_Element which holds any configuration directive for the element.
The component features an extensible prototyping system via the Riskle_Form_Prototype set of class. Default (and mandatory atm) is to use a Zend_Config_Ini file which can in turn contains further prototyping instructions, such as prototype from a model (by model I mean a class extending Zend_Db_Table). A given form can embed multiple prototypes, possibly of the same type, which have to be conretized before the form is usable. Concretization of form operates in a FILO merging fashion. Prototyping from a model is for the moment very basic, it treats all fields as text field, but this will be addressed in time. Of course, the system allows for different source of prototyping (think Riskle_Form_Prototype_Xml for example).
Elements features a variety of configuration directives, which I'll details here.
text.The datasource directive deserves a little more explanation. When the form factory encounters a datasource directive, it delegates the work to the datasource factory, which autodetects and decode the datasource. The core distributions handles the following datasources:
YourModel->methodYourModel::methodcsv:foo,bar. It uses a user land CSV decoder that will most likely be bundled with the core distribution when (if ?) released.json:{'foo', 'bar'}. It's worth noting that this example will be converted to the following associating array: array('foo' => 'foo', 'bar' => 'bar'). You can avoid this by including a noassoc switch (so that it reads json:noassoc:{'foo', 'bar'}. Another note on JSON: the main problem when allowing JSON in INI files is that you can't have a double quote character in values (except by using a dirty hack which I do not want), and the php json decoder expects identifiers to be doublequoted. The datasource handles this by replacing any non escaped single quote to a double quote.Data validation is done by a subclassed Zend_Input_Filter. validators configuration from elements should conform to ZFI syntax. The custom Riskle_Form_Input component features a getRaw set of methods to retrieve raw data (used in case the form was not successful). Not much else to say here.
The core distribution features a set of view helper aimed at easing html form drawing. The helpers use the built-in ZF view helpers to render fields while adding a bunch of custom markup around (namely: labels and error messages). The default helpers also take care of fields that depend on other fields (see Form elements) and add the according ajax queries to populate the element.
The most interesting part I think. Riskle_Form features a plugin system, much like the Zend_Controller one. It exposes the following hooks (in this order):
formStartup, always run at the beginning of the workflowprePopulate, run before the form gets it data (either from the model or the request)postPopulate, run after the form gets it datapreValidate, run before the forms attempts to validate the dataonValidateSuccess, run if and only if the data validation was a successonValidateFailure, run if and only if the data validation was a failurepostValidate, run after the forms attempts to validate the data (regardless of the success or not)preCommit, run before the form tries to feed the model with the dataonCommitSuccess, run if and only if the data feedage was a successonCommitFailure, run if and only if the data feedage was a failurepostCommit, run after the forms tries to feed the model with the data (regardless of the success or not)formShutdown, always run at the end of the workflowFor each hook, the instance of the current form is passed as an argument to the method. Of course, the commit set of hooks will only be run if the data validates.
A simple uploading form could look like the following:
$form = Riskle_Form::factory(new Zend_Config_Ini('upload.ini', null));
$form->registerPlugin(new Riskle_Form_Plugin_Upload('myUploadField'));
$form->run();
$this->view->assign('form', $form);
the view would look like:
echo $this->drawForm($this->form);
and upload.ini could look like:
[form]
model = "uploaded_files"
prototype = 1
[fields]
myUploadField.type = "file"
myUploadField.label = "choose an image"
legend.type = "text"
legend.label = "Legend"
Clearly, this form component is designed for use in an HTML component. Few or no care has been taken to ensure cross-medium compatibiliy such as XHTML, PDF, etc. Hopefully the changes to apply to achieve such compatibility will not be that much of a hassle. While I'm not willing to ensure such a compatibility, I'd be happy to apply any patch submitted.
Regarding plugins, they still miss the ability to really act on the workflow, such as stopping it, skipping steps (?) or add errors to the stack, etc.
Also, the code still needs a few refactoring and optimization, especially regarding the view helpers and the main form class, as well as the configuration file syntax which needs an in-depth revision.
So well, I've been busy these days working on my own implementation of a form component in the ZF spirit. This post is to help me see where I'm at with this component, as well as planning future evolution. I'll try my best to describe what it does and does not, and what it could do in the future.
Of course, while this is more of a personnal pense-bete than anything else, any comments are welcome.
Forms are build using the factory, which ensures each form has a unique name so that two forms can't conflict when used on the same action. Each element of the form is materialized by an instance of Riskle_Form_Element which holds any configuration directive for the element.
The component features an extensible prototyping system via the Riskle_Form_Prototype set of class. Default (and mandatory atm) is to use a Zend_Config_Ini file which can in turn contains further prototyping instructions, such as prototype from a model (by model I mean a class extending Zend_Db_Table). A given form can embed multiple prototypes, possibly of the same type, which have to be conretized before the form is usable. Concretization of form operates in a FILO merging fashion. Prototyping from a model is for the moment very basic, it treats all fields as text field, but this will be addressed in time. Of course, the system allows for different source of prototyping (think Riskle_Form_Prototype_Xml for example).
Elements features a variety of configuration directives, which I'll details here.
text.The datasource directive deserves a little more explanation. When the form factory encounters a datasource directive, it delegates the work to the datasource factory, which autodetects and decode the datasource. The core distributions handles the following datasources:
YourModel->methodYourModel::methodcsv:foo,bar. It uses a user land CSV decoder that will most likely be bundled with the core distribution when (if ?) released.json:{'foo', 'bar'}. It's worth noting that this example will be converted to the following associating array: array('foo' => 'foo', 'bar' => 'bar'). You can avoid this by including a noassoc switch (so that it reads json:noassoc:{'foo', 'bar'}. Another note on JSON: the main problem when allowing JSON in INI files is that you can't have a double quote character in values (except by using a dirty hack which I do not want), and the php json decoder expects identifiers to be doublequoted. The datasource handles this by replacing any non escaped single quote to a double quote.Data validation is done by a subclassed Zend_Input_Filter. validators configuration from elements should conform to ZFI syntax. The custom Riskle_Form_Input component features a getRaw set of methods to retrieve raw data (used in case the form was not successful). Not much else to say here.
The core distribution features a set of view helper aimed at easing html form drawing. The helpers use the built-in ZF view helpers to render fields while adding a bunch of custom markup around (namely: labels and error messages). The default helpers also take care of fields that depend on other fields (see Form elements) and add the according ajax queries to populate the element.
The most interesting part I think. Riskle_Form features a plugin system, much like the Zend_Controller one. It exposes the following hooks (in this order):
formStartup, always run at the beginning of the workflowprePopulate, run before the form gets it data (either from the model or the request)postPopulate, run after the form gets it datapreValidate, run before the forms attempts to validate the dataonValidateSuccess, run if and only if the data validation was a successonValidateFailure, run if and only if the data validation was a failurepostValidate, run after the forms attempts to validate the data (regardless of the success or not)preCommit, run before the form tries to feed the model with the dataonCommitSuccess, run if and only if the data feedage was a successonCommitFailure, run if and only if the data feedage was a failurepostCommit, run after the forms tries to feed the model with the data (regardless of the success or not)formShutdown, always run at the end of the workflowFor each hook, the instance of the current form is passed as an argument to the method. Of course, the commit set of hooks will only be run if the data validates.
A simple uploading form could look like the following:
$form = Riskle_Form::factory(new Zend_Config_Ini('upload.ini', null));
$form->registerPlugin(new Riskle_Form_Plugin_Upload('myUploadField'));
$form->run();
$this->view->assign('form', $form);
the view would look like:
echo $this->drawForm($this->form);
and upload.ini could look like:
[form]
model = "uploaded_files"
prototype = 1
[fields]
myUploadField.type = "file"
myUploadField.label = "choose an image"
legend.type = "text"
legend.label = "Legend"
Clearly, this form component is designed for use in an HTML component. Few or no care has been taken to ensure cross-medium compatibiliy such as XHTML, PDF, etc. Hopefully the changes to apply to achieve such compatibility will not be that much of a hassle. While I'm not willing to ensure such a compatibility, I'd be happy to apply any patch submitted.
Regarding plugins, they still miss the ability to really act on the workflow, such as stopping it, skipping steps (?) or add errors to the stack, etc.
Also, the code still needs a few refactoring and optimization, especially regarding the view helpers and the main form class, as well as the configuration file syntax which needs an in-depth revision.
Une faille de sécurité affectant les versions antérieures de SPIP 1.9 a été trouvée.
Ceci a conduit à sortir immédiatement une version 1.9.2c corrigeant cette erreur et quelques autres de moindre gravité.
La même faille a été corrigée et donne la version SPIP 1.8.3a.
La suite sur http://www.pyrat.net/SPIP-1-9-2c.html
Proposé par Jacques PYRAT
La fondation Eclipse vient d'annoncer la sortie de la version stable de PDT 1.0.
Le PHP Development Tools est, pour rappel, une extension Eclipse permettant à cet éditeur de se doter des fonctionnalités nécessaires au développement PHP (débuggage, colorisation syntaxique, "autocomplétion", et bien d'autres encore).
Le PDT se veut ouvert et extensible. D'après la fondation Eclipse, grâce à son API, il sera relativement aisé de l'enrichir de nouvelles fonctionnalités.
Notons enfin que PDT est le fruit de plusieurs mois de collaboration entre Zend et la fondation Eclipse.
La ville de Lyon a opté pour l'open source pour l’hébergement, la maintenance et l’évolution de ses différents portails web. Les technologies employées sont notamment : serveurs Apache, PHP, Zope/CPS, Linux RedHat, Squid, MySQL et OpenLDAP.
Le site Grenelle environnement, présenté par le ministère de l'écologie, du développement et de l'aménagement durable, est quant à lui un nouvel exemple de l'utilisation de SPIP.
En faisant du ménage sur mon portable, je suis retombé sur cette photo plutôt marrante :
Cette photo date du Forum PHP 2004.
J’étais parti faire des courses car on manquait de bouteille d’eau pour les participants et en revenant je me suis trouvé au milieu d’un photoshoot de Rasmus et Zeev pour divers journalistes présents sur place. On (je ne sais plus exactement qui) m’a alors demandé de me mettre à côté d’eux pour le côté fun de la situation…malheureusement (ou heureusement), la photo n’a pas été sélectionnée pour les magazines en question
Nouvelle cuvée de pure maintenance corrective pour phpMyAdmin.
TYPO3 diffuse un bulletin de sécurité concernant de multiples failles dans l'extension mm-forum.
L'équipe de sécurité de TYPO3 a reporté que de nombreuses failles de sécurité de type injection SQL et Cross Site Scripting étaient présentes dans l'extension non officielle mm-forum et ce jusqu'à la version 0.1.2. Ces failles qualifiées de très importantes sont corrigées dans la version 0.1.3 de l'extension sortie le 19 septembre.
TYPO3 en profite pour rappeler que des consignes en matière de sécurité sont disponibles dans cette documentation et que cette page recense les bulletins de sécurité critiques comme celui-ci.
Annonce TYPO3
Quelques citations clés:
Avec un peu de retard et pour ceux qui auraient manqué l'information : le programme du Forum PHP 2007 à été plublié.
Le Forum PHP 2007 se déroulera les 21 et 22 novembre prochain. Vous y serez ?
Avec un peu de retard et pour ceux qui auraient manqué l'information : le programme du Forum PHP 2007 à été plublié.
Le Forum PHP 2007 se déroulera les 21 et 22 novembre prochain. Vous y serez ?
Je reviens sur le pattern Singleton, car actuellement je travaille sur un projet perso et celui-ci m’a posé un probleme…
Dans mon cas précis, je me sers du Singleton pour gerer une classe de Log. On pourrait penser que le Singleton se prete parfaitement a ce type de fonctionnalité, seulement je me suis retrouvé face un probleme qui est en fait une des grandes forces du Singleton, l’initialisation unique …
Je m’explique, dans mon cas j’ai besoin de pouvoir travailler avec de multiples fichiers log, si le nom du fichier est passé en parametre du constructeur, je ne pourrais travailler qu’avec celui-ci, et pour ecrire sur un nouveau fichier je devrais passer par un accesseur qui modifierait l’attribut…, ou encore je devrais passer ma methode permettant l’ecriture du log, le nom du fichier…
Ces deux methodes ne me plaisent pas particulierement, pour résoudre le probleme l’idée est de modifier le Singleton pour qu’il enregistre non pas une, mais de multiples instances de notre classe.
Donc si l’instance de la classe n’est pas déj créée, il en crée une nouvelle,l’enregistre dans un tableau et la retourne, si celle-ci est dej créée il la retourne simplement.
On sort peut être un peu du principe du Singleton, néanmoins l’esprit et les avantages y sont toujours (;
UPDATE: new version (r105) available.
The component was given a little rewrite as expected, but maybe a little bit later than I would have wanted to :-) So it now has its own Rowclass proxy from which you can pull various infos such as current page, page range, next page, etc all exposed as getter methods (that is, getCurrentPage, getPageRange, getNextPage, etc), which you won't really have to worry about since the brand new view helper will take care of that for you. Usage has changed a little, bit, so let's first have a look at what's happening from the controller point of view:
$table = new Riskle_Db_Table_Paginate(new Table, $this->_getParam('page'));
$this->view->rowset = $table->fetchAll();
Not much changed here, except we don't need anymore to call getPaginationInfos(). Nice ! Now the big part, the view:
$this->paginate($this->rowset);
echo $this->paginate()->previous();
echo $this->paginate()->navigation();
echo $this->paginate()->next();
The view helper uses the neat composite helper trick from naneau - which is a really cool trick, great job naneau my fellow no-more-a-bunny. The first call inits the helper, feeding him the necessary rowset to work on, then you just have to call the methods you need to draw the navigation links. As you may expect, previous and next method will return nothing if no page is available (actually, they return their second argument, which defaults to an empty string).
Also, it's worth noting that the bundled Riskle_Db_Table features the patch from Erik, as well as a totally rewritten fetchCols method (now uses a straight Zend_Db_Select object instead of the ugly trick it used to use).
My code is no longer available on subversion, I moved the project to assembla. Instead ou can download this component from the riskle space's files board (direct download), the file contains all classes needed for the component to work, just unzip it in your include_path and you're set.
As usual, any comments are more than welcome.
UPDATE: new version (r105) available.
The component was given a little rewrite as expected, but maybe a little bit later than I would have wanted to :-) So it now has its own Rowclass proxy from which you can pull various infos such as current page, page range, next page, etc all exposed as getter methods (that is, getCurrentPage, getPageRange, getNextPage, etc), which you won't really have to worry about since the brand new view helper will take care of that for you. Usage has changed a little, bit, so let's first have a look at what's happening from the controller point of view:
$table = new Riskle_Db_Table_Paginate(new Table, $this->_getParam('page'));
$this->view->rowset = $table->fetchAll();
Not much changed here, except we don't need anymore to call getPaginationInfos(). Nice ! Now the big part, the view:
$this->paginate($this->rowset);
echo $this->paginate()->previous();
echo $this->paginate()->navigation();
echo $this->paginate()->next();
The view helper uses the neat composite helper trick from naneau - which is a really cool trick, great job naneau my fellow no-more-a-bunny. The first call inits the helper, feeding him the necessary rowset to work on, then you just have to call the methods you need to draw the navigation links. As you may expect, previous and next method will return nothing if no page is available (actually, they return their second argument, which defaults to an empty string).
Also, it's worth noting that the bundled Riskle_Db_Table features the patch from Erik, as well as a totally rewritten fetchCols method (now uses a straight Zend_Db_Select object instead of the ugly trick it used to use).
My code is no longer available on subversion, I moved the project to assembla. Instead ou can download this component from the riskle space's files board (direct download), the file contains all classes needed for the component to work, just unzip it in your include_path and you're set.
As usual, any comments are more than welcome.
En PHP, il est possible de compresser les sources envoyés vers le navigateur afin d’économiser de la bande passante. Cela s’appelle la compression zlib. Il est possible de l’activer directement dans le fichier php.ini grâce à la directive zlib.out_compression.
Mais voilà, on n’a pas toujours accès au fichier php.ini. Vous allez alors me dire
“bah, t’as qu’à faire un ini_set() dans ton code!”.
Je suis d’accord, sauf que l’utilisation d’ini_set() est gourmande en temps d’exécution vu que l’a conf est rechargée à chacun de ses appels.
Une solution tierce que m’a donné un stagiaire sur une formation que j’anime cette semaine est de passer par l’output buffering.
Il est possible de passer une fonction de callback à ob_start(). Cette fonction sera exécutée sur l’ensemble de votre buffer, donc de votre page. Or il existe une fonction spécifique en PHP permettant d’effectuer la compression zlib avec l’output buffering : ob_gzhandler()
En complant les deux, on obtient une compression zlib sur sa page :
ob_start(’ob_gzhandler’);
Cette astuce est certainement connue de beaucoup de monde vu qu’elle est directement décrite dans la documentation de PHP (http://fr.php.net/manual/fr/function.ob-gzhandler.php) mais je doit avouer que je n’étais jamais tombé dessus.
La version 1.0.2 du Zend Framework est désormais disponible.
Cette version apporte une solution à un bon nombre d'erreurs connues et fournit quelques fonctionnalités mineures, notamment :
Pour plus d'informations, consulter le changelog.
J’adore PHP, je travaille avec ce langage depuis maintenant 8 ans et je le trouve vraiment pratique et tellement facile d’utilisation.
Mais rien n’est parfait dans ce monde et PHP n’échappe pas à cette règle.
A quoi pensaient les développeurs de PHP lorsqu’ils ont pondu les fonctions de gestion des chaînes! Rien n’est normalisé, ni les noms des fonctions, ni leur prototypage, ni les valeurs qu’elles renvoient.
Des exemples ?
C’est parti, trouvez les erreurs :
str_repace() VERSUS strstr()
strip_tags() VERSUS stripslashes()
stripos() VERSUS str_ireplace()
strcasecmp() VERSUS stristr()
html_entity_decode() VERSUS htmlentities()
nl2br() VERSUS strtolower()
str_replace ( mixed $search, mixed $replace, mixed $subject [, int &$count] ) VERSUS strstr ( string $haystack, string $needle )
etc…
Il semblerait que deux bibliothèques ont été réunies, chacune avec des normes à l’opposée de l’autre.
Quelqu’un en saurait plus?
La version 2.3.0 de CrawlTrack est disponible.
CrawlTrack vous dit tout sur l'activité des robots sur votre site. Cette nouvelle version s'intéresse aussi aux "mauvais robots", ceux qui utilisé par des hackers peuvent ruiner des heures de travail. CrawlTrack est maintenant capable non seulement de détecter des tentatives de piratage mais aussi de les bloquer avant que le mal ne soit fait.
Site officiel
Proposé par Jean-Denis Brun
I just released on riskle's assembla space a new version of my pagination component for the Zend Framework which you can download right now:
This release fixes a nasty bug in Riskle_Db_Table::fetchCols which prevented from retrieving the right count of cols involved in the query.
The table component has also been slightly rewritten following Erik's suggestion to move the parent mapping into _fetch. The parent mapping itself has been improved to allow "multi level" table joining. This will be best explained with an example:
Say you have three table, Foo, Bar and Quux, and you would like to execute the following query:
SELECT * FROM Foo JOIN Bar ON Foo.bar_id = Bar.id JOIN Quux ON Bar.quux_id = Quux.id
This is now possible with the following mapping (in Foo's class of course):
array(
'Bar' => array('local' => 'bar_id', 'remote' => 'id'),
'Quux' => array('local' => 'quux_id', 'remote' => 'Quux.id'),
);
Easy heh ?
As usual, any comments are appreciated, and please note that this code is released under the same license as the ZF itself, the new-bsd license.
I just released on riskle's assembla space a new version of my pagination component for the Zend Framework which you can download right now:
This release fixes a nasty bug in Riskle_Db_Table::fetchCols which prevented from retrieving the right count of cols involved in the query.
The table component has also been slightly rewritten following Erik's suggestion to move the parent mapping into _fetch. The parent mapping itself has been improved to allow "multi level" table joining. This will be best explained with an example:
Say you have three table, Foo, Bar and Quux, and you would like to execute the following query:
SELECT * FROM Foo JOIN Bar ON Foo.bar_id = Bar.id JOIN Quux ON Bar.quux_id = Quux.id
This is now possible with the following mapping (in Foo's class of course):
array(
'Bar' => array('local' => 'bar_id', 'remote' => 'id'),
'Quux' => array('local' => 'quux_id', 'remote' => 'Quux.id'),
);
Easy heh ?
As usual, any comments are appreciated, and please note that this code is released under the same license as the ZF itself, the new-bsd license.
A PEAR package for the 1.0.2 version of the Zend Framework is now available from the PEAR PHPMafia channel. As usual, to install just issue the following:
pear channel-discover pear.phpmafia.net
pear install phpmafia/Zend
A PEAR package for the 1.0.2 version of the Zend Framework is now available from the PEAR PHPMafia channel. As usual, to install just issue the following:
pear channel-discover pear.phpmafia.net
pear install phpmafia/Zend