Paging-Unterstützung im Core, Informationsaustausch zwischen Core und Modul |
Willkommen, Gast ( Anmelden | Registrierung ) [ Hilfe | Mitglieder | Suche ]
Paging-Unterstützung im Core, Informationsaustausch zwischen Core und Modul |
Mon. 26. February 2007, 22:57
Beitrag
#1
|
|
Advanced Member Gruppe: AdvancedMembers Beiträge: 386 Mitglied seit: 12.07.2006 Mitglieds-Nr.: 136 |
Hallo!
Hier mal die Fortsetzung des Feature-Requests zum Paging als Core-Funktionalität. Die Idee hinter dem ganzen, ist es eine Gruppe von MOD_VALUE[] zu schaffen, die nicht nur im Modul, sondern auch im Core ausgewertet werden. Andersrum gibt es auch eine Gruppe solcher Werte, die der Core an das Modul zurück gibt. Nachdem ich festgestellt habe, dass ja die Bezeichnung nicht rein nummerisch sein muß, habe ich mich entschieden, diese in der Form 'cms:identifier' zu benennen, um sie von normalen MOD_VALUE[]-Werten zu unterscheiden. Moment hab ich nur zwei Variablen eingebaut, die für das Paging benutzt werden Diese sind: cms:paging Diese teilt Sefrengo mit, dass man den Inhalt eines Containers nur teilweise ausgeben möchte. cms:items_per_page Teilt Sefrengo dann mit, wie lang der auszugebende Teil ist. In der Konfiguration des Moduls sieht das ganze dann wie folgt aus: QUELLTEXT <?php // Paging aktivieren/deaktivieren $mip_form['cms:paging']['desc'] = 'Inhalte auf mehrere Seiten aufteilen und Navigation anzeigen?'; $mip_form['cms:paging']['cat'] = 'chk'; $mip_form['cms:paging']['option_var']['0'] = 'MOD_VAR[cms:paging]'; $mip_form['cms:paging']['option_val']['0'] = $dedi_mod['value']['cms:paging']; $mip_form['cms:paging']['option_desc']['0'] = 'ja'; $mip_form['cms:paging']['option_val_select']['0'] = 'true'; // Elemente pro Seite $mip_form['cms:items_per_page']['cat'] = 'txt'; $mip_form['cms:items_per_page']['desc'] = 'Elemente pro Seite:'; $mip_form['cms:items_per_page']['cms_var'] = 'MOD_VAR[cms:items_per_page]'; $mip_form['cms:items_per_page']['cms_val'] = $dedi_mod['value']['cms:items_per_page']; $mip_form['cms:items_per_page']['cms_val_default'] = '15'; mip_formsp($mip_form['cms:paging']); mip_formsp($mip_form['cms:items_per_page']); ?> Vorteil: Das Modul braucht sich nicht mehr um die Aufteilung des Contents zu bemühen, Sefrengo übernimmt das. Dadurch wird nicht unwesentlich Speicher gespart. Im Gegenzug ermittelt der Core für das Modul einige wesentliche Daten für die Seitennavigation: Anzahl der Elemente, und die aktuell dargestellt Seite. MOD_VALUE[cms:elements] Steht im Modul zur Verfügung und enthält die Gesamtzahl der Elemente. MOD_VALUE[cms:akt_page] Enthält die aktuell dargestellte Seite, die Zählung beginnt mit 1. Der Core liest dazu im Request eine Variable aus, deren Name in den Einstellungen der jeweiligen Sprache eingestellt werden kann. Frage: Macht das Sinn, das Sprachabhängig zu machen? Muß das überhaupt wählbar sein? In der Frontendausgabe des Moduls können diese Werte dann verwendet werden: QUELLTEXT <CMSPHP> echo '<p>Elemente gesamt: MOD_VALUE[cms:elements]<br />'; echo 'Aktuelle Seite: MOD_VALUE[cms:akt_page]</p>'; </CMSPHP> Oder komplexer, um eine Navigation aufzubauen (Der Code ist nicht getestet und nur als Beispiel zu verstehen!): QUELLTEXT $pager =& sf_factoryGetObject('GUI', 'Pager'); $pager->setTotalItems(MOD_VALUE[cms:elements]); $pager->setCurrentPage(MOD_VALUE[cms:akt_page]); $pager->setItemsPerPage(MOD_VALUE[cms:items_per_page]); $pager->generate(); $out = str_replace('{navigation}', $pager->getLinks(), $template); Damit sollte es Modulautoren wesentlich leichter sein, eine Seitennavigation in ihren Modulen zu integrieren. Darüber hinaus werden noch die Resourcen (=Speicher) geschont, da nur das verarbeitet werden muß, was auch dargestellt wird. Notwenig dafür ist zum einen eine angepaßte inc.generate_code.php, zum anderen kleine Fixes im SQL der Sprachanlage und Installation, und an der Sprachdatei lang_clients_config.php. Die beigelegte inc.generate_code.php verwendet hardcoded die Request-Variable 'page' um leicht testen zu können. Was auch noch fehlt ist:
Und so sieht das im Frontend aus: Und jetzt bitte Vorschläge, Tipps, Meinungen... Tschüss Tiggr Der Beitrag wurde von Tiggr bearbeitet: Mon. 26. February 2007, 23:05
Angehängte Datei(en)
Testmodul.cmsmod ( 2.16KB )
Anzahl der Downloads: 4
inc.generate_code.php ( 17.71KB ) Anzahl der Downloads: 4 -------------------- @bout Kites: Colorful Sky - Typo3
@bout LARP: Orga ohne Namen - Sefrengo @bout LARP: LARP-Welt - CakePHP @bout Kites: Rodgauer Workshop - Contao |
|
|
Tue. 27. February 2007, 21:14
Beitrag
#2
|
|
Advanced Member Gruppe: AdvancedMembers Beiträge: 386 Mitglied seit: 12.07.2006 Mitglieds-Nr.: 136 |
Hiho!
Ok, hab mehr Ergebnisse und gebe mich geschlagen! :-( Erstmal was geht: Es paged auch im Backend! Und nun das Problem: Das Problem ist das Caching. Bei eingeschaltenem Frontendcache kann man soviel in der Navi hin und her klickern wie man will, man sieht immer das selbe, den gecachten Inhalt! Ich hab jetzt mein Sefrengo so gehackt, das es die einzelnen Unterseiten cached, war garnicht mal so übel zu machen, mußte nur eine neue Spalte 'idpage' in der Tabelle cms_code einfügen, und an einigen wenigen Stellen das SQL etwas anpassen. Nun werden die einzelnen Seiten gecached. Wunderbar! Denkt man! Aber ein großes Problem gibt es, es unterläuft den Freigabemechanismus von Sefrengo. Folgender Ablauf: Es war noch nie jemand auf der Teilseite 5 der Seite. Nun hängt da ein Redakteur da einen neuen Blog-Beitrag an. Alle im Cache stehenden Teilseiten werden auf geändert aber nicht publiziert gestellt. Diese werden im alten Stand ausgeliefert, nur leider nicht die Teilseite 5, weil die ist ja noch nicht im Cache! Besucht nun ein normaler Seitenbesucher die Teilseite 5 bekommt er die aktuellen, noch nicht freigegebenen Inhalte gezeigt, da die Seite ja nicht im alten Zustand im Cache zu finden war! :-( Ergebnis: Man kann die Optimierung, wie ich sie mir vorstelle durchführen, mit erstaunlich wenig Aufwand. Aber dann kommen systembedingte "Mängel" zustande, die immer mehr Änderungen nach sich ziehen! Für mich selber wäre das Ergebnis zwar fast ok, aber ich werde es wohl doch in die Tonne kloppen, und was anderes probieren! Noch schlimmer wird das ganze, wenn man die "Seitenlänge" variabel gestalten möchte, und man dem Seitenbesucher entscheiden lassen würde, wie viele Elemente auf einer Seite zu finden sind, dann ginge garnichts mehr mit Cache! Mein persönliches Ergebnis: Netter Versuch, aber leider für'n Ar...! Zumindest hab ich was über Sefrengo gelernt! Tschüss Tiggr -------------------- @bout Kites: Colorful Sky - Typo3
@bout LARP: Orga ohne Namen - Sefrengo @bout LARP: LARP-Welt - CakePHP @bout Kites: Rodgauer Workshop - Contao |
|
|
Tue. 27. February 2007, 21:46
Beitrag
#3
|
|
Advanced Member Gruppe: AdvancedMembers Beiträge: 386 Mitglied seit: 12.07.2006 Mitglieds-Nr.: 136 |
Bevor ich es lösche, hier mal alle von mir geänderten Dateien!
Was fehlt ist die neue Spalte "idpage" in der Tabelle cms_code, und die Einstellung in der Sprache für die Request-Variable. Dabei ist auch der angepasste MrList und ein Testmodul! Tschüss Tiggr
Angehängte Datei(en)
-------------------- @bout Kites: Colorful Sky - Typo3
@bout LARP: Orga ohne Namen - Sefrengo @bout LARP: LARP-Welt - CakePHP @bout Kites: Rodgauer Workshop - Contao |
|
|
Tue. 27. February 2007, 23:19
Beitrag
#4
|
|
Advanced Member Gruppe: AdvancedMembers Beiträge: 613 Mitglied seit: 30.06.2006 Mitglieds-Nr.: 30 |
Aber trotzdem, toller Versuch, Kompliment.
-------------------- |
|
|
Wed. 28. February 2007, 22:23
Beitrag
#5
|
|
Administrator Gruppe: Members Beiträge: 1.092 Mitglied seit: 16.06.2006 Wohnort: Köln Mitglieds-Nr.: 1 |
Wäre auf jeden Fall schön, wenn Du bei der Speicherreduzierengeschgichte dran bleiben würdest. Da etwas zu optimieren würde sicher vie bringen.
Zum Paging und dem ganzen con_edit Bereich: Insgesamt ist das sehr komplex und hat leider ein paar heftige Haken, die sich erst beim genaueren Hinsehen offenbaren. Der gesamte Seiten und Contentbereich steht auch für Sefrengo 1.6 auf der Prioritätenliste. Damit das Paging vernünftig funktioniert müssen auch noch folgende Bedingungen erfüllt werden: - Die cms:tags funktionieren zur Zeit nur bei aktiviertem Cache. Sefrengo muss so klug reagieren, das auch in nicht gecachten PHP die Anfragen verarbeitet werden können - Beim Paging muss die cms_content Tabelle beachtet werden. Das hattest Du ja schon gesehen. Ein Paging bringt bei 1000 Einträgen überhaupt nichts, wenn im Hintergrund immer die komplette cms_content Tabelle für die entsprechende Seite geladen wird. Ich stelle mir das zukünftig so vor, das ein Modul auf ein Objekt zugreift , welchen Informationen übergeben werden kann, welche Wiederholungsschleifen des Moduls benötigt werden. Das ganze könnte eine Mischkalkulation sein, die folgendermaßen funktioniert: - es werden standardmäßig immer die ersten 10 Iterationen der cms_content geladen. - Innerhalb dieser Iterationen kann das das Modul mit Sefrengo kommunizieren, in welche Iteration es springen will. Beispiel: Gehen wir einfach mal davon aus, es soll Iteration 120-130 von Insgesamt 1000 ausgeführt werden: 1) Beim ersten Durchlauf des Moduls wird das gesetzt: $obj->setJumppoint(120); $obj->setPointOfExit(130); 2) Nach Beendigung des ersten Durchlaufs checkt Sefrengo $obj und weiß das es das Modul ein wenig vorspulen muß 3) Sefrengo generiert den benötigten Content und führt das Modul ab Sprungpunk 120 10 mal aus 4) Nach Iteration 130 wird das Modul beendet -------------------- Es wird, es wird...
|
|
|
Thu. 1. March 2007, 11:10
Beitrag
#6
|
|
Advanced Member Gruppe: AdvancedMembers Beiträge: 343 Mitglied seit: 26.06.2006 Wohnort: CH Mitglieds-Nr.: 5 |
was dabei aus meiner Sicht auch sinnvoll wäre ist, das es für jedes Modul einen zusätzlichen Bereich gibt, welcher nur 1mal ausgeführt und integriert wird egal wie viele Wiederholungen des Moduls ausgegeben werden. Dort könnten das Classen oder Funktionen abgelegt werden welche in den einzelnen Wiederholungen verwendet werden. Dadurch kann ein grosser Teil des Speicherverbrauchs reduziert werden. Dazu werde ich später noch etwas schreiben.
Ich werde dazu noch einen FR schreiben. Gruss Mistral -------------------- So einfach wie möglich, aber nicht einfacher!
(Albert Einstein) |
|
|
Vereinfachte Darstellung | Aktuelles Datum: 18.6.24 - 06:27 |