8791 sujets

Développement web côté serveur, CMS

Bonjour,

c'est encore moi, je galère de nouveaux avec mon code

Le code ci-dessous affiche les différents horaires de mes films comme ceci (j'ai mis les balises pour que vous compreniez mieux) :
<ul><li><a href="#tabs-1">Vendredi</li></ul>
<div id="tabs-1">Jour : Vendredi - heure : 11:30</div>
----------------------------------
<ul><li><a href="#tabs-2">Vendredi</li></ul>
<div id="tabs-2">Jour : Vendredi - heure : 14:30</div>
----------------------------------
<ul><li><a href="#tabs-3">Samedi</li></ul>
<div id="tabs-3">Jour : Samedi - heure : 11:30</div>
----------------------------------
<ul><li><a href="#tabs-4">Samedi</li></ul>
<div id="tabs-4">Jour : Samedi - heure : 14:30</div>



Et je voudrais qu'il s'affiche par date. C'est à dire :
<ul>
  <li><a href="#tabs-1">Vendredi</li>
  <li><a href="#tabs-2">Samedi</li>
</ul>
<div id="tabs-1">Jour : Vendredi heure : 11:30 & 14:30</div>
----------------------------------
<div id="tabs-2">Jour : Samedi - heure : 11:30 & 14:30</div>


$i=1;
foreach( $evenements as $evenement) {
	echo '<div id="tabs-sceances">';
		
		echo '<ul>';
			echo '<li><a href="#tabs-'.$i.'">'.$date.'</a></li>';
		echo '</ul>';
		
		echo '<div id="tabs-'.$i.'">';
			echo 'Jour : '.$date.'<br/>';
			echo 'heure : '.$pieces[1].'<br/>'; // On affiche l'heure
			echo '----------------------------------<br/>';
		echo '</div>'; //<!-- Fin #tabs-$i -->
	echo '</div>'; //<!-- Fin #tabs-sceances -->
	$i++;
} // Fin foreach


A terme le code sera dans des onglets avec pour titre le jour et pour contenu les horaires.

Comment est-ce possible ?

Merci d'avance

EDIT : voici une image pour vous donner une idée : upload/38390-horaires.jpg
Modifié par Melusine85 (19 Jul 2012 - 17:23)
Sans le reste de ton code, avec des variables qui sortent de n'importe où, et des objets dont on ne connait pas les méthodes/attributs publiques, ça va être dur de répondre Smiley langue
Oui désolée mais je vouais alléger la page ^^

Et voici
echo '<div id="horaires-sceances">';
	$parametres = simplexml_load_file(fichier.xml);
	$evenements = $parametres->listeEvenements->evenement->listeRepresentations->representation;
	$i=1;
	foreach( $evenements as $evenement) {
		$lien = $evenement->lien; // On récupère le lien pour la résa
		$horaires = $evenement->debut; // On récupère les horaires
		$pieces = explode(" - ", $horaires); // On divise la chaine de caractere en 2
			
		$date_evenement_before = $pieces[0];// Date evenement type 19/07/2012
		$date_evenement = explode('/', $date_evenement_before);
		$date_evenement_after = $date_evenement[2].'-'.$date_evenement[1].'-'.$date_evenement[0]; // On change la date de 19/07/2012 à 2012-07-19
		
		$date_jour = date('Y-m-d');// Date du jour type 2012-07-19
		
		$debut	= new DateTime($date_jour); 
		$fin	= new DateTime($date_evenement_after);
		$interval = $debut->diff($fin); // On récupère le nb de jour d'interval entre la date du jour et la date de l'évènement
		$int = $interval->format('%a'); // Jour et Mois
		
		$dates = date_create_from_format('d/m/Y', $pieces[0]); // d/m/Y == 01/01/2012
		$date = date_format($dates, 'D'); // on modifie la date de 19/07/2012 à Jeudi
		//On passe les jours en Français
		if	  ($date == 'Mon'){ $date = 'Lundi'; 	}
		elseif($date == 'Tue'){ $date = 'Mardi'; 	}
		elseif($date == 'Wed'){ $date = 'Mercredi';	}
		elseif($date == 'Thu'){ $date = 'Jeudi';	}
		elseif($date == 'Fri'){ $date = 'Vendredi';	}
		elseif($date == 'Sat'){ $date = 'Samedi';  	}
		elseif($date == 'Sun'){ $date = 'Dimanche';	}
		
		
		if( $int < 15 ){ // On affiche que les évènement entre J & J+14 (2 semaines)
			echo '<div id="tabs-sceances">';	
				echo '<ul class="ul-tabs">';
					echo '<li><a href="#tabs-'.$i.'">'.$date.'</a></li>';
				echo '</ul>';
				
				echo '<div id="tabs-'.$i.'" class="div-tabs">';
					echo 'date jour : '.$date_jour.'<br/>';
					echo 'date evenement : '.$date_evenement_after.'<br/>';
					echo 'interval : '.$int.'<br/>';
					echo 'Jour : '.$date.'<br/>';
					echo 'Lien resa : <a href="'.$lien.'">'.$lien.'</a><br/>';
					echo 'heure : '.$pieces[1].'<br/>'; // On affiche l'heure
					echo '------------------------------------<br/>';
					
					//echo '<a href="'.$lien.'">'.$pieces[1].'</a>'; //Heure avec lien
				echo '</div>'; //<!-- Fin #tabs-$i -->
			echo '</div>'; //<!-- Fin #tabs-sceances -->
		} // Fin if interval
		$i++;
	} // Fin foreach
echo '</div>'; // Fin div #horaires-sceances
Salut,

pourquoi ne pas faire simplement 2 boucles?


<div id="tabs-sceances">
  <ul>
<?php
foreach( $evenements as $i => $evenement) 
{
?>
    <li><a href="#tabs-<?php echo $i; ?>"><?php echo $date; ?></a></li>
<?php
}
?>
  </ul>
<?php
foreach( $evenements as $i => $evenement) 
{
?>
  <div id="#tabs-<?php echo $i; ?>">
    Jour : <?php echo $date; ?><br/>
    heure : <?php echo $pieces[1]; ?><br/>
  ----------------------------------<br/>
  </div>
<?php
}
?>
</div>


Si tu veut que ça n'affiche qu'une fois vendredi, une fois samedi, etc...
La structure de ton script ne convient alors plus...
Modifié par JJK801 (20 Jul 2012 - 10:27)
J'ai essayée entre temps mais les dates sortent toujours en double :

<ul>
	<li><a href="#tabs-1">Vendredi</a></li>
	<li><a href="#tabs-2">Vendredi</a></li>
	<li><a href="#tabs-3">Samedi</a></li>
	<li><a href="#tabs-4">Samedi</a></li>
</ul>

<div id="tabs-1" class="div-tabs">11:30</div>
<div id="tabs-2" class="div-tabs">14:30</div>
<div id="tabs-3" class="div-tabs">11:30</div>
<div id="tabs-4" class="div-tabs">14:30</div>


Et il me faut :
<ul>
	<li><a href="#tabs-1">Vendredi</a></li>
	<li><a href="#tabs-2">Samedi</a></li>
</ul>

<div id="tabs-1" class="div-tabs">11:30  14:30</div>
<div id="tabs-2" class="div-tabs">11:30  14:30</div>


(J'ai supprimée les variables pour plus de visibilitée ^^)


Du coup comment faire pour que ça fonctionne. Il faut que je change tout ?
Modifié par Melusine85 (20 Jul 2012 - 10:32)
Non, tout n'est pas a jetter, la trame est bonne mais il faut que tu passe par des intermédiaires:


<?php
$events = array(); // On créé un tableau pour stocker les evenements de maniére organisée

foreach( $evenements as $key => $evenement) 
{
    $horaires = $evenement->debut; // On récupère les horaires
    $pieces = explode(" - ", $horaires); // On divise la chaine de caractere en 2
    $dates = date_create_from_format('d/m/Y', $pieces[0]); // d/m/Y == 01/01/2012
    $date = date_format($dates, 'D');

    if( !isset($events[$date]) ) // si le jour n'existe pas encore
    {
        $events[$date] = array(); // On le créé dans le tableau sous forme de sous tableau
    }
    
    $events[$date][$pieces[1]][] = array(
        /* ICI les infos dont tu aura besoin dans ta boucle */
    );
}
?>
<div id="tabs-sceances">
    <ul>
      <?php
      foreach( $events as $date => $event) // affiche les jours uniquement
      {
      ?>
      <li><a href="#tabs-<?php echo $date; ?>"><?php echo $date; ?></a></li>
      <?php
      }
      ?>
    </ul>
    <?php
    foreach( $events as $date => $event) // créé les div pour les ancres
    {
    ?>
    <div id="#tabs-<?php echo $date; ?>">
        <?php
            foreach($event as $hour => $params) // créé les lignes avec les evenements
            {
        ?>
        <div>
            Jour : <?php echo $date; ?><br/>
            heure : <?php echo $hour; ?><br/>
            ----------------------------------<br/>
        </div>
        <?php  
            }
        ?>
    </div>
    <?php
    }
    ?>
</div>


Attention, il y a pas mal de déchets dans ton code, n'oublie pas de l'optimiser...

par exemple:


$date_jour = date('Y-m-d');// Date du jour type 2012-07-19
$debut	= new DateTime($date_jour); 


revient a faire:


$debut	= new DateTime();


Ou encore ceci:


if	  ($date == 'Mon'){ $date = 'Lundi'; 	}
elseif($date == 'Tue'){ $date = 'Mardi'; 	}
elseif($date == 'Wed'){ $date = 'Mercredi';	}
elseif($date == 'Thu'){ $date = 'Jeudi';	}
elseif($date == 'Fri'){ $date = 'Vendredi';	}
elseif($date == 'Sat'){ $date = 'Samedi';  	}
elseif($date == 'Sun'){ $date = 'Dimanche';	}


Peut se remplacer par:


$joursFr = array(
  'Mon' => 'Lundi',
  'Tue' => 'Mardi',
  'Wed' => 'Mercredi',
  'Thu' => 'Jeudi',
  'Fri' => 'Vendredi',
  'Sat' => 'Samedi',
  'Sun' => 'Dimanche'
);

$date = $jourFr[$date];


ou par:


switch($date)
{ 
  case 'Mon': $date = 'Lundi'; 	break;
  case 'Tue': $date = 'Mardi'; 	break;
  case 'Wed': $date = 'Mercredi'; 	break;
  case 'Thu': $date = 'Jeudi'; 	break;
  case 'Fri': $date = 'Vendredi'; 	break;
  case 'Sat': $date = 'Samedi'; 	break;
  case 'Sun': $date = 'Dimanche'; 	break;
}

Modifié par JJK801 (20 Jul 2012 - 11:23)
Merci pour ton code JJK801. ça ne marchais pas tout a fait comme je le voulais et entre temps j'ai eu la réponse ailleurs. Voici le code qui fonctionne :
echo '<div id="horaires-sceances">';
	$parametres = simplexml_load_file(fichier.xml);
	$evenements = $parametres->listeEvenements->evenement->listeRepresentations->representation;
	
    $i=1;
    $tableau_affichage = array();
    foreach( $evenements as $evenement) {
        $lien = $evenement->lien; // On récupère le lien pour la résa
        $horaires = $evenement->debut; // On récupère les horaires
        $pieces = explode(" - ", $horaires); // On divise la chaine de caractere en 2
 
        $date_evenement_before = $pieces[0];// Date evenement type 19/07/2012
        $date_evenement = explode('/', $date_evenement_before);
        $date_evenement_after = $date_evenement[2].'-'.$date_evenement[1].'-'.$date_evenement[0]; // On change la date de 19/07/2012 à 2012-07-19
 
        $date_jour = date('Y-m-d');// Date du jour type 2012-07-19
 
        $debut    = new DateTime($date_jour); 
        $fin    = new DateTime($date_evenement_after);
        $interval = $debut->diff($fin); // On récupère le nb de jour d'interval entre la date du jour et la date de l'évènement
        $int = $interval->format('%a'); // Jour et Mois
 
        $dates = date_create_from_format('d/m/Y', $pieces[0]); // d/m/Y == 01/01/2012
        $date = date_format($dates, 'D'); // on modifie la date de 19/07/2012 à Jeudi
        //On passe les jours en Français
        if      ($date == 'Mon'){ $date = 'Lundi';     }
        elseif($date == 'Tue'){ $date = 'Mardi';     }
        elseif($date == 'Wed'){ $date = 'Mercredi';    }
        elseif($date == 'Thu'){ $date = 'Jeudi';    }
        elseif($date == 'Fri'){ $date = 'Vendredi';    }
        elseif($date == 'Sat'){ $date = 'Samedi';      }
        elseif($date == 'Sun'){ $date = 'Dimanche';    }
 
        if( $int < 15 ){ // On affiche que les évènement entre J & J+14 (2 semaines)
            // initialisation du tableau avec les infos de l'événement
            if (!isset($tableau_affichage[$int])) {
                $tableau_affichage[$int] = array('jour' => $date, 'horaires' => array());
            }
            // nouvel horaire
            $tableau_affichage[$int]['horaires'][] = $pieces[1];
        } // Fin if interval
    } // Fin foreach
    
    // affichage : 
	echo '<div id="tabs-sceances">';
		echo '<ul class="ul-tabs">';
			$i=1;
			foreach ($tableau_affichage as $interval => $donnees_interval) {
				echo '<li><a href="#tabs-'.$i.'">'.$donnees_interval['jour'].'</a></li>';
				$i++;
			}
		echo '</ul>';
		
		$i=1;
		foreach ($tableau_affichage as $interval => $donnees_interval) {
			echo '<div id="tabs-'.$i.'" class="div-tabs">';
				echo 'interval : '.$interval.'<br/>';
				echo 'Jour : '.$donnees_interval['jour'].'<br/>';
				echo implode(' ',$donnees_interval['horaires']); // On affiche l'heure
				echo '<br/>------------------------------------<br/>';
			echo '</div>'; // Fin #tabs-$i
			$i++;
		}
	echo '</div>'; // Fin #tabs-sceances		
echo '</div>'; // Fin div #horaires-sceances


Merci encore pour le temps que tu a passé Smiley cligne

Bonne journée
Humm petit soucis.

En fait ma liste d'horaire viens d'un xml qui se met à jour automatiquement. Dès qu'un horaire est dépassé, le xml se met à jour et supprime l'horaire. Par exemple pour aujourd'hui, il y avait deux horaires : 11h30 et 14h30. Le premier étant passé, il s'est supprimé et du coup ça m'affiche ça :
interval : 0
Jour : Vendredi
14:30 11:30 14:30
------------------------------------
interval : 1
Jour : Dimanche
11:30 14:30


Il me manque le Samedi ...

J'avais pas vu que ça fonctionnais comme ça, on m'a juste donné le xml...

EDIT :
On viens de me dire que le nombre d'horaire peut être variable (min 1 par jour et max 10)

Merci d'avance.
Modifié par Melusine85 (20 Jul 2012 - 13:54)
JJK801 a écrit :
Attention, il y a pas mal de déchets dans ton code, n'oublie pas de l'optimiser...

par exemple:


$date_jour = date('Y-m-d');// Date du jour type 2012-07-19
$debut	= new DateTime($date_jour); 


revient a faire:


$debut	= new DateTime();


Ou encore ceci:


if	  ($date == 'Mon'){ $date = 'Lundi'; 	}
elseif($date == 'Tue'){ $date = 'Mardi'; 	}
elseif($date == 'Wed'){ $date = 'Mercredi';	}
elseif($date == 'Thu'){ $date = 'Jeudi';	}
elseif($date == 'Fri'){ $date = 'Vendredi';	}
elseif($date == 'Sat'){ $date = 'Samedi';  	}
elseif($date == 'Sun'){ $date = 'Dimanche';	}


Peut se remplacer par:


$joursFr = array(
  'Mon' =&gt; 'Lundi',
  'Tue' =&gt; 'Mardi',
  'Wed' =&gt; 'Mercredi',
  'Thu' =&gt; 'Jeudi',
  'Fri' =&gt; 'Vendredi',
  'Sat' =&gt; 'Samedi',
  'Sun' =&gt; 'Dimanche'
);

$date = $jourFr[$date];


ou par:


switch($date)
{ 
  case 'Mon': $date = 'Lundi'; 	break;
  case 'Tue': $date = 'Mardi'; 	break;
  case 'Wed': $date = 'Mercredi'; 	break;
  case 'Thu': $date = 'Jeudi'; 	break;
  case 'Fri': $date = 'Vendredi'; 	break;
  case 'Sat': $date = 'Samedi'; 	break;
  case 'Sun': $date = 'Dimanche'; 	break;
}


Merci pour l'optimisation. Je ne suis pas dev et je n'ai que les bases de php ^^
Bon, mon collègue vient de me venir en aide ^^

Il faut rajouter "T23:59:59+00:00" à la date de l'évènement pour que ça prenne en compte une journée pleine (24h).
$date_evenement_after = $date_evenement[2].'-'.$date_evenement[1].'-'.$date_evenement[0]."T23:59:59+00:00"; // On change la date de 19/07/2012 à 2012-07-19


Merci encore JJK801 pour ton aide !

Bonne journée