Blog

  • Soumettre un sitemap.xml à Google, et Bing

    Bonjour,

    Ce petit code va vous permettre de soumettre votre sitemap.xml aux 2 principaux moteurs de recherche, soit Google search et Bing.

    PHP
    47 lines
    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
    <?php
    class searchEngineSubmitter{
    private $urls;
    public function getUrls(){
    return $this->urls ;
    }
    /**
    * @param array $urlsForSubmitting
    */
    public function __construct(array $urlsForSubmitting){
    $this->urls = $urlsForSubmitting;
    }
    /**
    *
    * @param string $url
    * @return type
    */
    private function myCurl($url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    return $httpCode;
    }
    /*
    * @abstract Sitemap Submitter Use this script to submit your site maps automatically to Google, Bing.MSN and Ask Trigger this script on a schedule of your choosing or after your site map gets updated.
    * @param string
    */
    public function submitSitemap($sitemapUrl) {
    foreach ( $this->getUrls() as $url) {
    $code = $this->myCurl($url . $sitemapUrl);
    if ($code == '200') {
    return 'success: ' . parse_url($url, PHP_URL_HOST) . ' has been pinged (return code: ' . $code . ' )';
    } else {
    return 'warning' . parse_url($url, PHP_URL_HOST) . ' return error (return code: ' . $code . ' )';
    }
    }
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Pour l’utiliser on fait comme ceci :

    PHP
    6 lines
    1
    2
    3
    4
    5
    6
    <?php
    $submit = (new searchEngineSubmitter(
    ["http://www.google.com/webmasters/sitemaps/ping?sitemap=",
    "http://www.bing.com/webmaster/ping.aspx?siteMap="]))
    ->submitSitemap('http://www.mywebsite.com');
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Et voilà 🙂

    @ bientôt

  • Valider les champs d’un formulaire avec Silex et « Validator Constraints »

    Valider les champs d’un formulaire avec Silex et « Validator Constraints »

    Je me suis associé à Baptiste Pesquet l’auteur du cours sur Openclassrooms « Évoluez vers une architecture PHP professionnelle ». La validation des champs est désormais compatible avec la version 2.1 de silex c’est l’itération 14.

    Bonjour,

    Aujourd’hui nous allons voir comment ajouter la validation des valeurs de retour d’un formulaire dans le framework Silex.

    Après avoir suivi le cours sur Openclassrooms « Évoluez vers une architecture PHP professionnelle », il vous manquera cette partie avant de mettre votre site en ligne.

    Pourquoi valider les champs ?

    Pour s’assurer que les utilisateurs du site ne cherche pas à enter n’importe quelle donnée n’importe où. Par exemple un numéro de téléphone dans le champ email, tenter de faire passer des valeurs inapproprié et exploiter une faille xss…

    Voici comment nous allons procéder :

    Dans un premier temps nous allons ajouter un namespace qui sera utilisé par votre buildForm:: ce namespace c’est :

    PHP
    1 lines
    1
    use Symfony\Component\Validator\Constraints as Assert;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Voici ce que j’ai fait pour l’enregistrement d’un email :

    PHP
    22 lines
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php
    namespace MicroCMS\Form\Type;
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    class NewsletterType extends AbstractType
    {
    public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add('email', 'email', [
    'label' => '',
    'required' => true,
    ]);
    }
    public function getName() {
    return 'newsletter';
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    On vois que j’ai mis plusieurs contraintes. En premier lieu j’ai décidé que le champ est de type « email »et qu’il est « requis » (required), c’est à dire que sur le html généré, on verra ceci :

    HTML
    1 lines
    1
    <input id="newsletter_email" name="newsletter[email]" required="required" placeholder="Votre email pour vous inscrire à la Newsletter" type="email">
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Si l’utilisateur a un navigateur récent, et qu’il soumet le formulaire directement, un message lui dira que ce n’est pas possible car le champ est vide. Si il remplit ce champ avec autre chose qu’un email le navigateur va là aussi l’informer que cette donnée n’est pas valide. C’est une première étape car si l’utilisateur est un petit malin, il peut modifier le type de champ dans le input, supprimer le required et le email. à ce moment là, il pourra soumettre le formulaire sans message d’erreur.

    Il faut donc procéder à une deuxième vérification sur les données au niveau du framework et pas seulement dans le navigateur.

    Pour cela on va rajouter cette ligne dans notre méthode buildForm, ‘constraints’ => new Assert\Email(),

    PHP
    23 lines
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <?php
    namespace MicroCMS\Form\Type;
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\Validator\Constraints as Assert;
    class NewsletterType extends AbstractType
    {
    public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add('email', 'email', [
    'label' => '',
    'required' => true,
    'constraints' => new Assert\Email(),
    ]);
    }
    public function getName() {
    return 'newsletter';
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Là, on est certain que la valeur attendu sera un email et pas autre chose. Si l’utilisateur fait le malin au niveau de son navigateur, voici ce qui va s’afficher :

    • This value is not a valid email address.

    Grand maître L

  • Thomas pesquet

    Thomas pesquet

    Hop Hop Hop ! je sors ce blog de son sommeil pour vous rappeler à tous que ce soir Thomas Pesquet prend son envol pour l’ISS. Je lui souhaite bon vol !

    thomas pesquet official portrait
    PHOTO DATE: 01-14-16
    LOCATION: Bldg. 8, Room 183 – Photo Studio
    SUBJECT: Official portrait of ESA astronaut & Expedition 50/51 crew member Thomas Pesquet in blue flight suit.
    PHOTOGRAPHER: BILL STAFFORD
  • L’importance de la veille technologique…

    L’importance de la veille technologique…

    Hier, j’ai été invité à être membre d’un jury en tant que professionnel pour le passage du BTS SIO. J’ai à cette occasion pu rencontrer les futurs diplômés.

    Dans l’ensemble, leurs parcours professionnels étaient très intéressants et variés.

    Dans cette épreuve, il est demandé aux élèves de faire une rétrospective de leur veille technologique réalisée pendant les deux années de leur formation. A partir de ce moment, les choses se gâtent… Les élèves n’ont pas toujours compris l’intérêt de parcourir le Web ou d’assister à des conférences afin de se tenir au courant des évolutions de l’informatique et des systèmes d’informations. C’est d’autant plus dommageable qu’ils sont au début de leur formation et qu’ils ont tout à « découvrir » et j’insiste sur ce terme « découvrir ». Le but n’est pas qu’ils soient en mesure d’être des experts d’une technologie mais plutôt qu’ils aient une culture générale.

    Enfin, j’ai remarqué que pour eux, veille technologique == nouvelles technologies, alors que non ! Découvrir une nouvelle technologie n’est qu’une partie de la veille, mais découvrir des anciennes peux faire partie des objectifs de carrière, le secteur des banques à énormément de mal à recruter pour la maintenance de leur code en COBOL, les développeurs qui font l’effort de l’apprendre aujourd’hui (2016) ne manquent pas de travail !

    A méditer…

    Grand maître L

  • Diaballik devient Senseï

    Diaballik devient Senseï

    Il y a longtemps maintenant, je vous ai parlé du jeu de société Diaballik, lui même décliné en version iPad. Beaucoup d’eau a coulé sous les ponts et Philippe Lefrançois (le créateur a passé un deal avec un nouvel éditeur FERTI).

    plateau animé

    On y gagne un visuel très différent et deux nouveaux modes de jeux. Très honnêtement c’est vraiment excitant de se replonger dans ce jeu qui n’a pas pris une ride. je vous laisse le redécouvrir :

    figurines senseï

    Les pions et le plateau

    ensemble figurine et plateau

    Le jeux est disponible chez tous les bon vendeurs au prix de 32,15€.

  • …et pendant ce temps, l’horreur continue

    …et pendant ce temps, l’horreur continue

    Encore une fois, l’horreur a frappé la France et Paris en particulier. Ce déchaînement de violence doit nous amener à reconnaître que notre façon d’être et de vivre ne plaît pas à tout le monde.

    Ce n’est pas une raison pour renoncer à nos idées et nos valeurs de liberté, d’égalité et de fraternité. Ce sont les valeurs de la France et elles me sont chères.

    J’ai une pensée émue pour les familles endeuillées.

    Vive la liberté 😐

  • Grosse mise à jour de ma librairie PHP Json-heitz

    Le logiciel Heitz System expose toujours une API avec laquelle on peux discuter via JSON. Je vous avais déjà présenté la première version de cette class ici.

    Elle rencontre un petit succès 162 téléchargements aux dernières nouvelles sur Packagist.

    Pour l’invoquer, voici comment faire :

    PHP
    117 lines
    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
    <?php
    require_once 'vendor/autoload.php';
    use JsonHeitz\JsonHeitz;
    use JsonHeitzCredential\Credential;
    use JsonHeitz\JsonHeitzException\JsonHeitzException;
    try {
    $connect = (new Credential())
    ->setPort(80)
    ->setUserLogin('test1@heitzsystem.com')
    ->setUserPass('1')
    ->setHost('http://heitz.no-ip.com')
    ->setHostPassword('AuthentificationBaseTest')
    ->urlWebServeurHeitz()
    ;
    } catch (JsonHeitzException $exc) {
    echo $exc->getMessage();
    }
    try {
    $call = (new Query($connect))->setConnectHeitzAPI()
    // ->setDebug(true) //optional
    ;
    $resultat = $call->callWSHeitz();
    $call->setIdSession($resultat->idSession)
    ->setIdClient($resultat->idClient);
    var_dump($call->getOneClient());
    var_dump($call->getTaskList());
    var_dump($call->getTest());
    var_dump($call->getFormTraining());
    var_dump($call->getActiveReservation());
    var_dump($call->getConfigServeur());
    var_dump($call->getBilan());
    var_dump($call->getTest());
    var_dump($call->getClientMessage(10));
    var_dump($call->getListOfActiveAccess());
    var_dump($call->getListOfPassages());
    var_dump($call->getArrowPoints());
    var_dump($call->getTaskGroup());
    var_dump($call->getPlaceForTheTask());
    var_dump($call->getListOfFinancialDeadlines());
    var_dump($call->getListOfLevies());
    var_dump($call->getListOfBills());
    var_dump($call->getListOfFinancial());
    var_dump($call->getListOfFinancialDeadlines());
    var_dump($call->getListOfLevies());
    var_dump($call->getListOfPoints());
    var_dump($call->getListOfCures());
    var_dump($call->getListOfActiveAccess());
    var_dump($call->getAllArticles());
    var_dump($call->getAllCity());
    var_dump($call->getAllCivility());
    var_dump($call->getAllJobs());
    var_dump($call->getAllWhereTheCustomerHasPracticed());
    var_dump($call->getAllMotivation());
    var_dump($call->getAllVAT());
    var_dump($call->getAllPayment());
    var_dump($call->getAllWayToKnowTheInstitution());
    var_dump($call->getAllTypeOfProspects());
    var_dump($call->getAllDiscountLevel());
    var_dump($call->getAllCustomerGroup());
    var_dump($call->getAllEmployee());
    var_dump($call->getAllFamilySituation());
    var_dump($call->getArrowPoints());
    var_dump($call->getDetailOfCures());
    var_dump($call->getCriterion1());
    var_dump($call->getCriterion2());
    var_dump($call->getCriterion3());
    var_dump($call->getCriterion4());
    var_dump($call->getCriterion5());
    var_dump($call->getDashboard('01-03-2012', '01-03-2013'));
    var_dump($call->getDashbordFinancial('01-03-2012'));
    var_dump($call->getFinancial());
    var_dump($call->getFormTraining());
    var_dump($call->getScheduleSEPA());
    $sale = array(
    'vente' => '{"ventes":[{"idArticle":300024225, "idTva":0, "quantite":3, "prixUnitaire":12.34},
    {"idArticle":300185150, "idTva":0, "quantite":2, "prixUnitaire":987.654}]}',
    'reglement' => '{"reglements":[{"idMode":1, "montant":12.34},
    {"idMode":3, "montant":987.654},{"idMode":2, "montant":122.3}]}'
    );
    var_dump($call->addSale($sale));
    $search = array(
    "idClientRecherche" => '',
    "nom" => 'sa%',
    "prenom" => '',
    "secondPrenom" => '',
    "email" => '',
    "idCivilite" => '',
    "naissance" => '',
    "telephone" => '',
    "portable" => '',
    "idVille" => '',
    "idSituation" => '',
    "idProfession" => '',
    "dateCreation" => '',
    "contactSMS" => '',
    "contactEmail" => '',
    "contactCourrier" => '',
    "contactTelephone" => ''
    );
    var_dump($call->searchClient($search, 1));
    var_dump($call->getClientIdByEmail('toto@toto.fr'));
    var_dump($call->clientWithAnActiveSpecificAccess(1018874, 16485527));
    var_dump($call->accessListForAClient(19435255));
    } catch ( JsonHeitzException $exc) {
    echo $exc->getMessage();
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Et voila, @Bientôt Grand Maître L

  • SgAutoRepondeur avec composer

    J’ai développé une petite classe en PHP pour utiliser facilement l’API de SGAutoRépondeur.

    Elle est bien-sûr disponible pour tous sur mon Bitbucket. Elle respecte les conventions PSR-4 pour l’auto-chargement des classes et ça c’est important !!!

    Pour information, voici comment l’utiliser :

    PHP
    43 lines
    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
    <?php
    require_once 'vendor/autoload.php';
    try {
    $monTest = (new \SgAutoRepondeur\SgAutoRepondeur())
    ->setCodeActivationClient('1010201000162121718617151918911')
    ->setMembreID('32')
    ->setInscriptionNormale('non')
    ->setEmailSG('sebastienXXX_@hotmail.com')
    ->setListeID('779')
    ;
    } catch (SgAutoRepondeur\SgException\SgException $exc) {
    echo $exc->getMessage();
    }
    try {
    $userSG = (new \SgAutoRepondeur\User\User())
    ->setEmail('tutu@tutu.fr')
    ->setNom('Dupont')
    ->setPrenom('Jean')
    ->setAdresse('125 rue de nulle part')
    ->setPays('France')
    ->setAnneeNaissance('1979')
    ->setMoisNaissance('01')
    ->setJourNaissance('10')
    ->setVille('lyon')
    ->setIp('192.168.1.236');
    $monTest->setFields($monTest, $userSG);
    // var_dump($monTest->getFields());
    } catch (SgAutoRepondeur\SgException\SgException $exc) {
    echo $exc->getMessage();
    }
    try {
    var_dump( $result = (new SgAutoRepondeur\ResponseDictionary\ResponseDictionary())
    ->value( $monTest->callWebService($monTest->getFields()) ));
    } catch (SgAutoRepondeur\SgException\SgException $exc) {
    echo $exc->getMessage();
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Pour avoir plus d’informations sur l’autorépondeur et à quoi cela sert, je vous invite à vous rendre sur leur site internet

    http://sg-autorepondeur.com/index.php

    @ plus Grand Maitre L

  • Titeuf m’a rendu triste…

    Titeuf m’a rendu triste…

    …Mais c’est pour la bonne cause.

    Et oui ce matin j’ai lu la planche de Zep… des images fortes et des personnages malmenés. Je vous lasse découvrir :zep titeuf

  • Surveillance de masse en France

    Surveillance de masse en France

    Le titre m’avais accroché, j’ai donc décidé de lire la suite. L’article très complet résume les dernières informations concernant la loi Anti-terroriste voté en ce moment au parlement Français.

    Voici l’extrait qui m’a fait bondir de ma chaise :

    Il faut savoir sacrifier quelque peu sa vie privée.

    Cette affirmation ne me conviens pas du tout.
    Je ne supporte pas l’idée que l’on espionne ce que je dise/écrive sous prétexte de sécurité. On ne peut pas surveiller tous les internautes sans distinctions pour faire un tri a posteriori.

    Il faut au contraire des surveillances ciblées.

    Ne nous faisons pas d’illusions, les terroristes savent lire un tutoriel sur internet pour utiliser un VPN et TOR.

    Cette loi n’est là que pour faire plaisir à l’opinion publique.

    En réduisant nos libertés, le terroristes gagnent !

    Je vous renvoie vers l’article d’origine :

  • Codeigniter 3.0 is out !

    C’est parti Codeigniter 3.0 est maintenant disponible en version finale, la lise des changements étant longue comme mon bras, je vous invite à vous plonger dans le changelog officiel sur cette page.

    A partir de maintenant c’est un nouveau départ pour le framework qui j’espère sera amené à évoluer plus souvent. Je lui souhaite le meilleur mais je fait aussi quelques recommandations.

    Une nouvelle version à minima

    La version minimale est php 5.2.x, c’est une version qui n’est plus supportée par PHP depuis 4 ans (la doc dit qu’ils recommandent PHP 5.4.x). Là je suis un peux plus content mais aucun des apports de la version ne sont utilisé (TRAITS, namespaces…). Une refonte du cœur doit être entreprise pour tirer le meilleur parti de ces nouveaux ajouts.

    Et maintenant je fais quoi ?

    Et bien je vais tenter de migrer au moins un projet vers codeigniter 3.0 pour voir les limitations et les opportunités de la nouvelle version. Si tous se passe correctement, je migre mes autres projets.

     

    La nouvelle version est disponible ici

    See you soon !

  • Dorine Bourneton se pose sur l’aéroport Roissy Charles de Gaulle

    Il est normalement impossible pour les avions de tourisme d’atterrir sur cette plateforme aéroportuaire, mais avec une bonne ténacité, Dorine Bourneton est parvenue à convaincre ADP.

    Je vous laisse découvrir son parcours dans cette vidéo.

    @ Bientôt Grand maitre L

  • Le jeu vidéo « Bomb »

    Et hop pour faire plaisir à un copain ! Je vous informe de la sorti du jeux vidéo Bomb sur pc et linux.

    un petit simulateur de vol dans le style graphique de Team Fortress.

  • Juste un mot…

    Juste un mot…

    … pour dire que face à cette atrocité :

    Je suis charlie
    Je suis charlie
  • Générer un évenement *.ics pour outlook en PHP

    Il est maintenant possible de l’utiliser via composer :

    JSON
    2 lines
    1
    2
    "calendar/icsfile": "dev-master"
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Salut,

    Pour un besoin personnel j’ai du créer cette class PHP qui génère un événement pour Outlook, gmail…
    Voici la classe en question :

    PHP
    236 lines
    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
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    <?php
    /*
    * Variables used in this script:
    * $summary - text title of the event
    * $dateStart - the starting date (in seconds since unix epoch)
    * $dateEnd - the ending date (in seconds since unix epoch)
    * $address - the event's address
    * $description - text description of the event
    * $filename - the name of this file for saving (e.g. my-event-name.ics)
    */
    namespace ical;
    class ical {
    private $name;
    private $timezoneICal = 'Europe/Paris';
    private $dateStart;
    private $summary;
    private $dateEnd;
    private $filename;
    private $address;
    private $description;
    private $alarm = FALSE;
    private $repeat = FALSE;
    public function getName() {
    return $this->name;
    }
    public function getTimezoneICal() {
    return $this->timezoneICal;
    }
    public function getDateStart() {
    return $this->dateStart;
    }
    public function getSummary() {
    return $this->summary;
    }
    public function getDateEnd() {
    return $this->dateEnd;
    }
    public function getFilename() {
    return $this->filename;
    }
    public function getAddress() {
    return $this->address;
    }
    public function getDescription() {
    return $this->description;
    }
    public function getAlarm() {
    return $this->alarm;
    }
    public function getRepeat() {
    return $this->repeat;
    }
    public function setName($name) {
    $this->name = $name;
    return $this;
    }
    public function setTimezoneICal($timezoneICal) {
    $this->timezoneICal = $timezoneICal;
    return $this;
    }
    public function setDateStart($dateStart) {
    $this->dateStart = $this->_dateToCal($this->_human_to_unix($dateStart));
    return $this;
    }
    public function setSummary($summary) {
    $this->summary = $summary;
    return $this;
    }
    public function setDateEnd($dateEnd) {
    $this->dateEnd = $this->_dateToCal($this->_human_to_unix($dateEnd));
    return $this;
    }
    public function setFilename($filename) {
    $this->filename = $filename;
    return $this;
    }
    public function setAddress($address) {
    $this->address = $address;
    return $this;
    }
    public function setDescription($description) {
    $this->description = $description;
    return $this;
    }
    public function setAlarm($alarm) {
    if (is_int($alarm)) {
    $this->alarm = $alarm;
    return $this;
    } else {
    throw new \Exception(__CLASS__ . " : It's not an integer", 01);
    }
    }
    public function setRepeat($repeat) {
    $this->repeat = $repeat;
    return $this;
    }
    /**
    * @name getICAL()
    * @access public
    * @return string $iCal
    */
    public function getICAL() {
    $iCal = "BEGIN:VCALENDAR" . "\r\n";
    $iCal .= 'VERSION:2.0' . "\r\n";
    $iCal .= "PRODID:" . $this->getName() . "\r\n";
    $iCal .= "CALSCALE:GREGORIAN " . "\r\n";
    $iCal .= "BEGIN:VEVENT" . "\r\n";
    $iCal .= "DTSTART:" . $this->getDateStart() . "\r\n";
    $iCal .= "DTEND:" . $this->getDateEnd() . "\r\n";
    $iCal .= "SUMMARY:" . $this->_escapeString($this->getSummary()) . "\r\n";
    $iCal .= 'UID:' . uniqid() . "\r\n";
    $iCal .= 'LOCATION: ' . $this->_escapeString($this->getAddress()) . "\r\n";
    $iCal .= 'DESCRIPTION:' . $this->_escapeString($this->getDescription()) . "\r\n";
    if ($this->getAlarm()) {
    $iCal .= 'BEGIN:VALARM' . "\r\n";
    $iCal .= 'ACTION:DISPLAY' . "\r\n";
    $iCal .= 'DESCRIPTION:Reminder' . "\r\n";
    $iCal .= 'TRIGGER:-PT' . $this->getAlarm() . 'M' . "\r\n";
    if ($this->getRepeat()) {
    $iCal .= 'REPEAT:' . $this->getRepeat() . "\r\n";
    }
    $iCal .= "END:VALARM" . "\r\n";
    }
    $iCal .= 'END:VEVENT' . "\r\n";
    $iCal .= 'END:VCALENDAR' . "\r\n";
    return $iCal;
    }
    /**
    * @name _dateToCal()
    * @access private
    * @param string $timestamp
    * @return string
    */
    private function _dateToCal($timestamp) {
    return date('Ymd\THis\Z', $timestamp);
    }
    /**
    * @name _escapeString()
    * @abstract Escapes a string of characters
    * @param string $string
    * @return string
    */
    private function _escapeString($string) {
    return preg_replace('/([\,;])/', '\\\$1', $string);
    }
    /**
    * @name $setHeader();
    */
    public function setHeader() {
    header('Content-type: text/calendar; charset=utf-8');
    header('Content-Disposition: attachment; filename=' . $this->getFilename() . '.ics');
    }
    /**
    * @name _human_to_unix()
    * @desciption this function is from codeigniter frameWork
    * @param string $datestr
    * @return boolean
    */
    private function _human_to_unix($datestr) {
    $datestr = preg_replace("/\040+/", ' ', trim($datestr));
    if (!preg_match('/^[0-9]{2,4}\-[0-9]{1,2}\-[0-9]{1,2}\s[0-9]{1,2}:[0-9]{1,2}(?::[0-9]{1,2})?(?:\s[AP]M)?$/i', $datestr)) {
    throw new \Exception(__CLASS__ . " : bad" . $datestr);
    }
    $split = explode(' ', $datestr);
    $ex = explode("-", $split['0']);
    $year = (strlen($ex['0']) == 2) ? '20' . $ex['0'] : $ex['0'];
    $month = (strlen($ex['1']) == 1) ? '0' . $ex['1'] : $ex['1'];
    $day = (strlen($ex['2']) == 1) ? '0' . $ex['2'] : $ex['2'];
    $ex = explode(":", $split['1']);
    $hour = (strlen($ex['0']) == 1) ? '0' . $ex['0'] : $ex['0'];
    $min = (strlen($ex['1']) == 1) ? '0' . $ex['1'] : $ex['1'];
    if (isset($ex['2']) && preg_match('/[0-9]{1,2}/', $ex['2'])) {
    $sec = (strlen($ex['2']) == 1) ? '0' . $ex['2'] : $ex['2'];
    } else {
    // Unless specified, seconds get set to zero.
    $sec = '00';
    }
    if (isset($split['2'])) {
    $ampm = strtolower($split['2']);
    if (substr($ampm, 0, 1) == 'p' AND $hour < 12)
    $hour = $hour + 12;
    if (substr($ampm, 0, 1) == 'a' AND $hour == 12)
    $hour = '00';
    if (strlen($hour) == 1)
    $hour = '0' . $hour;
    }
    return mktime($hour, $min, $sec, $month, $day, $year);
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Pour l’utiliser voici le code :

    PHP
    23 lines
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <?php
    require_once 'vendor/autoload.php';
    use ical\ical;
    try {
    $ical = new ical();
    $ical->setAddress('Paris');
    $ical->setDateStart('2014-11-21 15:00:00');
    $ical->setDateEnd('2014-11-21 16:00:00');
    $ical->setDescription('wonder description');
    $ical->setSummary('Running');
    $ical->setFilename(uniqid());
    $ical->setHeader();
    echo $ical->getICAL();
    } catch (Exception $exc) {
    echo $exc->getMessage();
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Cette class est disponible sous Bitbucket, voici l’adresse https://bitbucket.org/colonelMoutarde/icalendar-generator.