C'est du MVC ça ?

C'est du MVC ça ? - PHP - Programmation

Marsh Posté le 28-09-2010 à 09:59:07    

Bonjour à tous,  
 
Pour la première fois j'essaie de créer une application en MVC et PHP POO et j'aimerai votre avis et surtout que vous me disiez si pour vous, c'est bien du mvc :)
( J'avais déjà créer un post mais je ne savais pas s'il valait mieux que j'en recréer un ou que je continue à poster dessu ... )
 
 
Mon application web est structuré comme ceci :  
 
/application
  controller_base.class.php
  template.class.php
  router.class.php
 
/controller
  clientController.php
  reservationController.php  
 
/model  
  Client.class.php
  ClientManager.class.php
  Reservation.class.php
  ReservationManager.class.php  
 
/views
  client.php
  seeclient.php  
  reservation.php  
  seeresa.php  
 
 
Je vous ai mis un lien vers un controller, une vue, une classe.  
 
Si vous voyez des choses bizarre n'hésitez pas, je débute aussi dans la POO ....  
 
Merci d'avance :)  
 
 

Reply

Marsh Posté le 28-09-2010 à 09:59:07   

Reply

Marsh Posté le 28-09-2010 à 10:03:00    

Ouais ça y ressemble.
 
Par contre attention les formulaires d'insertion, ça se fait en POST, pas en GET

Reply

Marsh Posté le 28-09-2010 à 10:13:44    

Il y a moyen d'écrire ceci autrement ?  
 
 
$manager = new ClientManager();
$managerv = new VilleManager();
 
Genre parfois j'ai 10 instances à créer je suis obliger d'avoir 10 ligne pour choper les données ...

Reply

Marsh Posté le 28-09-2010 à 10:45:40    

Je comprend pas la question


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 28-09-2010 à 10:49:02    

hmmmm, bah je sais pas, genre dans mon controlleur de reservation j'ai ceci :  
 
$managerreservation = new ReservationManager();
 $managerclient = new ClientManager();  
 $managerville = new VilleManager();  
 $managervillage = new VillageManager();  
 $reservations = $managerreservation->getList();  
 
    $this->registry->template->reservations = $reservations;
 $this->registry->template->managerville = $managerville;
 $this->registry->template->managervillage = $managervillage;
 $this->registry->template->managerclient = $managerclient;
    $this->registry->template->show('reservation');
 
Ca me parrait pas propre.
 
Par exemple pour $reservations = $managerreservation->getList();  
je peux pas faire ça plutot : $reservations = ManagerReservation::getList(); ?  
 

Reply

Marsh Posté le 28-09-2010 à 11:13:26    

Ah, ça ça dépend de ta classe bien sûr :o
Si "getList()" retourne un résultat indépendant de l'instance de managerreservation, bien sur il faut le mettre comme méthode statique :o

 

Bref, on peut pas te répondre sans connaître ta structure et ton code :/

 

Edit :
Tu peux quand même un peu compacter ton code en remplaçant les :

 
Code :
  1. $managerreservation = new ReservationManager();
  2. $this->registry->template->reservations = $reservations;
 

par des

 
Code :
  1. $this->registry->template->reservations = new ReservationManager();

Message cité 1 fois
Message édité par esox_ch le 28-09-2010 à 11:14:58

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 28-09-2010 à 23:22:53    

tu peux aussi passer par une classe de configuration qui instancie pour toi les classes que tu as besoin.


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 28-09-2010 à 23:35:14    

Je vois pas comment faire ça :(

Reply

Marsh Posté le 28-09-2010 à 23:58:10    

il existe une librairy dans la SPL http://www.php.net/manual/fr/function.spl-autoload.php regarde les exemple :)
 
Edit : perso je l'utilise et je n'est plus aucun require_once dans mes classes...
juste un pour charger mon fichier de config ;)


Message édité par stef_dobermann le 29-09-2010 à 00:00:21

---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 29-09-2010 à 08:57:42    

Encore une brillante idée de PHP cet autoload ...
On dirait que les dev ne se posent jamais la question de savoir pourquoi leur langage est le seul de la planète à proposer certaines fonctionnalités loufoques.
Genre en mettant du autoload dans tous les sens, bonne chance pour savoir ce que fait exactement ton script.. sans parler des effets de bord potentiels


Message édité par esox_ch le 29-09-2010 à 08:57:56

---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 29-09-2010 à 08:57:42   

Reply

Marsh Posté le 29-09-2010 à 10:58:36    

je sais exactement ce que fais mon script, l'autoload n'est utilisé que quand j'instancie une classe ou que je fais appel à une fonction static dans une classe.
ça m'évite de faire des require_once à tout va sans être sur que la classe soit nécessaire au script à ce moment-là.
En même temps de gros projets comme DOCTRINE utilise l'autoload via la SPL...


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 29-09-2010 à 11:08:07    

Question de goûts peut-être.. Et dire que des gros projets utilisent quelque chose n'est pas forcément gage de qualité (suffi de voir le nombre de gros projets qui se sont trouvés dans la merde).
Par contre, même en utilisant autoload, ça va pas lui simplifier la vie concernant le fait qu'il doit créer ses objets et qu'il a l'air de ne pas avoir envie de le faire "à la main".  
À part essayer de feinter le coup en implémentant un semblant de meta-programmation à grand coups de "eval" (ce qui va être un vrai horreur à mon sens), je vois pas comment il peut éviter d'écrire ces lignes.


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 29-09-2010 à 11:13:58    

sur le point de "lui simplifier la vie concernant le fait qu'il doit créer ses objets" on peut aussi voir le pattern factory, mais il faut un minimum de parametre, sinon revoir la conception de ses classes, il pourrait intégrer dans le constructeur de l'une de ses classes intégrer l'instanciation des ces objets... mais avec "$this" il est déjà dans ça classe :(


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 29-09-2010 à 12:43:38    

Bof, outre les problèmes éventuels d'implémentation, moi je vois ce genre de combine généralement d'un mauvais oeil parce que ça te crée des classes qui n'ont aucun sens d'un point de vue système..
Tes factories sont là uniquement parce que t'as une pétée d'objets et que t’arrive pas à leur courir après. Mais du coup, je trouve que t'y perd quand même vachement en clarté quant tu voies des classes "factory" à tort et à travers dans ton UML.
Enfin bon, au fond dans un langage sans grandes possibilités de meta-programmation, t'as pas non plus 36'000 choix en effet :(


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 29-09-2010 à 15:31:52    

Post constructif :
on peut factoriser le code :
je présume que les fichiers XX.class.php comme par exemple : Client.class.php sont les même ?
si oui tu peux  créer une classe générique pour mettre les données à l'intérieur

Code :
  1. class Client
  2.     {
  3.         private $id_client,
  4.                 $id_ville,
  5.                 $etat_adhesion,
  6.                 $nom_client,
  7.                 $prenom,
  8.                 $adresse_client,
  9.                 $tel;
  10.       private $data = array();
  11.      
  12.         /**
  13.          * Constructeur de la classe Client
  14.          * @param $donnees array Les valeurs à assigner au personnage
  15.          * @return void
  16.          */
  17.                          public function __construct(array $donnees)
  18.         {
  19.                  foreach ($donnees as $key => $value)
  20. {
  21.                            $this->data[$key] = $value;
  22. }
  23.         }
  24.      public function __set($key, $value) {
  25.         $this->data[$key] = $value;
  26.      }
  27.      public function __get($key) {
  28.          return $this->data[$key];
  29.      }
  30.     }
  31. ?>


 
le rouge ne sert plus à rien, ensuite il faut bien sûr faire quelque contrôle, notamment sur __get pour vérifier si la clé existe et  __set pour vérifier que la clé n'existe pas pour ne pas effacer la précédente valeur.
ensuite clientmanager et clientcontroller sont presque identique ??
et baseController  il y a quoi à l'intérieur ?
tu peux ensuite réfléchir à une solution pour encore plus factoriser ton code en utilisant des parametres pour instancier tes classes automatiquement.
à suivre ....


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 29-09-2010 à 15:46:41    

En fait je suis partis de cet espece de framework mvc  :  
 
http://phpro.org/tutorials/Model-V [...] r-MVC.html
 
Tu trouves que clientmanager et clientcontroller sont presque identique ? Bah euh ... mon clientcontroller est mon contrôleur d'action et l'autre ma classe métier qui vas me permettre d'accéder au données. Je ne comprend pas trop ton affirmation/question ( faut dire que je ne comprend pas grand chose non plus haha ).

Reply

Marsh Posté le 29-09-2010 à 16:13:07    

Anycee : stef_dobermann essaie de t'aider à compacter ton code en créant une classe générique.
Par contre, je ne pense pas que ce soit la bonne manière de s'y prendre si on ne connaît pas la structure UML du projet.


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 29-09-2010 à 17:03:25    

c'est vrai, mais c'est juste pour lui donner des pistes à creuser
Edit : sinon on lui fait l'application et ce n'est pas le but du forum


Message édité par stef_dobermann le 29-09-2010 à 17:05:24

---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 29-09-2010 à 18:34:34    

Non certes, mais si on connait sa structure, on peut l'orienter vers le bon design pattern.
Encore que ... franchement en PHP je trouve que ça vaut presque pas la peine.. Quand tu essaies de faire les choses proprement, tu passes 90% de ton temps à te battre contre le langage qui lui, veut faire les choses autrement


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 29-09-2010 à 20:22:59    

Merci à vous en tout cas de m'aider c'est sympa :)  
 
Bon ! Déjà le MVC ça a l'air good, maintenant concernant l'optimisation de mes classes, comme j'ai dit tout a l'heure je suis parti du framework linké plus haut auquel j'ai ajouté mes classes etc ...  
 
Si ça peut vous en dire un peu plus voici un MCD http://img695.imageshack.us/i/mcde.jpg/  
J'ai créer une classe .class.php ainsi qu'un XXXXManager.class.php pour chaque entitée.  
 
Du coup dans mon contrôleur pour charger les données du model ça donne un truc genre ça dans mon contrôleur d'action Réservation reservationController.php : http://pastebin.com/ZLY3568V  
 
Ce que je veux surtout, c'est que mon code soit propre. Je galère vraiment ... Qu'est-ce que j'aimerai avoir un vrai formateur php poo ... Vive l'afpa !

Reply

Marsh Posté le 29-09-2010 à 23:37:21    

d'après "l'espèce de frameworks "  

Code :
  1. public function loader()
  2. {
  3.         /*** check the route ***/
  4.         $this->getController();
  5.         /*** if the file is not there diaf ***/
  6.         if (is_readable($this->file) == false)
  7.         {
  8.                 echo $this->file;
  9.                 die ('404 Not Found');
  10.         }
  11.         /*** include the controller ***/
  12.         include $this->file;
  13.         /*** a new controller class instance ***/
  14.         $class = $this->controller . 'Controller_';
  15.         $controller = new $class($this->registry);
  16.         /*** check if the action is callable ***/
  17.         if (is_callable(array($controller, $this->action)) == false)
  18.         {
  19.                 $action = 'index';
  20.         }
  21.         else
  22.         {
  23.                 $action = $this->action;
  24.         }
  25.         /*** run the action ***/
  26.         $controller->$action();
  27. }


 
en rouge il instancie la classe que l'utilisateur veut
en bleu il exécute l'action par exemple getlist()
et tout cela en analysant l'URL


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 30-09-2010 à 08:51:45    

Mm moui comme ça pourquoi pas. J'ai juste quelques doutes sur le "is_callable". Sauf erreur il peut créer des soucis si tu as genre une méthode statique ou private. De plus il ne detecte pas correctement les fonctions desactivées dans le php.ini il me semble.
Faudra probablement le wrapper dans quelque chose.
Mais sinon sur le principe, pas mal :bounce:


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 30-09-2010 à 09:07:24    

Yep steff_doberman j'avais compris ( pour une fois ) ces grandes lignes.  
 
Par contre  je ne comprend pas cette ligne. $class = $this->controller . 'Controller_';  
 
Sinon en gros, si j'appel le module "client" il vas instancier ma classe client. génial mais ça me sers à rien vu que ma classe client j'en ai pas besoin, j'ai besoin de ma classe ManagerClient.class.php pour charger mes données.  

Reply

Marsh Posté le 30-09-2010 à 10:03:43    

Son code te permet de faire un système qui détermine automatiquement quel contrôleur est nécessaire en fonction de l'URL, et appelle la bonne action (toujours en se basant sur l'URL).
Après, dans ton contrôleur, tu vas devoir de toutes façons instancier ton modèle "à la main".
Une fois ceci étant fait, tu peux (et ça serait d'ailleurs une bonne idée) compléter son loader par un appel à la vue, qui récupérerai une propriété cachée dans ton contrôleur afin de mettre en forme l'output


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 30-09-2010 à 10:27:37    

Oui c'est déjà comme ça que ça se fait.  
 
Dans mon controlleur d'action, une fois les données recuperer par le model j'ai  
 
    $this->registry->template->show('client');
 
et voila ma class template :  
 
http://pastebin.com/DrjJRT1Y

Reply

Marsh Posté le 30-09-2010 à 11:18:42    

esox_ch a écrit :

Son code te permet de faire un système qui détermine automatiquement quel contrôleur est nécessaire en fonction de l'URL, et appelle la bonne action (toujours en se basant sur l'URL).
Après, dans ton contrôleur, tu vas devoir de toutes façons instancier ton modèle "à la main".
Une fois ceci étant fait, tu peux (et ça serait d'ailleurs une bonne idée) compléter son loader par un appel à la vue, qui récupérerai une propriété cachée dans ton contrôleur afin de mettre en forme l'output


Alors rendons à Césars ce qui appartiens à Césars, le code présenté plus haut viens du frameworks de Anycee http://phpro.org/tutorials/Model-V [...] r-MVC.html
j'ai juste fait un copié collé ;)


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 30-09-2010 à 11:38:05    

anycee a écrit :

Yep steff_doberman j'avais compris ( pour une fois ) ces grandes lignes.  
 
Par contre  je ne comprend pas cette ligne. $class = $this->controller . 'Controller_';  
 
Sinon en gros, si j'appel le module "client" il vas instancier ma classe client. génial mais ça me sers à rien vu que ma classe client j'en ai pas besoin, j'ai besoin de ma classe ManagerClient.class.php pour charger mes données.  


 
cette ligne te permet de construire le nom de la classe mais ils ont dû se tromper quelques part.
toi tu n'as qu'à modifier cette ligne en  

Code :
  1. $class = $this->controller . 'Manager';


 
et la méthode getController dont voici le code :

Code :
  1. private function getController() {
  2.         /*** get the route from the url ***/
  3.         $route = (empty($_GET['rt'])) ? '' : $_GET['rt'];
  4.         if (empty($route))
  5.         {
  6.                 $route = 'index';
  7.         }
  8.         else
  9.         {
  10.                 /*** get the parts of the route ***/
  11.                 $parts = explode('/', $route);
  12.                 $this->controller = $parts[0];
  13.                 if(isset( $parts[1]))
  14.                 {
  15.                         $this->action = $parts[1];
  16.                 }
  17.         }
  18.         if (empty($this->controller))
  19.         {
  20.                 $this->controller = 'index';
  21.         }
  22.         /*** Get action ***/
  23.         if (empty($this->action))
  24.         {
  25.                 $this->action = 'index';
  26.         }
  27.         /*** set the file path ***/
  28.         $this->file = $this->path .'/'. $this->controller . '.php';
  29. }


c'est la partie rouge qui nous interresse :
par exemple pour charger le fichier ManagerClient.class.php qui contient la classe ClientManager, il faut que tu la modifie en  

Code :
  1. $this->file = $this->path .'/Manager'. ucfirst($this->controller) . '.class.php';


 
voila avec ça ton include est automatique, ton instanciation aussi, et l'exécution de ton action aussi :)
attention toute fois aux 2 ligne verte  qui initialise un contrôleur et une action par défaut, ta classe doit comporter une méthode index, ou bien tu modifie la deuxième ligne verte en remplaçant index par getlist.
Edit :  
pour finir, la ligne jaune faut pareil mais pour le contrôleur ...


Message édité par stef_dobermann le 30-09-2010 à 11:39:49

---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 30-09-2010 à 11:53:38    

esox_ch a écrit :

Mm moui comme ça pourquoi pas. J'ai juste quelques doutes sur le "is_callable". Sauf erreur il peut créer des soucis si tu as genre une méthode statique ou private. De plus il ne detecte pas correctement les fonctions desactivées dans le php.ini il me semble.
Faudra probablement le wrapper dans quelque chose.
Mais sinon sur le principe, pas mal :bounce:


 
on pourrait rempler is_callable par method_exists au pire


---------------
Tout à commencé par un rêve...
Reply

Marsh Posté le 30-09-2010 à 12:53:25    

Oui mais là aussi, tout est pas rose sauf erreur. J'ai vu quelque part sur la doc un mec qui a fait une méthode qui gère tous les cas de figure avec les méthodes qui-vont-bien. C'est pas un gros problème de tt façons, faut juste le savoir si tu veux te baser lourdement dessus [:spamafote]


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 03-10-2010 à 12:36:56    

Tiens ptite question encore. J'ai un lien qui genère une facture PDF, c'est bien le controlleur qui vas charger les données du pdf et la vue, generer le pdf ?

Reply

Marsh Posté le 03-10-2010 à 13:45:36    

oui exactement


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 03-10-2010 à 19:52:10    

esox_ch a écrit :

Code :
  1. $managerreservation = new ReservationManager();
  2. $this->registry->template->reservations = $reservations;



C'est marrant comme les choses semblent évoluer. En 2010, on semble moins faire du PHP "cra-cra" (=sans MVC ni séparation en couches) au profit d'une programmation plus modulaire et c'est bien.
 
Mais du code comme au-dessus, genre registry pattern, ça me fait penser à la façon de faire en J2EE d'il y a dix ans. Et on ne veut plus ça aujourd'hui en J2EE, parce que c'est vite lourd, et qu'on a des belles annotations genre @Inject (JSR-330), ou de manière plus évidente Spring pour la DI et tout le reste.
 
On peut espérer que PHP ne suivra pas la même évolution. En voulant tout modulariser et tout rendre flexible, on peut vite se ramasser. Si quelqu'un arrive et dit : "hé, on pourrait déclarer les ressources, les controllers et tout ça dans un fichier en dehors du code, par exemple dans un fichier XML, et ce serait vachement plus propre", il sera temps de quitter le navire radeau.
 
Mes 2 cents très philosophiques du dimanche soir  [:pingouino]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 03-10-2010 à 21:37:13    

À voir PHP6 et les brillantes décisions qui ont été prises par les dev, je pense que bientôt ça sera plus 10 ans de retard que PHP aura ... mais 20..


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 17-10-2010 à 18:26:51    

esox_ch a écrit :

À voir PHP6 et les brillantes décisions qui ont été prises par les dev


Comme quoi? On dirait plutôt que PHP fait du surplace. [:pingouino]  
 

Spoiler :

we are hs


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 18-10-2010 à 11:41:42    

La plupart des changements me semblent plutôt inutiles, mais quand je lis ça:
 

Citation :

Goto
No 'goto' command will be added, but the break keyword will be extended with a static label - so you could do 'break foo' and it'll jump to the label foo: in your code.


 
ça me fait penser que PHP ne sait vraiment pas ce qu'il se veut... Genre "PHP5 c'est pour devenir OO", et maintenant, on introduit goto? :heink:


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 18-10-2010 à 11:59:41    

C'est pas un goto, c'est un break :o Et ça peut servir.

Reply

Marsh Posté le 18-10-2010 à 12:01:54    

Mouais ... je pense qu'il y a quand même des problèmes de fonds plus importants en PHP à traiter que de rajouter une fonctionnalité goto-like à break Oo


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 18-10-2010 à 12:02:44    

Ouais ça c'est sûr :D

Reply

Marsh Posté le 24-04-2019 à 17:36:53    

Bonjour,  :hello:  
 
je répond un peu tardivement mais je souhaite également avoir un avis pour mon MVC.
 
Ici une image de la structure:https://i.ibb.co/mbv1XhB/MVC.png
 
Et ci-dessous quelques liens vers:
- index: https://pastebin.com/bP10we2R
- controller_classe: https://pastebin.com/QaCUM0hX
- model_class: https://pastebin.com/4BHtBvkk
- view_class: https://pastebin.com/wYjLYquT
- listall_view: https://pastebin.com/4cPCxaA9
- car_controller: https://pastebin.com/qidisTY6
 
Merci beaucoup pour votre avis  :D  :hello:  
 
Cordialement,
Henry

Reply

Marsh Posté le 26-04-2019 à 09:07:39    

J'ai oublié d'ajouter la partie avec la session dans ma réponse, la voici ci dessous:
 
La classe principale:

Code :
  1. <?php
  2. class Session{
  3.     public function __construct(){
  4.         session_start();
  5.     }
  6.     public function isLogged(){
  7.         if (isset($_SESSION['user'])) return true;
  8.         else return false;
  9.     }
  10.     public function write($key,$value){
  11.         $_SESSION[$key]=$value;
  12.     }
  13.     public function read($key){
  14.         if (isset($_SESSION[$key])) return $_SESSION[$key];
  15.         else return false;
  16.     }
  17.     public function delete($key){
  18.         if (isset($_SESSION[$key])) {
  19.             unset($_SESSION[$key]);
  20.             return true;
  21.         }
  22.         else return false;
  23.     }
  24. }
  25. ?>


 
Et le controleur pour l'utilisateur:

Code :
  1. <?php
  2. class UserController extends Controller {
  3.     private $mUser;
  4.     public function __construct() {
  5.         parent::__construct();
  6.     }
  7.     function index() {
  8.         $this->listall();
  9.     }
  10.     function login() {
  11.         $theview = new View();
  12.         $theview->display('Connection', 'user', 'login', false);
  13.     }
  14.     function dologin() {
  15.         $u = $_POST['user'];
  16.         $this->s->write('user', $u);
  17.         $this->redirect('home', 'accueil');
  18.     }
  19.     function logout() {
  20.         $this->s->delete('user');
  21.         $this->redirect('home', 'accueil');
  22.     }
  23. }
  24. ?>


 
et finalement la vue pour le login:

Code :
  1. <form action="<?php echo URL_ROOT;?>/user/dologin" method="post">
  2.     <input name="user" type="text"/><br/>
  3.     <input name="pwd" type="password"/><br/>
  4.     <button class="submit">Valider</button>
  5. </form>


Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed