Comment trouviez vous ce cours ?

1(50%)
0
1(50%)

Appéciations du lecteurs :

Visualisations : 646
Appreciations : 2

A propos de l'auteur :

R@chid
Email: victrachild@yahoo.com
Validation du cour :

Php Mvc - Tp

Peut on créer une application Php Mvc sans utiliser un farmwork? 

Partie précédente           

        4 - Dispatcher, Layout, Feuille de style .

Le dispatcher reçoit l'url et recupère le contrôleur, l'action et l'id.

Notre travaille consiste sur l'envoi du nom de contrôleur, l'action, et l'id à travers l'url.

index.php

Affichage :

    On ajoutant cette partie de code qui va cherche le fichiers contenant le contrôleur demandé puis l'inlure, s'il y a une action il va l'appeler, et s'il y a un id, il va le transmettre dans l'action.

index.php

L'url

    Layout ou Master plan c'est la mise en page de site ou le plan graphique de site. voilà le gabarit de notre site.

layout.

    Il reste une autre tâche à effectuer par ce dispatcher(index.php), la connexion avec le serveur de la base de données et la sélection de la base. Le code final de index.php :

index.php

<?php
	session_start();
?>
<html>
	<head>
		<title></title>
		<link href="Views/Style/style.css" rel="stylesheet" type="text/css" />
	</head>
	<body>
		<div id="wrap">
			<div id="header">
				<h1>Géstion des Stocks</h1>
			</div>
			<div id="content">
				<div id="Menu">
					<h3>Menu</h3>
					<ul>
						<li><a href="?controler=Home">Home</a>
						</li>
						<li><a href="?controler=Produit">Stocks
						</a></li>
						<li><a href="?controler=Fournisseur">
						Fournisseurs</a></li>
					</ul>
				</div>
				<div id="main">
					<?php
						//Connexion au serveur de base de données
						mysql_connect('localhost', 'root', '');
						mysql_select_db('stockProduits');
						/*Traitement de la Requettes*/ 
						$controler = 'Home';
						$action = 'index';
						$id = '';
						if(!empty($_GET['controler'])){
							$controler = $_GET['controler'];
							if(!empty($_GET['action'])){
								$action = $_GET['action'];
								if(!empty($_GET['id']))
									$id = $_GET['id'];
							}
						}
				//On inclut le fichier s'il existe et s'il est spécifié
						if(is_file('Controllers/'.$controler.
					'.Controller.php')){
						include 'Controllers/'.$controler.
									'.Controller.php';
						$class = $controler."Controller";
						$objet = new $class();
						$objet->$action($id);
					}
						//Fermeture de connexion avec Serveur de DB
						mysql_close();
					?>
				</div>
			</div>
			<div id="footer">
				Programmation en Pratique 2012
			</div>
		</div>
	</body>
</html>

Dans le contrôleur Home on crée une action index();

Home : page par défaut

Affichage :

        5 - Contrôleur et vue .

    Maintenant que nous avons créer le cerveau* de l'application, on va développer les actions de contrôleur produit

Chaque contrôleur a au moins une action (index) qu'elle correspond a une vue particulière (index.phtml).

Prenant le cas de demande de site pour la 1° fois, le contrôleur et son action par défaut sont "HomeController" et "index", il doit appeler la vue "index.phtml" situant dans le dossier "Home" dans Views.

Contrôleur : Home.Controller.php

Vue : Views/Home/index.phtml

Affichage :

    On doit inclure chaque fois la vue dans chaque action correspondante, hors on peut développer une fonction qui nous retourne dans chaque action la vue correspondante. Cette fonction doit être utilisable dans tous les contrôleurs, c'est pour cela qu'elle doit être déclarer dans la classe mère, nous avons aussi besoin d'une fontion qui permet la rederiction.

Contôleur : Controllers/Controller.Controller.php

<?php
	//inclusion les models , utilisés par les actions de controlleur
	include(dirname(__FILE__).'/../Models/Produit.Model.php');
	include(dirname(__FILE__).'/../Models/FamilleProduit.Model.php');
	include(dirname(__FILE__).'/../Models/Stock.Model.php');
	/*  Controlers : Classe Abstraite */
	abstract class Controller{
		/*Un tableau pour Récupère le données de contrôleur (provenant 
		éventuellement de models) pour usage futur(Dans les vues)*/
		protected $viewData = array();
		
		//Retourne la vue correspondante
		protected function View($action){
			//Récupèrer le controleur a partir de classe fille.
			$controller = str_replace('Controller', '', get_class($this));
			//La vue correspondant
			$view = $controller . '/' . $action.'.phtml';
			include(dirname(__FILE__).'/../Views/'.$view);
		}
		//Rederiction vers une action d'un contrôleur
		protected function RederictAction(){
	/*Récupération des paramétres : contrôleur(action index par défaut ou action d'un 
	contrôleur précis avec ou sans id identifiant d'un objet qui aurais subi l'action*/
			$arg_list = func_get_args();
			if(count($arg_list)== 1)
				$url = 'controler='.$arg_list[0];
			elseif(count($arg_list)== 2)
				$url = 'controler='.$arg_list[0].'&action='.$arg_list[1];
			else
				$url = 'controler='.$arg_list[0].'&action='.$arg_list[1].'
						&id='.$arg_list[2];
			echo '<script type="text/javascript">
					window.location = "?'.$url.'"</script>';
		}
	}
