Twig + Php

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Twig + Php

Re: Twig + Php

par Saian » 21 mai 2019, 14:49

Et bien normalement t'es à peu près bon la logiquement. Juste à noter que True et False sont des chaines dans $_POST['Etat'] pas des booléen, le formulaire ne peut pas retourner un booléen.
Et donc tu devrais tester {%if form.Etat == 'True' %} à moins que twig transforme automatiquement la chaine True en booléen true ce dont je doute quand même.
L'affichage ou non des notices peut être géré avec la fonction error_reporting. Mais à mon sens un code bien écrit ne doit pas générer de notice.

Pour le test de form.Etat dans le template base, je ne suis pas sur que les variables fournies au template du formulaire soient également disponibles dans le template base. Je suppose que tu fais un extends de base.html.twig, un truc dans le genre ? de plus quand tu vas soumettre ton formulaire tu auras bien défini form.Etat mais dans les requêtes suivantes, cette valeur ne va pas se transporter automatiquement...

EDIT : ton code est difficilement lisible même comme ça. Il est important de faire des indentations propres, d'espacer le code comme il faut pour qu'il soit lisible. D'autant plus quand on débute.
A chaque fois que tu ouvres un if ou un for tu ajoutes une tabulation supplémentaire que tu enlèves après fermeture du if ou du for. Pareil avec les fonctions.

Et le var_dump ne t'es plus utile, c'était juste pour voir le contenu de $_POST.
<?php

function actionTousLivres($twig, $db)
{
  $form = array();
  $Catalogue = new Catalogue($db);

  if (isset($_POST['Etat'])) {
    $Etat = $_POST['Etat'];
    $form['Etat'] = $Etat;
  }


  if (isset($_POST['btAjouter'])) {
    $titre = $_POST['titre'];
    $resume = $_POST['resume'];
    $auteur = $_POST['auteur'];
    $gerne = $_POST['gerne'];
    $prix = $_POST['prix'];
    $quantite = $_POST['quantite'];

    //#Debut upload photo
    $photo = null;

    if (isset($_FILES['photo'])) { //Cette ligne teste si la variable fichier qui se nomme « photo » existe en mémoire.
      if (!empty($_FILES['photo']['name'])) { //Est-ce qu'une photo a été envoyée ?
        $extensions_ok = array('png', 'gif', 'jpg', 'jpeg', 'jfif'); //Cette ligne indique les extensions des fichiers que nous autoriserons. Nous les mettons dans un tableau .

        $taille_max = 500000;
        $dest_dossier = '/data/si62019/hattencourt/web/images/couverture/'; //Chemin du répertoire où seront stockées les images. Il faudra donner des droits au répertoire qui accueillera vos images.
        if (!in_array(substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok)) { //La ligne regarde si dans le nom de la photo, nous avons bien une extension autorisée.
          echo 'Veuillez sélectionner un fichier de type png, gif ou jpg !';
        } else {
          if (file_exists($_FILES['photo']['tmp_name']) && (filesize($_FILES['photo']
            ['tmp_name'])) > $taille_max) {
            echo 'Votre fichier doit faire moins de 500Ko !';
          } else {
            $photo = basename($_FILES['photo']['name']); //Cette ligne récupère uniquement le nom du fichier
            // enlever les accents

            $photo = strtr($photo, 'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ', 'AAAAAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
            // remplacer les caractères autres que lettres, chiffres et point par _
            $photo = preg_replace('/([^.a-z0-9]+)/i', '_', $photo);
            // copie du fichier
            move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier.$photo);
          }
        }
      }
    }

    $Catalogue = new Catalogue($db);
    $exec = $Catalogue->insert($titre, $resume, $auteur, $prix, $quantite, $gerne, $photo);
    $form['titre'] = $titre;
  }//Fin

  //Debut pagination
  $limite = 10;
  if (!isset($_GET['nopage'])) {
    $inf = 0;
    $nopage = 0;
  } else {
    $nopage = $_GET['nopage'];
    $inf = $nopage * $limite;
  }

  $r = $Catalogue->selectCount();
  $nb = $r['nb'];


  $listecatalogue = $Catalogue->selectLimit($inf, $limite);
  $form['nbpages'] = ceil($nb / $limite);
  //Fin

  //Supprimer un livre [version choix multiple]
  if (isset($_POST['btSupprimer'])) {
    $cocher = $_POST['cocher'];
    $form['valide'] = true;
    foreach ($cocher as $idlivre) {
      $exec = $Catalogue->delete($idlivre);
      if (!$exec) {
        $form['valide'] = false;
        $form['message'] = 'Problème de suppression dans la table produit';
      }
    }
  }
  //Fin

  echo $twig->render('tousleslivres.html.twig', array('form' => $form, 'listecatalogue' => $listecatalogue));
}

Re: Twig + Php

par Shake021 » 21 mai 2019, 14:44


