webForumDet fria alternativet

Admin-sida till kalender

10 svar · 549 visningar · startad av addeweb

addewebMedlem sedan jan. 2004216 inlägg
#1

Jag har gjort iordning en admin-sida till en kalender. Denna sida består av en lista som byter antal rader
beroende på vilken månad och skottår som gäller. Varje rad har sin egen dag + veckodag som är placerade
längst till vänster i listan.
Det gäller också (+)-knapparna som finns placerade längst till höger och används för att lägga till nya händelser.
Varje rad innehåller också en eller flera rubrik-länkar som har varsin checkbox för borttag.
Länkarna går till ett formulär för ändring av händelsen.
Överst ovan listan finns bl a knappar för föregående och nästa månad. Det funkar bra att byta till annan månad
men det tar jag inte upp här.

Problemet är att placera händelserna på rätt ställen. Har försökt med mysql_fetch_array() som jag brukar göra
på andra sidor men det funkar inte bra här. Datorn blev knäpp när jag provade. Har också funderat på och provat
att använda en if-sats som jämför kalenderns datum med händelsens datum men det funkar inte heller så bra.
Finns det någon vettig lösning?

<?php
if($_GET['p'] == "calendar"){

include("functions.php");

	// GET-variabler
	$day = $_GET['day']; 
	$month = $_GET['month']; 
	$year = $_GET['year']; 
	
	// Om inga värden finns i GET-variablerna, då används dagens datum istället. 
	if($day == "")
		$day = date("j");
		
	if($month == "")
		$month = date("n"); 
		
	if($year == "")
		$year = date("Y"); 
				
	echo '<h4>Kalender</h4>';
		
	if($_GET['status'] == "new"){ 

	echo '<p><b style="color: green">
Du har nu lagt in en ny händelse till 
'.strtolower(getWeekDayName( $_GET['day'], $_GET['month'], $_GET['year'])).' '.$_GET['day'].' 
'.strtolower(getMonthName( $_GET['day'], $_GET['month'], $_GET['year'] )).' '.$_GET['year'].'!
</b>
</p>';
}
// Hämta händelser till kalendern.
$result = mysql_query("SELECT * FROM events");
		
echo '<p style="text-align: center">
<input type="button" onclick="document.location=\''.$_SERVER['PHP_SELF'].'?p=list_all\'" 
value="Alla händelser: ';
		
// Antal händelser visas i knappen
echo mysql_num_rows( $result ).' st" />

// Knapp för att komma tillbaka till aktuell månad
<input type="button" onclick="document.location=\''.$_SERVER['PHP_SELF'].'
?p=calendar\'" value="I dag: '.date("j").' 
'.strtolower(getMonthName(date("j"), date("m"), date("Y"))).' '.date("Y").'" />
</p>';
			
echo '
<table cellpadding="0" cellspacing="0" border="0" style="width:100%; margin-bottom: 10px">
<tr>
<td style="width: 35%; text-align: right">
<input type="button" value=" << " onclick="'.goLastMonth( $month, $year ).'\'" 
style="width: 50px"
title="'.getMonthName($day, ($month-1), $year).'" /></td>
<td style="width: 30%; text-align: center">
<b style="font-size: 14px">'.getMonthName($day, $month, $year).' '.$year.'</b>
</td>
<td style="width: 35%">
<input type="button" value=" >> " onclick="'.goNextMonth( $month, $year ).'\'" 
style="width: 50px" 
title="'.getMonthName($day, ($month+1), $year).'" /></td></tr>
</table>';

echo '<form action="calendar_operations.php?p=delete" method="POST" style="margin: 0px">
<table cellpadding="3" cellspacing="0" border="0" 
style="width: 100%">
<tr style="background-color: '.$headbgrdcolor.'">
<td colspan="2" style="width: 10%"><b>Datum</b></td>
<td style="width: 82%"><b>Rubrik</b> (borttag/ändring)</td>
<td style="width: 8%">_</td>
</tr>';
	¨
 // Totalt antal dagar i månaden - används till for-loopen nedan. 
$daysInMonth = date("t", mktime(0,0,0, $month, $day, $year)); 
	
// Loopa rader med dagar och veckodagar efter antal dagar i månaden. 
for( $i = 1; $i <= $daysInMonth; $i++)
{	
// Funktionen selectDay sätter en annan bakgrundsfärg till raden för dagens datum. 	
echo '<tr class="'.selectDay( $i, $month, $year ).'">
<td style="border-bottom: solid '.$borderwidth.'px '.$borderlinecolor.'; 
font-weight: bold; font-size: 12px; text-align: right">'.$i.'</td>';
		
// Funktionen getWeekDay() används här nedan för att ta fram första bokstaven till svenska 
// veckodagsnamn.
echo '<td style="border-bottom: solid '.$borderwidth.'px '.$borderlinecolor.'; 
font-weight: bold; font-size: 12px">
'.getWeekDay( $i, $month, $year ).'</td>
<td style="border-bottom: solid '.$borderwidth.'px '.$borderlinecolor.'">';
		
// Om kalenderns datum överensstämmer med händelsens datum, visa händelsens rubrik
if(date("Y-m-d", mktime( 0, 0, 0, $month, $i, $year)) == date("Y-m-d", $row['eventdate']))
{
	echo '<input type="checkbox" name="del[]" value="'.$row['evid'].'"/>
<a href="'.$_SERVER['PHP_SELF'].'?p=edit_event&day='.$i.'&month='.$month.'
&year='.$year.'&evid='.$row['evid'].'">'.$row['heading'].'</a><br />';

}else{
	echo '_';
}

// Funktionen showAddButton() används för att visa knappen för idag och kommande dagar men 
// inte för tidigare dagar.
echo '</td>
<td style="border-bottom: solid '.$borderwidth.'px '.$borderlinecolor.'">'
.showAddButton( $i, $month, $year ).
'</td></tr>'; 		
}
echo '<tr>
<td colspan="4" style="padding-top: 10px; text-align: right">
<input type="reset" name="reset" value="Rensa" />
<input type="submit" name="delete" value="Radera markerade händelser" />
</td></tr>
</table>
</form>';
}?>
addewebMedlem sedan jan. 2004216 inlägg
#2

