74. PHP - Gestion de formulaire

Ce TP a pour but de permettre :

Ce tp aura pour résultat final, une page internet permettant grâce à un formulaire d'afficher les données saisies et de donner un lien vers un fichier uploadé.

74.1. Classe utilisateur (user)

Exercice : Créez dans un fichier ObjectUser.php une classe utilisateur (User) comprenant les propriétés (attributs) :

Contenu de la classe ObjectUser.php :

<?php
	class User {
		public function __construct()
		{}
		
		public function getName()
		{ return $this->mName; }
		public function getSurname()
		{ return $this->mSurname; }
		public function getLogin()
		{ return $this->mLogin; }
		public function getPassword()
		{ return $this->mPassword; }
		public function getAnotherInformations()
		{ return $this->mAnotherInformations; }
		public function getCV()
		{ return $this->mCV; }
		
		public function setName($mName)
		{ $this->mName = $mName; }
		public function setSurname($mSurname)
		{ $this->mSurname = $mSurname; }
		public function setLogin($mLogin)
		{ $this->mLogin = $mLogin; }
		public function setPassword($mPassword)
		{ $this->mPassword = $mPassword; }
		public function setAnotherInformations($mAnotherInformations)
		{ $this->mAnotherInformations = $mAnotherInformations; }
		public function setCV($mCV)
		{ $this->mCV = $mCV; }
		
		private $mName;
		private $mSurname;
		private $mLogin;
		private $mPassword;
		private $mAnotherInformations;
		private $mCV;
	}
?>

74.2. Le formulaire

Exercice : Créez une page Formulaire.php, dans laquelle vous inclurez votre fichier ObjectUser.php. Ajoutez une méthode printForm() à votre objet User, permettant d'afficher l'ensemble des champs dont vous avez besoin pour la saisie d'un utilisateur (penser au champ de type password pour le mot de passe et file pour le CV). Utilisez enfin dans votre page formulaire.php cette méthode pour afficher votre formulaire.

n.b : la méthode printForm() peut ne contenir que votre formulaire (<form etc. </form>), mais la page html doit être valide. Ce formulaire doit poster vers la page affichage.php.

n.b : Pour uploader un fichier, vous aurez besoin dans votre balise formulaire de l'attribut enctype="multipart/form-data", et vous passerez obligatoirement par la méthode post. Le champs caché MAX_FILE_SIZE est obligatoire en html, même si les navigateurs ne le prennent pas en compte.

<form enctype="multipart/form-data" action="_URL_" method="post">
<!-- MAX_FILE_SIZE doit précéder le champs input de type file -->
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
<!-- Le nom de l'élément input détermine le nom dans le tableau $_FILES -->
Envoyez ce fichier : <input name="userfile" type="file" />
<input type="submit" value="Envoyer le fichier" />
</form>

Nouvelle version de la classe User :

<?php
	class User {
		public function __construct()
		{}
		
		public function getName()
		{ return $this->mName; }
		public function getSurname()
		{ return $this->mSurname; }
		public function getLogin()
		{ return $this->mLogin; }
		public function getPassword()
		{ return $this->mPassword; }
		public function getAnotherInformations()
		{ return $this->mAnotherInformations; }
		public function getCV()
		{ return $this->mCV; }
		
		public function setName($mName)
		{ $this->mName = $mName; }
		public function setSurname($mSurname)
		{ $this->mSurname = $mSurname; }
		public function setLogin($mLogin)
		{ $this->mLogin = $mLogin; }
		public function setPassword($mPassword)
		{ $this->mPassword = $mPassword; }
		public function setAnotherInformations($mAnotherInformations)
		{ $this->mAnotherInformations = $mAnotherInformations; }
		public function setCV($mCV)
		{ $this->mCV = $mCV; }
		
		public static function printForm() {
			$output = "<form name=\"form\" enctype=\"multipart/form-data\" method=\"POST\" action=\"". $_SERVER['PHP_SELF'] ."\">\n";
				$output .= "<table>\n";
					$output .= "<tr>\n";
						$output .= "<td>Nom : </td>\n";
						$output .= "<td><input type=\"text\" name=\"surname\" /></td>\n";
					$output .= "</tr>\n";
					$output .= "<tr>\n";
						$output .= "<td>Prénom : </td>\n";
						$output .= "<td><input type=\"text\" name=\"name\" /></td>\n";
					$output .= "</tr>\n";
					$output .= "<tr>\n";
						$output .= "<td>Identifiant : </td>\n";
						$output .= "<td><input type=\"text\" name=\"login\" /></td>\n";
					$output .= "</tr>\n";
					$output .= "<tr>\n";
						$output .= "<td>Mot de passe : </td>\n";
						$output .= "<td><input type=\"password\" name=\"password\" /></td>\n";
					$output .= "</tr>\n";
					$output .= "<tr>\n";
						$output .= "<td>Informations complémentaires : </td>\n";
						$output .= "<td><textarea name=\"anotherInformations\" rows=\"5\" cols=\"30\"></textarea></td>\n";
					$output .= "</tr>\n";
					$output .= "<tr>\n";
						$output .= "<input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"30000\" />\n";
						$output .= "<td>Curriculum Vitae : </td>\n";
						$output .= "<td><input type=\"file\" name=\"cv\" /></td>\n";
					$output .= "</tr>\n";
					$output .= "<tr>\n";
						$output .= "<td colspan=\"2\"><input type=\"submit\" value=\"Valider\" /></td>";
					$output .= "</tr>\n";
				$output .= "</table>\n";
			$output .= "</form>\n";
			
			echo $output;
		}
		
		private $mName;
		private $mSurname;
		private $mLogin;
		private $mPassword;
		private $mAnotherInformations;
		private $mCV;
	}