function actionTousLivres($twig,$db){
  $form = array();
  $Catalogue = new Catalogue($db);


  var_dump($_POST);
    if (isset($_POST['Etat'])) {
      $Etat = $_POST['Etat'];
      $form['Etat'] = $Etat;

}



if (isset($_POST['btAjouter'])){
 $titre = $_POST['titre'];
 $resume= $_POST['resume'];
 $auteur = $_POST['auteur'];
 $gerne = $_POST['gerne'];
 $prix =$_POST['prix'];
 $quantite=$_POST['quantite'];

 //#Debut upload photo
 $photo=null;

 if(isset($_FILES['photo'])){ //Cette ligne teste si la variable fichier qui se nomme « photo » existe en mémoire.
 if(!empty($_FILES['photo']['name'])){ //Est-ce qu'une photo a été envoyée ?
 $extensions_ok = array('png', 'gif', 'jpg', 'jpeg', 'jfif'); //Cette ligne indique les extensions des fichiers que nous autoriserons. Nous les mettons dans un tableau .

 $taille_max = 500000;
 $dest_dossier = '/data/si62019/hattencourt/web/images/couverture/'; //Chemin du répertoire où seront stockées les images. Il faudra donner des droits au répertoire qui accueillera vos images.
 if( !in_array( substr(strrchr($_FILES['photo']['name'], '.'), 1), $extensions_ok ) ){ //La ligne regarde si dans le nom de la photo, nous avons bien une extension autorisée.
 echo 'Veuillez sélectionner un fichier de type png, gif ou jpg !';
 }
 else{
 if( file_exists($_FILES['photo']['tmp_name'])&& (filesize($_FILES['photo']
['tmp_name'])) > $taille_max){
 echo 'Votre fichier doit faire moins de 500Ko !';
 }
 else{
     $photo = basename($_FILES['photo']['name']); //Cette ligne récupère uniquement le nom du fichier
 // enlever les accents

$photo=strtr($photo,'ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïðòóôõöùúûüýÿ','AAA
AAACEEEEIIIIOOOOOUUUUYaaaaaaceeeeiiiioooooouuuuyy');
 // remplacer les caractères autres que lettres, chiffres et point par _
 $photo = preg_replace('/([^.a-z0-9]+)/i', '_', $photo);
 // copie du fichier
 move_uploaded_file($_FILES['photo']['tmp_name'], $dest_dossier.$photo);
     }
     }
                                   }
 }

 $Catalogue = new Catalogue($db);
 $exec = $Catalogue->insert($titre,$resume,$auteur,$prix, $quantite, $gerne, $photo);
 $form['titre'] = $titre;
}//Fin

//Debut pagination
 $limite=10;
 if(!isset($_GET['nopage'])){
 $inf=0;
 $nopage=0;
 }
 else{
 $nopage=$_GET['nopage'];
 $inf=$nopage * $limite;
 }

 $r = $Catalogue->selectCount();
 $nb = $r['nb'];


 $listecatalogue = $Catalogue->selectLimit($inf,$limite);
 $form['nbpages'] = ceil($nb/$limite);
 //Fin

 //Supprimer un livre [version choix multiple]
 if(isset($_POST['btSupprimer'])){
 $cocher = $_POST['cocher'];
 $form['valide'] = true;
 foreach ( $cocher as $idlivre){
 $exec=$Catalogue->delete($idlivre);
 if (!$exec){
 $form['valide'] = false;
 $form['message'] = 'Problème de suppression dans la table produit';
 }
 }
 }
 //Fin

echo $twig->render('tousleslivres.html.twig', array('form'=>$form, 'listecatalogue'=>$listecatalogue));
}
Voila mon controleur complet

<form method="POST" action="index.php?page=tousleslivres">
  <p>Selectionné l'état du catalogue :</p>
<select class="form-control" id="Etat" name="Etat">
 <option value="True">Activer</option>
 <option value="False">Desactiver</option>
 </select>
  <div>
    <button id="BtEtat" name="BtEtat" type="sumbit">Envoyer</button>
  </div>
</form>
mon formulaire
       {%if form.Etat == True %}
                    <li>
                        <a href="index.php?page=catalogue">Catalogue</a>

                    </li>
                    {%endif%}

Re: Twig + Php

par Shake021 » 21 mai 2019, 14:41

L'erreur routing est toujours présente j'ai l'impression que ces le serveur qui fais ça ^^ ,
Mais je ne comprend pas pourtant la logique de mon code devrais fonctionner je n'arrive pas à comprendre d'ou viens mon erreur

Re: Twig + Php

par Saian » 21 mai 2019, 14:39

Et bien maintenant tu as un problème dans le fichier routing.php à la ligne 40. ^^
Le array(0) { } je suppose que c'est le var_dump de $_POST et que la tu n'as pas soumis le formulaire ? et l'erreur semble arriver en amont du var_dump étant donnée qu'elle est affichée au dessus.
Après faut savoir qu'une notice n'est pas une erreur bloquante mais ça peut montrer qu'il y a un problème dans le code.

EDIT : tu utilises le bouton PHP de la barre d'outils au dessus du champ ou tu écris le message.

Re: Twig + Php

par Shake021 » 21 mai 2019, 14:36

Comment je peux faire pour envoyer mon code sous forme propre comme toi en sublime text ?
Je vais tout te mettre au propre

Re: Twig + Php

par Shake021 » 21 mai 2019, 14:34

La j'ai comme toi et ça me renvoie ça maintenant :Notice: Undefined offset: 1 in/data/si62019/hattencourt/src/config/routing.phpon line 40
array(0) { }

Re: Twig + Php

par Saian » 21 mai 2019, 14:27

Ca colle pas du tout au comportement normal de php. Tu as bien ce code ? Si c'est pas le cas montre ton code et entoure le de la balise PHP (bouton PHP dans la barre d'outils) histoire que ce soit lisible.
function actionTousLivres($twig,$db) {
  $form = array();
  $Catalogue = new Catalogue($db);
  
  var_dump($_POST);
  if (isset($_POST['Etat'])) {
    $Etat = $_POST['Etat'];
    $form['Etat'] = $Etat;
  }
  echo $twig->render('tousleslivres.html.twig', array('form'=>$form, 'listecatalogue'=>$listecatalogue));
}
EDIT : si tu as fait un var_dump($_POST['Etat']) et que tu avais sélectionné Désactiver alors le retour du var_dump est normal. Le problème c'est que tu ne montres pas le code avec lequel tu obtiens les différents retour.

