Hallo Regina,
Das fehlen vollständigen oder zusammemnhängenden Quelltextes verhindert zuverlässig, dass Dir geholfen werden kann.
ich kann dir nicht mehr zeigen wie hier im Forum steht, denn ich habe nicht mehr. Ich weiß nicht warum du immer wieder auf diesem Thema herumhackst?
$admin_kalenderarten = admin_kalenderarten($mysqli);
// Monate auf Deutsch
$monate = array(
1=>"Januar",
2=>"Februar",
3=>"März",
4=>"April",
5=>"Mai",
6=>"Juni",
7=>"Juli",
8=>"August",
9=>"September",
10=>"Oktober",
11=>"November",
12=>"Dezember"
);
// Anzuzeigenden Monat aus $_GET["ym"] laden und auf 1. des Monats einstellen
$timestamp = get_anzeigemonat_timestamp();
$showYear = date('Y', $timestamp);
$showMonth = date('m', $timestamp);
// H3 Title
$html_title = sprintf("%04d / %02d", $showYear, $showMonth);
// Prev & Next / Monat Link
$nextMonth = date('Y-m', mktime(0, 0, 0, $showMonth+1, 1, $showYear));
$prevMonth = date('Y-m', mktime(0, 0, 0, $showMonth-1, 1, $showYear));
// <tr>...</tr> Zeilen für die Kalenderausgabe konstruieren
$weeks = erzeuge_kalenderwochen($timestamp, $mysqli, $teile25);
/**
* Ermittle den Timestamp für den 1. des anzuzeigenden Monats. Der Monat wird
* im Query-Parameter ym übergeben. Fehlt der oder hat falsches Format, wird
* der aktuelle Monat verwendet.
*
* @return int Unix-Timestamp des ersten Tages im Anzeigemonat
*/
function get_anzeigemonat_timestamp() {
$ym = filter_input(INPUT_GET, "ym",
FILTER_VALIDATE_REGEXP,
[ 'options' => [ 'regexp'=>'/\d{4}-\d{1,2}/' ] ]);
// Parameter fehlt oder die Validierung ist gescheitert
if (is_null($ym) || $ym === false)
{
$ym = date('Y-m');
}
// $ym ist jetzt immer im Format yyyy-mm.
// Entweder durch Regex bestätigt, oder von date geliefert.
$parts = explode("-", $ym);
// Monat Jahr
return mktime(0,0,0,intval($parts[1]),1,intval($parts[0]));
}
/**
* Generiert Table Rows mit Kalendereinträgen. Daten werden automatisch beschafft.
*
* @return array Ein Array mit fertigen HTML Fragmenten pro Row
*/
function erzeuge_kalenderwochen($firstOfMonth, $mysqli, $teile25)
{
$thisMonth = date("Y-m", $firstOfMonth);
$showYear = intval(date('Y', $firstOfMonth));
$showMonth = intval(date('m', $firstOfMonth));
// date('w') liefert 0:So 1:Mo 2:Di usw...
// Finde Wochentag des Monatsersten, +6, %7, ergibt Wochentag des Tages zuvor.
// Diese Tagesnummer ist die Anzahl von leeren Feldern vor dem 1. des Monats
// $day wird die auszugebende Tagesnummer sein, d.h. um N Felder leerzulassen,
// wird $day auf 1-N initialisiert.
$weekDayBeforeFirst = (6 + intval(date('w', $firstOfMonth))) % 7;
$day = 1 - $weekDayBeforeFirst;
// Kalender zusammenbauen
// Tagesdatum und YYYY-MM Form des aktuellen Monats ermitteln
$today = date('Y-m-d', time());
// Anzahl der Tage im Anzeigemonat ermitteln
$day_count = intval(date('t', $firstOfMonth));
// $weeks: Ein Eintrag pro Anzeigewoche
$weeks = [];
while ($day <= $day_count)
{
// Negative Werte oder zu große Werte für $day sind kein Problem, die werden
// von mktime in den passenden Monat verschoben.
$weekNr = date('W', mktime(0,0,0,$showMonth, $day, $showYear));
$weekParts = [ "<td class='kw'>$weekNr</td>" ];
// Die 7 Tage einer Woche aufbereiten
for ($i=0; $i<7; $i++)
{
$weekParts[] = formatiere_tag($thisMonth, $day_count, $day, $today, $mysqli, $teile25);
$day++;
}
$weeks[] = "<tr>".implode('', $weekParts)."</tr>";
}
return $weeks;
}
/**
* Formatiere das HTML Fragment für einen Kalendertag
*
* @param \mysqli $mysqli mysqli-Objekt für Datenbeschaffung
* @param string $date Anfragedatum, yyyy-mm-tt
* @param bool $aktuellerTag True um Tag als aktuelles Datum zu formatieren
* @return string
*/
function formatiere_tag($thisMonth, $day_count, $day, $today, $mysqli, $teile25)
{
if ($day < 1 || $day > $day_count)
{
return "<td class='emptyDay'></td>";
}
$date = $thisMonth . sprintf('-%02d', $day);
// Daten beschaffen
$datumTermine = kalender_termine($mysqli, $date, $teile25, 3);
##### Debugging #####################################################
echo "<pre>Testausgabe:\n\n";
echo '$datumTermine: '; print_r( $datumTermine );
echo "\n" . '$date: '; print_r( $date );
echo "\n" . '$teile26: '; print_r( $teile25 );
//exit;
#####################################################################
$anzTermineGesamt = count_alle_kalender_termine($mysqli, $date, $teile25);
var_dump($datumTermine);
$dayClasses = ($date == $today ? "today " : "");
$dayHtml = "<td class='$dayClasses calendarDay'>"
. formatiere_tag_header($date, $day, $anzTermineGesamt);
foreach ($datumTermine as $termin)
{
$dayHtml .= formatiere_termin($termin);
}
return $dayHtml . '</td>';
}
/**
* Ermittle alle Kalendereinträge zu einem Datum und einer Liste von Empfängern
*
* @param \mysqli $mysqli Eine MySQLI Connection
* @param string $datum Das Abfragedatum im Format yyyy-mm-dd
* @param string[] $teile25 Komma-getrennte Liste der möglichen Kalenderarten (k_art)
*
* @return Array
*/
function kalender_termine($mysqli, $datum, $teile25, $limit = false) {
$values = $teile25;
$empfaengerListe = "'".implode("','", $values)."'";
$select = "SELECT
kt_id,
kt_kalenderID,
kt_datum,
test,
k_code,
k_art,
k_jobNr,
k_bezeichnung,
k_auto,
k_farbe,
k_datum_von,
k_ganztags,
k_von,
k_bis,
f_bezeichnung,
f_kennzeichen,
ka_farbe,
kf_farbe,
kf_color
FROM kalender_termine
LEFT JOIN
kalender ON kalender.k_code = kalender_termine.kt_kalenderID
LEFT JOIN
fuhrpark ON fuhrpark.f_id = kalender.k_auto
LEFT JOIN
kalender_arten ON kalender_arten.ka_code = kalender.k_art
LEFT JOIN
kalender_terminfarbe ON kalender_terminfarbe.kf_farbe = kalender_arten.ka_farbe
WHERE kt_datum=?
AND k_art IN (" . $empfaengerListe . ")
ORDER by test ASC";
if ($limit != false) {
$stmt = $mysqli->prepare($select . " LIMIT ?" );
$stmt->bind_param("ss", $datum, $limit);
} else {
$stmt = $mysqli->prepare($select );
$stmt->bind_param("s", $datum);
}
echo "<pre>". print_r( $select ); echo "</pre>" ;
$stmt->execute();
######### temporär Einfügen #############################################
if ( $mysqli -> error ) {
echo "<pre>";
printf("Errormessage: %s\n", $mysqli -> error);
echo "<hr>";
echo $select;
exit;
}
########################################################################
$stmt->bind_result(
$kt_id,
$kt_kalenderID,
$kt_datum,
$test,
$k_code,
$k_art,
$k_jobNr,
$k_bezeichnung,
$k_auto,
$k_farbe,
$k_datum_von,
$k_ganztags,
$k_von,
$k_bis,
$f_bezeichnung,
$f_kennzeichen,
$ka_farbe,
$kf_farbe,
$kf_color
);
}
/**
* Zähle die Kalendereinträge zu einem Datum und einer Liste von Kalenderarten
*
* @param \mysqli $mysqli Eine MySQLI Connection
* @param string $datum Das Abfragedatum im Format yyyy-mm-dd
* @param string[] $teile25 Komma-getrennte Liste der möglichen Kalenderarten (k_art)
*
* @return int Anzahl Einträge
*/
function Count_Alle_Kalender_Termine($mysqli, $datum, $teile25) {
// Bis eine bessere Abfrage bereitstelt, auf die alte Technik der unlimitierten
// Abfrage zurückfallen
$termine = Kalender_Termine($mysqli, $datum, $teile25);
return count($termine);
}
function formatiere_tag_header($date, $day, $anzTermine)
{
$dailyLink = '<a href="tageskalender.php?date='.$date .'">';
if ($anzTermine > 3)
{
$header = "$day - {$dailyLink}Alle $anzTermine anzeigen</a>";
}
else
{
$header = $dailyLink.$day."</a>";
}
return "<div class='dayHeader'>$header</div>";
}
function formatiere_termin($termin) {
// Formatiere_Datenblatt_Link wählt k/f-Bezeichnung automatisch aus.
// Formatiere_JobNr_und_Zeit gibt nur ein <span> aus wenn die JobNr
// gefüllt oder ein Zeitraum angefordert ist. Sonst kommt '' zurück.
if ($termin["kt_datum"] == $termin["k_datum_von"])
{
if ($termin["k_ganztags"] == "0")
{
$terminHoehe = '';
$terminInhalt = formatiere_datenblatt_link($termin) . formatiere_jobNr_und_zeit($termin, true);
}
else
{
$terminHoehe = 'min-height: 37px;';
$terminInhalt = formatiere_datenblatt_link($termin) . formatiere_jobNr_und_zeit($termin, false);
}
}
else
{
$terminHoehe = 'height: 37px;';
// Wochentag des Termindatums prüfen
$datum = getdate(strtotime($termin["kt_datum"]));
if ($datum['wday'] == 1) // Montag
{
$terminInhalt = formatiere_datenblatt_link($termin) . formatiere_jobNr_und_zeit($termin, false);
}
else
{
$terminInhalt = '';
}
}
return '<div style="background:'.$termin["ka_farbe"].'; margin-bottom:5px; padding-left:8px;'.$terminHoehe.'">'
. $terminInhalt
. '</div>';
}
function Formatiere_Datenblatt_Link($termin)
{
$text = ($termin["k_auto"] == "") ? $termin["k_bezeichnung"] : $termin["f_bezeichnung"];
$url = '/kalender-datenblatt.php?code='.$termin["k_code"];
$farbe = 'color:'.$termin["kf_color"];
return '<a href="'.$url.'" style="'.$farbe.'">'.shortText($text, 15).'</a>';
//return '<span style="color:'.$termin["kf_color"].'"><a href="'.$url.'" style="'.$farbe.'">'.shortText($text, 15).'</a></span>';
}
/**
* Formatiere JobNr und Zeitraum eines Termineintrags.
*
* Ist die JobNr leer und kein Zeitraum gefordert, wird ein Leerstring zurückgegeben.
*
* Ist die JobNr bestückt und ein Zeitraum gefordert, werden beide durch " - " getrennt.
*
* Das Ergebnis wird in einen span mit style-Attribut eingehüllt, das die Farbe gemäß
* Datenbank setzt. TODO: Unnötige Styles ins CSS verlegen!
*
* @param array $termin Terminzeile aus dem SQL Ergebnis
* @param bool $mitZeitraum true übergeben um auch den Zeitraum auszugeben
*
* @return string HTML-Text mit span Element, das die Werte enthält
*/
function Formatiere_JobNr_und_Zeit($termin, $mitZeitraum)
{
$parts = [];
if ($termin['k_jobNr'] != '')
{
$parts[] = $termin['k_jobNr'];
}
if ($mitZeitraum)
{
$parts[] = $termin['k_von'].' bis '.$termin['k_bis'].' Uhr';
}
if (count($parts) == 0)
{
return '';
}
return '<span style="color:'.$termin["kf_color"].'; font-size:10px; display: block; padding-bottom: 2px;">'
. implode(' - ', $parts)
. '</span>';
}
Bis bald!
Bernd