dbwebb-se / webtec

Course repo for web technologies - webtec.
Other
12 stars 7 forks source link

Tips, trix och show-off från kmom03 med "Idag är det fredag" och "Månadskalender" #15

Open mosbth opened 2 years ago

mosbth commented 2 years ago

I kmom03 kodar vi PHP med en sida "Today is Friday?" och en månadskalender.

Kika här för ett par exempel på hur "Is it Friday?" kan se ut.

Kika här för ett par exempel på hur "Månadskalender" kan se ut.

Här kommer ett par reflektioner från de som jobbat igenom uppgiften. Eventuellt kan det ge ledtrådar samt ge tips till vilka delar som kan upplevas som svår i kursmomentet.

Denna uppgiften har definitivt varit den svåraste hittills. Utmanade att inte kunna testköra sin kod så enkelt. Get och querysträngar var helt nytt för mig. Väldigt praktiskt att använda men inte helt lätt. if-satser och loopar känner jag mig bekväm med sedan tidigare, det var inga problem.

Allra svårast var att programmera tid och datum. Det är komplicerat och omständigt. Utgår från unix-tidsstämpel, alltså antal sekunder från 1970-01-01 00:00:00.

Utgick från övningar och byggde vidare på det. Med hjälp av en mängd olika if-satser kunde jag ställa olika kriterier. Bland annat kriteriet om det är första dagen i månaden och måndag skriv ut veckonumret.

Kalenderuppgiften fick jag ta mig till google för, jag hade inte koll på hur man kunde generera innehåll med looparna. Men när jag hittade hur man kombinerade en for-loop med echo kändes det rätt enkelt att generera fram en tabell, en rad i taget. Kombinerat med en rad if-satser för den villkorade formateringen och en massa sträng-manipulation för att formatera datumen rätt så gick det till slut. Kul uppgift! I mina stack overflow-eskapader lyckades jag även kosntatera att formattributet action = ”” ger fel i unicorn, men verkar ändå vara accepterad metod för self-submitting form enligt Mikael och stack overflow =).

Jag tycker att det här kursmomentet var betydligt svårare än de tidigare. Speciellt kalendersidan tyckte jag var svår. Det var många svåra saker, men jag hade speciellt svårt för "datumkalkylerna".

Jag gjorde båda extrauppgifterna och tyckte att de var betydligt lättare än de ordinarie. Jag använde mig av ledtrådarna i kursmaterialet, vilket underlättade mycket. Jag missade kanske ledtrådarna för de ordinarie uppgifterna?

Jag tycker att jag är bekväm med att använda den delen av PHP som har behandlats i det här kursmomentet. Men jag lyckades t.ex. inte "plocka ut" de svenska namnen på veckodagar och månader, utan tvingades hårdkoda dessa.

Uppgifterna var ju två rätt så olika. Den delen med en friday-sida jobbade jag igenom i övningen och den koden var ju bara att återanvända delar från den. Den andra delen av uppgiften med en månadskalender var desto lurigare. Jag började med att definiera alla variabler som jag behövde och sen stolpade jag upp alla delar som behövdes i tabellen i en for-loop. Sen var det bara att skriva i alla delar och jämföra med veckodagar för att få ditt röd färg och veckonummer där det ska vara.

Den delen som jag fastnade länge på och som jag aldrig riktigt förstod var något som uppstod när jag skulle göra länkarna för nästa och föregående månad. När jag var på 1:a oktober så blev länken till nästa månad den 31:a oktober och inte 1:a november. Trots att jag la till X dagar för att få fram nästa månad där X var antalet dagar i månaden (dubbelkollat med echo att vara 31 som det ska vara i oktober). Det slutade med att jag använde en $nextMonth = $nextMonth->modify-metod istället, och det gick ju bra. Men det gäckar mig att jag inte vet varför det blev fel med mitt första tillvägagångssätt.

mosbth commented 1 year ago

Om man kämpar med uppgifterna så finns det ett par videor som hjälper hur man kan tänka kring problemlösningen och de första raderna kod. Videorna är troligen bra för att få en känsla av hur koden kan se ut, hur man tänker kring problemlösning.

Tipset är att inte gå direkt på videorna utan att själv försöka först och se hur långt man kommer, använd videorna som livlinor när det kör ihop sig.

Man kan även titta på videorna när man själv är klar med uppgiften, för att se en alternativ lösning på uppgifterna.

Kmom03: Mikael visar hur man kan komma igång och lösa uppgiften med friday.php

Kmom03: Kom igång att lösa uppgiften med månadskalendern och month.php

Kmom03: Hur tänka när man skall loopa igenom alla dagar i en månad och skriva ut en tabell month.php

mosbth commented 1 year ago

Att räkna med datum kan göras med timestamp och antal sekunder för en dag, det ger rätt datum när man räknar med timestampet som grund.

En annan variant är att räkna via funktionen strtotime() där man kan hitta ett datum utifrån en timestamp och en relativ sträng. här är ett exempel på en webbsida som får in ett datum och längst ned ser du hur man "räknar ut" vilket datum måndag/söndag är i veckan eller månadens första sista dag och föregående/nästa månad.

image

Det spännande med strtotime() är att man kan utföra denna beräkning med strängar. Kodan bakom webbsidan kan se ut så här.

$date = $_GET["date"] ?? date('Y-m-d');

$timestamp = strtotime($date);

$firstDayInWeek  = date('Y-m-d', strtotime("Monday this week", $timestamp));
$lastDayInWeek  = date('Y-m-d', strtotime("Sunday this week", $timestamp));
$firstDayInMonth = date('Y-m-d', strtotime("first day of this month", $timestamp));
$lastDayInMonth = date('Y-m-d', strtotime("last day of this month", $timestamp));
$previousMonth = date('Y-m-d', strtotime("first day of previous month", $timestamp));
$nextMonth = date('Y-m-d', strtotime("first day of next month", $timestamp));

Prova gärna med ett eget litet kodexempel för att se hur flexibelt du kan ange ett datum relativt ett timestamp. Kanske är denna typen av kod något som kan förenkla arbetet i kmom03 och i kmom04. Men det finns andra varianter där man räknar med datum "för hand" som fungerar lika bra.

mosbth commented 1 year ago

Nu kan jag göra min lilla kalender. Jag gör det stegvis.

Först skriver jag ut månadens namn och året i en html tabell, tillsammans med antal dagar i den månaden.

$daysInMonth    = date('t', $timestamp);

image

Sedan lägger jag till länkarna så att jag kan klicka mellan föregående och nästa månad. Här tar jag användning av mina variabler för $previousMonth och $nextMonth. image

Nu är trixet att skapa en loop från månades första dag till den sista. Men jag vet att det börjar på 1 och slutar på $daysInMonth så en for-loop låter som en rimlig konstruktion. Jag kan göra enklaste möjliga för att veta att loopen blir rätt.

$calStr = "";
for ($i = 1; $i <= $daysInMonth; $i++) {
    $calStr .= "<tr>";
    $calStr .= "<td>$i dagens nummer</td>";
    $calStr .= "</tr>";
}

image

Fint, det där var iallafall en start.