Merci, je vais intégrer tout ça dès que possible !
Vous avez le droit de me relancer de temps en temps par MP si ça traîne
Merci, je vais intégrer tout ça dès que possible !
Vous avez le droit de me relancer de temps en temps par MP si ça traîne
Intercepter les erreurs jettées par un objet de class PEAR (renvoie d'objet PEAR_Error).
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 /** * Ce fichier contient seulement le décorateur de classe PEAR. * * Crédits * <ul> * <li>Shrike@irc.freenode.net:##php (decorator pattern demonstration)</li> * </ul> */ /** * <p>C'est une classe de type décorateur pour utiliser un objet PEAR.</p> * <p>Example :</p> * <code> * $mail_object = new PEAR_Decorator( Mail::factory('mail') ); * $cool_object = new PEAR_Decorator( new Cool() ); * // Les objets doivent ensuite être utilisés normalement * </code> */ class PEAR_Decorator { /** * L'objet a décorer * @access private * @var object */ private $o_decorated; public function __construct($o_decorated) { $this->o_decorated = $o_decorated; } public function __call($s_method, $a_arguments) { $ret = call_user_func_array(array($this->o_decorated, $s_method), $a_arguments); if($ret instanceof PEAR_Error) { // Ici vous pouvez traiter l'erreur PEAR // print_r($ret); } return $ret; } }
A utiliser si vous voulez utiliser PEAR avec votre propre gestionnaire d'erreurs.
Auteur : is_null
Bonjour,
Créez et modifiez des tables HTML dynamiquement (v1.51 du 10/03/2010)
Class_table_html.zip
Visionner la doc dans l'archive.
chargement automatique des classes :
(marche avec le ZF (et pear, si je ne me trompe pas...?))
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 function __autoload($class_name) { $path = str_replace('_', '/', $class_name); require_once $path . '.php'; }
rediriger les erreurs PHP en levée d'exeption :
c'est du brut de brut, mais, on peut facilement le rendre tres utile (bon, ok c'est pas les codes les plus nouveaux du monde...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 function errorHandler($errno, $errstr, $errfile, $errline) { $error = "Erreur : $errno cause :$errstr, à la ligne $errline, dans le fichier $errfile"; switch ($errno) { case E_ERROR: throw new Exception_PHP ("erreur".$error); break; case E_WARNING: throw new Exception_PHP ("warning".$error); break; case E_NOTICE: throw new Exception_PHP("notice".$error); break; default: throw new Exception_PHP("default".$error); break; } } set_error_handler("errorHandler");
Je confirme que la fonction __autoload() présentée fonctionne parfaitement avec PEAR.
D'ailleurs, je propose de créer une section OOP5, pour y ranger __autoload() ainsi que les contribuations du genre concept/design pattern si elles en valent la peine, c'est vrai qu'on s'amuse bien depuis qu'on n'a plus à se soucier du passage par référence ... Toutefois, merci de ne pas ajouter la suivante tant que je n'y ai pas ajouté la doc.
Registre avec initialisation paresseuse
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 class basicRegistry { private static $instance = null; protected $registry = array(); public static function instance() { if ( ! self::$instance ) { self::$instance = new ezCmsRegistry(); } return self::$instance; } public function __get( $key ) { if ( !isset( $this->registry[$key] ) ) { $method = 'get'.ucfirst($key); $this->registry[$key] = $this->$method(); } return $this->registry[$key]; } public function __set( $key, $value ) { return $this->registry[$key] = $value; } // vos functions }
Example concret, utilisé dans le cas d'un systême MVC avec action, et eZ components :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115 class ezcShopRegistry { private static $instance = null; protected $registry = array(); public static function instance() { if ( ! self::$instance ) { self::$instance = new ezCmsRegistry(); } return self::$instance; } public function __get( $key ) { if ( !isset( $this->registry[$key] ) ) { $method = 'get'.ucfirst($key); $this->registry[$key] = $this->$method(); } return $this->registry[$key]; } public function __set( $key, $value ) { return $this->registry[$key] = $value; } private function getLog() { $log = ezcLog::getInstance(); $writer = new ezcLogDatabaseWriter( $db, "log" ); $log->getMapper()->appendRule( new ezcLogFilterRule( new ezcLogFilter, $writer, true ) ); return $log; } public function getAction() { $action = (string)$this->query['action']['name']; return new $action( $this->query['action'] ); } private function getQuery() { $url = new ezcUrl( $_SERVER['REQUEST_URI'] ); $query = $url->getQuery(); if ( !isset( $query['action']['name'] ) ) { $query['action'] = array( 'name' => 'ezCmsObjectLister', 'model' => 'ezcShopCategory', 'orderWay' => 'ASC', 'orderField' => 'id', 'page' => 1, 'displayPerPage' => 12, ); } return $query; } private function getRoot() { return $this->config->getSetting( 'config', 'php', 'root' ); } private function getTranslator() { $cacheObj = new ezcCacheStorageFileArray( $this->root . $this->config->getSetting( 'config', 'translation', 'cache_path' ) ); $backend = new ezcTranslationCacheBackend( $cacheObj ); return new ezcTranslationManager( $backend ); } private function getConfig() { $config = ezcConfigurationManager::getInstance(); $config->init( 'ezcConfigurationIniReader', ROOT.'/config' ); return $config; } private function getSession() { $persistentSession = new ezcOverloadedPersistentSession( ezcDbInstance::get(), $this->persistentcodemanager ); ezcPersistentSessionInstance::set( $persistentSession ); // set default session return $persistentSession; } private function getPersistentcodemanager() { return new ezcOverloadedPersistentCodeManager( $this->root . $this->config->getSetting( 'config', 'pos', 'base' ) ); } private function getSignals() { return new ezcSignalCollection(); } private function getConverter() { } private function getLocale() { return 'en_US'; if ( isset( $_GET['locale'] ) ) { return $_GET['locale']; } return $this->config->getSetting( 'config', 'general', 'default_locale' ); } public function setUpDbHandler() { } public function getDb() { $db = ezcDbFactory::create ( $this->config->getSetting( 'config', 'db', 'dsn' ) ); ezcDbInstance::set( $db ); return $db; } }
Usage :
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $registre = ezcShopRegistry::instance(); $db = $registre->db; // instancie db automatiquement de manière parresseuse si nécéssaire
Explications :
C'est d'abord un registre classique, avec une variable tableau pour y stocker ses variables ou objets.
J'ai choisis l'instance parce qu'ainsi, __get() permet une initialisation paresseuse.
C'est-à-dire que je peux librement acceder à $registre->db, et si $registre->registry[db] n'existe pas, la valeur de $registry->getDb() est automatiquement assignée.
Ainsi, les objets sont initialisés just-in-time (juste-à-temps), et ceux qui n'auront pas été utilisés dans le script n'auront pas été instanciés.
Le second avantage est la paresse : les objets et variables sont automatiquements instanciés avec leurs configurations respective sans avoir à appeler __set(), dans laquelle on pourrait simplement jeter une erreur.
De toutes façons, j'évite les classes statiques autant que je peux.
Voilà une fonction que j'ai faite pour me simplifier l'envoi de mail.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 function smail($to, $sujet, $msg, $from, $pattern = false) { $fmail = dirname(__FILE__).'/mail/' . $msg; if (is_file($fmail) && is_array($pattern)) { foreach ($pattern as $key => $output) { $base[] = $key; $bnew[] = $output; } $fd = @fopen($fmail, "r"); while (!feof($fd)) { $line = fgets($fd, 2048); $content .= str_replace($base, $bnew, $line); } fclose($fd); } else { $content = $msg; } mail($to, $sujet, $content, "From: $from\r\n" ."Reply-To: $from\r\n" ."X-Mailer: PHP/" . phpversion()); }
Il vous suffit de créer un dossier "mail" contenant des fichiers types, par exemple join.mel contenant votre message et de mettre dedans des mot clef qui seront remplacés par $pattern.
Exemple :
Votre fichier hello.mel :
Votre code source :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Hello PSEUDO
Dans le cas ou le fichier n'est pas trouvé, le mail sera envoyé contenant le message $msg.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 $pattern['PSEUDO'] = '|PaRa-BoL'; smail($email, 'Bonjour', 'hello.mel', 'hello@monsite.com', $pattern);
Je propose une simplification du code.
Notez qu'il est inutile de saisir un Reply-To égal au From.
Néanmoins, je ne peux que recommander aux programmeurs d'utiliser une classe de génération de mails plus complête comple PEAR::Mail_Mime, qui permet de créer un mail plus facilement tout en offrant de nombreuses fonctionnalités additionnelles.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 function smail($to, $sujet, $msg, $from, array $pattern = array()) { $fmail = dirname(__FILE__).'/mail/' . $msg; if (is_file($fmail) && $pattern ) { $fd = @fopen($fmail, "r"); while (!feof($fd)) { $line = fgets($fd, 2048); $content .= str_replace( array_keys( $pattern ), array_values( $pattern ), $line); } fclose($fd); } else { $content = $msg; } mail($to, $sujet, $content, "From: $from\r\n" ."X-Mailer: PHP/" . phpversion()); }
Il est déjà poli de fournir une version texte du message en plus d'une version HTML, aussi est-il relativement complexe de gérer des attachement sans classe du genre de PEAR::Mail_Mime.
Aussi, attention au null byte avec cette fonction, elle est exploitable si $msg provient d'input.
Merci d'avoir simplifier la function
Evidement $msg ne devrais jamais provenir de données extérieurs
(Tu as mi un str_replace en trop)
Créer un mot de passe
Bonjour à tous,
Voici une fonction que j'utilise pour créer un mot de passe :
La fonction est appelée comme ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 // Créer un mot de passe ============================= function Make_Pass($n){ $Lettre1 = "AaBbCcDdEeFfGgHhIiJjKkLMmNnPpQqRrSsTtUuVvWwXxYyZz"; $Lettre2 = "AaBbC_cDdEeFfGgHhIiJ?jKkLMmN!nPpQqRrS+sTtUuVv-WwXxYyZz"; // il n'y a volontairement pas les caractères o ou O , et l (L minuscule) //pour qu'il n'y ait pas de confusion avec le 0 (zéro) et le o ou O // et l (L minuscule) et le 1 $i = 0; $a = rand(0,strlen($Lettre1)); $ThePass = substr($Lettre1, $a, 1); // le premier caractère sera une lettre // les n autres caractères - 1 (le premier) while($i < ($n-1)){ $X = rand(0,strlen($Lettre2)); // tableau pour les chiffres //mettez autant d'éléments dans le tableau que vous voulez. //un élément ne peut pas être supérieur à strlen($Lettre2) $Xarray = array(2,17,21,38,45,50); // si $X n'est pas dans le tableau : ce sera une lettre if(!in_array($X, $Xarray)){ $ThePass.= substr($Lettre2, $X, 1);} else{ // sinon ce sera un chiffre $Y = rand(0,9); $ThePass.= $Y;} $i++; } return $ThePass; } //-------------------------------------------------------
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $password = Make_Pass(10); // pour 10 caractères
Générer un mot de passe (bis)
Je ne comprends pas trop ta méthode, N1Bus... Pour ma part, je me contente de ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 function passGenerator($nbCarMax){ //Caractères autorisés //On retire 0, O, I, 1 et l pour éviter les confusions $chaine = "abcdefghjkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789-_."; $pass = ""; $maxChars = strlen($chaine); for($i =0; $i < $nbCarMax; $i++) { //on compte le nombre de caractères présents dans notre chaine // on choisie un nombre au hasard entre 0 et le nombre de caractères de la chaine $nb = mt_rand(0,($maxChars -1)); // on ajoute la lettre a la valeur de $pass $pass.=$chaine[$nb]; } return $pass; }
C'est vrai que je me suis compliqué un peu la vie...Je ne comprends pas trop ta méthode, N1Bus
Note : J'avais quand même besoin que le mot de passe commence par une lettre.
Et voilà : le premier caractère est un chiffre
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 function passGenerator($nbCarMax) { //Caractères autorisés : On retire 0, O, I, 1 et l pour éviter les confusions $chaine_alpha = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"; $chaine_autres = "23456789-_."; $chaine = $chaine_alpha.$chaine_autres; $pass = ""; for($i =0; $i < $nbCarMax; $i++) { if ($i==0) $maxChars = strlen($chaine_alpha); else $maxChars = strlen($chaine); // on choisie un nombre au hasard entre 0 et le nombre de caractères de la chaine $nb = mt_rand(0,($maxChars -1)); // on ajoute la lettre a la valeur de $pass $pass.=$chaine[$nb]; } return $pass; }
Gérer magic_quotes_gpc de manière transparente:
Ca évite de se fatiguer à vérifier la configuration du serveur à chaque fois. J'imagine qu'on a tous ce genre de fonction en stock, mais au cas où il y a des fainéants qui ne veulent pas écrire ces quelques lignes ^^
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 function filtrePostToSql($str){ if (get_magic_quotes_gpc()){ return mysql_real_escape_string(stripslashes($str)); }else{ return mysql_real_escape_string($str); } }
http://fr2.php.net/magic_quotes
Personnelement, je prefere utiliser un code qui permet de s'en debarasser de maniere transparente sur tout le script :
PS : j'ai corrige mon message precedent.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 <?php if (get_magic_quotes_gpc()) { function stripslashes_array($array) { return is_array($array) ? array_map('stripslashes_array', $array) : stripslashes($array); } $_COOKIE = stripslashes_array($_COOKIE); $_FILES = stripslashes_array($_FILES); $_GET = stripslashes_array($_GET); $_POST = stripslashes_array($_POST); $_REQUEST = stripslashes_array($_REQUEST); } ?>
Ah oui, effectivement c'est mieux Merci!
Placer des points sur une carte en coordonnées septentrionalles
Pour tout programme ou il est nécessaire de placer des points ou des lignes sur une carte a partir des coordonnées Nord-sud-est-ouest.
Auteur : Stéphane PETITCLERC
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Bonjour,
Pour ma part, je vous propose une classe simple de "géolocalisation".
Concrètement, on passe à la classe un fichier image (représentant une carte) en indiquant les coordonnées septentrionnalles du coin haut gauche de la carte ainsi que du coin bas droit, puis on appel la méthode DrawItem() pour dessiner un point sur la carte aux coordonnées septentrionnales passées en paramètre.
Personnelement, j'ai développé cet outil pour publier des carte mémétorologique à partir des données du satellite QuickSat. L'extraction des données se faisant en C, je ne vous propose ici que le module d'affichage qui peut être réutiliser dans bien des situations (tracé de route, positionnement de points sur un carte, météorologie, trajets, etc...).
Vous pouvez ré-écrire la fonction DrawItem pour dessiner autre chose que des points sur la carte (et drow line pour les lignes).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129 <?php class map { var $img; var $lat_deb = 0; var $lat_fin = 0; var $lon_deb = 0; var $lon_fin = 0; // constructeur : créé l'iamge a partir de URL, // lat_den/fin et lon_deb/fin sont les coordonnees du point au format numerique function map($url_img, $lat_deb, $lat_fin, $lon_deb, $lon_fin) { $this->lat_deb = $lat_deb; $this->lat_fin = $lat_fin; $this->lon_deb = $lon_deb; $this->lon_fin = $lon_fin; // Création d'une ressource image à partir de la carte $this->img = imagecreatefrompng($url_img); if($this->img === false) return false; return true; }//********************************************* // récupère les coordonnées en pixels du point passé en latitude/longitude. // le résultat est renvoyé dans un tableau. function GetCoordPixel($LAT, $LON, $force = 0) { if(!$force) { if($LAT > $this->lat_fin || $LAT < $this->lat_deb) return false; if($LON > $this->lon_fin || $LON < $this->lon_deb) return false; } $x = imagesx($this->img); $y = imagesy($this->img); $LATpixel = $y / ($this->lat_fin - $this->lat_deb); $LONpixel = $x / ($this->lon_fin - $this->lon_deb); $coordBasePixelLAT = ($this->lat_deb * $LATpixel) * -1; $coordBasePixelLON = ($this->lon_deb * $LONpixel) * -1; $X = $coordBasePixelLON + ($LONpixel * $LON); $Y = $coordBasePixelLAT + ($LATpixel * $LAT); return array(round($X), $y - round($Y)); }//********************************************* // transforme une coordonnee du type 61.3W en -61.3 function Coord($val) { $val = trim($val); switch(substr($val, -1, 1)) { case 'N' : $val = substr($val, 0, strlen($val) - 1); break; case 'S' : $val = substr($val, 0, strlen($val) - 1) * -1; break; case 'E' : $$val = substr($val, 0, strlen($val) - 1); break; case 'W' : $val = substr($val, 0, strlen($val) - 1) * -1; break; default: return false; break; } if(is_numeric($val)) return $val; return false; }//********************************************* // Dessine l'objet $item (couleur RVB 0-255) aux coordonnées X-Y (en °) function DrawItem($x, $y, $item = '', $R = 255, $V = 0, $B = 0) { if(!is_numeric($x)) { $x = $this->Coord($x); if(!is_numeric($x)) return false; } if(!is_numeric($y)) { $y = $this->Coord($y); if(!is_numeric($y)) return false; } if(!is_numeric($R) || !is_numeric($V) || !is_numeric($B)) return false; // création de la couleur de l'objet $tmpcolor = imagecolorallocate($this->img, $R, $V, $B); list($x, $y) = $this->GetCoordPixel($x, $y); switch($item) { default: imagefilledellipse($this->img, $x, $y, 5, 5, $tmpcolor); break; } }//********************************************* function DrawLine($x, $y, $to_x, $to_y, $R = 255, $V = 0, $B = 0) { if(!is_numeric($x)) { $x = $this->Coord($x); if(!is_numeric($x)) return false; } if(!is_numeric($y)) { $y = $this->Coord($y); if(!is_numeric($y)) return false; } if(!is_numeric($to_x)) { $to_x = $this->Coord($to_x); if(!is_numeric($to_x)) return false; } if(!is_numeric($to_y)) { $to_y = $this->Coord($to_y); if(!is_numeric($to_y)) return false; } if(!is_numeric($R) || !is_numeric($V) || !is_numeric($B)) return false; // création de la couleur de l'objet $tmpcolor = imagecolorallocate($this->img, $R, $V, $B) or die(); list($x, $y) = $this->GetCoordPixel($x, $y, true); list($to_x, $to_y) = $this->GetCoordPixel($to_x, $to_y, true); imageline($this->img, $x, $y, $to_x, $to_y, $tmpcolor); }//********************************************* // renvoie l'image sous forme de ressource graphique function GetImage() { return $this->img; }//********************************************** } ?>
Les coordonnées à passé en paramètre peuvent s'écrire de 2 façons :
DrawItem('16.1N', '61W'); ou encore DrawItem(16.1, -61);
Exemple :
Les images doivent être au format PNG (modifiez le constructeur pour prendre d'autre type).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 $carte = new map('./zoom.png', -10, 10, -5, 5); $carte->DrawItem(16, -61, '', 255, 0, 0); header('Content-Type: image/jpg'); imagejpeg($carte->GetImage());
Webshare, explorateur webFTP
Auteur : Virginie Vivancos
Lien vers le site officiel : http://www.webshare.fr
Démo : http://www.webshare.fr/demo
Forum : http://www.webshare.fr/?page=forum
Avec Webshare, vous pouvez profiter de tous vos documents et les gérer directement sur votre espace web depuis n'importe quel ordinateur, et ce, en toute convivialité! Vous pouvez également partager vos fichiers, transférer des documents volumineux, le tout en quelques clics !
Cette application open-source écrit en PHP/Ajax se présente comme un explorateur classique (documents sous forme d’icônes, arborescence et menu contextuel). Ne nécessitant pas de configuration complexe, Webshare v0.6 fonctionne sur tout navigateur récent et propose les fonctionnalités suivantes :
* Affichage et navigation :
o Vues par miniatures, icônes, liste, détails ;
o Tri par nom, valeur, type, date, taille ;
o Aperçu des images et des liens (miniatures) ;
o Visualisation directe des images et autres fichiers de type connu ;
o Lecture directe des fichiers audio MP3 depuis un lecteur intégré ;
o Recherche par nom ;
o Ajout de commentaires (dossier ou fichier) ;
o Affichage des propriétés et des données exif ;
o Zoom sur les images à l’aide de la souris ;
o Lecture directe des flux RSS.
* Gestion de fichier :
o Création, modification, renommage, suppression, copie, déplacement et verrouillage ;
o Glisser-déplacer (limité actuellement à un seul fichier à la fois) ;
o Upload et download d’un ou plusieurs documents simultanément (par zippage) ;
o Gestion des uploads dans une file d’attente avec démarrage automatique ;
o Support des noms fichiers accentués ou contenant des caractères internationaux.
* Accès, comptes et sécurité :
o Accès public ou restreint par identification (géré par l’administrateur uniquement) ;
o Nombre potentiellement illimité de partages et d’utilisateurs avec paramétrage particulier pour chacun ;
o Chaque action de l’utilisateur peut être autorisée, restreinte ou interdite par l’administrateur ;
o Filtre d’expressions interdites pour empêcher l’accès et la gestion de fichiers sensibles (scripts PHP, CGI, etc.) ;
o Stockage protégé des informations d’identifications sensibles, fonctions serveurs sécurisées.
* Interface :
o Personnalisation complète de l’affichage (création de nouvelles skins possible) ;
o Paramétrage des boutons de souris ;
o Possibilité d’éditer les fichiers textes et les pages HTML grâce à l’ajout de FCKeditor en tant que module.
Récupère le flux HTML d'une page et insère dans un tableau tous les liens relatifs.
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 $subject = file_get_contents($file); $pattern = '`href="([^#]*?)(?<!http)"`i'; $arRelativeLinks = array(); preg_match_all($pattern, $subject, $matches); { foreach($matches[1] as $link) $arRelativeLinks[] = $link; } //j'ai exclu les liens de type href="#"
Une petite class pour vos entêtes du moins une idée de départ :
Je vous joins aussi un plugin que j'ai fais pour smarty et qui mérite un partage
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 <?php class sendHeaderStatus{ /** * function send status header * * @param void $statusCode * @return header */ function sendStatusCode($statusCode){ return header(' ', true, $statusCode); } /** * function redirectionErreur404() get error 404 * with params * * @param : void * @return : void */ function redirectionErreur404(){ return self::sendStatusCode(404); } /** * function redirectionErreur403() get error 403 * with params * * @param : void * @return : void */ function redirectionErreur403(){ return self::sendStatusCode(403); } } ?>
Après avoir galéré longtemps pour comprendre le fonctionnement de ce truc, je propose un exemple illustrant le chaînage de trois listes déroulantes. Les scripts sont commentés. J'utilise AJAX.
Tout est dans le zip ci-joint.
Have fun.
Partager