Veröffentlichen ohne Sprachverzeichnis

hoebbel
Crownpeak employee
Crownpeak employee
4 5 2,088

Immer wieder werde ich gefragt, ob es denn nicht möglich sei, auf die Sprachkürzel bei der Generierung komplett zu verzichten.

Manchmal kommt auch eine Anfrage, in der explizit die üblichen Lösungswege (Redirect im Apache, Multiview, Infix) nicht gewünscht werden.

Es sollte ein sauberer Auftritt erzeugt werden, in dem es keine Sprachkürzel gibt, da nur eine Sprache verwendet wird.

Da das Schreiben eines eigenen URLCreators out-of-scope ist, habe ich die zweitbeste Lösung umgesetzt, die mir eingefallen ist (prototypischer Lösungsansatz für Linux)

  1. Generierung mit Multiview URLs (Sprachkürzel wird als an den Dateinamen angehängt, z.B. index.html.de)
    Wird bei der Generierungsaktion eingestellt, siehe Handbuch für Administratoren, Kapitel "7.5.9.2 Generierung ausführen"
  2. Nach der Generierung wird ein Skript ausgeführt, welches die nicht benötigten Sprachkürzel entfernt.

Da bei dieser Generierungsmethode Links ohne Sprachkürzel erzeugt werden, hat man danach einen sauberen Auftritt.

Das Beanshell Skript ist etwas länger geraten, da die Rückgabe komplett verarbeitet werden soll.

Hier das entsprechende Shell-Skript (zu entfernendes Sprachkürzel ist .de)

IFS=$(echo) find $1 -name \*.de | while read f; do export FILE=$(basename "$f" .de); export DIR=$(dirname "$f"); mv -v "$f" "$DIR/$FILE"; done

und das Beanshell Skript, welches dieses Shellskript (welches im Beispiel unter

/home/fs41/firstspirit4/temp/rename.sh abgelegt wurde)

aufruft:

import java.util.*;

class StreamCapture extends Thread {
    InputStream i;
    boolean useErrlog;
    StreamCapture(InputStream inputstream, boolean useErrorlog) {
        i = inputstream;
        useErrlog = useErrorlog;
    }

public void run() {
    try {
        InputStreamReader reader = new InputStreamReader(i);
        BufferedReader buffr = new BufferedReader(reader);
        String l = null;
        while ((l = buffr.readLine()) != null) {
            if(useErrlog) {
                context.logError(l);
            } else {
                context.logInfo(l);
            }
        }
    } catch (IOException ex) {
        context.logError( " failed: " + ex);

    } finally {
            try {            

                i.close();

            } catch (IOException exClose) {
                // ignore
            }
        }
}
}

// Hier wird das bzw. die Dateikommandos zusammengebaut
cmd = new Vector();

cmd1 = new Vector();
context.logInfo("Generierungsverzeichnis: " + context.getPath());

//filesystem script for linux
// we need this:
// bash -c 'IFS=$(echo) find test -name \*.de | while read f; do export FILE=$(basename "$f" .de); export DIR=$(dirname "$f"); mv -v "$f" "$DIR/$FILE"; done'

cmd1 = new Vector();
cmd1.add("/home/fs41/firstspirit4/temp/rename.sh");
cmd1.add(context.getPath());
cmd.add(cmd1);

for(c: cmd) {
    cmdstr = "";
    for (String s : c) {
        cmdstr += " " + s;
    }
    cmdstr = "ProcessBuilder(" + cmdstr.substring(1) + ")";
    context.logInfo(cmdstr);
    Process p = null;
    try {
        p = new ProcessBuilder(c).start();
        InputStream is = p.getInputStream();
        StreamCapture stdout = new StreamCapture(p.getInputStream(),false);
        StreamCapture stderr = new StreamCapture(p.getErrorStream(), true);
        stdout.start();
        stderr.start();
        result = p.waitFor();
        stdout.join(3000);
        stderr.join(3000);
        p.getOutputStream().close();
        if ( result == 0 ) {
            context.logInfo("command completed");
        } else {
            context.logError("failed with exitcode "    + result + " for " + cmdstr);
        }
    } catch (InterruptedException e) {
        context.logError("timeout for " + cmdstr + ": " + e);
    } catch (Exception e) {
        context.logError("failed for " + cmdstr + ": " + e);
    } finally {
        if (p != null) {
            try {
                p.getOutputStream().close();
            } catch (IOException ignore) {
                // ignore
            }
        }

    }

}

Edited: Beanshell-Skript so geändert, dass keine Filehandles liegen bleiben.

Edited: Fehlende Klammer in der vorletzten Zeile hinzugefügt

5 Comments
Peter_Jodeleit
Crownpeak employee
Crownpeak employee

Passt zum Thema javascript:;

picard
I'm new here

Danke für das BSH Skript, es ist jedoch noch ein Fehler drin, es fehlt eine geschlossene } um das letzte finally zu schließen. Wenn man sich die letzten schließenden Klammern anguckt, sieht man schon, das eine "Stufe" fehlt Smiley Happy

hoebbel
Crownpeak employee
Crownpeak employee

Danke - ist korrigiert.

ThoSa
I'm new here

Hallo Herr Höbbel,

so etwas ähnliches suche ich gerade. Folgende Fragen habe ich aber dazu noch:

1. Läuft das ganze auch unter FS 5.X?

2. Das Länderkürzel ist bei uns nicht das Problem, jedoch soll eine robots.txt und eine sitemap.xml in der Form www.example.com/robots.txt bzw. www.example.com/sitemap.xml  aufrufbar sein. Wie muss das BSH-Script angepasst werden, wenn die sitemap.xml und die robots.txt z. B. hier liegen www.example.com/de/verz1/system/ ?

3. Kann ich das Script in dem Publizierungsauftrag einhängen nach dem kopieren der genierierten Inhalte  auf  die Liveserver?

4. Gibt es einen eleganteren Weg ohne die Verwendung von symbolischen Links?

5. Wenn ich symbolische Links auf den Live-Server verwende, dann wäre es optimal wenn das BSH-Script, welches die Symbolische Links erstellt, nach jedem Voll-Deployment ausgeführt wird. Wie könnte dieses in FS abgebildet werden?

Vielen Dank für die Beantwortung meiner Fragen schon mal vorweg!

Mit freundlichen Grüßen

Thomas Sackmann

AGRAVIS Raiffeisen AG

hoebbel
Crownpeak employee
Crownpeak employee

Hallo Herr Sackmann,

in der FirstSpirit Version 5 ist das Skript eigentlich nicht mehr notwendig, da dies beispielweise über den Advanced URL Creator, der zum Lieferumfang gehört, abgedeckt werden kann, wobei dieser anstelle der Referenznamen die Anzeigenamen verwendet, was zu lesbareren URLs führt.

Mit einem entsprechenden SEO URL Creator können Sie dann auch das von Ihnen gewünschte Verhalten sehr leicht umsetzen, indem Sie Kurz-URLs für die entsprechenden Seite setzen.

Das ist bedeutend einfacher und nachvollziehbarer, als eine "Krücke" wie das hier beschreibene Skript zu verwenden Smiley Happy

Weiterführende Infromationen finden Sie im Handbuch für Redakteure im Kapitel 10.3 ab Seite 248:

http://www.e-spirit.com/odfs51/Dokumentation/Fuer-Redakteure/FSAR_DE_FirstSpirit_SiteArchitect.pdf

User: FIRSTDoku

Pass: FSdown_V2

Viele Grüsse aus Dortmund,

  Holger Höbbel

Version history
Last update:
‎07-21-2010 06:42 AM
Updated by: