Autor Beitrag
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 04.09.09 19:03 
Ich arbeite mich gerade in Typolight ein, nachdem ich das CMS, was ich für eine Seite eigentlich verwenden durfte/sollte/musste in die Tonne gekloppt habe(*). Nach Closed-Source-Teuer-Java-Undokumentiert ist das arbeiten jetzt deutlich entspannter. :D

Ich würde da gerne ein Template für eine Listenansicht bauen, was die Einträge in zwei Spalten anzeigt. Sowas war beim alten System einfach auswählbar, und das fand ich an der Stelle ganz nett. Das sieht bei mir jetzt grob so aus:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
<table>
<?php $n=0;
foreach ($this->entries as $entry): ?>
    <?php if($n%2 == 0): echo "<tr>"; endif; ?> // Zeile anfangen

    <td>
    // Code fürs anzeigen des Eintrags
    </td>

    <?php if($n%2 == 1): echo "</tr>"; endif; ?> // Zeile beenden

    <?php $n++; ?>   
<?php endforeach; ?>

<?php if ($n%2 == 0): echo "</tr>"; endif; ?> // Bei ungeraden Anzahlen: Zeile beenden
</table>

Das sind (abgesehen von ein paar includes) meine ersten Zeilen PHP überhaupt, also nicht lachen. :mahn: ;-)
Frage: Kann man das so machen? Oder geht das alles viel toller, besser, schöner?

__________
* Aussschlaggebend war letztlich, dass der Editor sämtliche Links beim speichern entfernt hat. Man kann in dem CMS also keine Seite mit Links auf externe Seiten bauen. Oder so. :autsch:

_________________
We are, we were and will not be.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 04.09.09 22:28 
Moin!

Also dieses Mischmasch aus HTML und PHP fand ich immer sehr unübersichtlich. IIRC ist das auch nicht wirklich der empfohlene Weg. Hat TypoLight kein "richtiges" Templatesystem, also wo im HTML Platzhalter stehen, die man dann PHP-seitig "befüllt"?

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 04.09.09 22:35 
Frag doch nicht so komplizierte Sachen. :lol:

Aber auch die default-Templates haben diesen Mix aus PHP und HTML. :nixweiss:

_________________
We are, we were and will not be.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 04.09.09 22:53 
Also das nennt sich PHPTemplate und ist sozusagen der letzte Schrei :puke:

Leider ist das Austauschen des Templaters meistens ein größeres Unterfangen, da das in den Systemen an viel zu vielen Stellen zu fest verankert ist.

Aber gut, zum eigentlichen Thema: Sei $foo die Liste der Einträge und $bar die Anzahl der Spalten, so kannst Du eine Aufteilung auf die Spalten so erreichen:

ausblenden C#-Quelltext
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:
<?php

$items_per_col = count($foo);
$items_per_col += $bar - 1;
$items_per_col /= $bar;
$items_per_col = (int)$items_per_col);

$items = array();
for($i = 0; $i < $bar; $i++) {
    for($j = 0; $j < $items_per_col && isset($foo[$i * $items_per_col + $j]); $j++) {
        $items[$i][] =& $foo[$i * $items_per_col + $j];
    }
}

echo "<tr>";
foreach($items as $col) {
    echo "<td>";
    foreach($col as $line) {
        echo "$line";
    }
    echo "</tr>";
}
echo "</tr>";

?>


P.S.: @Christian S: Wann gibt's für's DF eigentlich einen PHP-Highlighter? Kannst auch gern GeSHi verwenden ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.


Zuletzt bearbeitet von BenBE am Fr 04.09.09 23:55, insgesamt 1-mal bearbeitet
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 04.09.09 23:03 
Also für so'n einfachen Fall wie eine zweispaltige Tabelle fände ich Gausis Code schon ganz gut. Noch ein "&" vor "$entry" gepackt, damit nur mit Referenzen gearbeitet wird, und dann passt das schon. BenBEs Code ist natürlich allgemeiner nutzbar, aber hier doch irgendwie mit Spatzen auf Kanonen geworfen. :nixweiss:

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
P.S.: @Christian S: Wann gibt's für's DF eigentlich einen PHP-Highlighter? Darfst auch gern GeSHi verwenden ;-)
Irgendwann ;-) Und ich wusste gar nicht, dass die Lizenz bei Geshi so geändert wurde, dass man jetzt extra Genehmigung zur Verwendung bräuchte :shock:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 04.09.09 23:12 
Hm. Den Code von BenBE raff ich jetzt mal gar nicht. :nut: Ich kann zwar grob nachvollziehen, was da in etwa passiert, aber soviel blindes copy&paste möchte ich dann auch nicht. Und wenn der Chefentwickler hier mir mein Konstrukt nicht direkt um die Ohren haut, und dabei auch noch eine Seite rauskommt, wie ich sie haben will, dann reicht mir das voll und ganz. :D

_________________
We are, we were and will not be.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 04.09.09 23:17 
Was mir gerade noch einfällt:

Bei einer ungerade Anzahl von Einträgen hast Du ja dann in der letzten Zeile nur eine Zelle ("<td>..</td>"). Bin mir nicht sicher, ob das valide ist und nicht irgendein Browser Dir das dann um die Ohren haut, weil ja die Spaltenanzahl dann nicht korrekt wäre :gruebel:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 04.09.09 23:23 
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Bei einer ungerade Anzahl von Einträgen hast Du ja dann in der letzten Zeile nur eine Zelle ("<td>..</td>"). Bin mir nicht sicher, ob das valide ist und nicht irgendein Browser Dir das dann um die Ohren haut, weil ja die Spaltenanzahl dann nicht korrekt wäre :gruebel:

Es ist valides W3C, und im Firefox wird es auch richtig angezeigt. Aber natürlich kann niemand garantieren, dass es in allen Browsern klappt. Möglich wäre ja sogar colspan="2", dann wird der freie Platz sogar richtig ausgenutzt.
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Fr 04.09.09 23:48 
Also ich gebe da mal kurz meinen Senf dazu weil ich schon länger Typolight auch professionell für eine Agentur einsetze.
Das mit dem Template ist so gewollt, da man so maximal flexibel ist, keine andere Syntax lernen muss und man nicht auch noch rechenzeit zum parsen einer Template-Sprache verschwenden muss.

@Gausi: Am Besten du stellst solche Fragen direkt in der TL Community :-)
Und wieso musst du das mit Tabellen lösen und machst das nicht über CSS und float?

_________________
In the beginning was the word.
And the word was content-type: text/plain.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Fr 04.09.09 23:53 
Um meinen Code grob zu erklären:
Im ersten Teil berechne ich die Anzahl der Einträge pro Spalte, danach teile ich die Einträge auf die 3 Spalten auf und gebe diese dann im dritten Teil auf die 3 Spalten (je Spalte eine Zelle) auf.

Möchte man für jeden Eintrag eine eigene Zelle haben, kann man das wie folgt umbauen:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
<?php

$items_per_col = count($foo);
$items_per_col += $bar - 1;
$items_per_col /= $bar;
$items_per_col = (int)$items_per_col);

for($i = 0; $i < $items_per_col; $i++) {
    echo "<tr>";
    for($j = 0; $j < $bar; $j++) {
        echo "<td>";
        if(isset($foo[$j * $items_per_col + $i])) {
            echo $foo[$j * $items_per_col + $i];
        } else {
            echo " ";
        }
        echo "<td>";
    }
    echo "</tr>";
}

?>


Das Umsortieren der Einträge kann dann entfallen.

@TUFKAPL: Nein, braucht man nicht. Das war eine Feststellung ;-)

@matze: PHP-Templates lesen sich aber sehr bescheiden und so aufwändig wäre das einmalige Compilieren von Templates nun auch wieder nicht ...

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 04.09.09 23:58 
user profile iconmatze hat folgendes geschrieben Zum zitierten Posting springen:
Und wieso musst du das mit Tabellen lösen und machst das nicht über CSS und float?
Woher weißt Du, dass er keine tabellarischen Daten darstellen will?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 05.09.09 08:53 
Im TL-Forum bin ich auch bereits angemeldet, aber das ist ja eher ne allgemeine PHP-Frage, und da dachte ich, die stell ich lieber hier. ;-)

Das könnte man wahrscheinlich auch per Divs machen, ja. Aber wenn ich ca. 10 kleine Info-Blöcke habe (je ein Foto mit Name und Adresse), die ich zweispaltig anordnen möchte, dann geht das mit einer Tabelle imho einfacher als da mit float und clear zu arbeiten. Das Groblayout ist mit divs geregelt, das gibt TL ja auch so vor. Aber bitte keinen Streit über Vor- und Nachteile von Table-Dschungel und Div-Suppe. ;-)

@Müssen: Ich muss da gar nichts. Ich kann die Brocken auch einfach hinschmeißen. :angel:

_________________
We are, we were and will not be.
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Sa 05.09.09 12:36 
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Woher weißt Du, dass er keine tabellarischen Daten darstellen will?
*hüstel* Daran hab ich gar nicht gedacht :oops:

@Gausi: Baust du da grade ein eigenes Modul oder was? Denn sonst kannst du das ja auch per Tabelle-Inhaltselement oder so ausgeben lassen...

_________________
In the beginning was the word.
And the word was content-type: text/plain.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Sa 05.09.09 13:20 
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Das könnte man wahrscheinlich auch per Divs machen, ja. Aber wenn ich ca. 10 kleine Info-Blöcke habe (je ein Foto mit Name und Adresse), die ich zweispaltig anordnen möchte, dann geht das mit einer Tabelle imho einfacher als da mit float und clear zu arbeiten.

Wenn du das unbedingt mit Tabellen machen willst, möchte ich dich nicht aufhalten. Nur so als Information für die, die sich an HTML & CSS wagen möchten: Eine Liste, die sich ähnlich der Ansicht "Kacheln" im Windows-Explorer auf so viele Spalten verteilt, wie im Browser reinpassen:

ausblenden Der HTML-Quelltext:
1:
2:
3:
4:
5:
6:
7:
<ul class="tiles">
  <li>Erster Eintrag</li>
  <li>Zweiter Eintrag</li>
  <li>Dritter Eintrag</li>
  <li>Vierter Eintrag</li>
  <li>...</li>
</ul>


ausblenden Das Stylesheet
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
ul.tiles {
  padding: 0/* Listeneinträge werden oft per Padding der Liste eingerückt */
}

ul.tiles > li {
  list-style: none; /* Aufzählungszeichen entfernen */
  float: left;      /* Einträge fließen lassen */

  margin: 5px;      /* Abstand zwischen den Einträgen durch 2 */
  padding: 5px;     /* Innerer Rand der Kacheln */
   
  width: 200px;     /* Breite einer Kachel */
  height: 50px;     /* Höhe einer Kachel */

  border: 1px dashed black; /* Nur zur Demonstration */
}

Die absolut festgelegte Breite und Höhe kann auch weggelassen werden, allerdings sollte dann der Inhalt immer gleich groß sein.

Der Vorteil dieser Möglichkeit ist, wie oben schon vermerkt, dass die Anzahl der Spalten nicht auf 2 beschränkt ist. Heutzutage sind sowohl Auflösungen von 1024x768 als auch große Breitbildschirme mit Breiten um die 1680 im Einsatz, und weder möchten die Benutzer kleinerer Monitore eine horizontale Scrollleiste sehen, noch die mit größeren Browserfenstern riesige weiße Flecken am rechten Rand.

Ein Beispiel dieser Technik findet sich auf meiner Download-Seite. Dort habe ich auch Bild und Text kombiniert.

Grüße,
Yogu
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8535
Erhaltene Danke: 473

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Sa 05.09.09 13:43 
@Yogu: Hm, das sieht in der Tat sehr gut aus. Da ich aber ein Layout mit fester Breite verwende, relativiert sich das etwas. (Ja, auch darüber kann man wieder diskutieren. Ich weiß.) Ich werde das mal im Hinterkopf behalten, vielleicht kann ich das ja an anderer Stelle gebrauchen :D. Ich bin da offen für fast alles.

@matze: Nein, kein eigenes Modul, soweit bin ich da nicht. Ich verwende an der Stelle die catalogs-Extension, und da sollte man schon das allgemeine default-Template durch was eigenes ersetzen.

_________________
We are, we were and will not be.