Une nouvelle version de maintenance du Zend Framework vient de sortir. Elle intègre une petite vingtaine de correctifs allant de la simple modification de la documentation à la correction de bugs au niveau des web services.
Rappelons que la branche 1.7.x du framework, sortie en novembre 2008, prend en charge le protocole AMF d'Adobe (Action Message Format). Elle apporte aussi des améliorations au niveau de l'internationalisation, du transfert de fichiers et une hausse sensible des performances pour le Zend_Loader et le Zend_Controller. Elle intègre également la librairie javascript JQuery dans Zend extra et Zend_Tool dans l'incubateur.
Correction de plusieurs bugs, évolution du module de recherche, de l'editeur wysiwyg TinyMCE et du module news
Version 1.5.3 - Arecibo
-----------------------------
- Correction de plusieurs bugs:
- # 2516 les erreurs de script en Javascript listcontent.php (admin).
- # 2706 CreatePagination () ne comporte pas de clé de session.
- # 2915 suppression erreur dans multicontent.php.
- # 2925 Utilisateur n'existe pas dans exemple de contenu.
- # 2940 Longueur du champ Dateformat plus court dans les preferences utilisateur que dans les parametres globaux.
- # 2995 Bug affectation de groupe.
- # 2996 Gestion des langues: chaîne manquante.
- Avis d'erreur dans modform.inc.php.
- Correction d'un problème mineur sur l'autorisation editpref.php.
- Ajout d'une option pour désactiver le wysiwyg pour une page de contenu.
- Correction (espérons-le) du problème avec les pseudo-aléatoire déconnexions quand il y a inactivité dans la section admin.
- Mettez «canonical» dans la logique des modèles par défaut.
- le thème par défaut NCleanGrey, installation sans contenu par défaut.
- Recherche 1.5.3
- # 3034 La recherche de mots dans le footer rend toutes les pages de mon site.
- Maintenant, supprimez des gestionnaires d'événements lors de la désinstallation du module
- Ne retourne pas de resultats pour les pages non recherchable, meme si un resultat est trouvé dans le gabarit.
- Maintenant, les mots d'arret permettent éventuellement l'exclusion d'un module spécifique.
- Demandes qui sont inclus:
- # 1231 Utilisation de uploads/images/logo1.gif défaut au lieu de images/cms/logo1.gif.
- # 2897 Champ Image et Vignette passe dans l'onglet options.
- # 3025 News: nouveau paramètre, action = "détail", qui peut être utilisé pour afficher une entrée spécifique dans le détail en mode direct.
- # 3035 Ajout d'un lien vers la forge dans la partie administration.
- # 3068 Nouveau plugin : page_attr pour le rendement des attributs d'une page.
- TinyMCE
- Ajout du support pour la configuration de la troisième barre d'outils
- Ajout d'une option pour montrer la réalité aperçu des fichiers
- Correction des icônes dans filetype FilePicker
- Mise en oeuvre | comme séparateur dans les barres d'outils
- Correction, force le nettoyage pour le copier /coller
- Correction pour les barres d'outils pour l'utilisation en frontend
- News 2.9.3
- Quelques améliorations de l'onglet articles dans l'admin
- Maintenant, la production d'URL canonique en vue détaillée
- Les modifications apportées aux modèles par défaut
- # 3027 de définition de champ non supprimables lorsque l'entrée est faite en utilisant fesubmit.
- # 2941 (News) Champ Extra non présent en vue détail.
- Ebauche d'articles ne sont pas indexées dans le module de recherche.
Proposé par eric
Hello,
I'm very excited to present you OOTemplate,
this is a template engine for php5, it use the django template's syntax.
OOTemplate's aims is to simplify the generation of html code in php,
ootemplate has been design to be flexible.
for example if you develop a function "tips of days" in your website
you can use Rand statement; this get a random value in the array
and generate a block contents :
{% rand tip in tips %}
<h1>Tips of days</h1>
<h2>{{ tip.title }}<h2/>
<p>{{ tip.contents }}<p/>
{% endrand %}
or if in a form, you check a textarea's balise, for redisplayed contents,
you should escape an input and them use nl2br function for format it.
with ootemplate you can use filters :
<textare name="body">{{ body | escape | nl2br }}>/textarea>
Want to try, or contribute ?
OOTemplate is currently in development,
needs a bugs reports to be stable, and many other features.
If you are interested of this project,
you can follow his progress on http://code.google.com/p/ootemplate/,
retrieve the source code and report all issues.
J'ai installé aujourd'hui InDefero en remplacement de Trac pour la gestion de mes projets personnels. Il y a quelques mois, j'avais installé Trac un peu par dépit ne trouvant pas de logiciel à mon goût (un logiciel simple et léger, multi-projets avec au minimum la navigation dans des dépôts SVN, un wiki et gestionnaire de rapports et si possible en PHP) mais il fonctionnait assez mal (régulièrement j'avais des erreurs sur les pages) et l'utilisation en multi-projets était tellement pénible que j'avais fini par tout mettre dans un seul dépôt SVN...
InDefero est un clone libre de GoogleCode basé sur le framework PHP Pluf et il fournit déjà quasiment toutes les fonctionnalités dont j'ai besoin pour mes projets. La création d'un nouveau projet avec son dépôt SVN est d'une simplicité qui me fait regretter d'avoir utilisé Trac aussi longtemps ! Les seuls défauts que je lui trouve pour le moment sont une interface plus que minimale à l'ergonomie parfois perfectible et le choix de la syntaxe wiki Markdown. Après c'est aussi une question d'habitude, pour le wiki il est vrai que, entre la syntaxe de Mediawiki, TWiki (que j'utilise au travail), Trac et celle-ci, je m'embrouille un peu...
L'équipe de développement de PHP a annoncé le 26 février 2009 la sortie de PHP 5.2.9. Cette version a pour but d'améliorer la stabilité de la branche 5.2.x avec la correction de 50 bugs dont plusieurs concernant la sécurité.
Parmi les correctifs, on notera principalement :
Cette version ne sera probablement pas la dernière avant la sortie de PHP 5.3. D'après Ilia Alshanetsky, une version 5.2.10 viendra probablement corriger les bugs reportés par la communauté PHP.
Sources:
Un article sur le site developerWorks d'IBM montre aux développeurs PHP comment utiliser les APIs de Twitter pour extraire les messages de sa propre timeline et de celles de ses amis.
Twitter REST API
L'auteur se concentre particulièrement sur l'API REST de Twitter et expose dans un premier temps les caractéristiques de cette API : les types de requêtes disponibles, les différents codes de statuts retournés lors d'une requête, un exemple de message d'erreur.
Il nous présente ensuite deux méthodes intéressantes de l'API : public_timeline pour récupérer des informations sur un utilisateur et friends_timeline pour récupérer les 20 derniers messages postés par un utilisateur et ses amis. Plusieurs formats de sortie sont proposés : XML, RSS, ATOM et JSON.
twitterlibphp
Plutôt que de requêter directement l'API, l'auteur propose d'utiliser une librairie PHP dédié à Twitter : la twitterlibphp.
Cette librairie contient toute une série de méthodes qui encapsulent les méthodes de l'API Twitter. L'avantage est que tous les processus de connexions, authentification, gestion des erreurs sont simplifiés. Il suffit alors d'inclure la librairie, de s'authentifier et d'utiliser une des méthodes pour obtenir un résultat.
Plusieurs méthodes sont montrées en exemple :
Le nouveau numéro de PHP SOLUTIONS vient de sortir, avec un nouveau article de ma part sur PDO et bien sur de nombreux sujets sont traités :
Il y a un peu moins d'un an j'ai testé Pear::Log, ici j'ai voulu comparer mes tests en les réécrivant pour zend_log
En considérant que Zend et Pear sont dans mon include_path
[php]
<?php
include_once('Zend/Log.php');
include_once('Zend/Log/Writer/Stream.php');
include_once('Zend/Log/Writer/Null.php');
include_once('Zend/Log/Writer/Firebug.php');
include_once('Zend/Controller/Front.php');
require_once 'Pear/Log.php';
// FILE
touch('./out.log');
$loggerPearFile = &Log::singleton('file',
'./out.log',
'TEST');
$loggerZendFile = new Zend_Log();
$redacteurZendFile = new Zend_Log_Writer_Stream('./out.log');
$loggerZendFile->addWriter($redacteurZendFile);
// DISPLAY
$confDisplay = array('error_prepend'
=> '<font color="#ff0000"><tt>',
'error_append'
=> '</tt></font>');
$loggerPearDisplay = &Log::singleton('display',
'',
'',
$confDisplay,
PEAR_LOG_DEBUG);
$loggerZendDisplay = new Zend_Log();
$redacteurZendDisplay = new Zend_Log_Writer_Stream('php://output');
$loggerZendDisplay->addWriter($redacteurZendDisplay);
// Null
$loggerPearNull = &Log::singleton('null');
$redacteurZendNull = new Zend_Log_Writer_Null;
$loggerZendNull = new Zend_Log($redacteurZendNull);
// FIREBUG
$loggerPearFirebug = &Log::singleton('firebug',
'',
'PHP',
array('buffering' => true),
PEAR_LOG_DEBUG);
$redacteurZendFirebug = new Zend_Log_Writer_Firebug();
$loggerZendFirebug = new Zend_Log($redacteurZendFirebug);
// error_log
$loggerPearErrorLog = &Log::singleton('error_log',
PEAR_LOG_TYPE_SYSTEM,
'ident');
//*
// MAIL
// On fixe le sujet du mail
$confMail = array('subject' => 'Important Log Events',
'from' => 'from.website@example.com');
$loggerPearMail = &Log::singleton('mail',
'webmaster@example.com',
'ident',
$confMail);
$mail = new Zend_Mail();
$mail->setFrom('from.website@example.com')
->addTo('webmaster@example.com');
$writer = new Zend_Log_Writer_Mail($mail);
// On fixe le sujet du mail
$writer->setSubjectPrependText('Important Log Events');
// Only email warning level entries and higher.
$writer->addFilter(Zend_Log::WARN);
$loggerZendMail = new Zend_Log();
$loggerZendMail->addWriter($writer);
//*/
//*
// Windows
$confWindows = array('title' => 'Sample Log Output');
$loggerPearWindows = &Log::singleton('win',
'LogWindow',
'ident',
$confWindows);
//*/
//*
// sql
$confSql = array('dsn' => 'mysql://root@localhost/logs');
$loggerPearSql = &Log::singleton('sql',
'log_table',
'ident',
$confSql);
$parametres = array ('host' => '127.0.0.1',
'username' => 'root',
'password' => 'localhost',
'dbname' => 'logs');
$db = Zend_Db::factory('PDO_MYSQL', $parametres);
$planDeCorrespondance = array('niveau' => 'priority', 'msg' => 'message');
$redacteur = new Zend_Log_Writer_Db($db,
'nom_de_la_table_de_log',
$planDeCorrespondance);
$loggerZendSql = new Zend_Log($redacteur);
/* Creating a new database connection. /
$confSQLite1 = array('filename' => 'c:\var\log.db',
'mode' => 0666,
'persistent' => true);
$loggerPearSQLite1 =& Log::factory('sqlite',
'log_table',
'ident',
$confSQLite1);
$loggerPearSQLite1->log('logging an event' . __LINE__ , PEAR_LOG_WARNING);
/* Using an existing database connection. /
unset($error);
$db = sqlite_open('c:\var\log.db', 0666, $error);
$loggerPearSQLite2 =& Log::factory('sqlite', 'log_table', 'ident', $db);
$loggerPearSQLite2->log('logging an event ' . __LINE__ , PEAR_LOG_WARNING);
Ajoute les messages dans la table sqlite désignée
sqlite_close($db);
//*/
$loggerPearcomposite = &Log::singleton('composite');
$loggerZendComposite = new Zend_Log();
$loggerZendComposite->addWriter($redacteurZendDisplay);
$loggerZendComposite->addWriter($redacteurZendFile);
$loggerZendComposite->addWriter($redacteurZendNull);
// va dans les 2 rédacteurs
$loggerPearcomposite->addChild($console);
$loggerPearcomposite->addChild($loggerPearFile);
$loggerPearcomposite->addChild($loggerPearDisplay);
$loggerPearcomposite->addChild($loggerPearWindows);
$loggerPearcomposite->addChild($loggerPearSQL);
$loggerPearcomposite->addChild($loggerPearNull);
$loggerPearcomposite->addChild($loggerPearFirebug);
$loggerPearcomposite->addChild($loggerPearErrorLog);
$loggerPearcomposite->addChild($loggerPearMail);
$loggerPearcomposite->log('Ce message est logué dans tous les éléments du composite PEAR.' . date('c'));
$loggerZendComposite->info('Ce message est logué dans tous les éléments du composite ZF.' . date('c'));
$loggerPearWindows->log('This event will be logged only on Popup.');
// ouvre un popup et affiche tous les messages
$loggerPearFile->log('Message loggué dans un fichier par pear.');
$loggerZendFile->log('Message loggué dans un fichier par zf', Zend_Log::INFO);
//Stocke les messages dans un fichier
$loggerPearDisplay->log('Message envoyé à l\'affichage par pear.');
$loggerZendDisplay->log('Message envoyé à l\'affichage par zf.', Zend_Log::INFO);
//Affiche les messages dans le flux html
$loggerPearNull->log('This event will be logged only into the FIELDS OF THE NEPHILIM.');
$loggerZendNull->log('This event will be logged only into the FIELDS OF THE NEPHILIM.', Zend_Log::INFO);
//ne fait rien <img src="/blog/themes/travelogue/smilies/smile.gif" alt=":-)" class="smiley" />
$loggerPearFirebug->log('This event will be logged only to FireBug via Pear.');
// Maintenant vous pouvez appeler le logguer
//$loggerZendFirebug->log('This event will be logged only to FireBug via ZF.', Zend_Log::INFO);
$loggerPearSql->log('Message envoyé en base de données par pear.');
$loggerZendSql->log('Message envoyé en base de données par zf.', Zend_Log::INFO);
//Affiche les messages dans le flux html
$loggerPearMail->log('This event will be logged only by mail.');
// tente d'envoyer un mail (dans mons cas sans smtp ca n'a pas marché)
echo '<hr>out.log:<pre>';
readfile('./out.log');
?>
Les 4 premières lignes par les writer display. Ue fois en direct et une fois en composite.
Ensuite ce qui est dans le fichier.
[output] info: Ce message est logué dans tous les éléments du composite PEAR.2009-03-10T18:38:52+01:00 2009-03-10T18:38:52+01:00 INFO (6): Ce message est logué dans tous les éléments du composite ZF. 2009-03-10T18:38:52+01:00 info: Message envoyé à l'affichage par pear. 2009-03-10T18:38:52+01:00 INFO (6): Message envoyé à l'affichage par zf. ------------------------- out.log: Mar 10 18:38:52 TEST [info] Ce message est logué dans tous les éléments du composite PEAR.2009-03-10T18:38:52+01:00 2009-03-10T18:38:52+01:00 INFO (6): Ce message est logué dans tous les éléments du composite ZF.2009-03-10T18:38:52+01:00 Mar 10 18:38:52 TEST [info] Message loggué dans un fichier par pear. 2009-03-10T18:38:52+01:00 INFO (6): Message loggué dans un fichier par zf
Les 31 mars, 1 et 2 avril aura lieu le salon Solution Linux à Porte de Versailles.
Pour cette occasion, le groupe Alter Way que ma société (Anaska) a rejoint aura un grand stand sur lequel seront organisées une vingtaine d’ateliers autour de PHP (ZF, préparation à la certification, nouveautés de PHP 5.3), MySQL, BI, etc…
Je serais personnellement présent pendant ces trois jours sur le stand, n’hésitez pas à passer me faire un petit coucou.
Cette fonction vient du site php.net
elle est tirée d’une implémentation perl de http://www.w3.org/International/questions/qa-forms-utf-8.en.php si ça peut servire je la colle ici
[code lang="php"]
<?php
/**
* Returns true if $string is valid UTF-8 and false otherwise.
*
* @since 1.14
* @param [mixed] $string string to be tested
* @subpackage
*/
function is_utf8($string) {
// From http://w3.org/International/questions/qa-forms-utf-8.html
return preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs', $string);
}
?>
[/code]
Une petition de Google pour savoir qu’elle est le prochain runtime supporté par app engine.
http://i-want-php.appspot.com je croise les doigts :)
Zend_Config et Pear::config sont conçus pour simplifier l'accès et l'utilisation des données de configuration dans les applications. Ils fournissent une interface utilisateur basée sur des propriétés d'objets imbriquées. Les données de configuration peuvent venir de sources variées supportant une organisation hiérarchique des données.
Actuellement Zend_Config fournit des adaptateurs pour les données de configuration qui sont stockées dans des fichier textes avec Zend_Config_Ini et Zend_Config_Xml.
De son coté Pear::config propose Apache, GenericConf, IniCommented, IniFile, PHPArray, PHPConstants, XML.
Je ne suis pas encore à l'aise ni avec l'un, ni avec l'autre.
Ce qu'il me faut c'est
Un bug concernant l'apparition d'erreurs 404 sur les urls de type « spip.php » a poussé l'équipe de SPIP à sortir la version 2.0.6.
Attention : cette version provoque un changement dans la base de données.
N'oubliez pas une fois les fichiers téléchargés de vous rendre dans la partie privée de SPIP (votresite.com/ecrire) en tant qu'administrateur, afin de lancer la mise à jour de votre base.
Ne vous affolez pas, ce changement de base ne présente aucune modification fonctionnelle. Il s'agit juste d'une optimisation liée au plugin fulltext en cours de développement : http://trac.rezo.net/trac/spip/changeset/13833
Télécharger cette version
Article original publié sur Glagla Dot Org. Tous droits réservés.
Des URLs élégantes sont un des détails importants au niveau de la qualité d’une application Web.
On connaît tous rewrite d’apache pour gérer ses urls,
mais dans cet article je vous propose de voir une solution parmi d’autres pour gérer de belles urls via PHP.
Vous pouvez lire cet article intéressant du W3C écrit par Tim Berners-Lee W3C Cool URIs don’t change
Donc pour notre routeur, nous avons besoin d’un fichier de configuration,
celui-ci possède les règles nécessaires pour faire correspondre une url en particulier avec un controleur.
[*] url = "/hello.html"; script = HelloWorld type = static
Le code présenté sert d’illustration, et pourra bien entendu être amélioré.
il ne faut pas aussi oublier d’activer le mod rewrite d’Apache2 et faire passer toutes les urls reçues dans l’index.
RewriteEngine On RewriteRule ^.*$ /var/www/index.php [NC,L]
Le fichier prettyurls.conf est utilisé pour stocker nos urls, son format est assez simple
et pourra facilement être agrementé de nouvelles fonctionnalités.
[*] url = /; script = Home; type = static; [category] url = "/categories/.*-([0-9]+).html"; script = Category; type = regex; [404] url = "/.*"; script = NotFound; type = regex;
Dans un premier temps on enregistre dans la variable $request
l’url issue de la requête HTTP sans ses paramètres.
Ensuite on charge notre fichier de configuration prettyurls.conf via la fonction,
parse_ini_file (), les configurations sont retournées sous la forme d’un tableau associatif.
$request = preg_replace ('/^(.*)\?.*/', '$1', $_SERVER['REQUEST_URI']);
/** examples */
$request = '/categories/eh-coco-1.html';
$request = '/';
$request = '/categories/eh-coco-1.html';
$request = '/notfound/123456';
/** load prettyurls */
$pretty_urls = parse_ini_file ('prettyurl.conf', true);
Le tableau est parcouru via une boucle foreach,
� chaque itération on vérifie le type d’url recherché, en fonction de celui-ci on teste la validité du pattern associé.
$is_ok = false;
$matched = array ();
foreach ($pretty_urls as $bit)
{
switch (@$bit['type'])
{
case 'regex':
preg_match ('@'.$bit['url'].'@', $request, $matched);
if (!empty ($matched))
$is_ok = true;
break;
case 'static':
if (strcasecmp ($request, $bit['url']) === 0)
$is_ok = true;
break;
}
/** url has been matched */
if ($is_ok)
{
$controller = $bit['script'];
break;
}
}
//FrontController::load ($controller, $matched);
Voici quelques jours, avec l'arrivée du printemps... Le libre fête aussi son printemps...
Différents rendez-vous sont prévus un peu partout en France. April regroupe l'ensemble des villes qui participent (Pour connaître la liste... Cliquez ici)
De nombreux thèmes et sujets sont prévus : bureautique, graphique, internet (et peut etre PHP)... Cela dit, je serais présent sur les Villes Orsay et les Ulis se trouvant dans le 91 (Essonne)
Est ce que les problémes de performance ont bien été corrigé ? voila le sujet d'un commentaire de abhunguru sur un des billets consacrés au Planet eZ Publish.fr ; commentaire qui fait référence à deux billets de Pierre Jean Duvivier à propos de l'expérience eZ Publish chez Edipresse et du passage à Drupal pour résoudre plusieurs problèmes. Il y'a d'autres billets du même auteur sur le sujet dont un ou j'avais laissé un commentaire. Les questions de performances des applications web est un vaste sujet, je vais essayer de pas faire trop long.
Première chose, les informations fournies dans ces billets sont assez confuses voire inexactes (voir le paragraphe intitulé eZpublish ré-invente la compilation en PHP par exemple), je pense qu'il s'agit de la vision non technique de problèmes techniques, en fait ce qui ressort avant tout, c'est la frustration de l'auteur. Ensuite, la comparaison brute des chiffres Drupal / eZ Publish est complètement biaisée. Comparer des installations eZ Publish 3.8 utilisant PHP4 avec des installations de Drupal utilisant probablement PHP5, ce n'est pas très sérieux ! eZ Publish 4.0 (avec PHP5) est 2 fois plus rapide qu'eZ Publish 3.10, alors par rapport à eZ Publish 3.8... Je connais mal Drupal, donc je ne parlerai donc que d'eZ Publish.
Bref, en essayant de démêler tout ça, l'auteur dénonce finalement deux problèmes :
Avec une estimation à la louche, 500 000 pages vues par jour correspond à moins de 30 pages / secondes en pointe, un nombre certes respectable mais qui ne donne jamais que 8 pages / secondes sur chacun des 4 frontaux qui étaient d'après les articles des bi-Xeon quadcore ! Par expérience, la plupart du temps la cause de ce genre de problèmes est souvent une ou des énormités de configuration au niveau système ou au niveau applicatif. D'ailleurs dans ce cas, je me pose la question de la pertinence d'héberger plusieurs sites sur la même grosse plateforme plutôt que de séparer chaque site sur sa propre plateforme plus légère ?
Mais tout n'est pas 100% blanc ou 100% noir ; la version 3.8 d'eZ Publish était la première à implémenter le mode cluster tel qu'on le connait actuellement (tout ce qui est relatif aux contenus est dans une base de données) et il est clair que ce mode souffrait de défauts de jeunesse importants. Ce mode a été grandement amélioré au fil des versions, en version 3.10 et 4.0, il me semble que ça fonctionne bien et la version 4.1 apporte encore des améliorations importantes avec notamment le Stale cache, Charles-Christian Croix en parle également. Il y a aussi un excellent fil de discussion sur le mode cluster d'eZ Publish et comme suggéré par Bertrand dans ce fil, un article référence sur les architectures de ce type serait le bienvenu ! Donc pour revenir à la question initiale, au niveau des performances, il est clair que la version actuelle d'eZ Publish fonctionne mieux (le contraire serait malheureux).
Le second point soulevé par l'auteur est la difficulté de développement et de maintenance (et la maintenance je connais !). Là encore tout n'est pas blanc ou noir. eZ Publish est un outil assez complexe, c'est un fait mais ce n'est pas insurmontable ! Il semble qu'il y ait eu un mélange entre mauvaises pratiques et réels problèmes techniques. Exemple, le fait de mettre des identifiants dans les fichiers de configuration est une pratique à utiliser avec parcimonie. La sur-utilisation de ce genre de mécanisme est clairement une très mauvaise pratique et souvent révélatrice d'une mauvaise conception des contenus. En revanche, le problème de mise à jour d'une classe avec beaucoup d'instances est clairement un vrai problème, ce point a été amélioré mais il existe encore mais il est néanmoins contournable. Et puis les problèmes de performances exposés juste au dessus ne sont probablement pas étranger à d'autres mauvaises pratiques ou d'autres manques dans le développement ou la conception.
Et pour finir quand je lis que d'excellents développeurs PHP ont du mal à utiliser le langage de template d'eZ Publish, on frise le ridicule.
Il y a probablement une partie de réels problèmes dans les points remontés dans les articles de Pierre Jean Duvivier (eZ Publish n'est pas parfait) mais il est toujours plus facile de démonter une solution dans son ensemble que de se remettre en cause... Le fait est qu'eZ Publish est utilisé sur une large palette de sites à plus ou moins fort trafic et les chiffres indiqués ne sont pas non plus exceptionnels !
Et pour revenir au commentaire initial, oui les problèmes imputables à eZ Publish sont réglés petit à petit mais il ne faut pas oublier que la qualité de la mise en oeuvre de l'outil est largement aussi importante que l'outil lui-même !
I have add a new filter in ootemplate for create an elegants permalinks.
For example, you have an array with all posts of your blog, a post is composed by an ID, title, body and date,
you want print all posts and create a pretty urls for them.
{% for post in allposts %}{% endfor %}{{ post.title }}
{{ post.body | wrap: '30' '...' }} {{ post.date | date: "%d.%m.%y" }}
this example print
My First post is Hello World !
this post explain blabla bla bla... 17.11.2008Second post, superstar
this post explain blabla bla bla... 20.11.2008
Dans cet article j’essaie de voir comment améliorer l’implémentation mysqli de PHP.
Pour ceux qui ne la connaissent pas, la classe mysqli est le client PHP5 orienté objet du serveur MySQL.
Donc on va voir comment mettre en place deux ou trois méthodes afin d’obtenir un meilleur debug sur les requêtes passées au serveur, gérer les erreurs via des exceptions et pour finir trouver une solution pour gérer les Transactions.
Pour le moment on va simplement étendre mysqli afin de pouvoir changer son comportement.
class MySQLException extends Exception {}
class MySQL extends mysqli {}
Maintenant voyons comment avoir un meilleur suivi des requêtes envoyées � notre serveur MySQL.
Pour ça, on va lui ajouter deux méthodes, une pour ajouter un message debug et l’autre pour les récupérer.
class MySQL extends mysqli {
protected $_debug = "";
public function setDebug ($string) { $this->_debug .= strftime ("%D %r").$string."\n"; }
public function getDebug () { return $this->_debug; }
}
on redéfinit la méthode query afin d’avoir quelques informations sur les requêtes passées et déclencher une exception en cas d’échec.
class MySQL extends mysqli {
protected $_debug = "";
public function setDebug ($string) { $this->_debug .= strftime ("%D %r").$string."\n"; }
public function getDebug () { return $this->_debug; }
public function query ($sql)
{
$this->setDebug ($sql);
if (parent::query ($sql) === false)
throw new MySQLException ("Invalid Query : {$sql}\n");
}
}
Pour finir voici une implémentation permettant de gérer les transactions avec mysqli.
on va tout d’abord ajouter une nouvelle méthode � notre classe MySQL begin celle-ci va envoyer l’ordre START TRANSACTION qui avertit le serveur mysql que les requêtes suivantes doivent être considérées comme des transactions et attendre les évènements COMMIT ou ROLLBACK pour la terminer.
public function begin ()
{
$this->query ("START TRANSACTION");
}
[/code]
[code lang="php"]
$dbh = new MySQL ();
try {
$dbh->begin ();
$dbh->query ("INSERT INTO table1 VALUES (1, 2, 3, 4"));
$dbh->query ("INSERT INTO table2 VALUES (5, 6, 7, 8"));
$dbh->commit ();
}
catch (MySQLException $e) {
$dbh->rollback ();
}
echo $dbh->getDebug ();
Chaque requête va être executée dans un block try catch, si une exception est lancée via la méthode query
alors on met fin � la transaction en exécutant le rollback, sinon on envoit le commit.
Pendant le salon "solution Linux" qui va se dérouler le 31 mars - 1er et 2 avril 2009 à porte de Versailles.
Une séance de dédicace est prévue le mardi 31 mars à partir de 16h00 sur le stand ENI pour mon livre "PHP & MySQL - MySQLi - PDO, construisez votre application".
Bien sur, les autres jours, vous pouvez me recontrer pendant tout le salon sur le stand de AFUP
Alors n'hésitez pas à venir me rencontrer et surtout demandez un badge visiteur au salon en cliquant ici
Steema Software has released a new product, a native native TeeChart for PHP v1.
The Charting Library is available with the option of 100% PHP sourcecode, supports PHP5 and above and may be used in most PHP IDEs with specific optmisation for use as a palette component in the Delphi for PHP programming environment.
For product review, please see: http://www.steema.com/products/teechart/php/overview.html
Proposé par Steema Software
eZ Systems organise le 9 avril à partir de 15h une rencontre communautaire à Paris autour de son CMS eZ Publish. Il ne s'agit pas d'un nouveau developper day mais bien d'un évènement qui se veut plus communautaire et 100% francophone !
Avis aux développeurs débutants ou expérimentés, intéressés par le CMS eZ Publish (qui je le rappelle est écrit en PHP, est libre et est publié sous licence GPL), voila une excellente occasion de se rencontrer et d'échanger sur divers sujets :-) Toutes les informations pratiques sont dans la news sur ez.no. On se voit le 9 avril ? :-)
var_dump (strlen ("é") == 2) // bool(true)
var_dump (mb_strlen ("é", 'utf-8') == 1) // bool(true)
On parle souvent des éléphants du PS mais rarement des éléphpants qui y sont tout aussi présents :
La photo pourrait également figurer sur le site http://elephpantgettingsome.wordpress.com/
Merci à mon collègue Vincent Vignolle (Solinux) pour cette photo.
Jeudi 2 Avril , une journée spéciale PHP est prévue pendant le salon "Solution Linux"
et pour fêter cette journée, une nouvelle séance de dédicace a été décidée par les Editions ENI pour le livre "PHP & MySQL - MySQLi - PDO, construisez votre application" avec la présence de son auteur christophe Villeneuve.
Alors apporter votre exemplaire pour obtenir une dédicace où sinon il y aura des ouvrages de disponibles à acquérir.