Ergebnis 1 bis 5 von 5

Thema: Alias-Generierung

  1. #1
    Contao-Nutzer Avatar von Gausi
    Registriert seit
    04.09.2009.
    Beiträge
    149

    Standard Alias-Generierung

    Diesmal eine eher allgemeine Frage zur Modulentwicklung von mir. Ich muss ein Alias für ein neues Event erzeugen. Dieses muss eindeutig sein (klar), und muss vollständig automatisch generiert werden, der Anwender hat keinen Einfluss darauf.

    Im Backend läuft das so, dass der Alias aus dem Titel generiert wird, und ggf. die ID drangehängt wird. Aber es ist ja nicht sicher, dass der Alias "Titel-ID" nicht auch schon existiert, oder?

    Aktuell mache ich das so:

    PHP-Code:
    public function AliasExists($suggestedAlias) {
        
    $objAlias $this->Database->prepare("SELECT id FROM tl_calendar_events WHERE alias=?")
                         ->
    execute($suggestedAlias);
        if (
    $objAlias->numRows) {
            return 
    true;
        } else {
            return 
    false;
        }
    }
     
    public function 
    generateAlias($varValue) {
        
    // Generate new alias from varValue (here: the title)
        
        
    $varValue standardize($varValue);        

        if (
    $this->AliasExists($varValue)) {
            
    // alias already exists, we have to modify it.
            // 1st try: Add the ID of the event (which is currently not in the DB, therefore +1 at the end)
            
    $maxI $this->Database->prepare("SELECT MAX(id) as id FROM tl_calendar_events")
                         ->
    limit(1)
                         ->
    execute();
            
    $newID $maxI->id 1;
            
            
    $varValue .= '-'.$newID;
            
    // if even this modified alias exists: use random alias, with ID as prefix
            
    while ($this->AliasExists($varValue)) {                
                
    $randID mt_rand();
                
    $varValue $newID.'-'.$randID;
            }
        }        
        return 
    $varValue;

    Prinzip: zuerst "standardisierten Titel" probieren, dann mit ID dran, und wenn auch das nicht klappt, dann die ID als Alias, gefolgt von einem zufälligen Wert. Theoretisch kann die letzte Schleife in eine Endllosschleife laufen, aber dieses "Risiko" gehe ich ein.

    Frage aber: Wie sieht das aus, wenn der Titel zu lang wird, also über die 128 Zeichen, die ein Alias haben kann, hinaus geht? Wird das durch standardize bzw. die Datenbankabfrage abgefangen, oder muss ich da noch ein Substr() für den ersten Alias-Versuch drumbauen, um das sauber zu machen? Oder ist das eh alles überflüssig, oder gibt es da schon eine Core-Funktion für?
    All of this has happened before - but the question remains: Does all of this have to happen again?

  2. #2
    Alter Contao-Hase
    Registriert seit
    02.10.2010.
    Ort
    58636 Iserlohn
    Beiträge
    1.084

    Standard

    Du kannst die Funktion vom Seiten-Alias nutzen.
    Schau dort mal in das tl_page dca.
    Meine Extensions: contentmodify, dca_editor

  3. #3
    Contao-Nutzer Avatar von Gausi
    Registriert seit
    04.09.2009.
    Beiträge
    149

    Standard

    Und genau das reicht eben nicht. Contao selbst generiert da unter Umständen doppelte Aliase, und speichert die sogar erstmal so ab (zumindest bei 4.4). Erst, wenn man die Seite erneut bearbeitet, kommt eine Fehlermeldung diesbezüglich, und man muss den Alias manuell korrigieren, bis er passt.

    Kann man schnell nachstellen
    1. Seite mit Name "testtest" erstellen. Erzeugter Alias: "testtest", ok.
    2. Noch eine Seite mit Name "testtest" erstellen. Erzeugter Alias: "testtest-42" (oder was auch immer die ID ist), ok.
    3. Diese Seite bearbeiten und Alias ändern zu "testtest-43" (halt eine höher, damit der Ausweich-Alias für die nächste Seite blockiert ist)
    4. Noch eine Seite mit Name "testtest" erstellen, "Speichern und Schließen" anklicken. Erzeugter Alias: "testtest-43"

    Und somit ist ein doppelter Alias in der Datenbank drin. Und das möchte ich sicher verhindern, weil ich bei dem Modul dem Anwender keinen Zugriff auf das Alias geben will.

    Edit: Seiten-Name, nicht -Titel
    Geändert von Gausi (26.10.2018 um 07:18 Uhr)
    All of this has happened before - but the question remains: Does all of this have to happen again?

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.114
    Partner-ID
    10107

    Standard

    Du musst einfach eine Schleife machen.

  5. #5
    Contao-Nutzer Avatar von Gausi
    Registriert seit
    04.09.2009.
    Beiträge
    149

    Standard

    Die Schleife habe ich ja am Ende drin, meine Frage bezog sich auf den ersten Teil. Und den habe ich grade auch getestet, das funktioniert so nicht, wie ich das jetzt habe.

    Wenn der zuerst generierte Alias wegen eines sehr langen Titels schon 128 Zeichen hat, und schon in der Tabelle drin ist, dann ist der Alias "<128zeichen>-<neueID>" nicht in der DB, allerdings landet dann wegen der Längenbeschränkung doch wieder "<128zeichen>" als Alias in der DB.

    Muss ich also doch mit substr arbeiten, damit das sauber läuft.

    Ist vielleicht ne Kleinigkeit, aber wenn man schonmal dran ist mit dem Aufräumen im Code, dann kann man sowas mitmachen.
    All of this has happened before - but the question remains: Does all of this have to happen again?

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •