12 Monatskalender -> Automatischer Zeilenumbruch nach 3 Monaten

hanspeter123

Mitglied
Hallo Leute,

ich habe hier so ein Problem und zwar stelle ich mit dem nachfolgenden Script einen (Buchungs)kalender dar, nun möchte ich aber nicht nur 3 Monate anzeigen lassen sondern 12, das geht auch recht einfach in dem ich in dem Code einfach diese Zeile hier:

Code:
 //show months ab today
        for($r=0 ;$r<3 ;$r++)
   {

von <3 auf <12 abändere, dann zeigt er mir volle 12 Monate, aber leider in einer Reihe, was das gesamte Design zerstört, ich möchte gern das es nach 3 Monaten automatisch eine neue Zeile (tr) anfängt, nur weis ich nicht wie ?!

Hier mal der Gesamte Code, vielleicht hat ja einer eine gute idee, bin für alles offen :)

Code:
 if($room->cal =="J")
  {

        //$title_cal='<h4><a href="#"><<</a>&nbsp;&nbsp; '.$this_month_letter.'  '.$this_year_letter.'&nbsp;&nbsp;<a href="#" >>></a></h4>';

        //va contenir trois tableau html 1 mois de l'année
        //pour trois mois a partir de today
        $table_cal= array();
$month1 = date('m');
$year1 = date('Y');

        //show months ab today
        for($r=0 ;$r<3 ;$r++)
   {

        //2 764 800  sec sur d'aller au mois suivant (32 (31 +1) jours)
           //$this_month_letter=date('F',($r*2764800+time()));
		   
 //$this_month = JHTML::_('date', ($r*2764800+time()), '%B');
           // annee de type aaaa
   //        $this_year_letter=date('Y',($r*2764800+time()));



        //2 764 800  sec sur d'aller au mois suivant (32 (31 +1) jours)
 $newdate = date("Y-m-d", mktime(0, 0, 0, $month1+$r, 1, $year1));
 
           //$this_month_letter=date('F',($r*2764800+time()));
		   
 $this_month = JHTML::_('date', $newdate, '%B');
           // annee de type aaaa
           $this_year_letter= JHTML::_('date', $newdate, '%Y');
      

      




 
        $table='<table border="1" style="width:150px; text-align:center;" >'."\n";
        $table.='<tr><td colspan="7"><b>'.$this_month." ".$this_year_letter.'</b></td></tr>';
        $table.='<tr style="background-color:#FDF5E6;"><td>'.JText::_( 'Mon').'</td>
													   <td>'.JText::_( 'Tue').'</td>
													   	<td>'.JText::_( 'Wed').'</td>
														<td>'.JText::_( 'Thu').'</td>
														<td>'.JText::_( 'Fri').'</td>
														<td>'.JText::_( 'Sat').'</td>
														<td>'.JText::_( 'Sun').'</td></tr>';


                     $today_date= JHTML::_('date', $newdate, '%d-%m-%Y');

                    $today_num= JHTML::_('date', $newdate, '%d');
                    $today_letters= JHTML::_('date', $newdate, '%a');

                    $this_year=JHTML::_('date', $newdate, '%Y');

                    $this_month=JHTML::_('date', $newdate, '%m');

                   // $this_month+=$r;

                    //$fev= is_bissextile($this_year) ? 29 : 28 ;

                    //année bisextile
                    if( (is_int($this_year/4) && !is_int($this_year/100)) || is_int($this_year/400))
                     {
                     // Année bissextile
                     // vous remplacez le retour par ce que vou voulez
                        $fev=29;
                     }
                     else
                     {
                         $fev=28;

                     }



                    


                    $max_day_month_array= array("31",$fev,"31","30","31","30","31","31","30","31","30","31") ;

                    $last_day_this_month= $max_day_month_array[$this_month-1];


                    $nb_weeks_before_today=ceil($today_num/7);


                    //nb semaine dans le mois  arrondi a l'entier superieur
                    $nb_weeks_in_month= ceil($last_day_this_month/7);



                      //remontons les dispos pour chaque mois
                     // depuis lbresa_cal avec un between
                    // 1 jour du mois au dernier


                    $first_day_sql=$this_year."-".$this_month."-01";
                    $last_day_sql=$this_year."-".$this_month."-".$last_day_this_month;

                   $query="select
                            *
                          from
                            #__lbresa_cal
                          where
                            id_room=$room->id
                           and
                            date between
                             '$first_day_sql'
                           and
                               '$last_day_sql'
                           order by date asc ";

                   $db->setQuery($query);
                   $cal_liste=$db->loadObjectList();







                    //les jours de la semaine
                    $week= array("Mon","Tue","Wed","Thu","Fri","Sat","Sun");





                    //remplir la premiere semaine
                    //connaitre le nom du premier jour du mois

                    $first_day_month_letter=date('D',strtotime($this_year."-".$this_month."-01"));
					
									

                    //cherchons l'index de ce premier jour dans notre tableau week
                    $index=0;
                    for($i=0;$i<count($week);$i++)
                    {
                            if($week[$i]==$first_day_month_letter)
                            {
                                    $index=$i;
                            }



                    }
					
                    //remplissons maintenant la premiere semaine de notre calendar
                    //les jour qui ne font pas parti du mois seront des cases blanches
                    $table.='<tr>';


                    for($i=0; $i<$index ; $i++)
                    {
                            $vide_space="&nbsp;";
                            $table.='<td style="background-color:#708090;">'.$vide_space.'</td>';

                    }

                    //les premiers jour du mois à remplir

                    $day_number=0;

                    for($i=$index; $i<count($week) ;$i++)
                    {
                            $day_number++;
                        //couleur des dispos
                        //$font_color=($cal_liste[$day_number-1]->dispo > 0) ? "green;" : "red;" ;
						
						$cdate = date("Y-m-d",time());					
													
						if($cal_liste[$day_number-1]->dispo > 0 and $cal_liste[$day_number-1]->date >= $cdate)
						{
						$font_color = "black;";
						$free=1;
						}
						else
						{
						$font_color = "white;";
						$free=0;
						}
                        //couleur des prix reduits
                        //$bg_color=($cal_liste[$day_number-1]->prixred>0) ? "#FFFF00;" :"#DCDCDC;";
						
						if($cal_liste[$day_number-1]->prixred>0 and $cal_liste[$day_number-1]->date >= $cdate)
						{
						$bg_color = "#FFFF00;";
						}
						else
						{
						$bg_color = "#DCDCDC;";
						}
						
						
						
						
						
						if($cal_liste[$day_number-1]->prixred>0) { $day_price = $cal_liste[$day_number-1]->prixred." ".$monaie; } else { $day_price = $cal_liste[$day_number-1]->prix." ".$monaie; }

                        //italique et gras pour le today

                        $date=$day_number."-".$this_month."-".$this_year;

                        $font_style= ($date==date("d-m-Y",time())) ? "italic;" : "normal;";
                        $font_weight= ($date==date("d-m-Y",time())) ? "bold;" : "normal;";
						
						$add = JHTML::_('date', $cal_liste[$day_number-1]->date, '%d-%m-%Y');
						$add2 = JHTML::_('date', $cal_liste[$day_number-1]->date, '%Y-%m-%d');

                            if($free==1)
							{
							$table.='<td style="background-color:#86b200;"><a href="javascript:add_date(\''.$add.'\', \''.$add2.'\')" alt="'.$day_price.'" title="'.$day_price.'" style="color:'.$font_color.' font-style:'.$font_style.' font-weight:'.$font_weight.'">'.$day_number.'</a></td>';
							}
							else
							{
							$table.='<td style="background-color:red;"><span style="color:'.$font_color.' font-style:'.$font_style.' font-weight:'.$font_weight.'">'.$day_number.'</span></td>';
							}

                    }

                    $table.='</tr>'."\n";
					
					//on commence a compter le nombre de lignes ecrite pour corriger sir fevrier insuffisant
					$nb_lines=1;
					
                    //remplissons les semaines restantes

                    //on part de 1 car nous avons deja rempli la premiere semaine

                    for($i=1;$i<=($nb_weeks_in_month);$i++)
                    {

                            $table.="<tr>";

                            for($j=0;$j<count($week);$j++)
                            {


                                            $day_number++;

                                            // day number ne doit pas depasser 30 ou 31
                                            // au delà on y met un vide_space dans la case
                                            if($day_number<=$last_day_this_month)
                                            {
                                                    //couleur des dispos
                                                    //$font_color=($cal_liste[$day_number-1]->dispo > 0) ? "green;" : "red;" ;
													
													$cdate = date("Y-m-d",time());					
													
						if($cal_liste[$day_number-1]->dispo > 0 and $cal_liste[$day_number-1]->date >= $cdate)
						{
						$font_color = "black;";
						$free=1;
						}
						else
						{
						$font_color = "white;";
						$free=0;
						}
                                                    //couleur des prix reduits
                                                    //$bg_color=($cal_liste[$day_number-1]->prixred>0) ? "#FFFF00;" :"#DCDCDC;";
													
						if($cal_liste[$day_number-1]->prixred>0 and $cal_liste[$day_number-1]->date >= $cdate)
						{
						$bg_color = "#FFFF00;";
						}
						else
						{
						$bg_color = "#DCDCDC;";
						}
													
											if($cal_liste[$day_number-1]->prixred>0) { $day_price = $cal_liste[$day_number-1]->prixred." ".$monaie; } else { $day_price = $cal_liste[$day_number-1]->prix." ".$monaie; }

                                                    //italique et gras pour le today

                                                    $date=$day_number."-".$this_month."-".$this_year;

                                                    $font_style= (date("d-m-Y",strtotime($date))==date("d-m-Y",time())) ? "italic;" : "normal;";
                                                    $font_weight= (date("d-m-Y",strtotime($date))==date("d-m-Y",time())) ? "bold;" : "normal;";
													
													$add = JHTML::_('date', $cal_liste[$day_number-1]->date, '%d-%m-%Y');
													$add2 = JHTML::_('date', $cal_liste[$day_number-1]->date, '%Y-%m-%d');

                                                    if($free==1)
													{

                                                    $table.="<td style='background-color:#86b200;'><a href='javascript:add_date(\"".$add."\", \"".$add2."\")' alt='".$day_price."' title='".$day_price."' style='color:".$font_color." font-style:".$font_style." font-weight:".$font_weight." '>".$day_number."</a></td>";
                                                   }
												   else
												   {
												   $table.="<td style='background-color:red;'><span style='color:".$font_color." font-style:".$font_style." font-weight:".$font_weight." '>".$day_number."</span></td>";
												   }
                                            }

                                            else
                                            {

                                                    $table.="<td style='background-color:#708090; color:#708090;'>".$vide_space."0</td>";
                                            }



                            }

                            $table.="</tr>\n";
							$nb_lines++;

                    }
					
					// on verifie que le nombre de ligne est suffisant sinon on l'ajoute
					if($nb_lines==5)
					{
					
					$table.="<tr>";
					
						 for($l=0;$l<count($week);$l++)
                            {
							$table.="<td style='background-color:#708090; color:#708090;'>".$vide_space."0</td>";
							
							}
					$table.="</tr>\n";
					
					}
					
					
					
					

        $table.='</table>';


 
         $table_cal[]=$table;
      
   }// end for $r

ich hoffe ich habe nicht zuwenig kopiert, denn ich weis nicht genau wo der Code aufhört...
 
Bei der Ausgabe einfach einen Zähler einbauen der bis auf 3 zählt. Dann wird eine neue Zeile erzeugt und der Zähler wieder zurückgesetzt.

PHP:
<table>
<tr>
<?php
$z = 0;
for ($a = 1; $a <= 12; $a++) {
    $z++;
    echo "<td>Monat " .$a ."</td>";
    if ($z == 3 and $a < 12) {
        $z = 0;
        echo "</tr><tr>";
	} elseif ($z == 3 and $a == 12) {
		echo "</tr>";
	}
}
?>
</table>
 
Oder einfacher mit modulo (Restbetrag beim Dividieren) prüfen ob kein Rest übrigbleibt

PHP:
<table>
<tr>
<?php 
    for($month = 0; $month < 12; $month++){
        if($month % 3 == 0) echo "</tr>\n<tr>";
        echo "<td>Monat ". ($month+1) ."</td>";        
    }
?>
</tr>
</table>
 
Dann hast du aber auch vor dem ersten Monat 'ne neue Zeile.
PHP:
if($month && $month % 3 == 0) echo "</tr>\n<tr>";
macht erst nach dem 3. Monat eine neue Zeile.
 
Ich persönlich finde es am schönsten über Arrays zu lösen. Ist aber nicht jedermanns Sache
PHP:
<table>
<?php 
$fields = array_map(create_function('$m', 'return "<td>Monat {$m}</td>";'), range(1,12));
foreach(array_chunk($fields, 3) as $row){
    echo '<tr>'.implode('', $row)."</tr>\n";    
}
?>
</table>
 
Vielen Dank für die Hilfe, jetzt habe ich aber als nichts versteher noch ein Problem, und zwar muss ich das jetzt hier einbauen

Code:
// print_r($table_cal);


$topdate = date("Y-m-d", mktime(0, 0, 0, date('m')+3, 1, date('Y')));
$backdate = date("Y-m-d", mktime(0, 0, 0, date('m'), 1, date('Y')));

  // erstellung des Kalender HTML Codes...
   $dom_html= "<table width='100%' id='Kalenderloc' >\n";
   $dom_html.= "<tr> <td width='5%'><!-- <img src='components/com_joomloc/images/fleche-G.gif' /> --></td>\n";

   foreach($table_cal as $table)
   {

       $dom_html.="<td>".$table."</td>";
   }

   $dom_html.= "<td width='5%'><a href='javascript:moove_cal(2,\"".$topdate."\", $room->id)'><!-- <img src='components/com_joomloc/images/fleche-D.gif' /></a> --></td></tr></table>";

   // aussgabe des Kalenders ...
   echo $dom_html ;

   echo "</div>";

  
  
  
  
  
  }//END IF room cal J

