IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Ajout d'un caractère après selection des checkbox


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 133
    Par défaut Ajout d'un caractère après selection des checkbox
    Bonjour à tous,

    N'ayant pas eu de réponse sur un autre forum, je viens vous demander de l'aide.
    Je vais vous mettre le script la dessus, mais avant je m'explique

    Je lis les données d'un fichier texte et les affiches dans un input checkbox pour pouvoir sélectionner ce que je désire modifier en rajoutant "#" au début des lignes sélectionner.
    Le soucis, c'est au moment de la modification dans le fichier txt, c'est bien l'ensemble du fichier qui est effacé et provoque une erreur.

    Je pense être entièrement en défaut au moment de l'écriture du fichier txt. Pourriez-vous m'aider, svp ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    <?php
       $path = './Fichier_test/';
        $fichier = 'exemple';
        $ext = '.conf';
        $chemin = $path . $fichier . $ext ;
     
     if (file_exists($chemin)) {
     
             $line = file($chemin);
             $ligne_cpt = count($line);
     
    }
     
    /************** Debut section de controle *************** */
     
    if(isset($_POST['env_1'])){  
     
      if(!empty($_POST['valid']))
       {
     
          $valid = $_POST['valid'];
          $op = fopen("$chemin","w");
     
          for ($i=0; $i<count($valid); $i++) 
              {
                $txt   = str_replace('','#', $valid[$i]) ;
                $result = file_put_contents($op, $text);            
                fclose($op);          
     
                echo "num de ligne :" . $valid[$i] ."Fichier modifié !"."<br>";  
              }
        } 
        else
        {
            echo "Vous n'avez rien selectionner, aucune modification a été apportée !";
        }
    }
     
    /* Fin section de controle  */
    /*******************************************/
     
    foreach( $line as $lines => $value ) 
                 {                 
                     if(!preg_match("[#]", $value)) 
                      {               
      ?>
     
    <form action="" method="post">
    <div class="elem">
      <i class="fa-solid fa-check ivert"></i>
             <input type="checkbox" name="valid[]" id="" value="<?= $lines ?>"  >
                 <label for=""><?= $value ?></label> 
    </div>     
     
    <?php
          }
        }
    ?>
    <div class="form-button">
        <button type="submit" name="env_1">Modifier les selections</button>
    </div>
    </form>

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 360
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 360
    Billets dans le blog
    17
    Par défaut
    Si tu me permets, quelle horreur, il n'y a rien qui va

    Le script est mal indenté et dur à lire
    Les variables sont mal nommées, ex. foreach( $line as $lines => $value)
    file_put_contents() est mal utilisé (on l'utilise avec un nom de fichier, pas un gestionnaire)
    <form> est dans le foreach(), mais pas le </form>
    etc.

    J'ai refait le script en gardant ta logique :
    -- On affiche les lignes de f443.conf ne commençant pas par un #
    -- On ajoute un # au début des lignes sélectionnées selon leur position dans le fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <?php
     
    // Chargement des données
    $file = __DIR__ . '/f443.conf';
    $data = @file($file);
    if ($data === false) {
        throw new Error('Impossible de lire ' . $file);
    }
     
    // Traitement des données
    if ($_SERVER['REQUEST_METHOD'] === 'POST') { // Formulaire soumis ?
        if (!empty($_POST['rows']) && is_array($_POST['rows'])) {
            foreach ($_POST['rows'] as $i) { // On travaille sur $data
                $data[$i] = '#' . $data[$i];
            }
            file_put_contents($file, implode('', $data)); // Màj du fichier selon $data
        } else {
            $error = 'Vous n\'avez rien sélectionné';
        }
    }
     
    ?>
     
    <!-- Gestion de la vue -->
     
    <!-- Affichage de $error si besoin -->
    <?php if (isset($error)): ?>
        <p><?= $error ?></p>
    <?php endif ?>
     
    <!-- Affichage de $data -->
    <form method="post">
        <?php foreach ($data as $i => $value): ?>
            <?php if (strpos($value, '#') !== 0): ?>
                <label>
                    <input type="checkbox" name="rows[]" value="<?= $i ?>">
                    <?= $value ?>
                </label><br>
            <?php endif ?>
        <?php endforeach ?>
        <button type="submit">Modifier la sélection</button>
    </form>

  3. #3
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 133
    Par défaut
    Bonjour SEB,

    Alors tout d'abord merci pour ces remarques et surtout d'avoir pris du temps pour moi. Je pense en effet, qu'il faut que je prenne des noms de variables plus appropriées dans mes scripts. (Je vais y penser).
    Quand au script, je vais le modifier, le comprendre et je reviens car j'aurai une question supplémentaire.

    JLuc

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 360
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 360
    Billets dans le blog
    17
    Par défaut
    Au plaisir

  5. #5
    Membre confirmé
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 133
    Par défaut
    Me voila de retour, avec une question.

    Seb, j'ai modifié et etudié le script pour l'adapter à mes tests, comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <form method="post">
                <fieldset>
                    <legend> Cocher et Valider pour de-activer </legend>    
                <?php foreach ($data as $i => $value):?>                
                    <?php  if (strpos(ltrim($value), '#') !== 0): ?>
                        <?php  if(trim($value) !== ''): ?>                  
                            <i class="fas fa-square ivert"></i>
                        <label for="">                          
                                <input type="checkbox" name="rows[]" value="<?= $i ?>">                        
                            <?= $value?> 
                        </label><br>
                        <?php endif ?>
                    <?php endif ?>                
                <?php endforeach ?>
                <div class="form-button"><button type="submit" name="valid_form_2"><span><i class="far fa-paper-plane"></i>Modifier la sélection</span></button></div>
                </fieldset>
            </form>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    	// Traitement des données
    if ($_SERVER['REQUEST_METHOD'] === 'POST') { // Formulaire soumis ?
     
        if(isset($_POST['valid_form_2'])){
         if (!empty($_POST['rows']) && is_array($_POST['rows'])) {
             foreach ($_POST['rows'] as $i) { // On travaille sur $data                
                   $data[$i] = '#' . $data[$i];
             }
             file_put_contents($file, implode('', $data)); // Màj du fichier selon $data
            var_dump($_POST['rows']);
         } else {
            $error_vert = 'Vous n\'avez rien sélectionné';
            }
      } //unset($data[$i]);
    }
    Jusque la, tout à l'air de fonctionner.

    Par contre lorsque je rafraichi la page avec F5 ou avec la touche enter, et sans qu'aucune coche ne soit selectionnée, l'écriture se fait à nouveau, mais en supprimant à chaque fois le 1er caractère qui peut etre # ou autre !
    ex: ligne 1 => igne 1 => gne 1 (etc...)

    J'ai cherché, mais pas trouvé comment empêcher cela. Peut-être une suggestion ?
    Merci d'avance

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 360
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 360
    Billets dans le blog
    17
    Par défaut
    Par contre lorsque je rafraichi la page avec F5 ou avec la touche enter, et sans qu'aucune coche ne soit selectionnée, l'écriture se fait à nouveau
    C'est normal, F5 rejoue la requête
    L'objectif de la requête étant de préfixer les lignes sélectionnées avec un #, on peut donc se retrouver avec autant de # en début de ligne que de refreshes

    Pour éviter cela il faut vérifier si la ligne commence déjà par un # :
    -- Si oui on ignore la ligne
    -- Si non on ajoute un #

    Cela pourrait donner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    // Traitement des données
    if ($_SERVER['REQUEST_METHOD'] === 'POST') { // Formulaire soumis ?
     
        if(isset($_POST['valid_form_2'])){ // 2 form sur la page, donc control de l'envoie
            if (!empty($_POST['rows']) && is_array($_POST['rows'])) {
                foreach ($_POST['rows'] as $i) { // On travaille sur $data
                    if (substr($data[$i], 0, 1) === '#') { // Ligne débute déjà par un "#" ?
                        // Si oui, on ne fait rien de spécial
                    } else {
                        // Si non, on préfixe la ligne avec "#"
                        $data[$i] = '#' . $data[$i];
                    }
                }
                file_put_contents($file, implode('', $data)); // Màj du fichier selon $data
            } else {
                $error_vert = 'Vous n\'avez rien sélectionné';
            }
        }
    }
    Dans ton affichage il y a des l/trim() indiquant que tu boucles sur un $data qui n'est pas propre
    Ça n'a rien à faire là, il faut nettoyer $data lors de son chargement

Discussions similaires

  1. affichage direct après selection de checkbox
    Par oliv27400 dans le forum Interfaces Graphiques
    Réponses: 6
    Dernier message: 29/07/2010, 15h34
  2. Ajouter des Checkbox dans un TlistView
    Par ATTIA dans le forum Composants VCL
    Réponses: 10
    Dernier message: 01/10/2009, 19h41
  3. Garder la selection des checkbox apres submit
    Par etoileDesNeiges dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 01/06/2007, 14h39
  4. Réponses: 44
    Dernier message: 19/10/2005, 11h54
  5. Selection des x premiers caractères dans un champ précis
    Par Schulman dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/01/2005, 10h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo