Bonjour à tous ! Alors voilà, je vous explique mon problème.

Tout d’abord, je n'ai remercié aucunes des réponses de mon ancien sujet, mais je vous remercie de votre aide.



Bon, mon problème est le suivant.
J'ai crée un site, toujours pour mon baccalauréat informatique,
et j'y ai placé un menu déroulant comme suit


<form method="post" action="recherche.php">
		recherche : 
					<select name="Choix">
						<option value="choix1">Bus A</option>
						<option value="choix2">Bus B</option>
						<option value="choix3">Bus C1</option>
						<option value="choix4">Bus C2</option>
						<option value="choix5">Bus D</option>
						<option value="choix6">Bus E</option>
						<option value="choix7">Bus G</option>
						<option value="choix8">formulaire d'inscription</option>
						<option value="choix9">navette</option>
					</select>


et quand on clique, sur choix1 par exemple, j'ai crée un petit truc en php comme suit sur recherche.php je ne m'y connait pas beaucoup...


<?php

date_default_timezone_set("Europe/Paris");
echo date_default_timezone_get();

$rep=$_POST["Choix"];
$date= date("d-m-y");
$heure= date("h:i");

if($rep=="choix1")
{
echo" Bienvenue sur la page d'information de la ligne A et il est actuellement $heure et nous sommes le $date";
}

if($rep=="choix2")
{
echo"Bienvnue sur la page d'information de la ligne B il est actuellement $heure et nous sommes le $date "

?>
Smiley sweatdrop

Alors ca marche très bien, mais ce n'est absolument pas ce que je voulais faire.
En effet je voudrais que quand nous cliquons sur BUS A par exemple le premier point de ma liste, cela m’emmène à une nouvelle page HTML, que je pourrais modifier avec le CSS, pour la rendre ésthétiquement plus jolie, mais je n'arrive pas à faire un lien dirrect.

Donc voilà ma question au final, comment faire un lien vers une page HTML dans le {} de mon IF($rep=="choix1) et pour qu'il m'y emmène directement sans passer par un lien a re-cliquer dessus... J'espère avoir été claire.. J'attends avec impatience votre réponse. Merci à tous ! Smiley ravi
Modérateur
Et l'eau,

1. pense à fermer le sujet précédent en cochant la case "résolu" et accessoirement à indiquer la meilleur réponse.
2. Je ne vois pas le contexte (tu n'indiques pas tout) de ton application et ma réponse/solution risque de ne pas être adaptée à la situation.


<?php 
    $target = [
        "ma-page.php",
        "ma-page-complementaire.php",
        "encore-ma-page.php",
        "encore-ma-page-complementaire.php",
    ];

    if(!empty($_GET) && $_GET['choix'] !== ""){
        $url = $target[ intval($_GET['choix']) ];
        header('location:'.$url);
    }
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

    <form action="<?= $_SERVER['PHP_SELF'] ?>" methode="get">
        <select name="choix">
            <option value="">Choisir une page</option>
            <?php foreach($target as $id => $value): ?>
            <option value="<?= $id ?>"><?= str_replace('-', ' ', str_replace('.php', '', $value)) ?></option>
            <?php endforeach; ?>
        </select>
        <button type="submit">envoyer</button>
    </form>
</body>
</html>


- Ce type de formulaire est de méthode GET
- Je pense plutôt que tu devrais faire un menu déroulant

<div id="monMenuDeroulant">
        <span>Choisir ma page</span>
        <nav>
            <?php foreach($target as $value): ?>
            <a href="<?= $value ?>"><?= str_replace('-', ' ', str_replace('.php', '', $value)) ?></a>
            <?php endforeach; ?>
        </nav>
    </div>


#monMenuDeroulant a{
    display: block;
}

#monMenuDeroulant nav{
    display: none;
}

#monMenuDeroulant:hover nav{
    display: block;
}

Modifié par niuxe (08 May 2018 - 15:58)
C'est clair que le <select> n'est pas adapté pour cela.
De plus il n'y a aucun filtrage sur les $_POST !!!!!

La liste de liens est bien meilleure.

Perso, j'aime bien utiliser le heredoc pour avoir un code plus lisible :
<div id="monMenuDeroulant">
        <span>Choisir ma page</span>
        <nav>
<?php
$targets = explode(';', 'ma-page;ma-page-complementaire;encore-ma-page;encore-ma-page-complementaire');
foreach($targets as $value) {
   $caption = str_replace('-', ' ', $value);
   echo <<< ENTRY
            <a href="$value.php">$caption</a>\n
ENTRY;
}
?>
        </nav>
   </div>

http://php.net/manual/fr/language.types.string.php#language.types.string.syntax.heredoc
Modifié par bazooka07 (09 May 2018 - 01:43)
Modérateur
bazooka07 a écrit :
C'est clair que le &lt;select&gt; n'est pas adapté pour cela.

+1
bazooka07 a écrit :
De plus il n'y a aucun filtrage sur les $_POST !!!!!

On peut le faire en post, mais on est plus dans les bonnes pratiques....

bazooka07 a écrit :

La liste de liens est bien meilleure.

Un select permet de choisir une option et non de faire une redirection vers....

bazooka07 a écrit :

Perso, j'aime bien utiliser le heredoc pour avoir un code plus lisible :

<div id="monMenuDeroulant">
        <span>Choisir ma page</span>
        <nav>
<?php
$targets = explode(';', 'ma-page;ma-page-complementaire;encore-ma-page;encore-ma-page-complementaire');
foreach($targets as $value) {
   $caption = str_replace('-', ' ', $value);
   echo <<< ENTRY
            <a href="$value.php">$caption</a>\n
ENTRY;
}
?>
        </nav>
   </div>

http://php.net/manual/fr/language.types.string.php#language.types.string.syntax.heredoc


Pas bête ton explode Smiley smile

Cependant, la syntaxe Heredoc pour ça, ça n'a pas de sens. C'est valable pour des String nettement plus long.
Les avantages de cette syntaxe :
- interprétation des variables
- garde l'indentation, retour à la ligne, mise en forme générale du texte, etc.

(ce qui veut dire que ton \n n'est pas obligatoire.)

les inconvénients :
- syntaxe restrictive (Dans une class, pas d'indentation pour déclarer une string Heredoc.
Modifié par niuxe (09 May 2018 - 17:22)
niuxe a écrit :

Pas bête ton explode Smiley smile

La paresse est un art méconnu Smiley biggrin
niuxe a écrit :

Cependant, la syntaxe Heredoc pour ça, ça n'a pas de sens. C'est valable pour des String nettement plus long.
Les avantages de cette syntaxe :
- interprétation des variables
- garde l'indentation, retour à la ligne, mise en forme générale du texte, etc.

On est certes sur un cas trivial. Mais cela améliore la lisibilité du code.
Cela reprend le principe d'un template.
Quand on doit générer un tableau, c'est plus propre
niuxe a écrit :

(ce qui veut dire que ton \n n'est pas obligatoire.)

Le \n n'est pas obligatoire mais il donne un code source dans la page HTML plus joli.
On peut le remplacer par une ligne vide. Mais comme la nature,j j'ai horreur du vide.
niuxe a écrit :

les inconvénients :
- syntaxe restrictive (Dans une class, pas d'indentation pour déclarer une string Heredoc.

J'avoue ne pas bien comprendre à quoi tu fais allusion. Un exemple sous le coude ?
Modérateur
bazooka07 a écrit :

La paresse est un art méconnu Smiley biggrin

+1
bazooka07 a écrit :

On est certes sur un cas trivial. Mais cela améliore la lisibilité du code.
Cela reprend le principe d'un template.
Quand on doit générer un tableau, c'est plus propre

De base, le php est un langage de template. C'est juste une question de goût je pense. Smiley smile

bazooka07 a écrit :

Le \n n'est pas obligatoire mais il donne un code source dans la page HTML plus joli.

:)
bazooka07 a écrit :

On peut le remplacer par une ligne vide. Mais comme la nature,j j'ai horreur du vide.

Oui toi aussi Smiley smile
bazooka07 a écrit :

J'avoue ne pas bien comprendre à quoi tu fais allusion. Un exemple sous le coude ?


Ce code ci-dessous ne fonctionnera pas puisqu'en sortie :
php a écrit :

Parse error: syntax error, unexpected end of file ....


<?php 
    class maClass{
        function maMethode(){
            $chaineCaracteres = <<<FOO
                Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quasi neque quas quos nam aut nobis voluptate, praesentium, omnis saepe iure eius incidunt atque, est! Voluptates, ullam qui molestiae? Minus, dolore?
            FOO;
            echo $chaineCaracteres;
        }
    }
?>


Alors que celui ci fonctionnera (pas d'indentation pour la déclaration de la chaîne) :

<?php 

    class maClass{
        function maMethode(){
$chaineCaracteres = <<<FOO
    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quasi neque quas quos nam aut nobis voluptate, praesentium, omnis saepe iure eius incidunt atque, est! Voluptates, ullam qui molestiae? Minus, dolore?
FOO;
            echo $chaineCaracteres;
        }
    }
?>

Modifié par niuxe (10 May 2018 - 22:19)
Ton exemple n'est pas très pertinent.
C'est écrit sur fond rouge dans le manuel de PHP
http://php.net/manual/fr/language.types.string.php#language.types.string.syntax.heredoc
le marqueur de fin de Heredoc doit être le seul sur la ligne, excepté pour le ";" de fin d'instruction.

Le seul souci qu'il y a, mais ce n'est pas spécifique à la POO, c'est quand on indente la portion de code.
Il faut veiller à garder collé contre la marge gauche le marqueur de fin.
Mais avec un éditeur de code avec coloration syntaxique cela saute tout de suite aux yeux.

C'est quand même plus agréable à lire qu'une longue série de concaténation de chaines ou une longue suite d'instructions echo Smiley biggrin
Oups, j'ai oublié la correction :
<?php 
    class maClass{
        function maMethode(){
              $chaineCaracteres = <<<FOO
    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quasi neque quas quos nam aut nobis voluptate, praesentium, omnis saepe iure eius incidunt atque, est! Voluptates, ullam qui molestiae? Minus, dolore?
FOO;
            echo $chaineCaracteres;
        }
    }
?>

C'est permis d'indenter "$chaineCaracteres = <<< FOO".

En passant les constantes de class, c'est sympa aussi :
<?php 
    class maClass{

       const CHAINE_CARACTERES = <<< FOO
    Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quasi neque quas quos nam aut nobis voluptate, praesentium, omnis saepe iure eius incidunt atque, est! Voluptates, ullam qui molestiae? Minus, dolore?
FOO;

        function maMethode(){
             echo self::CHAINE_CARACTERES;
        }
    }
?>

Modifié par bazooka07 (11 May 2018 - 01:23)
Modérateur
bazooka07 a écrit :

C'est quand même plus agréable à lire qu'une longue série de concaténation de chaines ou une longue suite d'instructions echo Smiley biggrin

ça reste pas terrible. En plus du problème d'indentation, c'est peu lisible et un mélange pas terrible.

En procédural:

define('TEMPLATE_FOLDER', '/var/www/bidule/templates/');

function template($template_file, $variables) {
  extract($variables, EXTR_SKIP);
  ob_start();
  include TEMPLATE_FOLDER . '/' . $template_file; 
  return ob_get_clean();
}

// [AILLEURS]
// Logique seule
function truc(){
  $targets = explode(';', 'ma-page;ma-page-complementaire;encore-ma-page;encore-ma-page-complementaire');
  print template('foo/menu.tpl.php', [
    'targets' => str_replace('-', ' ', $targets)
  ]);
}



Fichier template super clean

   <div id="monMenuDeroulant">
        <span>Choisir ma page</span>
        <nav>
           <?php foreach ($targets as $value): ?>
              <a href="<?php print $value; ?>.php">
                 <?php print $value; ?>
              </a>
           <?php endforeach; ?>
        </nav>
   </div>

Modifié par kustolovic (11 May 2018 - 09:37)
Avec du Heredoc, ton template super clean devient :
 <div id="monMenuDeroulant">
        <span>Choisir ma page</span>
        <nav>
<?php
foreach ($targets as $value) {
     echo <<< LINK
              <a href="{$value}.php">{$value}</a>\n
LINK;
}
?>
        </nav>
   </div>

Bilan :
3 paires "<?php ?>" en moins
1 "print" ou "echo" en moins
Mon éditeur à coloration syntaxique ne fait pas l'appariement des paires "foreach endforeach" et ça n'aide pas à déboguer.
C'est pas super cool ce template super clean Smiley decu

Les paires "{}" qui encadrent les noms de variables simples ne sont pas obligatoires contrairement aux tableaux et objets mais cela aide à la lecture et ressemblent à des formats de templates.

P.S.: Depuis PHP 5.6 ceci est permis :
const TEMPLATE_FOLDER =  '/var/www/bidule/templates/';

l'expression avec const est évalué à la génération du byte-code
l'expression avec define est évalué à chaque execution
Modifié par bazooka07 (11 May 2018 - 11:35)
Modérateur
Le principal est que le code fonctionne. C'est une question de goût, d'habitude de lecture. Mais j'avoue que la proposition de Kustolovic me parait plus adaptée pour la maintenance (meilleur abstraction) et vers une évolution d'un template engine où Il y a pas grand chose à faire il me semble

@Kustolovic : Je viens de comprendre pourquoi ton ob_start/ob_get_clean. Ça sent le vécu. Smiley smile

@bazooka07 : En poussant le bouchon Smiley lol

<?php
foreach ($targets as $value) {
     $tpl = <<< LINK
              <a href="{%s}.php">{%s}</a>\n
LINK;
    vprintf($tpl, array_fill(0,2,$value));
}
?>

Smiley biggol

Pour l'indentation de la syntaxe heredoc, je ne savais plus si c'était les 2 ou le derniers à placer à gauche. Merci de me l'avoir rappeler.

Perso, j'ai utilisé une fois cette syntaxe depuis que je code et c'était pertinent (dans une app Symfony 1)
Modifié par niuxe (12 May 2018 - 03:06)
<?php
const MY_TEMPLATE = "<a href=\"{%s}.php\">{%s}</a>\n";
foreach ($targets as $value) {  vprintf(MY_TEMPLATE, array_fill(0,2,$value)); }
?>

La paresse est un art méconnu Smiley lol
Merci, je ne connaissais pas vprint.
Sinon "printf(MY_TEMPLATE, $value, $value);" . Mais cela fait moins chic Smiley decu
Modifié par bazooka07 (12 May 2018 - 10:36)