Avatar billede jdjensen Juniormester
15. juli 2019 - 22:21 Der er 54 kommentarer og
1 løsning

Vis tekst afhængig af dag og tidspunkt

Jeg søger et PHP-script der kan printe teksten "ÅBEN" eller "LUKKET" på en Wordpress-side, afhængig af hvilken dag og hvilket tidspunkt det er på dagen.

Formålet med scriptet er at fortælle mine brugere, om min chat er åben eller lukket vha. en tekst, som jeg efterfølgende kan style som jeg vil med CSS.

ÅBEN skal vises på disse tidspunkter:

Mandag fra kl. 09.00 - 17.00
Tirsdag fra kl. 09.00 - 17.00
Onsdag fra kl. 09.00 - 17.00
Torsdag fra kl. 09.00 - 17.00
Fredag fra kl. 09.00 - 17.00

LUKKET skal vises på de øvrige tidspunkter inkl. både lørdag og søndag:

Mandag fra kl. 17.00 - 09.00
Tirsdag fra kl. 17.00 - 09.00
Onsdag fra kl. 17.00 - 09.00
Torsdag fra kl. 17.00 - 09.00
Fredag fra kl. 17.00 - 09.00
Lørdag fra kl. 00.00 - 00.00
Søndag fra kl. 00.00 - 00.00

Jeg påtænker at scriptet skal tilføjes i min Functions.php fil i WordPress. Derefter lave en "shortcode" der automatisk genererer det ønskede output, "ÅBEN" eller "LUKKET".

Er der en som kan hjælpe med dette? :-)

På forhånd tak.
Avatar billede acore Ekspert
16. juli 2019 - 11:59 #1
$ts = time();
$hhmm = date("H", $ts)*100 + date("i", $ts);
$shortcode = (date("N", $ts) <= 5 && $hhmm >= 900 && $hhmm <= 1700? "ÅBEN": "LUKKET");
Avatar billede acore Ekspert
16. juli 2019 - 11:59 #2
PS. Ikke testet
Avatar billede jdjensen Juniormester
16. juli 2019 - 14:01 #3
Hej acore

Mange tak for dit svar.

Jeg har forsøgt at "omdanne" dit script til en shortcode i min functions.php fil.

function ChatServiceShortcode() {
    $ts = time();
    $hhmm = date("H", $ts)*100 + date("i", $ts);
    $shortcode = (date("N", $ts) <= 5 && $hhmm >= 900 && $hhmm <= 1700? "&Aring;ben": "Lukket");
    return $shortcode;
}
add_shortcode('chatservice', 'ChatServiceShortcode');

Når jeg bruger [chatservice] på min side printer den nu:

<p>�ben</p>

(alternativt kan jeg bruge "&Aring;" for at vise Å korrekt)

Jeg har dog endnu ikke haft mulighed for at teste, om den skriver LUKKET efter kl. 17.

Derudover har jeg svært ved at se, hvordan jeg i fremtiden skal redigere dage og tidspunkterne hvor der vises ÅBEN eller LUKKET i dit script. Jeg vil gerne hvis det er nemmere at styre, f.eks. hvis chatten kun skal være åben i udvalgte timer på én dag og andre timer en anden dag. Eller hvis chatten en dag er lukket på en tirsdag. Er det muligt at gøre dette lidt nemmere at styre for en ikke-PHP-script-guru? ;-)

Derudover kan jeg ikke rigtig finde ud af, hvordan jeg automatisk får tilføjet en class til outputtet men ellers kan jeg også tilføje den således:

<p class="chatservice">[chatservice]</p>
Avatar billede jdjensen Juniormester
16. juli 2019 - 14:18 #4
Apropos classes der skal bruges, så vil jeg gerne have at der bruges én class når chatten er ÅBEN og en anden class når chatten er LUKKET. Eks:

ÅBEN:
<div class="chatservice-open">[chatservice]</p>

LUKKET:
<div class="chatservice-closed">[chatservice]</p>

Så jeg kan style det på basis af den tekst der bliver vist.
Avatar billede acore Ekspert
16. juli 2019 - 14:46 #5
Du kan ændre 1700 til 1430 for at se om den viser lukket.

Det kan sagtens lave mere fleksibelt - fx

function ChatServiceShortcode() {
  // Day 1 is Monday, 2 is Tuesday and so on - closed in Tuesdays and Saturdays
  $openinghours = array(
      array( "day" => 1, "open" => 900, "close" => 1200),
      array( "day" => 1, "open" =>1300, "close" => 1600),
      array( "day" => 1, "open" =>1910, "close" => 1920),
      array( "day" => 3, "open" => 900, "close" => 1700),
      array( "day" => 4, "open" => 900, "close" => 1600),
      array( "day" => 5, "open" => 900, "close" => 1700),
      array( "day" => 7, "open" => 930, "close" => 1004)
    );
  $ts = time();
  $hhmm = date("H", $ts)*100 + date("i", $ts);

  $isopen = false;

  foreach ($openinghours as $day) {
    if (date("N", $ts) == $day['day'] && $hhmm >= $day['open'] && $hhmm <= $day['close']) {
      $isopen = true;
      break;
    }
  }

  return $isopen? "<div class='chatservice-open'>&Aring;ben</div>": "<div class='chatservice-close'>Lukket</div>";
}

Har forsøgt at lægge class ind, men er ikke helt sikker på, at det er det, du mener (stadig ikke testet)
Avatar billede acore Ekspert
16. juli 2019 - 14:53 #6
Hvis du gerne vil løfte åbningsdage og -tider helt ud af koden, kan du for eksempel placere den i en xml fil, som du henter dem fra - let at kode og lidt mere sikkert over for fejl
Avatar billede jdjensen Juniormester
16. juli 2019 - 15:29 #7
Hej acore

Det gjorde det meget nemmere at styre, tak. :-)

Der er noget med tidspunkterne der ikke helt passer. Hvis jeg f.eks. sætter tirsdag til at der skal stå lukket kl. 15, så viser den stadig åben. Det er som om den er 2 timer bagud for hvis jeg sætter close til kl. 13, så står der lukket.

      array( "day" => 1, "open" => 900, "close" => 1700),
      array( "day" => 2, "open" => 900, "close" => 1300),
      array( "day" => 3, "open" => 900, "close" => 1700),
      array( "day" => 4, "open" => 900, "close" => 1700),
      array( "day" => 5, "open" => 900, "close" => 1700),

Det er helt perfekt med den måde du har sat classes ind på i printet.

Kan man egentlig også lave så der står "Lukker snart" når det f.eks. er en time før close/lukketid? Dette print skal så have en class="chatservice-closing-soon" så jeg kan style den seperat fra de andre 2.
Avatar billede jdjensen Juniormester
16. juli 2019 - 15:37 #8
I min wordpress står universal tid (UTC) også til 2 timer tidligere end lokaltid.

Universel tid (UTC) er 2019-07-16 13:36:11.
Lokal tid er 2019-07-16 15:36:11.

Det ser altså ud til at den regner ud fra universal tid og ikke lokal tid.
Avatar billede jdjensen Juniormester
16. juli 2019 - 15:43 #9
- Tidszone UTC+2.
Avatar billede acore Ekspert
16. juli 2019 - 15:46 #10
Noget kunne tyde på, at din server-tid ikke passer med din egen tidszone. Det kan løses ved at fixe "problemet" eller ved at kompensere for det i koden. ret til

$ts = time() + 2*24*3600; // Server-offset in seconds

Man kan sagtens lave "lukker snart" eller "åbner snart" eller "idagerderlukket" eller "denæste14dageholdervisommerferie" - her er endnu et bud:

function ChatServiceShortcode() {
  // Day 1 is Monday, 2 is Tuesday and so on
  $openinghours = array(
      array( "day" => 1, "start" =>  900, "end" => 1200, "text" => "<div class='chatservice-open'>&Aring;ben</div>"),
      array( "day" => 1, "start" => 1200, "end" => 1300, "text" => "<div class='chatservice-Lunch'>Lunch-break - back soon</div>"),
      array( "day" => 1, "start" => 1300, "end" => 1600, "text" => "<div class='chatservice-open'>&Aring;ben</div>"),
      array( "day" => 1, "start" => 1600, "end" => 1700, "text" => "<div class='chatservice-closingsoon'>Lukker snart!</div>"),
      array( "day" => 2, "start" =>  900, "end" => 1700, "text" => "<div class='chatservice-open'>&Aring;ben</div>"),
      array( "day" => 3, "start" =>  900, "end" => 1700, "text" => "<div class='chatservice-open'>&Aring;ben</div>"),
      array( "day" => 4, "start" =>  900, "end" => 1700, "text" => "<div class='chatservice-open'>&Aring;ben</div>"),
      array( "day" => 5, "start" =>  900, "end" => 1700, "text" => "<div class='chatservice-open'>&Aring;ben</div>")
    );
  $text = ""<div class='chatservice-close'>Lukket</div>";  // Default text, if non of the above fulfilled
  $ts_offset = 2; // hours

  $ts = time() + $ts_offset*3600;
  $hhmm = date("H", $ts)*100 + date("i", $ts);

  foreach ($openinghours as $day) {
    if (date("N", $ts) == $day['day'] && $hhmm >= $day['start'] && $hhmm <= $day['end']) {
      $text = $day['text'];
      break;
    }
  }

  return $text;
}
Avatar billede jdjensen Juniormester
16. juli 2019 - 16:12 #11
Ah ok jeg er med, tak. :-)

Jeg får dog en fejl i den seneste kode:

Parse error: syntax error, unexpected 'class' (T_CLASS) i functions.php
Avatar billede jdjensen Juniormester
16. juli 2019 - 16:13 #12
Ok det var så fordi jeg havde et komma for meget. Jeg tjekker lige om det virker efter hensigten og vender tilbage.
Avatar billede jdjensen Juniormester
16. juli 2019 - 16:17 #13
Nope jeg ved ikke om jeg har overset noget i dit svar men jeg får en parse error når jeg bruger nedenstående:

function ChatServiceShortcode() {
  // Day 1 is Monday, 2 is Tuesday and so on - closed in Saturdays and Sundays
  $openinghours = array(
      array( "day" => 1, "start" => 900, "end" => 1600, "text" => "<div class='chatservice-open'>&Aring;ben</div>"),
      array( "day" => 1, "start" => 1600, "end" => 1700, "text" => "<div class='chatservice-closing-soon'>Lukker snart</div>"),
      array( "day" => 2, "start" => 900, "end" => 1600, "text" => "<div class='chatservice-open'>&Aring;ben</div>"),
      array( "day" => 2, "start" => 1600, "end" => 1700, "text" => "<div class='chatservice-closing-soon'>Lukker snart</div>"),
      array( "day" => 3, "start" => 900, "end" => 1600, "text" => "<div class='chatservice-open'>&Aring;ben</div>"),
      array( "day" => 3, "start" => 1600, "end" => 1700, "text" => "<div class='chatservice-closing-soon'>Lukker snart</div>"),
      array( "day" => 4, "start" => 900, "end" => 1600, "text" => "<div class='chatservice-open'>&Aring;ben</div>"),
      array( "day" => 4, "start" => 1600, "end" => 1700, "text" => "<div class='chatservice-closing-soon'>Lukker snart</div>"),
      array( "day" => 5, "start" => 900, "end" => 1600, "text" => "<div class='chatservice-open'>&Aring;ben</div>"),
      array( "day" => 5, "start" => 1600, "end" => 1700, "text" => "<div class='chatservice-closing-soon'>Lukker snart</div>")
    );
  $text = ""<div class='chatservice-close'>Lukket</div>";  // Default text, if non of the above fulfilled
  $ts_offset = 2; // hours

  $ts = time() + $ts_offset*3600;
  $hhmm = date("H", $ts)*100 + date("i", $ts);

  foreach ($openinghours as $day) {
    if (date("N", $ts) == $day['day'] && $hhmm >= $day['start'] && $hhmm <= $day['end']) {
      $text = $day['text'];
      break;
    }
  }

  return $text;
}
add_shortcode('chatservice', 'ChatServiceShortcode');
Avatar billede jdjensen Juniormester
16. juli 2019 - 16:34 #14
Hmm det lader til at være dobbelt "" ved:

$text = ""<div class='chatservice-closed'>Lukket</div>";  // Default text, if non of the above fulfilled

Løste ihvertfald problemet da jeg ændrede "" til ". :-)
Avatar billede acore Ekspert
16. juli 2019 - 17:53 #15
Min fejl - der var en " for meget - prøv med

function ChatServiceShortcode() {
  // Day 1 is Monday, 2 is Tuesday and so on
  $openinghours = array(
      array( "day" => 1, "start" =>  900, "end" => 1200, "text" => "<div class='chatservice-open'>&Aring;ben</div>"),
      array( "day" => 1, "start" => 1200, "end" => 1300, "text" => "<div class='chatservice-Lunch'>Lunch-break - back soon</div>"),
      array( "day" => 1, "start" => 1300, "end" => 1600, "text" => "<div class='chatservice-open'>&Aring;ben</div>"),
      array( "day" => 1, "start" => 1600, "end" => 1700, "text" => "<div class='chatservice-closingsoon'>Lukker snart!</div>"),
      array( "day" => 2, "start" =>  900, "end" => 1700, "text" => "<div class='chatservice-open'>&Aring;ben</div>"),
      array( "day" => 3, "start" =>  900, "end" => 1700, "text" => "<div class='chatservice-open'>&Aring;ben</div>"),
      array( "day" => 4, "start" =>  900, "end" => 1700, "text" => "<div class='chatservice-open'>&Aring;ben</div>"),
      array( "day" => 5, "start" =>  900, "end" => 1700, "text" => "<div class='chatservice-open'>&Aring;ben</div>")
    );
  $text = "<div class='chatservice-close'>Lukket</div>";  // Default text, if non of the above fulfilled
  $ts_offset = 2; // hours

  $ts = time() + $ts_offset*3600;
  $hhmm = date("H", $ts)*100 + date("i", $ts);

  foreach ($openinghours as $day) {
    if (date("N", $ts) == $day['day'] && $hhmm >= $day['start'] && $hhmm <= $day['end']) {
      $text = $day['text'];
      break;
    }
  }

  return $text;
}
Avatar billede jdjensen Juniormester
16. juli 2019 - 18:25 #16
Tusind tak for hjælpen.

Hvis jeg ønsker at styre "openinghours" i en ekstern XML-fil, som du siger er nemmere, findes der så en hurtig løsning på det?

Og vil jeg stadig kunne benytte de classes og HTML som er sat ind? Jeg synes nemlig det er fint, at man også kan indramme teksten i f.eks. et link.
Avatar billede acore Ekspert
16. juli 2019 - 18:56 #17
Godt, at du fandt ud af det. Det kan laves magen til med xml. Jeg laver et eksempel med xml senere i dag eller i morgen. Duer ikke med kode fra mobilen.
Avatar billede claes57 Ekspert
17. juli 2019 - 06:29 #18
Husk det der offset på 2 timer følger sommertid, og skal rettes to gange årligt... ville være smart med automatik der også.
Avatar billede acore Ekspert
17. juli 2019 - 09:12 #19
@claes57: Helt enig

Her et forsøg med xml fil og localtime. Det er ikke testet og der burde lægges lidt check ind (fx på om objects findes i xml), hvis det var en produktionskode. Lidt afhængigt af hvor du placerer openinghours.xml og din kode skal du måske ændre

  $xmlfile = "openinghours.xml";

til et absolut path.

openinghours.xml:
<?xml version="1.0"?>
<openinghours>
<openinghour>
  <day>1</day>
  <start>900</start>
  <end>1600</end>
  <class>chatservice-open</class>
  <text>Åben</text>
</openinghour>
<openinghour>
  <day>1</day>
  <start>1600</start>
  <end>1700</end>
  <class>chatservice-closing</class>
  <text>Lukker snart</text>
</openinghour>
<openinghour>
  <day>3</day>
  <start>600</start>
  <end>1700</end>
  <class>xchatservice-closing</class>
  <text>xxLukker snart</text>
</openinghour>
<closinghour>
  <class>chatservice-closed</class>
  <text>Lukket</text>
</closinghour>
</openinghours>

php:
function ChatServiceShortcode() {
  $xmlfile = "openinghours.xml";

  $text = "";
  $class = "";
  if ($xml = @simplexml_load_file($xmlfile)) {
    $text = $xml->closinghour->text;
    $class = $xml->closinghour->class;

    $localtime = localtime(time(), true);
    $wday = $localtime['tm_wday'];
    $hhmm = $localtime['tm_hour']*100 + $localtime['tm_min'];

    foreach ($xml->openinghour as $day) {
      if ($wday == $day->day && $hhmm >= $day->start && $hhmm < $day->end) {
        $text = $day->text;
        $class = $day->class;
        break;
      }
    }
  }

  return "<div class='".$class."'>".$text."</div>";
}
Avatar billede jdjensen Juniormester
17. juli 2019 - 20:15 #20
Hej acore

Tak jeg tester lige med XML-filen så snart jeg kommer hjem.

Yicks - kan du også automatisere tiden? Jeg vil med garanti glemme at ændre offset de gange det skal gøres på et år? Tak for input claes57. :-)))
Avatar billede jdjensen Juniormester
17. juli 2019 - 20:38 #21
Hej igen

Jeg har lige forsøgt med XML-filen og det nye PHP-script men der kommer ikke noget tekst ud på siden denne gang. Jeg har sat en absolut URL ind til XML-filen i PHP-scriptet.
Avatar billede jdjensen Juniormester
17. juli 2019 - 20:44 #22
Nevermind, der var en fejl i URL'en til min XML-fil. Nu er der hul igennem. :-)

Men hvis tiden kan automatiseres i forhold til sommer- og vintertid, så vil det være en kæmpe hjælp.
Avatar billede acore Ekspert
17. juli 2019 - 20:57 #23
Jeg har testet koden, og den burde virke. Er du sikker på path?

Du kan prøve at rette linien med $text=“” til

$text = getcwd();

Hvis xml filen ikke kan åbnes, vil den udskrive aktuelt path. Den kan måske hjælpe til at checke. Er det forståeligt?
Avatar billede claes57 Ekspert
17. juli 2019 - 21:03 #24
sommertid er 'simpelt'
standard, så sæt din tid til UTC + 1 time, og hvis datoen er mellem
sidste søndag i marts og sidste søndag i oktober
så læg en time mere til. Skiftet sker kl 02:00 søndag morgen, så hvis du tester på søndag, så er det ok mht lukketider hvis du altid holder lukket mellem 00:00 og 03:00 i weekender.
Avatar billede acore Ekspert
17. juli 2019 - 21:04 #25
Tiden skulle være automatiseret. Den bruger nu localtime, der skulle være rigtig. Hvis du vil teste hvad tid, den bruger, så læg linien

print_r($localtime);

Ind før return. Det udskriver tiden, der bruges. Se https://www.php.net/manual/en/function.localtime.php for detaljer om hvad den dumper.
Avatar billede jdjensen Juniormester
17. juli 2019 - 21:05 #26
Det er dog som om at den ikke bruger CSS klasserne og ikke retter sig efter tidspunkterne. Kl. er nu 21 og hvis jeg bruger følgende:

<openinghour>
  <day>3</day>
  <start>900</start>
  <end>1900</end>
  <class>chatservice-open</class>
  <text>Åben</text>
</openinghour>

Så printer den stadig "Åben" hvor den burde printe "Lukket".

Og når den så er "Åben" så bruger den ikke CSS stilen "chatservice-open". Eller når den er ved at lukke så bruger den ikke "chatservice-closing". Meget mystisk.
Avatar billede acore Ekspert
17. juli 2019 - 21:07 #27
@claes57: ...eller brug localtime
Avatar billede acore Ekspert
17. juli 2019 - 21:10 #28
Prøv først forslaget i #23 så du kan se hvilken klokke den bruger
Avatar billede claes57 Ekspert
17. juli 2019 - 21:10 #29
vælg 31. marts i året eller 31. okt i året, og hent weekdaynumber - så træk (7-tallet) fra 31, og du har datoen på sidste søndag i måneden.
Avatar billede acore Ekspert
17. juli 2019 - 21:16 #30
@claes57: Læs venligst hvad jeg skriver i #25. Sommertid ER allerede indbygget. Spørgsmålet er, om den rigtige tidszone er valgt.
Avatar billede acore Ekspert
17. juli 2019 - 21:19 #31
I #28 skulle der stå 25 og ikke 23
Avatar billede jdjensen Juniormester
17. juli 2019 - 21:29 #32
Jeg kan få den til at printe en anden tekst fra XML-filen så URL'en jeg har lagt ind burde være rigtig.

Den printer bare ikke det den skal og med den class jeg har sat ind. Her er min XML-fil hvor den burde printe "Lukker snart" med mindre jeg har lavet en fejl:

<?xml version="1.0"?>
<openinghours>
<openinghour>
  <day>1</day>
  <start>900</start>
  <end>1600</end>
  <class>chatservice-open</class>
  <text>Åben</text>
</openinghour>
<openinghour>
  <day>1</day>
  <start>1600</start>
  <end>1700</end>
  <class>chatservice-closing</class>
  <text>Lukker snart</text>
</openinghour>
<openinghour>
  <day>2</day>
  <start>900</start>
  <end>1600</end>
  <class>chatservice-open</class>
  <text>Åben</text>
</openinghour>
<openinghour>
  <day>2</day>
  <start>1600</start>
  <end>1700</end>
  <class>chatservice-closing</class>
  <text>Lukker snart</text>
</openinghour>
<openinghour>
  <day>3</day>
  <start>900</start>
  <end>2100</end>
  <class>chatservice-open</class>
  <text>Åben</text>
</openinghour>
<openinghour>
  <day>3</day>
  <start>2100</start>
  <end>2300</end>
  <class>chatservice-closing</class>
  <text>Lukker snart</text>
</openinghour>
<openinghour>
  <day>4</day>
  <start>900</start>
  <end>1600</end>
  <class>chatservice-open</class>
  <text>Lukker snart</text>
</openinghour>
<openinghour>
  <day>4</day>
  <start>1600</start>
  <end>1700</end>
  <class>chatservice-closing</class>
  <text>Lukker snart</text>
</openinghour>
<openinghour>
  <day>5</day>
  <start>900</start>
  <end>1600</end>
  <class>chatservice-open</class>
  <text>Åben</text>
</openinghour>
<openinghour>
  <day>5</day>
  <start>1600</start>
  <end>1700</end>
  <class>chatservice-closing</class>
  <text>Lukker snart</text>
</openinghour>
<closinghour>
  <class>chatservice-closed</class>
  <text>Lukket</text>
</closinghour>
</openinghours>
Avatar billede acore Ekspert
17. juli 2019 - 21:37 #33
Prøv forslaget i #25
Avatar billede jdjensen Juniormester
17. juli 2019 - 21:55 #34
Så printer den følgende i toppen af siden:

Array
(
    [tm_sec] => 47
    [tm_min] => 54
    [tm_hour] => 19
    [tm_mday] => 17
    [tm_mon] => 6
    [tm_year] => 119
    [tm_wday] => 3
    [tm_yday] => 197
    [tm_isdst] => 0
)
Avatar billede acore Ekspert
17. juli 2019 - 22:05 #35
Så klokken er 19:54. Men den viden - virker det så med text og class? Det andet fikser vi nårvi ved det virker.
Avatar billede jdjensen Juniormester
17. juli 2019 - 22:11 #36
Hvis jeg lige nu bruger:

<openinghour>
  <day>3</day>
  <start>900</start>
  <end>2430</end>
  <class>chatservice-open</class>
  <text>Åben</text>
</openinghour>

Så printer den "Åben" men den bruger ikke den stilen "chatservice-open". Den printer blot "Åben" i ren tekst.
Avatar billede jdjensen Juniormester
17. juli 2019 - 22:12 #37
Mente:

<openinghour>
  <day>3</day>
  <start>900</start>
  <end>2330</end>
  <class>chatservice-open</class>
  <text>Åben</text>
</openinghour>

Samme resultat.
Avatar billede jdjensen Juniormester
17. juli 2019 - 22:15 #38
Ok stylen virkede kun hvis "Åben" var et link. Jeg havde tidligere lavet det til et link.

Har rettet det i mit stylesheet og nu virker det alle styles igen.

Så det er bare tidspunktet den er gal med nu.
Avatar billede acore Ekspert
17. juli 2019 - 22:17 #39
Kan du prøve med vies source for at se hvilken class den prøver at bruge
Avatar billede jdjensen Juniormester
17. juli 2019 - 22:20 #40
Og hvordan kan jeg så i fremtiden lave teksten til et link.

Forsøgte med følgende i XML-filen:

<text><a href="tel:00000000">Åben</a></text>

Men så kommer der intet ud. :-D

Måske man skulle lave en ekstra entry i XML-filen der hed:

<link> ... </link>
Avatar billede jdjensen Juniormester
17. juli 2019 - 22:25 #41
<div class="chatservice-open">Åben</div>

Så det ser rigtigt ud i kildekoden og mine styles virker igen, efter jeg fik rettet til i mit stylesheet.

Det er blot tidspunktet den er gal med nu og så kunne jeg godt tænke mig en <link> entry i XML-filen der gør teksten til et link.
Avatar billede acore Ekspert
17. juli 2019 - 22:25 #42
Prøv at indsætte linien

date_default_timezone_set(“Europe/Copenhagen”);

som første linie i funktionen og brug #25 til at se tiden.

Det er mærkeligt, at det ikke allerede er sat. Bruger du wordpress?
Avatar billede jdjensen Juniormester
17. juli 2019 - 22:28 #43
Ja jeg bruger WordPress og nu giver den mig:

Array
(
    [tm_sec] => 19
    [tm_min] => 27
    [tm_hour] => 22
    [tm_mday] => 17
    [tm_mon] => 6
    [tm_year] => 119
    [tm_wday] => 3
    [tm_yday] => 197
    [tm_isdst] => 1
)

Tidspunktet er 22:27 så det stemmer?
Avatar billede acore Ekspert
17. juli 2019 - 22:36 #44
Og tm_isdst er 1, hvilket betyder sommertid.

Så alt spiller - undtagen link?
Avatar billede jdjensen Juniormester
17. juli 2019 - 22:39 #45
Tidspunkterne spiller 100% acore, tak!!! :-)

Ja en <link> entry i XML-filen ville være prikken over i'et. Det er bare ikke på alle tidspunkter jeg vil gøre teksten til et link så det må ikke være et krav at den entry skal sættes.
Avatar billede acore Ekspert
17. juli 2019 - 23:02 #46
Nu med link - fx <link>https://www.computerworld.dk/eksperten/spm/1029386</link>

Virker også, hvis link udelades

function ChatServiceShortcode() {
  $xmlfile = "openinghours.xml";
  $tz = “Europe/Copenhagen”;

  date_default_timezone_set($tz);

  $text = "";
  $class = "";
  $link = "";
  if ($xml = @simplexml_load_file($xmlfile)) {
    $text = $xml->closinghour->text;
    $class = $xml->closinghour->class;

    $localtime = localtime(time(), true);
    $wday = $localtime['tm_wday'];
    $hhmm = $localtime['tm_hour']*100 + $localtime['tm_min'];

    foreach ($xml->openinghour as $day) {
      if ($wday == $day->day && $hhmm >= $day->start && $hhmm < $day->end) {
        $text = $day->text;
        $class = $day->class;
        $link = (isset($day->link)? $day->link: "");
        break;
      }
    }
  }
  if ($link != "") $text = "<a href = '".$link."'>".$text."</a>";

  return "<div class='".$class."' >".$text."</div>";
}
Avatar billede acore Ekspert
17. juli 2019 - 23:03 #47
(godnat)
Avatar billede jdjensen Juniormester
18. juli 2019 - 19:50 #48
Takker det spiller på alle <openinghour> men kan man også gøre, så link virker på <closinghour> i XML-filen?

<closinghour>
  <class>chatservice-closed</class>
  <text>Lukket</text>
  <link>...</link>
</closinghour>
Avatar billede acore Ekspert
18. juli 2019 - 21:02 #49
Ja:

function ChatServiceShortcode() {
  $xmlfile = "openinghours.xml";
  $tz = “Europe/Copenhagen”;

  date_default_timezone_set($tz);

  $text = "";
  $class = "";
  $link = "";
  if ($xml = @simplexml_load_file($xmlfile)) {
    $text = $xml->closinghour->text;
    $class = $xml->closinghour->class;
    $link = (isset($xml->closinghour->link? $xml->closinghour->link: "");

    $localtime = localtime(time(), true);
    $wday = $localtime['tm_wday'];
    $hhmm = $localtime['tm_hour']*100 + $localtime['tm_min'];

    foreach ($xml->openinghour as $day) {
      if ($wday == $day->day && $hhmm >= $day->start && $hhmm < $day->end) {
        $text = $day->text;
        $class = $day->class;
        $link = (isset($day->link)? $day->link: "");
        break;
      }
    }
  }
  if ($link != "") $text = "<a href = '".$link."'>".$text."</a>";

  return "<div class='".$class."' >".$text."</div>";
}
Avatar billede jdjensen Juniormester
18. juli 2019 - 23:05 #50
Takker men får tilsyneladende en parse error.

Parse error: syntax error, unexpected ';' on line 48:

$link = (isset($xml->closinghour->link? $xml->closinghour->link: "");
Avatar billede acore Ekspert
19. juli 2019 - 06:59 #51
Min fejl - mangler parentes

$link = (isset($xml->closinghour->link)? $xml->closinghour->link: "");
Avatar billede jdjensen Juniormester
19. juli 2019 - 08:03 #52
Perfekt - endnu engang tak for hjælpen. :-)
Avatar billede acore Ekspert
19. juli 2019 - 10:17 #53
Også dejlig tråd - set fra min stol. Og den kan jo let bygges videre på - når du får nye gode ideer. Må jeg spørge hvilke shop det er - kunne tænke mig at se den?
Avatar billede jdjensen Juniormester
19. juli 2019 - 13:56 #54
Så absolut og lige min tanke!! Hvis jeg får nye ideer til videreudvikling kan jeg jo bare skrive videre på tråden. ;-)

Jeg har også ideer til nogle mindre onlineværktøjer, som jeg måske tænker kunne være sjovt at starte en tråd på. Så kan du jo se om det er noget du vil hjælpe med. Med dine PHP-skills tror jeg du kan kode det meste. :-D

Lige nu ligger websitet bare på et lokalt developer-site men kan eventuelt sende dig en besked når det hele bliver mere færdigt, hvis du er interesseret. :-)
Avatar billede acore Ekspert
19. juli 2019 - 15:39 #55
Ja, kunne godt tænke mig at se det, så du må gerne sige til, når det bliver aktuelt
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