• Billet écrit dans : Découverte PHP 27.09.2008 Aucune réponse à cet article.

    Dans un article précédent, nous avions vu comment créer un bot IRC en PHP. Seulement assurer la connexion du bot sur le salon était assez laborieux. Un processus php par bot qui tourne sur votre machine, c’est pas folichon.

    Mais grâce à http://new.imified.com, ce souci n’en est plus un ! Ce service web permet de connecter un bot à MSN, IRC, Gtalk etc et ce bot demandera à votre page PHP ce qu’il doit faire.

    Au final nous n’avons plus qu’a se consacrer sur les réponses et les traitements à faire en fonction du dialogue de l’utilisateur (donnée récupérer sous forme de $_GET). Fini le parsage du stream pour détecter la bonne ligne ^^

    Je vous avouerais, j’ai pas encore tester. Mais je compte le faire un de ces quatres :) Je pense que c’est LA solution pour créer rapidement un compagnon virtuel … Imaginer un bot de ce style qui pilote votre twitter, facebook etc. Vous lui parlez, il s’occupe du reste :)

    Vu sur le channel #symfony-fr (irc.freenode.com) grâce à [MA]Pascal.
    Il a crée un bot qui relaie ce que vous lui dites sur un site donné. (Système de prise de notes rapide)
    Ajouter paste@bot.im à votre compte Gtalk et parler lui. Enfin, cela reste surtout un bot de test, réalisé avec Symfony 1.2 et Doctrine (un ORM comme propel)

    Billet écrit dans : Découverte PHP 27.09.2008 Aucune réponse à cet article.
  • Billet écrit dans : Mobile, iPhone 16.09.2008 8 Réactions !!

    Mise à jour 29/07/09 : Cet article date d’un peu .. sa version raccourci et plus clair est disponible sur [shal]Débuter sur le développement iPhone[/shal] ! Have Fun :p

    Cet article a pour but de vous expliquer comment créer une application Iphone.
    Afin d’éviter un abus de langage, nous différencions deux types d’applications potentiels :

    •    Les applications web : ouvert via Safari et qui ne sont ni plus ni moins un site dédié au format de l’iphone.
    •    Les applications embarqués : Application directement téléchargé sur le iphone store (gratuitement ou pas) pour lequel l’utilisateur doit donner son mot de passe pour l’installer.

    Cet article traitera principalement du 2e type d’application.

    Application Web

    Afin de créer une application web iphone, la règle constatée est d’avoir un look Apple et celui suffit.
    Pour ce faire il peut être intéressant d’utiliser :

    •    iUI – pour User Interface (UI) Library for Safari development on iPhone qui est disponible sur http://code.google.com/p/iui/
    Cela fournit des images, un CSS et une bibliothèque Javascript permettant de simuler une navigation sur une application Iphone « embarqué ». Deux exemples sont disponibles :

    •    Un tutorial expliquant comment créer le css, et le javascript pour profiter, détecter et se servir de la « rotation » de l’iphone

    •    Un plugin Firefox pour « émuler » l’affichage dans un iphone

    •    Une application AIR pour emuler l’iphone sur PC. Attention ce n’est qu’une beta.

    •    Un site web pour tester les applications web est disponible : http://www.testiphone.com/

    Ces pistes de réflexions devraient vous aider à concevoir un site spécial iphone.

    Rappel : The vertical view dimensions are 320×365 pixels while the horizontal view dimensions are 480×200 pixels.
    Note : De nombreux sites proposent une version iphone et parlent de leur « application iphone », d’où l’existence d’un certain abus de langage sur le terme « application »

    Application embarqué

    La création d’application pour Iphone permet ainsi d’avoir une application « hors ligne ». Idéal pour les jeux commerciaux, les utilitaires etc.

    Le kit de développement (SDK) est fourni gracieusement par Apple, nous pouvons donc développé des applications qui fonctionneront dans l’émulateur fourni.

    Cependant il faut payer une licence pour pouvoir mettre son application sur un vrai téléphone et être disponible sur l’apple store.
    •    99$ pour un particulier.
    •    300$ pour une entreprise.

    Le fait d’avoir cette licence nous donne accès à « l’Iphone Developer Program » (http://developer.apple.com/iphone/program/).  Un résumé des étapes pour faire partie du programme est disponible sur http://forum.frenchiphone.com/index.php/topic,18561.0.html.

    Une fois sur l’apple store notre application est hébergé directement chez Apple, ils ont à leurs charges les coût d’hébergements, fournissent une plateforme de téléchargement etc.

    Lors de la « mise en ligne » de notre application nous pouvons la distribuer :
    •    Gratuitement. Apple prend en charge la totalité des coûts.
    •    Commercialement. 70% du prix de l’application nous revient et apple prend les 30% restant pour frais d’entretiens.

    Contraintes de fonctionnements :

    Pour développer grâce à leur SDK nous devons avoir un mac OS X (version 10.5.3 ou supérieur).

    Et notre application ne fonctionnera que sur les iphone possédant le firmware 2.1. Celui-ci est sorti le 13 septembre 2008.

    Le simulateur intégré au SDK ne permet pas de :
    •    Simuler l’accéléromètre
    •    D’utiliser l’appareil photo de l’iphone. Au passage, nous ne pouvons enregistré de vidéo via l’appareil photo.
    •    D’accéder à certaines librairies des frameworks (souvent lorsqu’on récupère du code « iphone », il ne peut être porté directement dans le SDK vu que certains utilisent une version non officiel du SDK d’Apple où nativement il a plus de librairies).

    Une contrainte d’Apple est que chaque application « vie » dans un bureau cloisonné. Nous ne pouvons accéder aux ressources d’autres applications (comme les mp3 et vidéo stocker sur le téléphone).

    Plus d’information sur : http://www.gizmodo.fr/2008/08/05/lindispensable-marche-noir-des-applications-pour-iphone.html

    Programmer sur Iphone :

    L’API de l’iphone est quasiment la même que pour développer sous mac.
    Il faut utiliser « Cocoa »(L’iphone a sa version de Cocoa nommé « Cocoa Touch »). http://fr.wikipedia.org/wiki/Cocoa_(Apple) .

    Cocoa est l’API native d’Apple pour le développement orienté objet sur son système d’exploitation Mac OS X. C’est l’une des 5 API majeur disponible pour Mac OS X,

    Pour utiliser cette API sur l’Iphone, nous sommes contraint d’utiliser les environnements de développements suivants
    •    Xcode (anciennement Project Builder) : compile et lance l’émulateur de l’iphone.
    •    Interface Builder : Permet d’agir graphiquement sur les vues et permet un développement rapide de l’application d’un point de vue graphique.

    Le langage de programmation utilisé est Objective-C.

    Wikipédia : L’Objective-C est un langage de programmation orienté objet réflexif. C’est une extension du C ANSI comme le C++ mais se distingue de ce dernier par sa distribution dynamique des messages, son typage dynamique et son chargement dynamique. Contrairement au C++, il ne permet pas l’héritage multiple mais il existe toutefois des moyens de combiner les avantages de C++ et d’Objective-C.

    Ressources

    Voici une liste de ressources disponibles pour

    •    Apprendre à utiliser Cocoa et Objective-C

    o    Un cours pour débutant est disponible dans le thread de ce forum.

    o    Débuter avec Cocoa en utilisant Objective-C

    o    Un cours est disponible sur le site du zéro pour Objective-C :

    o    Un livre « biblique » selon les développeurs Mac peut être acheter pour 36.10€

    L’objective-C a une notation et une utilisation de la programmation objet quelque peu déroutante si l’on vient du monde « Java, PHP5, C# ». Le cours du site du zéro est très précis pour comprendre la syntaxe et la notation.

    •    Tutoriaux pour crée des applications iphone

    o    Un pdf, des exemples, et des templates de code sont disponibles dans cet article

    o    Tutorial pour la création d’interface « dynamique »

    o    Tutorial pour créer un lecteur RSS pour Iphone :

    o    Utiliser les évènements, les contrôleurs et les vues

    o    Des Tutoriaux Vidéos sont disponibles sur

    o    Avoir le look and feel d’apple

    o    Forum d’entre-aide

    Sans oublier tous mes liens concernant l’iphone : http://delicious.com/onishinji/iphone

    Billet écrit dans : Mobile, iPhone 16.09.2008 8 Réactions !!
  • Billet écrit dans : Découverte PHP 06.09.2008 7 Réactions !!

    Dans ce billet nous allons voir comment utiliser Ajax pour valider champ par champ un formulaire constuit avec sfForm de Symfony 1.1.

    Je prend pour acquis que vous ayez lu / que vous connaissez la validatation de formulaire « classique » offert par sfForm. Tout est expliqué et surtout .

    En fait le souci avec les validateurs symfony 1.1 est qu’ils ne possèdent pas la méthode isValid() contraitement aux validateurs symfony 1.0. Du coup, quand on fait de l’ajax, nous sommes obligés de passer d’un type de validateur à un autre.

    Cette exemple illuste le fait avec le validateur sfValidatorEmail (sf 1.1) et sfEmailValidator (sf 1.0). L’idée est de définir les paramêtres du validateur (les messages d’erreurs dans notre cas) qu’à un seul endroid afin de respecter le concept Dry (Don’t Repeat Yourself).

    Voilà les étapes nécessaires pour mettre en place une validation de formulaire classique et « Ajaxé » :

    1. Vous créez vos widgets dans lib/form/MaClasseForm.class.php
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      
      class MaClasseForm extends BaseMaClassForm
      {
      	public function configure()
      	{
      		$this->setWidgets(array(
      		'id'         => new sfWidgetFormInputHidden(),
      		'FirstName' => new sfWidgetFormInput(),
      		'LastName'  => new sfWidgetFormInput(),
      		'Email'      => new sfWidgetFormInput(),
      		'password_repeat'      => new sfWidgetFormInput(),
      		'password'      => new sfWidgetFormInput()
      		));
       
                      // On peut modifier les labels si besoin est ...
      		$this->widgetSchema->setLabels(array(
      		'FirstName'    => 'Prenom',
      		'Email'   => 'addresse Email ',
      		'LastName' => 'Nom',
      		));
              }
      }
    2. Vous définissez vos validateurs dans lib/form/MaClasseForm.class.php à la suite de la méthode configure()
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      
       
       $this->setValidators(array(
      'id'         => new sfValidatorPropelChoice(array('model' => 'Utilisateurs', 'column' => 'id', 'required' => false)),
      'FirstName' => new sfValidatorString(array('max_length' => 20, 'required' => false)),
      'LastName'  => new sfValidatorString(array('max_length' => 20, 'required' => false)),
      'password'      => new sfValidatorString(array('max_length' => 40, 'required' => false)),
      'password_repeat' => new sfValidatorString(array('max_length' => 40, 'required' => false)),
      'Email'      => new sfValidatorEmail(array('required' => true)),
      'Birthday'   => new sfValidatorDate(array('required' => false)),
      ));
       
      // J'en profite pour definir un nom formater des champs pour avoir $_POST['utilisateurs['email']] etc
      $this->widgetSchema->setNameFormat('utilisateurs[%s]');
    3. Normallement à ce stade vous pouvez utiliser la classe de formulaire dans votre fichier apps/MonApp/MonModule/actions/actions.class.php
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      
      public function executeMonAction() {
       
         $this->formInscription = new MaClasseForm();
         if ($this->request->isMethod('post'))
         {
            // récupère les champs du formulaire sous forme de tableau.
           $array_champ = $this->getRequest()->getParameter("utilisateurs");
           $this->formInscription->bind($array_champ);
           if ($this->formInscription->isValid())
      	{
             // Formulaire valide.
             }
      }
    4. Voilà la validation « classique » et faite. Et l’ajax dans tout ça ? On y vient ^^ Alors au lieu d’afficher le formulaire de manière classique (via le template adéquate apps/MonApp/MonModule/templates/MonActionSuccess.php)
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      
      // Au lieu de
      echo $form;
       
      // On va rendre le template comme on le souhaite
      // Par souci de flemme je ne fait que le champ Email
      <table>
        <tr>
          <td><?php echo $form['Email ']->renderLabel() ?>:</td>
          <td><?php echo $form['Email '] ?></td>
         <td><span id="error_for_email ">
                      <?php if ($form['Email ']->hasError()): ?>
      		<ul class="error_list">
      		<?php foreach ($form['Email ']-<getError() as $error): ?>
      			<li class="error_for"><?php echo $error ?></li>
      			<?php endforeach; ?>
      		</ul>
      		<?php endif; ?> </span></td>
        </tr>
      </table>
    5. Et maintenant on va jouer avec l’ajax pour vérifier ce champ email lors de la saisie.
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      
      /************** Ajax Time :) *****************/
      // Dans le template on met :
      <?php
      // Crée l'observateur pour le champ utilisateurs_email du formulaire.
      echo observe_field("utilisateurs_email",array(
      'update' => "error_for_email",
      'url' => "MonModule/VerifierEmail",
      'with' => "'email='+ value",
      ));
      ?>
    6. On rajoute l’action VerifierEmail() dans le fichier d’actions.
      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
      
       
      public function executeVerifierEmail()
      	{
      	 // Initialisation des variables internes
      	 $chaine_a_verifier = $this->getRequestParameter("email");
      	 $array_erreur = array();
       
      	 // Récupère le validateur d'email définit dans lib/form/MaClasseForm.class.php
      	 $form = new MaClasseForm();
      	 $validateur_form = $form->getValidatorSchema();
      	 $all_validateurs_field = $validateur_form->getFields();
      	 $email = $all_validateurs_field["email"];
       
      	 // Récupere le bon code d'erreur
      	 if($chaine_a_verifier == "")
      	 {
      	 	$array_erreur =	array('email_error' => $email->getMessage("required"));
      	 }
      	 else
      	 {
      	 	$array_erreur =	array('email_error' => $email->getMessage("invalid"));
      	 }
       
      	 // Crée un validateur d'email hérité de Symfony 1.0
      	 $validateur_email = new sfEmailValidator($this->getContext());
       
               // Un peu de Dry (Don't Repeat Yourself) afin d'éviter d'avoir des messages d'erreurs définit à deux endroits différents.
      	 $validateur_email->initialize($this->getContext(), $array_erreur  );
      	 // Dispatcheur vers le bon templates
      	 if($validateur_email->execute($chaine_a_verifier,$message_retour))
      	 {
      	 	$message_a_afficher = $this->getPartial("ajax_error",array("message"=>$message_retour,"reussi"=>true));
      	 }
      	 else
      	 {
      	 	$message_a_afficher = $this->getPartial("ajax_error",array("message"=>$message_retour,"reussi"=>false));
      	 }
       
      	 return $this->renderText($message_a_afficher);
      	}
    7. Donc en fait on met à jour le « span » error_for_email avec le résultat de l’appel de la méthode VerifierEmail(). J’ai utilisé un template partial car le but est de le réutiliser pour tous les appels en Ajax. Celui ci n’est pas bien compliqué
      1
      2
      3
      4
      
      <ul>
          <li class="<?php if($reussi) echo "accept_for"; else echo "error_for"; ?>">&amp;nbsp;<?php echo $message; ?>
          </li>
      </ul>
    8. Et voilà, le formulaire fonctionne classiquement et dispose de vérifications en Ajax aussi.

    Nous venons de voir le validateur d’Email, mais tous fonctionnent sur le même principe. Voici la méthode pour utiliser le validateur de Sting qui diffère un peu.

    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
    
       public function executeVerifierPseudo()
       {
         // Initialisation des variables internes
        $chaine_a_verifier = trim($this->getRequestParameter("pseudo"));
     
        // Récupère le validateur de pseudo
        $form = new MaClasseForm();
        $validateur_form = $form->getValidatorSchema();
        $all_validateurs_field = $validateur_form->getFields();
        $validateurs = $all_validateurs_field["FirstName"];
        $pseudo = $validateurs->getValidators();
        $pseudo = $pseudo[0];
     
        // Crée un validateur de String sf1.0
        $validateur_pseudo = new sfStringValidator($this->getContext());
        $validateur_pseudo->initialize($this->getContext(), array(
        'min' => $pseudo->getOption("min_length"),
        'min_error' => $pseudo->getMessage("min_length"),
        'max' =>$pseudo->getOption("max_length"),
        'max_error' => $pseudo->getMessage("max_length"),
        'required' => $pseudo->getMessage("required"),
        ));
        // Dispatcheur vers le bon templates
        if($validateur_pseudo->execute($chaine_a_verifier,$message_retour) &amp;&amp; $chaine_a_verifier != "")
        {
           $message_a_afficher = $this->getPartial("ajax_error",array("message"=>$message_retour,"reussi"=>$bool));
        }
        else
        {
         if($chaine_a_verifier == "") $test = $pseudo->getMessage("required");
     
         // Remplace les jokers des messages d'erreurs.
         $min = $pseudo->getOption("min_length");
         $max = $pseudo->getOption("max_length");
         $message_retour=    preg_replace("#%value%#",$chaine_a_verifier,$message_retour);
         $message_retour=    preg_replace("#%min_length%#",$min,$message_retour);
         $message_retour=    preg_replace("#%max_length%#",$max,$message_retour);
         $message_a_afficher = $this->getPartial("ajax_error",array("message"=>$message_retour,"reussi"=>false));
       }
     
       return $this->renderText($message_a_afficher);
    }

    Et voilà c’est fini :)

    Billet écrit dans : Découverte PHP 06.09.2008 7 Réactions !!
CV Guillaume chave