Hilfe - Suche - Mitglieder - Kalender
Vollansicht: Listennavigation merkt sich letzte Position
Forum Sefrengo.org > Allgemeine Foren > Entwicklung
monkderhonk
Hallo Leute,

eigentlich steht schon alles im Titel. Ich will, dass die Navigation sich immer die letzte ausgewählte Unterkategorie, -seite merkt und automatisch dorthin springt. Catx soll nicht angezeigt werden, nur die Seiten.

Cat1->Seite1
->Seite2 gespeichert
->Seite3
->Seite4

Cat2->Seite1
->Seite2
->Seite3 gespeichert
->Seite4

wenn zB Cat1->S2 aktiv ist, soll das gespeichert werden. Wenn ich nun zB auf Cat2->Seite3 bin und zur Cat1 wechseln will, soll automatisch die Seite 2 angezeigt werden.

Wie mach ich das am besten? Gibts dafür schon was?
Hätte als erstes an Cookies gedacht...


Lösung:

am Anfang der Frontendausgabe, ab 2. zeile (zwischen <cmsphp> und <cmsphp:cache>):

QUELLTEXT
session_start();


if ($idcat == 2) {

    $_SESSION["work"] = $idcatside;
}

if ($idcat == 3 || $idcat == 6 || $idcat == 8) { //cat6 und 8 sind unterkategorien von cat3. cat3 hat keine eigenen seiten

    $_SESSION["assigned"] = $idcatside;
}


Am Ende ca. 751. Zeile den Moduloutput abändern:

QUELLTEXT
$tempwork = $_SESSION["work"];
$tempassigned = $_SESSION["assigned"];

$mod['output'] = str_replace('index.php?idcat=2','index.php?idcatside='.$tempwork,$mod['output']);
$mod['output'] = str_replace('index.php?idcat=3','index.php?idcatside='.$tempassigned,$mod['output']);

// Navigation ausgeben
echo $mod['intro'] . $mod['output'] . $mod['outro'];



Zur Erklärung:
Es wird innerhalb meherer festgelegter Kategorien die jeweils zuletzt besuchte Seite in einer Session-Variable gespeichert.
Vor der Modulausgabe werden die Ziele (href) der Links der Kategorien so abgeändert, dass sie auf die gespeicherte Seite zeigen.
In der Konfiguration der Navi darf die Einstellung "Bei Ordnerlinks immer Link zur Startseite des Ordners generieren
(statt Link zum Ordner)" kein Häkchen haben. Damit kann ich bequem die jew. idcat durch die gewünschte idcatside ersetzen.

Anmerkung:
Ich bin php-neuling und kein modul-profi. ich gebe mich mit dieser fixen lösung zufrieden. Über Verbesserungsvorschläge würde ich mich trotzdem freuen. Probleme sehe ich vor allem in komplizierteren Hierarchien bzw. Ordnungen. Hoffe, der Code hilft dem ein oder anderen.

Lg,

monk
saschapi
Ich geh mal davon aus, dass es hier nicht um die Startseiten in den Ordnern geht. Du willst also, dass immer die zuletzt in einer Kategorie besuchte Seite beim nächsten Anspringen der Kategorie quasi als "temoräre" Ordnerstartseite angezeigt wird.

Dann wirst du nicht drum herum kommen das zu schrauben. Wenn es pro Sitzung sein darf kannst du entweder mit cookies oder PHP-Session arbeiten. Wenn es über die einzelne Sitzung hinaus gehen soll (also auch nach Tagen noch funzen) sind cookies die Wahl bzw. wenn die Leute irgendwie mit einem Benutzernamen angemeldet werden ein DB-Eintrag.

Bedenke aber, dass Cookies natürlich bei abgeschalteten cookies oder JS nicht funzen und somit ein geringer Prozentsatz der Leute diese funktion nicht nutzen kann bzw. wird
monkderhonk
Hi saschapi,

erstmal danke für deine antwort. ich dachte, wie gesagt, auch erst an cookies. der prozentsatz besucher, der keine cookies zulässt kann vernachlässigt werden, vor allem, weil es ja nur ein feature der seite sein soll und die navi auch ohne klappen sollte.

Sefrengo erzeugt doch von sich aus ne session. da könnt ich doch ne variable "letzte seite" ranhängen. nun müsste ich theoretisch nur das listennavigations feature "Routing des aktiven Status" abändern.

irgendwelche vorschläge, einwände?

lg, monk
saschapi
Einwände keine cool.gif
monkderhonk
ich habs soweit, dass ich abhaengig von der kategorie die aktuelle seite in ei.ner zugehoerigen session-variable speichere.
Meine Idee ist es, dem Routing-Code den Inhalt der Session-Variablen in der richtigen Forum unterzuschieben.

Nur: innerhalb des Navigations-Moduls steht der Code des Routings in cached php. wie kann ich das zusammenbringen? So ohne weiteres scheint das nicht zu klappen.
bjoern
Jeden Link mit einem eindeutigen String versehen wie NAVIDCATSIDE{idcatside} versehen und dann entweder am Ende der Modulausgabe oder in der Projekt Outputmanipulation mit einem preg_replace entsprechend ersetzen.
monkderhonk
Hi bjoern,

ich stolper mal: meinst du damit, ich soll dein routing umgehen?
wie meinst du das, ich soll den link mit einem string versehen?
sorry, erstmal nur bahnhof.

Ich habs ja fast soweit. ich hab rausgefunden, dass das routing auch ohne cached php funzt. dann muss ich ja an das MOD_VALUE[30] nurnoch meine werte aus den session-vars ranhängen, so konstruiert, dass es passt. nur kommen da bei mir nur fehler zusammen.

so klappt alles. wenn ich die 2. entkommentiere kommt ein "syntax error, unexpected ')' "

$temp = "MOD_VALUE[30]";
//$temp .= 'idcat:3 > idcat:6';
$ln_routing['raw'] = trim( str_replace(' ', '', "$temp"));


lg, monk
bjoern
Mit Deiner Änderung: Vorsichtig, es funktioniert in der Bearbeitungsansicht, wo der Cache deaktiviert ist. Aber funktioniert es auch im Frontend?

Mit derm ersetzen des String:

1) Im Template angeben:
<a href="#1" class="MEINSTRING{idcatside}">1 ....</a>
<a href="#2" class="MEINSTRING{idcatside}">2 ....</a>

2) Daraus wird dann auf der Seite
<a href="#1" class="MEINSTRING1">1 ....</a>
<a href="#2" class="MEINSTRING2">2 ....</a>

3) Dadurch hast Du eindeutige "Text-Variablen", die Du ersetzen kannst
str_replace('MEINSTRING1', 'eine-css-klasse', $navoutput);// gewünschte css klasse entfernen
preg_replace('#MEINSTRING[\d]+#U', 'eine-andere-css-klasse', $navoutput);// alle anderen strings entfernen

Code ist ungetestet.
monkderhonk
wenn ich mal dau-mäßig rekapitulieren darf:

1. ich benenne meine links in der navi eindeutig.
2. ich merke mir zu jeder kategorie die zuletzt besuchte seite in einer session-variable.
3. ich suche mir vor dem output die entsprechenden links und ändere sie entsprechend des inhalts der session-var ab.

zu 3. ich will ja, dass die links auf ein von mir definiertes neues ziel linken. in deinem beispiel code ändere ich nur die css-klasse. könntest du das etwas genauer erläutern? warum unterscheidest du da die 2 zeilen?

lg und danke fürs mitdenken,

monk
bjoern
Zu3:

Du willst ja für einen bestimmten Link (ich hab den jetzt mal als #1 definiert) eine Veränderung erreichen, also musst Du diesen einen Link besonders behandeln. Alle anderen Links (#2 , kann aber auch mehr sein z.B. 3#, #4, #5....) haben ja nun auch einen eindeutigen String, den es gilt wieder egubekommen. Der preg_match macht genau das: MEINSTRING2, MEINSTRING3, MEINSTRING3456 .... werden ersetzt. Ob Du das nun mit einer Styleklasse oder etwas anderen machst ist egal, ist ja nur ein Beispiel.
monkderhonk
ok, das versteh ich.
ich will ja aber dass mein href attribut verändert wird. also wende ich zeile 1 von 3) auf das href attribut an? oder wieso hast du in deinem beispiel die css-klasse bemüht?
sorry, falls ich da etwas auf dem schlauch steh.


kannst du mir schnell dein beispiel abändern, dass statt 'eine-css-klasse' ein konstrukt ala "'index.php?'.$tempvar" steht? ich produzier im zusammenhang variablen - strings nur fehler.

str_replace('MEINSTRING1', 'eine-css-klasse', $navoutput);// gewünschte css klasse entfernen

lg, monk
bjoern
str_replace('MEINSTRING1', 'index.php?'.$tempvar, $navoutput);
Dieses ist eine vereinfachte Darstellung unseres Foreninhaltes. Um die detaillierte Vollansicht mit Formatierung und Bildern zu betrachten, bitte hier klicken.
Invision Power Board © 2001-2024 Invision Power Services, Inc.