Det är svårt att själv se vad som är fel när man inte har möjlighet att diskutera problem med någon att jag vänder mig till det här forumet istället och frågar.

Eftersom varje händelse har ett datum, en rubrik och beskrivning medan ett kalenderdatum kan innehålla flera händelser, kan man lägga in händelserna från databasen i en multidimensionell array för att sedan använda if-satser med jämförelse av datum och skriva ut händelserna på rätt platser i listan?? Är jag på rätt väg?

addewebMedlem sedan jan. 2004216 inlägg
#3

Finns det ingen som vill hjälpa mig?

pettssonMedlem sedan jan. 20021 122 inlägg
#4

Det är rätt jobbigt att leta fel i en hel fil, försök begränsa kod-mängden till det som är fel.
Och visst kan du lagra händelserna i en array med datumet som key, ex.vis så här:

$handelser = array();
while($row = mysql_fetch_assoc($result)) {
 $handelser[$row["DatumfältIDatabasen"]][$row["HändelseID"]] 
= array("Rubrik" => $row["Rubrik"], "Beskrivning" => $row["Beskrivning"]);
}
addewebMedlem sedan jan. 2004216 inlägg
#5

Ok, det skulle jag ha tänkt på. Å andra sidan är det inte heller lätt i värmen.
Den här delen längre ner i koden ovan har jag problem med:

// Om kalenderns datum överensstämmer med händelsens datum, visa händelsens rubrik
if(date("Y-m-d", mktime( 0, 0, 0, $month, $i, $year)) == date("Y-m-d", $row['eventdate']))
{
    echo '<input type="checkbox" name="del[]" value="'.$row['evid'].'"/>
<a href="'.$_SERVER['PHP_SELF'].'?p=edit_event&day='.$i.'&month='.$month.'
&year='.$year.'&evid='.$row['evid'].'">'.$row['heading'].'</a><br />';

}else{
    echo '&nbsp;'; // Ingen utskrift
}

Ett datum ska kunna innehålla en eller flera händelser i sin rad i listan. Det är vad jag försöker lösa. Är ju osäker på
hur man lägger in värdena i en sådan multidimensionell array från databasen. Är ju inte van med sådana multidimensionella
arrayer. Det är ingen vardagsmat, precis.
Att jag har gjort en sådan lista är att jag tycker att det är mera användarvänlig med en sån. Antalet datum-rader ändras beroende på vilken månad. Man slipper tänka på skottår och fumla med selectboxar.

