AMR Link nachträglich verändern

Gesperrt
Domi
Beiträge: 33
Registriert: So 20. Nov 2011, 22:39
Kontaktdaten:

AMR Link nachträglich verändern

Beitrag von Domi » Do 17. Mai 2012, 16:31

Hallo zusammen,

ich benutze Mod_Rewide und daher habe ich alle meine Links auf meiner Seite im "front_content.php?idart=xx"-Format angegeben. Jetzt habe ich einen Cache gebaut, der die ganze Seite in eine .txt-Datei speichert und dann ausgibt - Funktioniert!

Allerdings habe ich jetzt das Problem, dass in der .txt-Datei die Links auch im "front_content.php?idart=xx"-Format angegeben sind und daher auch so ausgegeben werden. Also beim ersten Mal, wenn die Seite noch nicht gecacht ist, funktioniert es ganz normal mit dem Alias in der URL und so, aber wenn er die gecachte Datei aufruft, funktioniert es nicht.

Daher wollte ich fragen, ob es von Contenido / AMR schon eine Funktion gibt, die in dem ganzen Text (hier also mein ganzer Quelltext) alle Links sozusagen nachträglich umändert, sodass dann auf der Seite die richtigen mod_rewite-URL in den Links stehen? Wenn nicht, kann mir jemand helfen so eine Funktion zu schrieben?

LG Domi

Spider IT
Beiträge: 1416
Registriert: Fr 3. Dez 2004, 10:15

Re: AMR Link nachträglich verändern

Beitrag von Spider IT » Do 17. Mai 2012, 20:11

Hallo Domi,

das ist genau das, was AMR in der Standardeinstellung macht (siehe Konfiguration).
Aber anstatt zu versuchen, AMR zu verbiegen, warum greifst du die Seite nicht erst NACH der Umwandlung ab?

Gruß
René

Domi
Beiträge: 33
Registriert: So 20. Nov 2011, 22:39
Kontaktdaten:

Re: AMR Link nachträglich verändern

Beitrag von Domi » Sa 19. Mai 2012, 18:01

Hallo,

Das AMR das macht, ist ja auch richtig so :)
Also ich habe einmal geschaut, aber wenn ich das erst danach abgreifen würde, müsste ich meinen ganzen Cache umschreiben :?

Also ich suche sozusagen eine Funktion, die mir alle Links im Code einmal "umschreibt". Ich hatte mir da unfefähr sowas vorgestellt:

Code: Alles auswählen

...

$full_site = file_get_contents("cache/sites/idart_".$idart."_lang_".$lang.".txt"); // Das funktioniert auch alles!
echo ReplaceLinks($full_site); // --> UND GENAU DIESE FUNKTION FEHLT MIR!

...
LG Domi

Domi
Beiträge: 33
Registriert: So 20. Nov 2011, 22:39
Kontaktdaten:

Re: AMR Link nachträglich verändern

Beitrag von Domi » Mi 13. Jun 2012, 18:06

Weiß niemand, wie ich das Problem lösen kann?

Spider IT
Beiträge: 1416
Registriert: Fr 3. Dez 2004, 10:15

Re: AMR Link nachträglich verändern

Beitrag von Spider IT » Do 14. Jun 2012, 09:14

Hallo Domi,

versuch mal das hier (nicht getestet):

Code: Alles auswählen

function ReplaceLinks($html) {
    # HTML-Code auf Anfang der Links aufsplitten
    $aLinks = explode('front_content.php', $html);
    # Das erste Array-Element ist kein Link
    $return = $aLinks[0];
    # Ab Element 1 anfangen
    for ($i = 0, $n = count($aLinks); $i < $n; $i ++) {
        # Das Ende des Links suchen
        $pos = strpos($aLinks[$i], '"');
        # Link-Parameter auslesen
        if (substr($aLinks[$i], 0, 1) == '?') {
            $aParms = explode('&', substr($aLinks, 1, ($pos - 1)));
        }
        # Neuen Link generieren
        $aParams = array('client' => $client, 'lang' => $lang);
        for ($j = 0, $o = count($aParms); $j < $o; $j ++) {
            $parm = explode('=', $aParms[$j]);
            $key = ((substr($parm[0], 0, 4) == 'amp;') ? substr($parm[0], 4) : $parm[0]);
            $aParams[$key] = $parm[1];
        }
        $link = Contenido_Url::getInstance()->build($aParams, false);
        # Teilcode mit ersetztem Link an Returnstring anfuegen
        $return .= $link . substr($aLinks[$i], $pos);
    }
    # Ergebnis zurueck liefern
    return $return;
}
So wie ich das sehe, muss evtl. nur noch das "cms/" vor dem Link entfernt werden (je nachdem wie Contenido installiert und eingerichtet wurde).

Gruß
René

Domi
Beiträge: 33
Registriert: So 20. Nov 2011, 22:39
Kontaktdaten:

Re: AMR Link nachträglich verändern

Beitrag von Domi » Do 14. Jun 2012, 14:31

Hallo Spider IT,
also hierbei gibt er mir einen 500 Internal Server Error aus.
Also ich verstehe schon ein bisschen davon und ich weiß, dass alle meine Links im Quellcode so sind:

Code: Alles auswählen

<a href="front_content.php?idart=1">Startseite</a>
oder so:
<a href="front_content.php?idart=16" title="Hilfe">Hilfe</a>
Also ich habe überall nur eine idart angegeben, weil ich nur mit einem Mandant und einer Sprache arbeite.
Ich sage dir das, weil in dem Script ja was von client steht, aber ich weiß nicht ob es dir was hilft ;) Ich hoffe mal!

LG Domi

Spider IT
Beiträge: 1416
Registriert: Fr 3. Dez 2004, 10:15

Re: AMR Link nachträglich verändern

Beitrag von Spider IT » Do 14. Jun 2012, 15:02

Hallo Domi,

an welcher Stelle hast du denn das eingebaut?
Kann ich mir das evtl. mal ansehen?

Wenn ich den Code direkt unten im Layout mit einfüge und die Funktion mit ein Teil HTML füttere, meckert er nur an, dass "lang" mit angegeben sein muss (die Variable ist anscheinend bei der Generierung des Layouts nicht verfügbar).
Wenn du nur ein Mandant mit nur eine Sprache hast, kannst du für beiden (client und lang) die jeweilige Nummer einsetzen anstatt die Variablen.

Gruß
René

Spider IT
Beiträge: 1416
Registriert: Fr 3. Dez 2004, 10:15

Re: AMR Link nachträglich verändern

Beitrag von Spider IT » Do 14. Jun 2012, 15:08

Hab noch einen kleinen Fehler gefunden, hier die korrigierte Version:

Code: Alles auswählen

function ReplaceLinks($html) {
    global $client, $lang;
    
    # HTML-Code auf Anfang der Links aufsplitten
    $aLinks = explode('front_content.php', $html);
    # Das erste Array-Element ist kein Link
    $return = $aLinks[0];
    # Ab Element 1 anfangen
    for ($i = 1, $n = count($aLinks); $i < $n; $i ++) {
        # Das Ende des Links suchen
        $pos = strpos($aLinks[$i], '"');
        # Link-Parameter auslesen
        if (substr($aLinks[$i], 0, 1) == '?') {
            $aParms = explode('&', substr($aLinks[$i], 1, ($pos - 1)));
        }
        # Neuen Link generieren
        $aParams = array('client' => $client, 'lang' => $lang);
        for ($j = 0, $o = count($aParms); $j < $o; $j ++) {
            $parm = explode('=', $aParms[$j]);
            $key = ((substr($parm[0], 0, 4) == 'amp;') ? substr($parm[0], 4) : $parm[0]);
            $aParams[$key] = $parm[1];
        }
        $link = Contenido_Url::getInstance()->build($aParams, false);
        # Teilcode mit ersetztem Link an Returnstring anfuegen
        $return .= $link . substr($aLinks[$i], $pos);
    }
    # Ergebnis zurueck liefern
    return $return;
}
Gruß
René

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: AMR Link nachträglich verändern

Beitrag von xmurrix » Do 14. Jun 2012, 21:58

Hallo Domi,

im AMR-Plugin gibt es die Funktion mr_buildGeneratedCode(), die genau das macht, was du brauchst.
Diese Funktion bekommt den HTML-Code und ersetzt alle darin vorkommenden URLs zu Clean-URLs.

Du kannst also folgendes machen:

Code: Alles auswählen

$full_site = file_get_contents("cache/sites/idart_".$idart."_lang_".$lang.".txt"); // Das funktioniert auch alles!
echo mr_buildGeneratedCode($full_site);
Wenn dieser Code in einem Modul oder in der front_content.php nach der Initialisierung der Plugins ausgeführt wird, sollte es wie gewünscht arbeiten. Ansonsten musst du dafür sorgen, dass das Plugin korrekt intialisiert wird, damit es seine Arbeit verrichten kann.

Zur der Sprache:
Die Angabe des lang-Parameters in URLs is eine Vorgabe von CONTENIDO. Wenn du aber die Plugin Funktion zum Generieren der URLs verwendest, kümmern sich das Plugin um das Setzen des Parameters für die Sprache, sofern dies nicht in den zu ersetzenden URLs vorkommt.

Einzelne URLs ohne lang-Parameter kannst du auch mit

Code: Alles auswählen

$url = 'front_content.php?idart=123';
$urlNew = mr_buildNewUrl($url);
auf Clean-URLs umstellen.

Wenn du die CONTENIDO-Funktion verwendest, muss der Parameter lang dabei sein:

Code: Alles auswählen

$aParams = array(
    'idart' => 123,
    'lang' => $lang
);
$urlNew = Contenido_Url::getInstance()->build($aParams, false);
Der Vorschlag von René ist auch vollkommen in Ordnung, sofern du damit zufrieden bist. Es bleibt dir überlassen, welche Lösung du einsetzen möchtest.

Am saubersten wäre es natürlich, wenn man die von CONTENIDO zur Verfügung gestellte Funktion verwendet (das letzte Beispiel), aber die erwartet die Id der Sprache, was du nicht hast...

Nachtrag:
Ist zwar Offtopic, trotzdem...
Warum verwendest du nicht die in CONTENIDO vorhandene Funktion zum Cachen der Ausgabe der Seiten?
Der Grund, weshalb deine gecacheten Seiten keine umgewandelten URLs enthalten liegt daran, dass die Ausgabe gecached wird, bevor das Plugin die URLs umwandeln kann.
Das kann z. B. passieren, wenn du z. B. die Ausgabe am Ende des Layouts cachest.

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Domi
Beiträge: 33
Registriert: So 20. Nov 2011, 22:39
Kontaktdaten:

Re: AMR Link nachträglich verändern

Beitrag von Domi » Fr 15. Jun 2012, 23:14

Hallo,
Vielen Dank, das mit der Methode mr_buildGeneratedCode() klappt genauso :)

Was gibt es für eine Caching Methode von CONTENIDO ?

LG Domi

xmurrix
Beiträge: 3147
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Kontaktdaten:

Re: AMR Link nachträglich verändern

Beitrag von xmurrix » Fr 15. Jun 2012, 23:59

In contenido/includes/config.misc.php kannst du das Cachen aktivieren:

Code: Alles auswählen

$cfg['cache']['disable'] = false;
Dann den Rest in cms/includes/concache.php konfigurieren.
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.

Gesperrt