php output in mooie opmaak

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bryan De Baar

Bryan De Baar

24/10/2018 15:28:57
Quote Anchor link
ben bezig met een functie voor openingstijden te tonen op mijn site.

Ik werk met switch en voor elke dag een case.
De output wil ik mooi onder elkaar zoals:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
Maandag     10:00 - 18:00
Dinsdag     10:00 - 18:00
Woensdag    10:00 - 18:00
donderdag   10:00 - 18:00
vrijdag     10:00 - 18:00
zaterdag    10:00 - 18:00
zondag      10:00 - 18:00


en niet
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
Maandag 10:00 - 18:00
Dinsdag 10:00 - 18:00
Woensdag 10:00 - 18:00
donderdag 10:00 - 18:00
vrijdag 10:00 - 18:00
zaterdag 10:00 - 18:00
zondag 10:00 - 18:00

Natuurlijk kan ik een tabel element in de variable zetten, maar ik hoor hier en daar dat de style niet door php moet worden gedaan maar door de browser.
Welke manier kan ik het beste toepassen hiervoor?
Gewijzigd op 24/10/2018 15:30:44 door Bryan De Baar
 
PHP hulp

PHP hulp

05/04/2020 05:20:28
 
Thomas van den Heuvel

Thomas van den Heuvel

24/10/2018 15:48:51
Quote Anchor link
Quote:
maar ik hoor hier en daar dat de style niet door php moet worden gedaan maar door de browser.

Eh? Het enige waar je PHP voor nodig hebt is voor het invullen van de variabele delen zodat je e.e.a. dynamisch kunt opbouwen.

Deze informatie wordt vervolgens in een of andere opmaak gegoten, bijvoorbeeld een tabel. Maar dit "statische" en dynamische deel zijn onlosmakelijk met elkaar verbonden.

Het is echter niet nodig om alle statische lappen HTML te echo'en omdat daar dus niets dynamisch aan is. Gelukkig kun je te allen tijde een PHP-blok beëindigen en weer starten zodat dit onderscheid statisch <--> dynamisch ook op die manier duidelijk(er) gemaakt kan worden.

En hoe je dat vervolgens implementeert, dat kan op een heleboel manieren waarbij je de PHP en de HTML uit elkaar trekt (bijvoorbeeld via een template of wat dan ook) maar uiteindelijk worden deze twee toch (weer) bij elkaar gebracht, onafhankelijk van het aantal abstractielagen die je tussen het begin (PHP) en het eind (de HTML output) introduceert. Dus waarom zou je het jezelf onnodig moeilijk maken?
Gewijzigd op 24/10/2018 15:51:58 door Thomas van den Heuvel
 
- Ariën -
Beheerder

- Ariën -

24/10/2018 15:53:50
Quote Anchor link
Hoe genereer je nu de data?
 
Bryan De Baar

Bryan De Baar

24/10/2018 16:07:53
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
<?php
function time_schedule(){

    date_default_timezone_set('Europe/Amsterdam');
    $weekdag = (int) date('w');

        switch ($weekdag) {
        
            case
0:  // zondag
            $today = "<tr><td>Vandaag gesloten</td></tr>";
            $time_table = "
            <tr><td>Maandag</td><td>:</td><td>Gesloten</td></tr>
            <tr><td>Dinsdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            <tr><td>Woensdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            <tr><td>Donderdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            <tr><td>Vrijdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            <tr><td>Zaterdag</td><td>:</td><td>10:00 - 16:00</td></tr>
            "
;
            break;
    
            case
1:  // maandag
            $today = "<tr><td>Vandaag gesloten</td></tr>";
            $time_table = "
            <tr><td>Dinsdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            <tr><td>Woensdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            <tr><td>Donderdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            <tr><td>Vrijdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            <tr><td>Zaterdag</td><td>:</td><td>10:00 - 16:00</td></tr>
            <tr><td>Zondag</td><td>:</td><td>Gesloten</td></tr>
            "
;
            break;    
    
            case
2:  // dinsdag    
            $today = "<tr><td>Vandaag open tot 18:00</td></tr>";
            $time_table = "
            <tr><td>Woensdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            <tr><td>Donderdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            <tr><td>Vrijdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            <tr><td>Zaterdag</td><td>:</td><td>10:00 - 16:00</td></tr>
            <tr><td>Zondag</td><td>:</td><td>Gesloten</td></tr>
            <tr><td>Maandag</td><td>:</td><td>Gesloten</td></tr>
            "
;
            break;    
    
            case
3:  // woensdag    
            $today = "<tr><td>Vandaag open tot 18:00</td></tr>";
            $time_table = "
            <tr><td>Donderdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            <tr><td>Vrijdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            <tr><td>Zaterdag</td><td>:</td><td>10:00 - 16:00</td></tr>
            <tr><td>Zondag</td><td>:</td><td>Gesloten</td></tr>
            <tr><td>Maandag</td><td>:</td><td>Gesloten</td></tr>
            <tr><td>Dinsdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            "
;
            break;    
    
            case
4:  // donderdag    
            $today = "<tr><td>Vandaag open tot 18:00</td></tr>";
            $time_table = "
            <tr><td>Vrijdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            <tr><td>Zaterdag</td><td>:</td><td>10:00 - 16:00</td></tr>
            <tr><td>Zondag</td><td>:</td><td>Gesloten</td></tr>
            <tr><td>Maandag</td><td>:</td><td>Gesloten</td></tr>
            <tr><td>Dinsdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            <tr><td>Woensdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            "
;
            break;    
    
            case
5:  // vrijdag    
            $today = "<tr><td>Vandaag open tot 18:00</td></tr>";
            $time_table = "
            <tr><td>Zaterdag</td><td>:</td><td>10:00 - 16:00</td></tr>
            <tr><td>Zondag</td><td>:</td><td>Gesloten</td></tr>
            <tr><td>Maandag</td><td>:</td><td>Gesloten</td></tr>
            <tr><td>Dinsdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            <tr><td>Woensdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            <tr><td>Donderdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            "
;
            break;    
    
            case
6:  // zaterdag    
            $today = "<tr><td>Vandaag open tot 16:00</td></tr>";
            $time_table = "
            <tr><td>Zondag</td><td>:</td><td>Gesloten</td></tr>
            <tr><td>Maandag</td><td>:</td><td>Gesloten</td></tr>
            <tr><td>Dinsdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            <tr><td>Woensdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            <tr><td>Donderdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            <tr><td>Vrijdag</td><td>:</td><td>10:00 - 18:00</td></tr>
            "
;
            break;
    }


return array('today' => $today, 'time_table' => $time_table);
}

?>


Nu heb ik dus wat Thomas zegt, veel html erin.
Waarom ik deze vraag stel is omdat ik met een database wil werken waarin de dagen met tijden staan.
deze wil ik natuurlijk netjes presenteren
Gewijzigd op 24/10/2018 16:08:18 door Bryan De Baar
 
- Ariën -
Beheerder

- Ariën -

24/10/2018 16:34:31
Quote Anchor link
Een array met de dagen en tijden zou simpeler zijn. Ook indien het in de database staat.

Dan hoef je geen code te herhalen, en houd je HTML en PHP meer gescheiden.

Enige buiten je functie is een foreach() { ..} op je pagina om de array mee uit te lezen. En daarin verwerk je jouw tabel.
Gewijzigd op 24/10/2018 16:36:55 door - Ariën -
 
Thomas van den Heuvel

Thomas van den Heuvel

24/10/2018 16:38:23
Quote Anchor link
Mja als je wat meer structuur in de dynamische delen aanbrengt kan bovenstaande code een stuk korter.

Wat in ieder geval nogal onhandig is aan het bovenstaande is dat de data geen betekenis heeft (platte tekst) en meerdere keren wordt herhaald, wat het nogal foutgevoelig maakt, vooral als er bijvoorbeeld een openings- of sluitingstijd wijzigt.

Zorg op zijn minst dat je één bron hebt voor een specifiek stuk informatie.
 
Michael -

Michael -

24/10/2018 20:17:42
Quote Anchor link
Je idee is leuk, maar dit is totaal niet onderhoudsvriendelijk.
Het voordeel van dynamisch is dat je je inhoud maar op 1 plek hoeft aan te passen, maar wel op meerdere plekken en op verschillende manieren kan weergeven.
Ik heb een klein voorbeeldje gemaakt, maar het kan vast nog wel eenvoudiger.
Voorbeeld

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
function time_schedule(){

    $time_table = array(
        array('Zondag',        array('Gesloten')),
        array('Maandag',    array('Gesloten')),
        array('Dinsdag',    array('10:00','18:00')),
        array('Woensdag',    array('10:00','18:00')),
        array('Donderdag',    array('10:00','18:00')),
        array('Vrijdag',    array('10:00','18:00')),
        array('Zaterdag',    array('10:00','16:00')),
    );

    
    date_default_timezone_set('Europe/Amsterdam');
    $weekdag = (int) date('w');
    
    $table = '<table>';
    for($i=$weekdag;$i<7;$i++) {
        if($i == $weekdag) {
            $table .= '<tr><td colspan="2">Vandaag ' . (isset($time_table[$i][1][1]) ? 'open tot ' . $time_table[$i][1][1] : 'zijn we gesloten') . '</td></tr>';
        }
else {
            $table .= '<tr><td>' . $time_table[$i][0] . '</td><td>' . $time_table[$i][1][0] . (isset($time_table[$i][1][1]) ? ' - ' . $time_table[$i][1][1] : '') . '</td></tr>';
        }
    }

    for($i = 0; $i < $weekdag; $i++) {
        $table .= '<tr><td>' . $time_table[$i][0] . '</td><td>' . $time_table[$i][1][0] . (isset($time_table[$i][1][1]) ? ' - ' . $time_table[$i][1][1] : '') . '</td></tr>';
    }

    $table .= '</table>';
    return $table;
}

echo time_schedule();
?>
Gewijzigd op 24/10/2018 20:57:01 door Michael -
 
- Ariën -
Beheerder

- Ariën -

24/10/2018 20:45:27
Quote Anchor link
Je mist een controle op lijn 20 of er Gesloten in de array staat. Anders krijg je een offset-notice, als de winkel op een bewuste dag gesloten is.
Gewijzigd op 24/10/2018 20:45:57 door - Ariën -
 
Michael -

Michael -

24/10/2018 20:57:21
Quote Anchor link
- Ariën - op 24/10/2018 20:45:27:
Je mist een controle op lijn 20 of er Gesloten in de array staat. Anders krijg je een offset-notice, als de winkel op een bewuste dag gesloten is.


Scherp! Aangepast.
 
Thomas van den Heuvel

Thomas van den Heuvel

24/10/2018 23:38:23
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
// https://www.phphulp.nl/php/forum/topic/php-output-in-mooie-opmaak/102495
function openingstijden() {
    // the data
    $data = array(
        array('closed' => true,  'opening' => '-', 'closing' => '-'),           // zon
        array('closed' => true,  'opening' => '-', 'closing' => '-'),           // maa
        array('closed' => false, 'opening' => '10:00', 'closing' => '18:00'),   // din
        array('closed' => false, 'opening' => '10:00', 'closing' => '18:00'),   // woe
        array('closed' => false, 'opening' => '10:00', 'closing' => '18:00'),   // don
        array('closed' => false, 'opening' => '10:00', 'closing' => '18:00'),   // vry
        array('closed' => false, 'opening' => '10:00', 'closing' => '16:00'),   // zat
    );
    $days = array('zondag','maandag','dinsdag','woensdag','donderdag','vrijdag','zaterdag'); // 0 = zondag, 6 = zaterdag
    $currentDay = date('w');

    // the table
    ob_start();
        // don't forget colspan = 2 ...
        ?>
<table border="1">
        <tr>
            <td colspan="2"><?php
            if ($data[$currentDay]['closed']) {
                ?>
Vandaag gesloten<?php
            } else {
                ?>
Vandaag open tot <?php
                echo $data[$currentDay]['closing'];
            }

            ?>
</td>
        </tr><?php
        for ($i=1; $i < 7; $i++) { // we start at one, we skip current day
            $dayOfWeek = ($currentDay + $i) % 7;
            ?>
<tr>
                <td><?php echo ucfirst($days[$dayOfWeek]); ?>:</td>
                <td><?php
                if ($data[$dayOfWeek]['closed']) {
                    ?>
gesloten<?php
                } else {
                    echo $data[$dayOfWeek]['opening'].' - '.$data[$dayOfWeek]['closing'];
                }

                ?>
</td>
            </tr><?php
        }
        ?>
</table><?php
    return ob_get_clean();
}

echo openingstijden();
?>

Handiger om de hele table in de function op te bouwen in plaats van individuele delen te retourneren, tenzij je die ergens anders nodig hebt? Extra "closed" attribuut om e.a.a. beter te scheiden en de HTML leesbaar te houden. Resultaat geretourneerd als string zodat je zelf nog kunt bepalen waar je de tabel weergeeft als je die op een andere plek al op moet halen en aan een template moet doorgeven ofzo.
Gewijzigd op 24/10/2018 23:40:08 door Thomas van den Heuvel
 
Michael -

Michael -

24/10/2018 23:54:54
Quote Anchor link
Quote:
Extra "closed" attribuut om e.a.a. beter te scheiden en de HTML leesbaar te houden.

Dat is een manier. Ik vind het ontzettend lelijk en onzin om steeds af te sluiten en weer te openen. Ik vind het er absoluut niet leesbaarder van worden. Gelukkig mag ieder voor zijn eigen bepalen hoe die het doet ;-).
 
Thomas van den Heuvel

Thomas van den Heuvel

25/10/2018 00:01:58
Quote Anchor link
Ik denk dat je het nu over twee verschillende dingen hebt?
ad quote: het "closed" attribuut geeft de data meer betekenis, wat mij wel zinnig lijkt
ad reactie: dit gaat over het openen en sluiten van PHP-haken/-blokken? ook dat lijkt mij handig/zinnig, anders loop je zo te wieberen met al die quotes, ook is het onderscheid tussen dynamische en statische delen dan beter onderscheidbaar, maar inderdaad, tis maar waar je de voorkeur aan geeft.
 
- Ariën -
Beheerder

- Ariën -

25/10/2018 10:21:51
Quote Anchor link
Ik ben zelf niet zo een voorstander van HTML in functies/methods. Ik houd de lagen liever gescheiden, maar daar zijn meningen vast over verdeeld :p
 
Bryan De Baar

Bryan De Baar

25/10/2018 10:22:09
Quote Anchor link
Dank allemaal voor het meedenken, ik ga hier eens mee aan de slag.
Ik kan de arrays natuurlijk ook vanuit de database laden. (ik denk erover om een ingave pagina te maken en deze in een databse te stoppen).
 
Thomas van den Heuvel

Thomas van den Heuvel

25/10/2018 14:50:49
Quote Anchor link
- Ariën - op 25/10/2018 10:21:51:
Ik ben zelf niet zo een voorstander van HTML in functies/methods. Ik houd de lagen liever gescheiden, maar daar zijn meningen vast over verdeeld :p

Mja, maar dat is het hem juist. Deze zijn uiteindelijk onlosmakelijk met elkaar verbonden. De introductie van abstractielagen hiertussen om deze (verder) te "scheiden" zorgt vaak alleen maar voor meer complexiteit.

En in dit geval wordt zo'n overzicht haast volledig dynamisch gegenereerd. Hoe zou een alternatief waarin je dingen "scheidt" (waarbij je waarschijnlijk ook een poging onderneemt om ook de logica uit de HTML te halen?) er dan uitzien? Zo'n opzet heeft waarschijnlijk onevenredig veel overhead.

Houd dingen gewoon simpel.
Gewijzigd op 25/10/2018 14:51:22 door Thomas van den Heuvel
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.