Si vous obtenez une erreur __PHP_Incomplete_Class lorsque vous utilisez des objets en session, c’est probablement parce que vous avez utilisé session_start() avant la déclaration de vos classes.
Par conséquent, attention à ce que la directive session.auto_start ne soient pas activée.
Archive pour le ‘Developpement’ catégorie
Eviter l’erreur : « __PHP_Incomplete_Class »
6 avril 2010Savez-vous planter IE6 à la mode jQuery ?
1 avril 2010Un plugin jQuery pour planter IE6, marrant non ?
[cc lang=’js’ width=’100%’]
/**
* jQuery Crash (http://mktgdept.com/jquery-crash)
* A jQuery plugin to crash IE6.
*
* v0.0.2 – 5 March 2010
*
* Copyright (c) 2009 Chad Smith (http://twitter.com/chadsmith)
* Dual licensed under the MIT and GPL licenses.
* http://www.opensource.org/licenses/mit-license.php
* http://www.opensource.org/licenses/gpl-license.php
*
* Use $.crash();
*
**/
;jQuery.crash=function(x){for(x in document.open);};
[/cc]
Les évènements Google Agenda dictés par votre Nabaztag (anniversaires, rdv etc…)
26 mars 2010Si vous avez un compte Google Agenda et que vous souhaitez, que votre lapin vous rappelle les évènements du jour, voici un petit script pour vous.
A noter, que ce script sera bientôt disponible sur le site de zcripts.com pour que vous puissiez l’utiliser sans rien programmer, ni rien héberger 😉
Pour trouver l’adresse de votre fichier ical Google Calendar allez dans paramètres (en haut à droite) -> onglet Agendas -> cliquez sur le nom de l’agenda et descendez jusqu’à Adresse URL privée et cliquez enfin sur le bouton ical (vert)
[cc lang=’php’ width=’100%’ lines=’40’]
$serial = « ********* »; // serial de votre lapin
$token = « ********* »; // token de votre lapin
// chemin privé de votre fichier ical privé de Google Agenda
$path = « *********** »;
// une partie de l’adresse est en dur pour éviter l’exécution d’un
// script distant
$fichier = « http://www.google.com/calendar/ical ». $path . »basic.ics »;
$source = file_get_contents($fichier); // on ouvre le fichier
$source = preg_split(‘#\n(?!s)#’, $source);
$source = array_map(‘trim’, $source);
$tabEve = array(); // tableau des évenements
$cles = array(); // tableau des clés des évenements
$i = 0;
// Boucle qui parcours le fichier à la recherche des événements
// le but est de dire que de l’index début à l’index fin on a un événement
foreach($source as $k=>$eve){
// on récupère la zone pour gérer le décalage horaire
if (eregi(‘X-WR-TIMEZONE’,$eve)) {
$ex = explode(« : »,$eve);
$zone = $ex[1];
}
if ($eve == ‘BEGIN:VEVENT’) {
$cles[$i][‘debut’] = $k;
}
if ($eve == ‘END:VEVENT’) {
$cles[$i][‘fin’] = $k;
$i++;
}
}
$e = 0;
// boucle qui va rechercher les évènements que l’on a délimité plus haut, et enfin on garde seulement les
// éléments nécessaires pour le lapin
foreach($cles as $c){
for($eve=$c[‘debut’]; $eve< =$c['fin'];$eve++){
$ex = explode(":",$source[$eve]);
if(!isset($eves[$e][$ex[0]])){
if(eregi("SUMMARY",$ex[0]) || eregi("RRULE",$ex[0])){
$eves[$e][$ex[0]] = utf8_decode($ex[1]); // repetitions
}
if(eregi("DTSTART",$ex[0])){
$eves[$e]['SMOIS'] = substr($ex[1],4,2);
$eves[$e]['SJOUR'] = substr($ex[1],6,2);
$eves[$e]['SANNEE'] = substr($ex[1],0,4);
$eves[$e]['DTSTART'] = substr($ex[1],0,4).substr($ex[1],4,2).substr($ex[1],6,2); // jour début
if(strlen($ex[1])>8){
$d = date(‘Y-m-d H:i’,mktime(substr($ex[1],9,2), substr($ex[1],11,2),0, substr($ex[1],4,2), substr($ex[1],6,2), substr($ex[1],0,4)));
$date = new DateTime($d,new DateTimeZone($zone));
$new_date = strtotime($d)+$date->getOffset(); // calcul décalage horaire
$eves[$e][‘HEURE’] = date(‘H:i’,$new_date);
}else{
$eves[$e][‘HEURE’] = « »;
}
}
if(eregi(« DTEND »,$ex[0])){
$eves[$e][‘EMOIS’] = substr($ex[1],4,2);
$eves[$e][‘EJOUR’] = substr($ex[1],6,2);
$eves[$e][‘EANNEE’] = substr($ex[1],0,4);
$eves[$e][‘DTEND’] = substr($ex[1],0,4).substr($ex[1],4,2).substr($ex[1],6,2); // jour fin
}
}
}
$e++;
}
// Aujourd’hui
$jour = date(« d »); // jour
$mois = date(« m »); // mois
$annee = date(« Y »); // annee
$aujourdhui = date(« Ymd »); // date du jour
// création du tableau final qui récupère les évènements du jour (aussi ceux qui in une fréquence annuelle pour les anniversaires par exemple)
if(count($eves)>0){
foreach($eves as $eve){
if(empty($eve[‘HEURE’])){$eve[‘HEURE’] = » « ;}else{$eve[‘HEURE’] = » à » . $eve[‘HEURE’];}
if($aujourdhui>=$eve[‘DTSTART’] && $aujourdhui< =$eve['DTEND']){ $tabEve[] = $eve['SUMMARY']. $eve['HEURE']; }else{ if(eregi("FREQ=YEARLY",$eve['RRULE'])){ $d = $annee.substr($eve['DTSTART'],4,4); if($aujourdhui>=$d && $aujourdhui<=$d){ $tabEve[] = $eve['SUMMARY']. $eve['HEURE']; } } } } } // Maintenant que nous avons le tableau tabEve des évènements du jour, on peut créer le texte du lapin $phrase = "évènements du jour : "; foreach($tabEve as $evefin){ $phrase .= $evefin. " . "; } if(empty($phrase)){ $phrase = "Rien aujourd'hui"; } // envoi au lapin ! $curl = curl_init(); $api_url = "http://api.nabaztag.com/vl/FR/api.jsp?&sn=$serial&token=$token&voice=$voice&tts=".urlencode(utf8_encode($phrase)); curl_setopt($curl,CURLOPT_HEADER,$api_url); curl_exec($curl); curl_close($curl); } [/cc] Voilà. Ce script pourrait être amélioré, avec la gestion des autres répétitions, MONTHLY etc...
Créez votre module personnalisé d’expédition Joomla Virtuemart
20 mars 2010Si vous avez besoin de créer un module d’expédition personnalisé pour Joomla Virtuemart, voici quelques informations pour vous aider.
(Pour info, pour installer VirtueMart sur Joomla, il suffit de télécharger Virtuemart, vous dezippez l’archive, puis vous vous connectez en administrateur sur joomla, vous allez dans le menu extensions puis installer/desinstaller
et vous uploadez/installez le fichier virtuemart.zip)
Fichiers de base
Il y a 3 fichiers de bases pour créer un module d’expédition, que vous devrez placer dans :
/administrator/components/com_virtuemart/classes/shipping/
Une classe, un fichier d’information et un fichier de configuration.
Si vous voulez créer un module s’appelant expPerso nommez les fichiers ainsi :
- expPerso.php (la classe expPerso)
- expPerso.ini (versionning du module, créateur etc…)
- expPerso.cfg.php (constantes de configuration du module)
Récupérez les 3 fichiers du module de base, renommez les et adaptez les… 😉
Une fois ces 3 fichiers placés, vous pourrez activer votre module dans composant -> VirtueMart -> configuration -> onglet shipping
Gérer les traductions
La page qui gère les traductions de l’interface d’ajout des taux d’expédition est :
/www/administrator/components/com_virtuemart/languages/shipping/french.php
Pour les erreurs, par exemple si un champs n’a pas été rempli, regardez le fichier
/www/administrator/components/com_virtuemart/languages/common/french.php
Créer de nouveaux taux
Le formulaire qui gère la création de nouveaux taux est :
/www/administrator/components/com_virtuemart/html/shipping.rate_form.php
Fichiers d’ajouts de taux
Les classes de fonctionnement sont :
/www/administrator/components/com_virtuemart/classes/ps_shipping.php qui contient les fonctions qui gèrent l’ajout/modification/suppression des taux
/www/administrator/components/com_virtuemart/html/shipping.rate_form.php qui est le formulaire html d’ajout (interaction avec ps_shipping.php)
/www/administrator/components/com_virtuemart/html/shipping.rate_list gère l’affichage des taux ajoutés.
Dans ce fichier, les entêtes sont gérés par le tableau $columns
[cc lang=’php’ width=’100%’]
$columns = Array( « # » => « width=\ »20\ » »,
« » => « width=\ »20\ » »,
$VM_LANG->_(‘PHPSHOP_SHIPPING_RATE_LIST_CARRIER_LBL’) => »,
$VM_LANG->_(‘PHPSHOP_SHIPPING_RATE_LIST_RATE_NAME’) => »,
$VM_LANG->_(‘E_REMOVE’) => « width=\ »5%\ » »
);
[/cc]
Et les cellules par l’objet $listObj
[cc lang=’php’ width=’100%’]
$listObj->addCell( $db->f(« shipping_rate_value »));
[/cc]
Notez que les constantes, qui sont donc par convention en majuscules comme PHPSHOP_SHIPPING_RATE_LIST_CARRIER_LBL sont traduites grâce aux fichiers de traduction que j’ai présenté plus haut, alors que $db->f(« shipping_rate_value ») correspond à un champ en base de données
La classe expPerso
Au début je vous ai parlé de expPerso.php qui contient la classe expPerso. Ce fichier contient la requête qui après validation de la commande affiche les possibilités d’expéditions.
exemple un morceau de la requête qui affiche un les frais d’expédition en fonction du poids de la commande
[cc lang=’php’ width=’100%’]
$q .= « shipping_rate_weight_start < = '" . $d["weight"] . "'AND " ;
$q .= "shipping_rate_weight_end >= ‘ » . $d[« weight »] . « ‘ » ;
[/cc]
Pour utiliser le montant de la commande appelez tout simplement la variable globale $total
[cc lang=’php’ width=’100%’]
function list_rates( &$d ) {
global $total;
[…]
[/cc]
Le code postal, lui par exemple est déjà récupéré par la requête
[cc lang=’php’ width=’100%’]
$zip = $dbc->f( « zip » ) ;
[/cc]
Bon, voilà de quoi vous éclairer un peu, maintenant à vos claviers pour faire vos modifications…
Défoulez vous sur une poupée vaudou Internet Explorer
18 mars 2010Pour faire suite au post précédent : http://blog.yann.info/2010/03/18/il-ne-faut-plus-utiliser-internet-explorer-6/
Développeurs, plutôt que de bricoler des hacks IE, passez vos nerfs sur la poupée vaudou IE que vous pouvez fabriquer vous-même : tutorial-making-the-ie-voodoo-doll/
Il ne faut plus utiliser internet explorer 6
18 mars 2010Pourquoi ? tout simplement parce que ce navigateur ne respecte pas les standards de développement du W3C, sans parler des failles de sécurité ! Nous les développeurs en avons marre d’utiliser des hacks pour avoir un affichage identique dans chaque navigateur. Déjà IE toutes versions confondues (jusque là) est encore assez loin des recommandations, mais IE6, c’est pire que tout. Pour rappel IE a été ‘imposé‘ (pré-installé sur chaque PC) par Microsoft pour évincer Netscape, A l’époque il n’y avait pas vraiment de standards donc IE à eu son heure de gloire et on développais pour ainsi dire, que pour IE.
Maintenant il y a des standards et des bons navigateurs comme Firefox, Opéra, Chrome… alors il n’y a pas de raisons que le code fonctionne sur un navigateur et pas l’autre, ça pénalise forcément l’utilisateur ou le développeur, l’un ne pouvant pas utiliser le browser qu’il veut car certains sites ne fonctionnent pas et l’autre devant sans cesse adapter le code pour chacun.
Au pire mettez à jour Internet Explorer !
De toute façon, peu à peu le support d’IE6 va s’arrêter comme annoncé par: Youtube, google etc…
Alors gagnons/gagnez du temps et virer moi Internet Explorer 6 ! Merci 😉
Installer Firefox : http://www.mozilla-europe.org/fr/firefox/
Installer Chrome : http://www.google.fr/chrome
Installer Opera : http://www.opera.com/
Installer Safari : http://www.apple.com/fr/safari/
Installer IE
Pour wordpress il existe une extension d’avertissement pour les utilisateurs d’IE6
Shockingly Big IE6 Warning
jQuery : cocher tout / tout décocher (checkbox)
16 mars 2010Si vous avez plusieurs cases à cocher à la suite, il peut être intéressant de proposer au visiteur de les cocher toutes en un clic et de les décocher de la même façon.
Démo ici
voici donc quelques checkbox, et au dessus une case cocher tout dont le texte est entouré d’un span que l’on mettra à jour cocher/décocher
[cc width=’100%’ lang=’html’]
Cocher tout
- Case 1
- Case 2
- Case 3
[/cc]
N’oubliez pas d’inclure le fichier jQuery
[cc width=’100%’ lang=’js’]
[/cc]
Et maintenant le code jQuery.
[cc width=’100%’ lang=’js’]
$(document).ready(function() {
$(‘#cocheTout’).click(function() { // clic sur la case cocher/decocher
var cases = $(« #cases »).find(‘:checkbox’); // on cherche les checkbox qui dépendent de la liste ‘cases’
if(this.checked){ // si ‘cocheTout’ est coché
cases.attr(‘checked’, true); // on coche les cases
$(‘#cocheText’).html(‘Tout decocher’); // mise à jour du texte de cocheText
}else{ // si on décoche ‘cocheTout’
cases.attr(‘checked’, false);// on coche les cases
$(‘#cocheText’).html(‘Cocher tout’);// mise à jour du texte de cocheText
}
});
});
[/cc]
Installer PHP sous Ubuntu, soit LAMP (Linux Apache MySQL PHP)
12 mars 2010Installation de l’environnement
Pour développer en local du PHP, vous aurez besoin d’installer Apache, MySQL et PHP.
Tapez dans un terminal :
[cc lang=’bash’ width=’100%’]
sudo tasksel install lamp-server
[/cc]
Il est conseillé de mettre un mot de passe pour MySQL
Une fois que c’est fait, vous pouvez tester le serveur en entrant l’adresse suivante dans votre navigateur préféré : http://127.0.0.1 ou http://localhost/
Si vous voyez ce message :
[cc width=’100%’]
It works!
This is the default web page for this server.
The web server software is running but no content has been added, yet.
[/cc]
c’est que tout s’est bien passé.
Changer de répertoire de travail
Par défaut, la page web que vous voyez se trouve dans
[cc lang=’bash’ width=’100%’]
/var/www
[/cc]
Ce qui n’est pas très pratique, car par défaut vous n’avez pas les droits en écriture sur ce dossier qui appartient à ROOT.
Puisqu’on ne va pas l’utiliser rendons ce dossier inaccessible de l’extérieur.
[cc lang=’bash’ width=’100%’]
sudo gedit /etc/apache2/sites-available/default
[/cc]
Recherchez le bloc délimité par <Directory /var/www/> et </Directory/>et remplacez-le contenu par :
[cc lang=’bash’ width=’100%’]
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
[/cc]
Ajoutez également Allow from 192.168.0.0/24 si vous voulez y accéder de votre réseau local, si vos adresses IP local sont en 192.168.1.0, adaptez évidemment.
Ouvrez ensuite le fichier httpd.conf
[cc lang=’bash’ width=’100%’]
sudo gedit /etc/apache2/httpd.conf
[/cc]
Et ajoutez cette ligne
[cc lang=’bash’ width=’100%’]
ServerName localhost
[/cc]
On va maintenant activer l’option userdir, qui va permettre d’activer un dossier de développement pour chaque utilisateur.
[cc lang=’bash’ width=’100%’]
mkdir /home/$USER/public_html
sudo a2enmod userdir
[/cc]
On redémarre Apache, pour que les modifications soient prises en compte.
[cc lang=’bash’ width=’100%’]
sudo /etc/init.d/apache2 force-reload
[/cc]
Voilà, maintenant le dossier public_html qui se trouve dans votre espace de travail est accessible via http://127.0.0.1/~yann
Remplacez évidemment yann par votre nom d’utilisateur
pour tester, créez un nouveau fichier test.php dans le dossier public_html et copiez-y ce code
[cc lang=’php’ width=’100%’]
< ?php
echo phpinfo();
?>
[/cc]
Ouvrez l’URL http://127.0.0.1/~yann/test.php, vous devriez voir la configuration PHP s’afficher. Si votre navigateur télécharge les fichiers au lieu de les interpréter, regardez la fin de cet article…
Installer phpMyAdmin
Téléchargez l’archive de phpMyAdmin et décompressez là. Renommez ensuite le dossier en phpMyAdmin puis déplacez le dans /var/www
[cc lang=’bash’ width=’100%’]
sudo mv phpMyAdmin/ /var/www/phpMyAdmin
[/cc]
phpMyAdmin utilise le module mcrypt, alors installons-le
[cc lang=’bash’ width=’100%’]
sudo apt-get install php5-mcrypt
[/cc]
On redémarre Apache
[cc lang=’bash’ width=’100%’]
sudo /etc/init.d/apache2 force-reload
[/cc]
Et voilà phpMyAdmin est accessible à l’adresse http://127.0.0.1/phpMyAdmin
Connectez vous avec root : mot_de_passe_que vous avez_choisi
Où est mon php.ini ?
Le fichier de configuration de PHP se trouve dans /etc/php5/apache2/php.ini pour désactiver short_open_tag et magic_quotes_gpc par exemple, ce qui serait une très bonne idée 😉
N’oubliez pas de relancer Apache
[cc lang=’bash’ width=’100%’]
sudo /etc/init.d/apache2 force-reload
[/cc]
Mon navigateur télécharge les fichiers PHP au lieu de les interpréter 🙁
Sous Ubuntu 10.04, php est désactivé quand vous utilisez le module a2enmod. Pour éviter que le navigateur télécharge les fichiers php, éditez le fichier
[cc lang=’bash’ width=’100%’]
sudo gedit /etc/apache2/mods-enabled/php5.conf
[/cc]
Et commentez les lignes ci dessous :
[cc lang=’bash’ width=’100%’]
#
#
# php_admin_value engine Off
#
#
[/cc]
Et on relance apache…
[cc lang=’bash’ width=’100%’]
sudo /etc/init.d/apache2 force-reload
[/cc]
Si vous recherchez des conseils pour la certification PHP 5
Accès à l’élément sélectionné d’un select en jQuery
10 mars 2010Pour accéder facilement à la sélection d’un select vous pouvez utiliser jQuery
démo ici
[cc lang=’html’ width=’100%’]
[/cc]
on récupére la valeur à chaque changement de sélection avec la méthode .change()
[cc lang=’js’ width=’100%’]
$(document).ready(function(){
$(‘#monselect’).change(function () {
v = $(« #monselect option:selected »).val();
t = $(« #monselect option:selected »).text();
$(‘#retour’).html(v+ » « +t);
})
.trigger(‘change’);
})
[/cc]
.val() récupère le value de l’élement sélectionné, alors que .text() renvoie le texte affiché dans le select.
Sans jQuery on pourrait utiliser une fonction appelée sur l’évènement onchange du select.
[cc lang=’js’ width=’100%’]
function recup(){
document.getElementById(‘monselect’).options[document.getElementById(‘monselect’).selectedIndex].value;
}
[/cc]