Avatar billede BTEngineer Novice
01. april 2008 - 22:42 Der er 10 kommentarer og
1 løsning

Kalender problem

Hej.

Jeg har lavet følgende events system:
http://www.intetliv.dk/test/view.html

Problemet er, at hvis man tilføjer mere end et event til f.eks. den. 2 april 2008, så viser den kun det nyeste event.
Ville gerne have det sådan, at hvis der er to eller flere events til èn dag, så skal de stå sådan:

02. Onsdag
      - test
      - test2

Min kode ser sådan her ud:
<?
    include("../inc/cfg.php");

    include 'calendar.php';
?>

<table border="0" width="100%" cellspacing="1" height="95%">
    <tr>
        <td width="298" valign="top">

<?
    $currentTime = mktime(0, 0, 0, $month, $day, $year);
    $weekinfo = array();
    getWeekinfo($currentTime, $weekinfo);
   
    $prevWeekinfo = array();
    getWeekinfo($weekinfo['startTime']-(24*60*60), $prevWeekinfo);
   
    $nextWeekinfo = array();
    getWeekinfo($weekinfo['endTime']+(24*60*60), $nextWeekinfo);
   
    $monthNames = array('01' => 'Jan', '02' => 'Feb', '03' => 'Mar', '04' => 'Apr', '05' => 'Maj', '06' => 'Jun', '07' => 'Jul', '08' => 'Aug', '09' => 'Sep', '10' => 'Okt', '11' => 'Nov', '12' => 'Dec');
?>

<a href="./?date=<?=$prevWeekinfo['startDate']?>" >&lt;&lt;</a> Uge <?=$weekinfo['week']?>. <?=$weekinfo['startDay']?> <?=$monthNames[$weekinfo['startMonth']]?> - <?=$weekinfo['endDay']?> <?=$monthNames[$weekinfo['endMonth']]?> <a href="./?date=<?=$nextWeekinfo['startDate']?>" >&gt;&gt;</a>
<br><br>
<?
$days = getDays($weekinfo['startDate'], $weekinfo['endDate']);

for ($i = 0; $i < 7; $i++){

    $curTime = $weekinfo['startTime'] + ($i * 24 * 60 * 60);
    $curDate = date('Y-m-d', $curTime); // hele datoen
    $curDay  = date('d', $curTime); // nummer på dagen.
    $text = $dayNames[date('N', $curTime)-1].': ';
   
    if (isset($days[$curDate])){   
        echo $curDay,'. ', $text, '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - <a target="open" href="vis_event.php?id='.$days[$curDate]['id'].'">'.$days[$curDate]['overskrift'].'</a><br><br>';
    } else {
        echo $curDay, '. ', $text, '<br><br>';
   
}
}
?>
    </td>
        <td width="936" valign="top">
            <p>
            <iframe src="vis_event.php" name="open" height="100%" width="100%" border="0" frameborder="0" scrolling="no">Your browser does not support inline frames or is currently configured not to display inline frames.</iframe>
        </td>
    </tr>
</table>

og CALENDER.PHP:
<?
        include("../inc/cfg.php");

    function getDays($startDate, $endDate){
        global $mysqli;
       
        $startDate = mysql_real_escape_string($startDate);
        $endDate = mysql_real_escape_string($endDate);
       
        $sql =    'SELECT * FROM events'.' WHERE date >= '.$startDate.' AND '.$endDate.' <= date';
        $result = mysql_query($sql) or die(mysql_error());
       
        $arr = array();
        while ($res = mysql_fetch_array($result) ){
            $arr[$res['date']] = $res;
        }
       
        return $arr;
    }
   
    function getWeekinfo($time, & $data){
       
        $data['week'] = date('W', $time);
        // Find first day of the week
        for ($i = 1; true; $i++){
            if ( date('W',$time - ($i * 60 * 60 * 24)) != $data['week']){
                $data['startTime'] = $time - (($i-1) * 60 * 60 * 24);
                $data['startDay'] = date('d', $data['startTime']);
                $data['startMonth'] = date('m', $data['startTime']);
                $data['startYear'] = date('Y', $data['startTime']);
                $data['startDate'] = date('Y-m-d', $data['startTime']);
                break;
            }
        }
       
        // Find last day in the week
        for ($i = 1; true; $i++){
            if (date('W',$time + ($i * 60 * 60 * 24)) != $data['week']){
                $data['endTime'] = $time + (($i-1) * 60 * 60 * 24);
                $data['endDay'] = date('d', $data['endTime']);
                $data['endMonth'] = date('m', $data['endTime']);
                $data['endYear'] = date('Y', $data['endTime']);
                $data['endDate'] = date('Y-m-d', $data['endTime']);
                break;
            }
        }
       
    }
   
    $dayNames = array('Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag', 'Søndag');
   
    $DATE = '/^(\d\d\d\d)-(\d\d)-(\d\d)$/';
   
    $startDate = null;
    if (!isset($_GET['date']) || preg_match($DATE, $_GET['date']) == 0){
        $startDate = date('Y-m-d');
    } else {
        $startDate = $_GET['date'];
    }

    $dates = array();
    preg_match($DATE, $startDate, $dates);
   
    $year = $dates[1];
    $month = $dates[2];
    $day = $dates[3];
?>

Tak på forhånd.
Avatar billede BTEngineer Novice
01. april 2008 - 22:43 #1
Og det vises jo her:
if (isset($days[$curDate])){   
        echo $curDay,'. ', $text, '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - <a target="open" href="vis_event.php?id='.$days[$curDate]['id'].'">'.$days[$curDate]['overskrift'].'</a><br><br>';
    } else {
        echo $curDay, '. ', $text, '<br><br>';
   
}
Avatar billede BTEngineer Novice
01. april 2008 - 22:54 #2
Og..

Så vil jeg gerne have lavet sådan, at den skifter mellem at have en rød + foran linket og en grøn + foran linket.

Giver gerne ekstra points.
Avatar billede fant0mas Nybegynder
02. april 2008 - 09:02 #3
Det kan du som sådan ikke. Grunden hertil er ønsket om at begrænse querys.
Men i dit tilfælde er det vist ligemeget.
Men omskriv funktionen getDays til:
function getDays($thedate){
           
$thedate = mysql_real_escape_string($thedate);
       
$sql =    "SELECT * FROM calendar WHERE date = '$thedate'";
       
$result = mysql_query($sql) or die(mysql_error());       
$arr = array();
$i = 0;
while ($res = mysql_fetch_assoc($result) ){
if(($i%2)? $color = 'Red': $color = 'Green'); // FARVEN PÅ PLUS(+)
$arr[] = '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="'.$color.'">+</font> <a target="open" href="vis_event.php?id='.$res['id'].'">'.$res['overskrift'].'</a>';   
$i++;       
}       
$pony = implode($arr);
return $pony;
}

---------------------------------------------------------
Og alt i denne if: if (isset($days[$curDate])){ bla bla bla }
Til: 

$disp = getDays($curDate);
if (!empty($disp)){ 
echo $curDay, '. ', $text;
echo $disp.'<br>';
} else {
echo $curDay, '. ', $text, '<br><br>';
}
Avatar billede BTEngineer Novice
02. april 2008 - 19:02 #4
Så ser det sådan her ud:
http://www.intetliv.dk/test/view.html
Avatar billede BTEngineer Novice
02. april 2008 - 19:04 #5
Sikker på man skal ændre:
    function getDays($startDate, $endDate){
        global $mysqli;
       
        $startDate = mysql_real_escape_string($startDate);
        $endDate = mysql_real_escape_string($endDate);
       
        $sql =    'SELECT * FROM events'.' WHERE date >= '.$startDate.' AND '.$endDate.' <= date';
        $result = mysql_query($sql) or die(mysql_error());
       
        $arr = array();
        while ($res = mysql_fetch_array($result) ){
            $arr[$res['date']] = $res;
        }
       
        return $arr;
    }

til
function getDays($thedate){
           
$thedate = mysql_real_escape_string($thedate);
       
$sql =    "SELECT * FROM calendar WHERE date = '$thedate'";
       
$result = mysql_query($sql) or die(mysql_error());       
$arr = array();
$i = 0;
while ($res = mysql_fetch_assoc($result) ){
if(($i%2)? $color = 'Red': $color = 'Green'); // FARVEN PÅ PLUS(+)
$arr[] = '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="'.$color.'">+</font> <a target="open" href="vis_event.php?id='.$res['id'].'">'.$res['overskrift'].'</a>';   
$i++;       
}       
$pony = implode($arr);
return $pony;
}
Avatar billede fant0mas Nybegynder
02. april 2008 - 19:23 #6
Ja, nu har jeg jo selv skrevet det :D
Har du husket denne også:

Og alt i denne if: if (isset($days[$curDate])){ bla bla bla }
Til:

$disp = getDays($curDate);
if (!empty($disp)){
echo $curDay, '. ', $text;
echo $disp.'<br>';
} else {
echo $curDay, '. ', $text, '<br><br>';
}
Avatar billede BTEngineer Novice
02. april 2008 - 19:42 #7
ja der står:

$days = getDays($weekinfo['startDate'], $weekinfo['endDate']);

for ($i = 0; $i < 7; $i++){

    $curTime = $weekinfo['startTime'] + ($i * 24 * 60 * 60);
    $curDate = date('Y-m-d', $curTime); // hele datoen
    $curDay  = date('d', $curTime); // nummer på dagen.
    $text = $dayNames[date('N', $curTime)-1].': ';
   
if (isset($days[$curDate])){
   
$disp = getDays($curDate);
if (!empty($disp)){ 
echo $curDay, '. ', $text;
echo $disp.'<br>';
} else {
echo $curDay, '. ', $text, '<br><br>';
}
}
}
Avatar billede fant0mas Nybegynder
02. april 2008 - 20:02 #8
Hele denne if skal væk!
if (isset($days[$curDate])){
Avatar billede fant0mas Nybegynder
02. april 2008 - 20:04 #9
Altså sådan:

$days = getDays($weekinfo['startDate'], $weekinfo['endDate']);

for ($i = 0; $i < 7; $i++){

    $curTime = $weekinfo['startTime'] + ($i * 24 * 60 * 60);
    $curDate = date('Y-m-d', $curTime); // hele datoen
    $curDay  = date('d', $curTime); // nummer på dagen.
    $text = $dayNames[date('N', $curTime)-1].': ';
 
 
$disp = getDays($curDate);
if (!empty($disp)){
echo $curDay, '. ', $text;
echo $disp.'<br>';
} else {
echo $curDay, '. ', $text, '<br><br>';
}
}
Avatar billede BTEngineer Novice
02. april 2008 - 20:11 #10
Tusinde tak.

Det virker perfekt.

Har du noget i mod, at forklarer mig, hvad du har gjort?
Altså hvorfor den ikke viste alle før.. og gerne lidt om denne streng: if(($i%2)?
og om funktionen for();

- Kun hvis du gider :)
Avatar billede fant0mas Nybegynder
02. april 2008 - 20:52 #11
Meget gerne :o).
1.
Det er fordi datoen er brugt som index-nøgle i arrayet, og flere rækker derfor vil overskrive den gamle. Fordelen er, at det kun kræver ét databasekald, hvorimod den nye metode kræver én for hver dag, altså 7.

2.
En forkortet version af:
if($i%2 == 1){
$color = 'Red';
}else{
$color = 'Green';
}

% tegnet betyder Modulus og returnerer resten af $i divideret med 2
Dvs. enten 0 eller 1 i dette tilfælde. Du kan selv prøve:

for($i=0;$i<7;$i++){
if($i%2 == 1){
echo ($i%2).'<br>';
}else{
echo ($i%2).'<br>';
}
}

3.
for er en løkke, som her kører til $i er 6
$i++ betyder at vi for hver gennemgang af løkken ligger 1 til værdien.

Tak for points!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester