2017-11-21 10 views
0

外部リンクを相対リンクとして扱うSilverStripeに問題があります。Silverstripe外部リンクを相対リンクとしてレンダリング

私はのDataObjectを持っている:

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

アーティストのウェブサイトは、<a href="$Website" target="_blank">経由でレンダリングされます。問題は、URLがウェブサイトのベースURLに追加されていることであるので、我々のようなもので終わる:

代わりに希望の

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

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

しかし、 $ Websiteにプロトコル(httpまたはhttps)が含まれている場合、リンクは期待通りに機能します。 $ウェブサイトhttp://www.artistsite.comであれば、我々が得る:

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

このサイトは、クライアント・維持アーティストのレコードの最終的に何百、何千とが、含まれています。理想的には、クライアントはhttpまたはhttpsをそれぞれに追加することを心配することなく、URLに貼り付けることができます。

誰もが考えている? SilverStripe forumsに記載されているのと同じ問題ですが、解決策が投稿されていません。

このサイトはSilverStripe 3.6です。

+0

この問題を処理するためのモジュールがあります。 SS3.0の場合はhttps://github.com/restruct/silverstripe-namedlinkfield、SS4の場合はhttps://github.com/burnbright/silverstripe-externalurlfield。基本的に 'Website'コンテンツを検証し、保存する前に変更する必要があります。 – wmk

+0

ええ、プロトコルが存在することを確認するための 'onBeforeWrite'か、存在しない場合にプロトコルを追加するカスタムゲッター...前者はパフォーマンス上の方が良いオプションですが、テキストフィールドのテキストを変更します。 – bummzack

答えて

5

これは、SilverStripeの問題ではありません。

<!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> 

それらのすべてのサイトではなく、外部のURLへの相対リンクとしてオープン:

は以下を含むHTML文書を考えます。

は、URLが有効なプロトコルが含まれていないテストにonBeforeWriteを追加することです

html - links without http protocolは、管理者は、機能のリンクを貼り付ける役立ちますし、そうでない場合は、自動的に追加します。http://少なくとも。あるいは、@ wmkが自動的に行うコメントで示唆したモジュールを使用してください。

1

レコードがすでに確立されていると私は別のフィールドタイプに、すべてのウェブサイトのフィールドを変換する必要はしたくなかったので、私はオッリ・tyyneläのと@のbummzackの勧告@に従ってonBeforeWriteを追加することを選択しました:

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(); 
} 

ありがとう:)

関連する問題