2017-11-21 1 views
0

Ich habe ein Problem mit SilverStripe, bei dem externe URLs als relative Links behandelt werden.Silverstripe Rendern von externen URLs als relative Links

Ich habe ein Datenobjekt:

class Artist extends DataObject { 
    private static $db = array(
    'Title' => 'Varchar(255)', 
    'Content' => 'HTMLText', 
    'Website' => 'Varchar(255)', 
); 
} 

Künstler-Websites über <a href="$Website" target="_blank"> gerendert werden. Das Problem ist, dass die URLs an die Basis URL der Website angehängt werden, so dass wir am Ende mit etwas wie:

<a href="mysite.com/www.artistsite.com" target="_blank">

anstelle der gewünschten:

<a href="www.artistsite.com" target="_blank">

jedoch Wenn $ Website das Protokoll (http oder https) enthält, funktioniert die Verbindung wie erwartet. Also, wenn $ Webseite ist http://www.artistsite.com dann erhalten wir:

<a href="http://www.artistsite.com" target="_blank">

Diese Seite enthält Hunderte und schließlich Tausende von Client gepflegt Künstler Aufzeichnungen. Im Idealfall kann der Client URLs einfügen, ohne sich darum kümmern zu müssen, dass HTTP oder HTTPS an diese angehängt werden.

Wer hat irgendwelche Ideen? Es ist das gleiche Problem wie auf der SilverStripe forums beschrieben, aber keine Lösung wurde veröffentlicht.

Diese Seite auf SilverStripe 3.6.

+0

Es gibt Module zur Behandlung dieses Problems, z https://github.com/restruct/silverstripe-namedlinkfield für SS3.0 + und https://github.com/burnbright/silverstripe-externalurfield für SS4. Sie müssen den Inhalt der Website grundsätzlich validieren und vor dem Speichern ändern. – wmk

+0

yeah, entweder 'onBeforeWrite', um sicherzustellen, dass das Protokoll vorhanden ist, oder ein benutzerdefinierter Getter, der das Protokoll hinzufügt, wenn es nicht existiert ... ersteres wäre die leistungsstärkere Option, aber es ändert den Text im Textfeld . – bummzack

Antwort

5

Dies ist kein SilverStripe-Problem direkt.

ein HTML-Dokument mit folgendem Gegeben:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Title</title> 
</head> 
<body> 

<a href="google.com" target="_blank">test</a> 
<a href="www.google.com" target="_blank">test</a> 

</body> 
</html> 

alle von ihnen offen als relative Links zu der Website, nicht die externe URL.

Siehe html - links without http protocol

die Admin funktionelle Links einfügen Damit ist eine onBeforeWrite zu Test hinzuzufügen, funktioniert die neue URL ein gültiges Protokoll enthalten, und wenn es nicht, fügt automatisch http: // zumindest. Oder benutze die Module, was @wmk in dem Kommentar vorgeschlagen hat, der das automatisch macht.

1

Seit Aufzeichnungen wurden bereits eingerichtet, und ich wollte nicht alle Website-Felder zu einem anderen Feldtyp umwandeln haben, entschied ich mich ein onBeforeWrite für das Hinzufügen per @ olli-Tyynelä der und Empfehlung des @ bummzack:

public function onBeforeWrite() { 
    $url = $this->Website; 
    if ($ret = parse_url($url)) { 

    if (!isset($ret["scheme"])) { 
     $url = "http://{$url}"; 
     $this->Website = $url; 
     $this->write(); 
    } 
    } 
    parent::onBeforeWrite(); 
} 

Danke :)

Verwandte Themen