Re: Twig + Php

par Shake021 » 21 mai 2019, 14:23

Non j'ai juste ajouté les var_dump entre temps la j'ai essayé ce que tu m'as dis il m'affiche
string(5) "False"
Notice : Undefined variable: Etat in /data/si62019/hattencourt/src/controleur/controleur_catalogue.php on line 65
NULL

Edit: Le string montre bien alors qu'il envoie false a la variable non?

Re: Twig + Php

par Saian » 21 mai 2019, 14:15

L'index c'est en rapport aux tableaux. Tu essaies d'accéder à l'index btEtat du tableau $_POST or justement cet index n'existe pas. Le var_dump devrait t'aider à voir ce qu'il y a dans le tableau. Encore faut-il le placer au bon endroit par exemple au dessus du if (isset($_POST[' btEtat '])){

EDIT : comme c'est la liste déroulante Etat qui t'intéresse, à ta place je testerais plutôt if (isset($_POST['Etat'])
D'ailleurs c'est étrange car tu fais un if (isset($_POST[' btEtat ']) ce qui ne devrait pas générer d'erreur. As tu modifié le code entre temps ? comment est la ligne 61 en erreur ?
A noter que les index des champs dans le tableau $_POST seront toujours les name des input, pas les id. Et je ne suis pas sur que les button soient transmis.

Re: Twig + Php

par Shake021 » 21 mai 2019, 14:13

Je suis désolé je commence le php je suis pas super fort mais je ne comprend pas ce qu'est l'index btEtat ?

Re: Twig + Php

par Saian » 21 mai 2019, 14:10

C'est pas possible, un var_dump de $_POST va forcément afficher plus de chose que juste NULL. Au pire tu devrais avoir quelque chose du genre array(0) { }
Et puis ça veut dire quoi j'ai obtenu la ligne en erreur ? quelle erreur ?

EDIT : tu as ajouté l'erreur. Elle est clair, l'index btEtat n'existe pas à la ligne 61 du fichier controleur_catalogue.php.
Le var_dump est justement sensé te permettre de voir ce que contient le tableau afin de déterminé si le button est présent dedans et sous quel forme, quel index.

Re: Twig + Php

par Shake021 » 21 mai 2019, 14:03

avec var_dump($_POST) j'ai obtenue la ligne NULL en erreur
Notice: Undefined index: btEtat in /data/si62019/hattencourt/src/controleur/controleur_catalogue.php on line 61

Re: Twig + Php

par Saian » 21 mai 2019, 13:50

Si tu veux un peu plus d'aide, montre nous ce que tu obtiens et avec quel code.

Re: Twig + Php

par Shake021 » 21 mai 2019, 13:43

Salut , merci de ta réponse j'ai essayé le var_dump et il est considérer comme nul j'ai donc ajouté un name dans le bouton qui s'appelle btEtat mais toujours rien :/

Re: Twig + Php

par Saian » 21 mai 2019, 13:34

Salut, mon avis que c'est ton test if (isset($_POST[' btEtat '])){ qui ne passe pas. btEtat c'est l'id du bouton, pas son nom, et donc $_POST[' btEtat '] n'existe probablement pas. Fais un print_r ou vardump de $_POST pour voir ce qu'il y a dedans. En règle générale je regarde plutôt si la method est post auquel cas je sais que le formulaire a été soumis, les autres requêtes étant en get.