pettssonMedlem sedan jan. 20021 122 inlägg
#6

Vad är det som inte funkar då? Det ser ut som detta skriver ut en checkbox och en länk. Ska den inte göra det?

addewebMedlem sedan jan. 2004216 inlägg
#7

Jo, det är meningen att en checkbox ska stå framför rubriken för borttag av händelsen.

Det är rörigt med multidimensionell array. Det fungerade inte så bra. Jag har jämfört platserna i listan mha
echo print_r($events); och gjort 2 st foreachar.
Händelserna hamnar på rätt ställen med hjälp av jämförelsen av datum men då blir det två checkboxar, första med evid-variabeln och den andra med rubriken som rubriklänkar. GET-variabeln $evid till alla länkarna har bara värdena 0 och 1. Egentligen borde varje händelse bara ha en rubriklänk med GET-variabeln $evid som innehåller värdet så att man kan ändra händelsen. Och ett annat fel. Det blir inte heller fler händelser än en. Lägger jag till en händelse till ett datum som har 2-3 händelser, ersätts rubriken av den nya.

Koden nedan nedbantad. Har plockat bort månadsvisningen som fungerar och kan hoppas över.

<?php

// Hämta händelser till kalendern.
$result = mysql_query("SELECT * FROM events");

while($row = mysql_fetch_array($result)) {
		
$events[$row['eventdate']] = array( $row['evid'], $row['heading']);

}

// Loopa rader med dagar och veckodagar efter antal dagar i månaden. 
for( $i = 1; $i <= $daysInMonth; $i++)
{	
// Funktionen selectDay sätter en annan bakgrundsfärg till raden för dagens datum. 	
echo '<tr class="'.selectDay( $i, $month, $year ).'">
<td style="border-bottom: solid '.$borderwidth.'px '.$borderlinecolor.'; 
font-weight: bold; font-size: 12px; text-align: right">'.$i.'</td>';
		
// Funktionen getWeekDay() används här nedan för att ta fram första bokstaven till svenska 
// veckodagsnamn.
echo '<td style="border-bottom: solid '.$borderwidth.'px '.$borderlinecolor.';
font-weight: bold; font-size: 12px">'
.getWeekDay( $i, $month, $year ).
'</td><td style="border-bottom: solid '.$borderwidth.'px '.$borderlinecolor.'">';

// 1:a foreachen			
foreach ($events as $key => $value1) {
	
if(date("Y-m-d", mktime( 0, 0, 0, $month, $i, $year)) == date("Y-m-d",  strtotime($key)))
{
// 2:a foreachen
foreach ($events[$key] as $key2 => $value2) {
// Om kalenderns datum överensstämmer med händelsens datum, visa händelsens rubrik
echo '<input type="checkbox" name="del[]" value="'.$key.'"/>&nbsp;
<a href="'.$_SERVER['PHP_SELF'].'?p=edit_event&day='.$i.'&month='.$month.'&
year='.$year.'&evid='.$key2.'">'.$value2.'</a><br />';
	}  // slut 2:a foreachen
}else{  // Annars ingen rubrik-länk
	echo '&nbsp;';
   } // slut if-satsen
} // slut 1:a foreachen
		
// Funktionen showAddButton() används för att visa knappen för idag och kommande dagar men
// inte för tidigare dagar.
echo '</td><td style="border-bottom: solid '.$borderwidth.'px '.$borderlinecolor.'">
'.showAddButton( $i, $month, $year ).'
</td></tr>'; 		
    }
}
?>
addewebMedlem sedan jan. 2004216 inlägg
#8

Trots att det inte finns med i koden ovan, så har jag före for-loopen för antal dagar i månaden prövat med en annan sak:
while (list( $id, $eventdate, $heading ) = mysql_fetch_row($result)) {
Resultatet blev då istället att en enda händelse finns i listan som istället upprepades lika många gånger som totalt antal händelser.

Jag vet inte hur jag ska lösa det. Det verkar inte heller fungera med foreachar. Vet inte om det behövs en tredje.

addewebMedlem sedan jan. 2004216 inlägg
#9

Hoppa över förra inlägget!

Efter jag försökt förgäves med dubbla foreachar, multidimensionella arrayer och felaktiga länkrubriker, har jag löst problemet någorlunda. Jag kanske borde ha använt foreach men jag får inte till det tillsammans med multi-arrayer. Istället lade jag till 2 extra arrayer och en vanlig for-loop. Alla händelser finns nu placerade på sina ställen i listan. Finns det något bättre alternativ än så här?

<?php
// Hämta händelser till kalendern.
$result = mysql_query("SELECT * FROM events");
		
$eventdates = array();
$evids = array();
$headings = array();
	
while($row = mysql_fetch_array($result)) {
	
$eventdates[] = $row['eventdate'];
$evids[] = $row['evid'];
$headings[] = $row['heading'];
}
 // Totalt antal dagar i månaden - används till for-loopen nedan. 
$daysInMonth = date("t", mktime(0,0,0, $month, $day, $year)); 
	
// Loopa rader med dagar och veckodagar efter antal dagar i månaden. 
for( $i = 1; $i <= $daysInMonth; $i++)
	{	
// Funktionen selectDay sätter en annan bakgrundsfärg till raden för dagens datum. 	
echo '<tr class="'.selectDay( $i, $month, $year ).'">
<td style="font-weight: bold; font-size: 12px; text-align: right">'.$i.'
</td>';
		
// Funktionen getWeekDay() används här nedan för att ta fram första bokstaven till svenska 
// veckodagsnamn.
echo '<td style="font-weight: bold; font-size: 12px">'.getWeekDay( $i, $month, $year ).'</td>
<td>';
				
for( $j = 0; $j < count($eventdates); $j++)
{
// Om kalenderns datum överensstämmer med händelsens datum, visa händelsens rubrik
if(date("Y-m-d", mktime( 0, 0, 0, $month, $i, $year)) == date("Y-m-d",  strtotime($eventdates[$j])))
{
echo '<input type="checkbox" name="del[]" value="'.$evids[$j].'"/>&nbsp;
<a href="'.$_SERVER['PHP_SELF'].'?p=edit_event&day='.$i.'&month='.$month.'
&year='.$year.'&evid='.$evids[$j].'">'.$headings[$j].'</a>
<br />';				
	}else{			
	            echo '&nbsp;'; // Ingen utskrift			
	}
}				
// Funktionen showAddButton() används för att visa knappen för idag och kommande dagar men 
// inte för tidigare dagar.
echo '</td><td>'
.showAddButton( $i, $month, $year ).'
</td></tr>'; 		
		
}
?>
addewebMedlem sedan jan. 2004216 inlägg
#10

Efter jag har fått fason på händelselistan, har jag fått ett nytt problem. Vad som händer när datum inte stämmer är att blanksteget som finns i else-satsen upprepar sig flera gånger. Har sett mängder med blanksteg i källkoden där inga rubriker finns. Det påverkar också länkrubrikerna som får olika avstånd från vänster istället för att placeras längst till vänster. Jag har provat med att ta bort else-satsen med blanksteget vilket gjorde att det fungerade bättre men inte tillräckligt. Linjerna mellan dagarna försvann istället. Om jag skulle lägga in annat istället för blanksteget, då blir det också upprepning av det nya. Vad ska jag göra för att behålla linjerna?

addewebMedlem sedan jan. 2004216 inlägg
#11

Det fungerar nu bra utan upprepande blanksteg. Har lagt till en variabel $space för koll om blanksteg har skrivits eller inte.

$space = true; // Variabeln $space sätts till true för koll om blanksteg har skrivits. 
for( $j = 0; $j < $count_events; $j++)
{
// Om kalenderns datum överensstämmer med händelsens datum, visa händelsens rubrik
if(date("Y-m-d", mktime( 0, 0, 0, $month, $i, $year)) == date("Y-m-d", ´
 strtotime($eventdates[$j])))
{		
echo '<a href="'.$_SERVER['PHP_SELF'].'?	
p=edit_event&day='.$i.'&month='.$month.'&year='.$year.'&evid='.$evids[$j].'">'
.$headings[$j].'</a><br />';	
				
		}else{
			if (!$space){         
       			 echo '&nbsp;';
   			$space=true; 
		}	
	}		
}
136 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)