Aber egal wie ich das auch mache, es kommt immer nur mißt raus, kann mir nochmal einer Helfen ?! :) Bitte.
 
edit: blödsinn.....

PHP:
$z = 0;
for ($a = 1; $a <= 12; $a++) {
    $z++;
    echo "<td>$table</td>";
    if ($z == 3 and $a < 12) {
        $z = 0;
        echo "</tr><tr>";
    } elseif ($z == 3 and $a == 12) {
        echo "</tr>";
    }
}

Habs jetzt nicht getestet, aber könnte so funktionieren.
 
Zuletzt bearbeitet:
@Maniac: Musst du auch nicht testen.
Ist nämlich im Grunde genau das was ich oben auch schon geschrieben habe. Nur das ich in die Zellen nicht den Wert von "$table" eingetragen habe sondern "Monat" und den Zählen.
 
@Maniac: Musst du auch nicht testen.
Ist nämlich im Grunde genau das was ich oben auch schon geschrieben habe. Nur das ich in die Zellen nicht den Wert von "$table" eingetragen habe sondern "Monat" und den Zählen.

Jepp, habs ja deinen Code genommen, aber ich habe ihn nicht getestet :-)
 
sooo habe den code jetzt mal so eingefügt
Code:
 // erstellung des Kalender HTML Codes...
   $dom_html= "<table width='100%' id='Kalenderloc' >\n";
   $dom_html.= "<tr> 
    for($month = 0; $month < 12; $month++){
        if($month % 3 == 0) echo "</tr>\n<tr>";
        echo "<td>Monat ". ($month+1) ."</td>";        
    }
 <td width='5%'><!-- <img src='components/com_joomloc/images/fleche-G.gif' /> --></td>\n";

   foreach($table_cal as $table)
   {

       $dom_html.="<td>".$table."</td>";
   }

   $dom_html.= "<td width='5%'><a href='javascript:moove_cal(2,\"".$topdate."\", $room->id)'><!-- <img src='components/com_joomloc/images/fleche-D.gif' /></a> --></td></tr></table>";

   // aussgabe des Kalenders ...
   echo $dom_html ;

dann kommt leider diese fehlermeldung

Parse error: syntax error, unexpected '/' in /srv/www/rosenthal-bielatal.de/CMS/components/com_joomloc/views/loc/view.html.php on line 746

wobie die Zeile 746 diese hier ist

Code:
if($month % 3 == 0) echo "</tr>\n<tr>";

Wenn ich den code so einfüge:

Code:
 // erstellung des Kalender HTML Codes...
   $dom_html= "<table width='100%' id='Kalenderloc' >\n";
   $dom_html.= "<tr> <td width='5%'><!-- <img src='components/com_joomloc/images/fleche-G.gif' /> --></td>\n";

   foreach($table_cal as $table)
   {

       $dom_html.=$z = 0;
for ($a = 1; $a <= 12; $a++) {
    $z++;
    echo "<td>".$table."</td>";
    if ($z == 3 and $a < 12) {
        $z = 0;
        echo "</tr><tr>";
    } elseif ($z == 3 and $a == 12) {
        echo "</tr>";
    }
} 
   $dom_html.= "<td width='5%'><a href='javascript:moove_cal(2,\"".$topdate."\", $room->id)'><!-- <img src='components/com_joomloc/images/fleche-D.gif' /></a> --></td></tr></table>";

   // aussgabe des Kalenders ...
   echo $dom_html ;

dann kommt diese fehlermeldung...
Parse error: syntax error, unexpected $end, expecting T_FUNCTION in /srv/www/rosenthal-bielatal.de/CMS/components/com_joomloc/views/loc/view.html.php on line 1113

Wobei hier wieder Zeile 1113 das hier ist

Code:
 }// class
am ende der Datei

und wenn ich das nun so einfüge

Code:
  // erstellung des Kalender HTML Codes...
   $dom_html= "<table width='100%' id='Kalenderloc' >\n";
   $dom_html.= "<tr> <td width='5%'><!-- <img src='components/com_joomloc/images/fleche-G.gif' /> --></td>\n";

   foreach($table_cal as $table)
   {

       $dom_html.=$z = 0;
for ($a = 1; $a <= 12; $a++) {
    $z++;
    echo "<td>$table</td>";
    if ($z == 3 and $a < 12) {
        $z = 0;
        echo "</tr><tr>";
    } elseif ($z == 3 and $a == 12) {
        echo "</tr>";
    }
} 
   }

   $dom_html.= "<td width='5%'><a href='javascript:moove_cal(2,\"".$topdate."\", $room->id)'><!-- <img src='components/com_joomloc/images/fleche-D.gif' /></a> --></td></tr></table>";

   // aussgabe des Kalenders ...
   echo $dom_html ;
dann kommen ca. 15 Zeilen NUR mit dem Aktuellen Monat.

Was mach ich falsch ?! :/
 
Zurück