?>

Contenu du fichier Formulaire.php :

<?php
	include_once("./ObjectUser.php");
	
	echo "<html>";
		echo "<head><title>Formulaire.php</title></head>";
		echo "<body>";
			User::printForm();
		echo "</body>";
	echo "</html>";
?>

Ce qui nous donne pour l'instant :

Figure 66. Le formulaire "User"

74.3. La page d'affichage

Cette page va récupérer les données postées par le formulaire. Vous inclurez de la même manière votre fichier ObjectUser.php et lui ajouterez deux méthodes :

Pour rendre accessible le fichier uploadé depuis votre navigateur, vous utiliserez la fonction move_uploaded_file.

Nouveau contenu du fichier ObjectUser.php :

<?php
	class User {
		public function __construct()
		{}
		
		public function getName()
		{ return $this->mName; }
		public function getSurname()
		{ return $this->mSurname; }
		public function getLogin()
		{ return $this->mLogin; }
		public function getPassword()
		{ return $this->mPassword; }
		public function getAnotherInformations()
		{ return $this->mAnotherInformations; }
		public function getCV()
		{ return $this->mCV; }
		
		public function setName($mName)
		{ $this->mName = $mName; }
		public function setSurname($mSurname)
		{ $this->mSurname = $mSurname; }
		public function setLogin($mLogin)
		{ $this->mLogin = $mLogin; }
		public function setPassword($mPassword)
		{ $this->mPassword = $mPassword; }
		public function setAnotherInformations($mAnotherInformations)
		{ $this->mAnotherInformations = $mAnotherInformations; }
		public function setCV($mCV)
		{ $this->mCV = $mCV; }
		
		public static function printForm() {
			$output = "<form name=\"form\" enctype=\"multipart/form-data\" method=\"POST\" action=\"". $_SERVER['PHP_SELF'] ."\">\n";
				$output .= "<table>\n";
					$output .= "<tr>\n";
						$output .= "<td>Nom : </td>\n";
						$output .= "<td><input type=\"text\" name=\"surname\" /></td>\n";
					$output .= "</tr>\n";
					$output .= "<tr>\n";
						$output .= "<td>Prénom : </td>\n";
						$output .= "<td><input type=\"text\" name=\"name\" /></td>\n";
					$output .= "</tr>\n";
					$output .= "<tr>\n";
						$output .= "<td>Identifiant : </td>\n";
						$output .= "<td><input type=\"text\" name=\"login\" /></td>\n";
					$output .= "</tr>\n";
					$output .= "<tr>\n";
						$output .= "<td>Mot de passe : </td>\n";
						$output .= "<td><input type=\"password\" name=\"password\" /></td>\n";
					$output .= "</tr>\n";
					$output .= "<tr>\n";
						$output .= "<td>Informations complémentaires : </td>\n";
						$output .= "<td><textarea name=\"anotherInformations\" rows=\"5\" cols=\"30\"></textarea></td>\n";
					$output .= "</tr>\n";
					$output .= "<tr>\n";
						$output .= "<input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"30000\" />\n";
						$output .= "<td>Curriculum Vitae : </td>\n";
						$output .= "<td><input type=\"file\" name=\"cv\" /></td>\n";
					$output .= "</tr>\n";
					$output .= "<tr>\n";
						$output .= "<td colspan=\"2\"><input type=\"submit\" value=\"Valider\" /></td>";
					$output .= "</tr>\n";
				$output .= "</table>\n";
			$output .= "</form>\n";
			
			echo $output;
		}
		
		public function execForm() {
			if (!empty($_POST['name']))
				$this->mName = $_POST['name'];
			if (!empty($_POST['surname']))
				$this->mSurname = $_POST['surname'];
			if (!empty($_POST['login']))
				$this->mLogin = $_POST['login'];
			if (!empty($_POST['password']))
				$this->mPassword = $_POST['password'];
			if (!empty($_POST['anotherInformations']))
				$this->mAnotherInformations = $_POST['anotherInformations'];
				
			if (!empty($_FILES['cv'])) {
				$uploads_dir = '/uploads';
				if ($_FILES['cv']['error'] == UPLOAD_ERR_OK) {
					$tmp_name = $_FILES['cv']['tmp_name'];
					$name = $_FILES['cv']['name'];
					move_uploaded_file($tmp_name, ".$uploads_dir/$name");
					$this->mCv = $uploads_dir . "/" . $name;
				}
			}	
		}
		
		public function printData() {
			echo "Prénom :" . $this->mName . "<br/>\n";
			echo "Nom :" . $this->mSurname . "<br/>\n";
			echo "Identifiant :" . $this->mLogin . "<br/>\n";
			echo "Mot de passe :" . $this->mPassword . "<br/>\n";
			echo "Informations complémentaires :" . $this->mAnotherInformations . "<br/>\n";
			echo "Fichier uploadé : <a href=\"".$this->mCv."\">lien</a>.";
		}
		
		private $mName;
		private $mSurname;
		private $mLogin;
		private $mPassword;
		private $mAnotherInformations;
		private $mCV;
	}
?>

Nouveau contenu du fichier Formulaire.php :

<?php
	include_once("./ObjectUser.php");
	
	echo "<html>";
		echo "<head><title>Formulaire.php</title></head>";
		echo "<body>";
			if (empty($_POST) && empty($_FILES)) {
				User::printForm();
			} else {
				$monUtilisateur = new User();
				$monUtilisateur->execForm();
				$monUtilisateur->printData();
			}
		echo "</body>";
	echo "</html>";
?>

Exemple de rendu :

Figure 67.

74.4. Fichiers sources