?>

Contrôleur : Controllers/Home.Controller.php

<?php
	/*  Controlers : Home*/
	//Inclusion de Classe Mére
	require_once('Controller.Controller.php');
	class HomeController extends Controller{
		
		//Action index
		public function index(){
			$this->View( __FUNCTION__);
		}
	}
?>

Maintenant on va se concentrer sur les actions définie dans le diagramme de séquence,

  • Contrôleur : Produit
  • Actions : index(toujours par défaut), ajouter, modifier, supprimer, et stocker
  • Vues : index.phtml(liste des produits), ajouter.phtml, ...stocker.phtml

Contrôleur : Produit.Controller.php.

<?php
	/*  Controlers : Produit*/
	//Inclusion de Classe Mére
	require_once('Controller.Controller.php');
	class ProduitController extends Controller{
		
		//Action index
		public function index(){
			$produit = new ProduitModel();
			//met dans viewData une liste des produits
			$this->viewData['listProduit'] = $produit->listProduit();
			$this->View(__FUNCTION__);
		}

Vue : Produit/index.phtml

<h1>Listes de Produits</h1>
<table>
	<tr>
		<th>N°</th><th>Designation</th>
		<th>Prix Unitaire (Dh)</th><th>Tva(%)</th>
		<th>Quantité</th><th>Suppression</th>
		<th>Modification</th><th>Stockage</th>
	</tr>
	<?php 
		//On récupère la liste a partir de viewData
		foreach($this->viewData['listProduit'] as $produit) :
			echo'<tr><td>'.$produit['id'].'</td>
			     <td>'.$produit['designation'].'</td>
				 <td>'.$produit['prixUnitaire'].'</td>
				 <td>'.$produit['tva'].'</td>
				 <td>'.$produit['quantite'].'</td>
				 <td><a href="?controler=Produit&action=modifier&id=
					'.$produit['id'].'">Modifier</a></td>
				 <td><a href="?controler=Produit&action=supprimer&id=
					'.$produit['id'].'">Supprimer</a></td>
				 <td><a href="?controler=Produit&action=stocker&id=
					'.$produit['id'].'">Stocker</a></td>
				 </tr>';
		endforeach;
	?>
</table>
<a href="?controler=Produit&action=ajouter">Ajouter un nouveau produit</a>

Affichage :

Action : ajouter()

Contrôleur : Produit.Controller.php

//Action :ajouter
		public function ajouter(){
			$produit = new ProduitModel();
			$this->viewData['produit'] = $produit;
			$famille = new FamilleProduit();
			$this->viewData['listFamille'] = $famille->listFamilleProduit();
			/*Pour éviter que les message d'erreurs ne soient afficher 
			au premier appel de la vue, on vérifier */
			if(!isset($_POST['designation']))
				$this->View(__FUNCTION__);
			else{
			$produit->setDesignation($_POST['designation']);
			$produit->AddModelError("designation", " * Erreur Désignation");
			$produit->setPrixUnitaire($_POST['prix']);
			$produit->AddModelError("prixUnitaire", " * Erreur Prix Unitaire");
			$produit->setTva($_POST['tva']);
			$produit->AddModelError("tva", " * Erreur tva");
			$produit->setQuantite($_POST['quantite']);
			$produit->AddModelError("quantite", " * Erreur Quantité");
			$produit->setIdFamille($_POST['famille']);
			//Validation des données.
			if($produit->IsValid()){
				$produit->addProduit();
				//rederiction vers index.phtml
				$this->RederictAction("Produit");
			}else
				$this->View(__FUNCTION__);
			}
		}

Vue : Produit/ajouter.phtml

<h1>Ajouter un nouveau produit</h1>
<form id="form1" method="post">
	<table>
		<tr>
			<td>Designation : </td>
			<td>
				<input type="text" id="designation" name="designation" 
			value="<?php echo $this->viewData['produit']->getDesignation();?>"/>
				<span id="erreur">
		<?php 
			echo $this->viewData['produit']->ValidationMessage("designation");
		?>
				</span>
			</td>
		</tr>
		<tr>
			<td>Prix Unitaire : </td>
			<td>
				<input type="text" id="prix" name="prix" 
		value="<?php echo $this->viewData['produit']->getPrixUnitaire();?>"/>(DH)
				<span id="erreur">
		<?php 
			echo $this->viewData['produit']->ValidationMessage("prixUnitaire");
		?>
				</span>
			</td>
		</tr>
		<tr>
			<td>Tva : </td>
			<td>
				<input type="text" id="tva" name="tva" 
			value="<?php echo $this->viewData['produit']->getTva();?>"/>(%)
				<span id="erreur">
				<?php 
				echo $this->viewData['produit']->ValidationMessage("tva");
				?></span>
			</td>
		</tr>
		<tr>
			<td>Quantité : </td>
			<td><input type="text" id="quantite" name="quantite" 
		value="<?php echo $this->viewData['produit']->getQuantite();?>"/>
			<span id="erreur">
			<?php 
			echo $this->viewData['produit']->ValidationMessage("quantite");
			?></span>
		</td>
		</tr>
		<tr>
			<td>Famille : </td>
			<td>
				<select id="famille" name="famille">
				<?php 
					foreach($this->viewData['listFamille'] as $cat)
						echo '<option value="'.$cat['id'].'">
						'.$cat['famille'].'</option>';
				?>
				</select>
			</td>
		</tr>
		<tr><td colspan='2'><input type="submit" value="Ajouter" /></td></tr>
	</table>
</form>

Affichage :

Action : modifier()

Contrôleur : Produit.Controller.php

//Action : Modifier
	public function modifier($id){
		$produit = new ProduitModel();
		$this->viewData['produit'] = $produit->findProduit($id);
		$famille = new FamilleProduit();
		$this->viewData['listFamille'] = $famille->listFamilleProduit();
		if(!isset($_POST['designation']))
			$this->View( __FUNCTION__);
		else{
			$produit->setDesignation($_POST['designation']);
			$produit->AddModelError("designation", " * Erreur Désignation");
			$produit->setPrixUnitaire($_POST['prix']);
			$produit->AddModelError("prixUnitaire", " * Erreur Prix Unitaire");
			$produit->setTva($_POST['tva']);
			$produit->AddModelError("tva", " * Erreur tva");
			$produit->setQuantite($_POST['quantite']);
			$produit->AddModelError("quantite", " * Erreur Quantité");
			$produit->setIdFamille($_POST['famille']);
			if($produit->IsValid()){
				$produit->updateProduit($id);
				//rederiction vers index.phtml
				$this->RederictAction("Produit");
			}else
				$this->View( __FUNCTION__);
		}
	}

Vue : Produit/modifier.phtml

<h1>Modifier un produit</h1>

<form id="form1" method="post">
	<table>
		<tr>
			<td>Id : </td>
			<td><input type="text" id="id" name="id" readonly="true" 
				value="<?php echo $this->viewData['produit']->getId();?>"/>
			</td>
		</tr>
		<tr>
			<td>Designation : </td>
			<td><input type="text" id="designation" name="designation" 
			value="<?php echo $this->viewData['produit']->getDesignation();?>"/>
				<span id="erreur"><?php 
			echo $this->viewData['produit']->ValidationMessage("designation");
				?></span>
			</td>
		</tr>
		<tr>
			<td>Prix Unitaire : </td>
			<td><input type="text" id="prix" name="prix" 
		value="<?php echo $this->viewData['produit']->getPrixUnitaire();?>"/>(DH)
			<span id="erreur"><?php 
		echo $this->viewData['produit']->ValidationMessage("prixUnitaire");
			?></span>
		</td>
		</tr>
		<tr>
			<td>Tva : </td>
			<td><input type="text" id="tva" name="tva" 
			value="<?php echo $this->viewData['produit']->getTva();?>"/>(%)
				<span id="erreur"><?php 
			echo $this->viewData['produit']->ValidationMessage("tva");
				?></span>
			</td>
		</tr>
		<tr>
			<td>Quantité : </td>
			<td><input type="text" id="quantite" name="quantite" 
			value="<?php echo $this->viewData['produit']->getQuantite();?>"/>
				<span id="erreur"><?php 
			echo $this->viewData['produit']->ValidationMessage("quantite");
				?></span>
			</td>
		</tr>
		<tr>
			<td>Famille : </td>
			<td>
				<select id="famille" name="famille">
				<?php 
			foreach($this->viewData['listFamille'] as $cat) :
				if($cat['id'] == $this->viewData['produit']->getIdFamille())
					echo '<option value="'.$cat['id'].'" selected>'
						.$cat['famille'].'</option>';
				else
					echo '<option value="'.$cat['id'].'">'
						.$cat['famille'].'</option>';
			endforeach;
					?>
				</select>
			</td>
		</tr>
		<tr><td colspan='2'><input type="submit" 
		value= "  Modifier  " /></td></tr>
	</table>
</form>

Affichage :

Action : supprimer()

Contrôleur : Produit.Controller.php

//Action : Supprimer
	public function supprimer($id){
		$produit = new ProduitModel();
		$this->viewData['produit'] = $produit->findProduit($id);
		$famille = new FamilleProduit();
		$this->viewData['listFamille'] = $famille->listFamilleProduit();
		if(isset($_POST['id'])){
			$produit->deleteProduit($id);
			//rederiction vers index.phtml
			$this->RederictAction("Produit");
		}
		$this->View(__FUNCTION__);
	}

Vue : Produit/modifier.phtml

<h1>Supprimer un produit</h1>

<form id="form1" method="post">
	<table>
		<tr>
			<td>Id : </td>
			<td><input type="text" id="id" name="id" readonly="true" 
				value="<?php echo $this->viewData['produit']->getId();?>"/>
			</td>
		</tr>
		<tr>
			<td>Designation : </td>
			<td>
			<input type="text" id="designation" name="designation" 
				readonly="true" value="<?php 
				    echo $this->viewData['produit']->getDesignation();?>"/>
			</td>
		</tr>
		<tr>
			<td>Prix Unitaire : </td>
			<td>
				<input type="text" id="prix" readonly="true" name="prix" 
				value="<?php 
				echo $this->viewData['produit']->getPrixUnitaire();?>"/>(DH)
			</td>
		</tr>
		<tr>
			<td>Tva : </td>
			<td>
				<input type="text" id="tva" readonly="true" 
			name="tva" value="<?php 
				echo $this->viewData['produit']->getTva();?>"/>(%)
			</td>
		</tr>
		<tr>
			<td>Quantité : </td>
			<td>
				<input type="text" id="quantite" readonly="true" 
			name="quantite" value="<?php 
				echo $this->viewData['produit']->getQuantite();?>"/>
			</td>
		</tr>
		<tr>
			<td>Famille : </td>
			<td>
				<input type="text" id="famille" readonly="true" 
				name="famille" value="<?php
			foreach($this->viewData['listFamille'] as $cat)
				if($cat['id'] == $this->viewData['produit']->getIdFamille())
						echo $cat['famille'];
				?>"/>
			</td>
		</tr>
		<tr><td colspan='2'><input type="submit" value= "  Supprimer  " />
		</td></tr>
	</table>
</form>
<a href="?controler=Produit">Retour</a>

Affichage :

Action : stocker()

Contrôleur : Produit.Controller.php

//Action : Stocker
	public function stocker($id){
		$stock = new StockModel();
		$stock->setIdProduit($id);
		$this->viewData['stock'] = $stock;
		$this->viewData['listStock'] = $stock->listStockProduit();
		if(!isset($_POST['date']))
			$this->View( __FUNCTION__);
		else{
			$stock->setDate($_POST['date']);
			$stock->AddModelError("date", " * Date invalide");
			$stock->setQuantite($_POST['quantite']);
			$stock->AddModelError("quantite", " * Quantite invalide");
			if($stock->IsValid()){
				$stock->addStock();
				//rederiction vers index.phtml
				$this->RederictAction("Produit");
			}else
				$this->View( __FUNCTION__);
		}
	}
	//Autre Actions : ....

Vue : Produit/modifier.phtml

<h1>Stockage de Produit </h1>
<form id="form1" method="post">
	<table>
		<tr><th>N°</th><th>Date de Stock</th><th>Quantité</th></tr>
		<?php 
			//Listes des Stock d'un produit
			foreach($this->viewData['listStock'] as $stock)
				echo '<tr><td>'.$stock['id'].'</td><td>'.$stock['date']
				.'</td><td>'.$stock['quantite'].'</td></tr>';

		?>
		<tr>
			<td>Nouveau Stock</td>
			<td>
				<input type="text" id='date' name='date' 
			value="<?php echo $this->viewData['stock']->getDate();?>"/>
				<br>
				<span id="erreur">
			<?php echo $this->viewData['stock']->ValidationMessage("date");?>
				</span>
			</td>
			<td>
				<input type="text" id='quantite' name='quantite' 
			value="<?php echo $this->viewData['stock']->getQuantite();?>"/>
				<br>
				<span id="erreur">
			<?php echo $this->viewData['stock']->ValidationMessage("quantite");?>
				</span>
			</td>
		</tr>
		<tr><td colspan='3'><input type="submit" value="Ajouter au Stock" />
		</td></tr>
	</table>
	<a href="?controler=Produit">Retour</a>
</form>

Affichage :


Partie précédente           






Téléchargement ...