TP 4 Prog. Web – Structure de base MVC
version 2 : vérifier les données et si une erreur est détectée, réafficher le formulaire avec les données saisies par l'utilisateur ainsi que les erreurs détectées (lors de la création et la
modification d'un produit) exemple de script :
public function validFormCreerProduit() {
$erreurs=array();
$donnees['nom']=htmlentities($_POST['nom']); // evite injection js ...
$donnees['id_type']=htmlentities($_POST['id_type']);
$donnees['prix']=htmlentities($_POST['prix']);
$donnees['photo']=htmlentities($_POST['photo']);
if (!preg_match("/[AZaz]{2,}/",$donnees['nom']))
$erreurs['nom']='le nom doit être composé au minimum de 2 lettres';
if(! ctype_digit($donnees['id_type']))
$erreurs['id_type']='veuillez saisir un entier';
elseif (!$this>instanceModelProduit>verif_id_type($donnees['id_type'])) $erreurs['id_type']='Saisir une valeur numérique qui existe dans la table id_type';
if(! is_numeric($donnees['prix']))
$erreurs['prix']='veuillez saisir une valeur numérique';
if (! preg_match("/[AZaz09]{2,}.(jpeg|jpg|png)/",$donnees['photo'])) $erreurs['photo']='nom de fichier incorrect, extension .jpeg ou .jpg ou .png';
if(! empty($erreurs)) {
include("views/v_head.php");
include("views/v_menu.php");
include("views/v_form_create_produit.php");
include("views/v_foot.php");
} else {
$this>instanceModelProduit>insertUnProduit($donnees);
header("Location: ".BASE_URL."index.php/Produit/afficherProduits");
}
}
dans chaque vue, intégrer l'affichage des erreurs :
<label>Nom
<input name="nom" type="text" size="18" value="<?php if(isset($donnees['nom'])) echo $donnees['nom']; ?>"/>
<?php if(isset($erreurs['nom'])) echo '<small class="error">'.$erreurs['nom'].'</small>'; ?>
</label>
gérer une liste déroulante, cette liste permet de remplacer l'identifiant du type de produit,
<label>Type
<select name="id_type">
<?php foreach($typeProduit as $key=>$value) : ?>
<option value="<?php echo $key; ?>"
<?php if(isset($donnees['id_type']) and $donnees['id_type']==$key): ?>
selected<?php endif; ?> >
<?php echo $value; ?>
</option>
<?php endforeach; ?>
</select>
<?php if(isset($erreurs['id_type'])) echo '<small class="error">'.
$erreurs['id_type'].'</small>'; ?>
</label>
dans votre modèle, intégrer une méthode pour récupérer le contenu de la liste déroulante, exemple :
function dropDownTypeProduit(){
$requete="SELECT id_type,libelle FROM typeProduit ORDER BY id_type;";
$select = $this>db>query($requete);
$result = $select>fetchAll();
$liste_dropDown = array();
if(count($result) > 0){
$liste_dropDown[''] = 'selectionner un type';
foreach($result as $row){
$liste_dropDown[$row['id_type']] = $row['libelle'];
Routage avec slim
# installation : dans un terminal, sur le dossier racine (index.php), installer composer et exécuter la commande ci dessous :
composer require slim/slim "^3.0"
* dans le fichier `index.php`
commenter et rajouter
//include("kernel.php");
require 'vendor/autoload.php';
$app = new \Slim\App;
faire quelques tests
$app>get('/',function(){
echo 'bienvenue';
});
$app>get('/hello/{name}', function ($request, $response, $args) { $response>write("Hello, " . $args['name']);
return $response;
});
$app>get('/hello2[/{name}]', function ($request, $response, $args) { $response>write("Hello, " . $args['name']);
return $response;
})>setArgument('name', 'World!');
$app>get('/produit', function ($request, $response, $args) { include('controllers/produit_c.php');
$instanceProduit = new Produit();
$instanceProduit>index();
});
// Run app
$app->run();
# à l'aide des exemples ci dessus refaire le routage de votre application
Autre exemple de contrôle des données
remplacer dans l'exemple ci dessus les fonctions de contrôle si c'est possible par des fonction du type filter_var
http://php.net/manual/fr/intro.filter.php
http://www.w3schools.com/php/php_filter.asp
ANNEXE
<?php
$filter = array(
'email' => FILTER_VALIDATE_EMAIL,
'septdigits' => array('filter' => FILTER_VALIDATE_REGEXP, 'options' => array('regexp' => '/^\d{7}$/')
),
'zeroAvingt' => array('filter' => FILTER_VALIDATE_INT, 'options' => array('min_range' => 0,'max_range' => 20) ),
'encodeurl' => array( 'filter' => FILTER_SANITIZE_ENCODED ), 'checkboxes' => array( 'filter' => FILTER_VALIDATE_INT, 'flags' => FILTER_REQUIRE_ARRAY,
),
'estUnBoolean' => array( 'filter' => FILTER_VALIDATE_BOOLEAN ), 'validurl' => FILTER_VALIDATE_URL,
'doitExister' => FILTER_VALIDATE_INT );
if ( isset($_POST) ) {
$inputs = filter_input_array(INPUT_POST, $filter);
if (empty($inputs['email'])) $errors['email'] = "l'email n'est correct";
if (empty($inputs['septdigits'])) $errors['septdigits'] = "le numérique doit être sur 7 digits";
if (empty($inputs['zeroAvingt'])) $errors['zeroAvingt'] = "zeroAvingt n'est pas un nombre entre 0 et 20";
if (empty($inputs['encodeurl'])) $errors['encodeurl'] = "encodeurl est vide ou invalide";
if (empty($inputs['checkboxes']))$errors['checkboxes'] = "aucune case à cochée n'est selectionnée.";
echo "<pre>";
var_dump($inputs);
var_dump($errors);
echo "</pre>";
}
?>
<form method="post" action="<?= $_SERVER['PHP_SELF']; ?>">
Email: <input type="text" name="email" value="email@example.com" /><br /><br />
7 Digits: <input type="text" name="septdigits" maxlength="7" /><br /><br />
</select><br /><br />
<input type="hidden" name="validurl" value="http://votreUrl.com" />
<input type="submit" value="Soumettre" />
</form>