2012-05-10 6 views
6

コンポーネントのRTFフィールドでアンカーボタンを使用しようとしていて、予期しない動作が発生しています。デザインビューでChromeブラウザを使用して、アンカーとして使用する見出し(つまり、<h2>My Heading</h2>)をハイライト/選択し、アンカーボタンを押してアンカー名(my_place)を入力します。SDL Tridion 2011 SP1でリッチテキストフィールドにアンカーリンクを作成する

これは私のソース]タブに表示されている次のコードになり:による自動閉鎖<a/>タグにブラウザにHTMLを表示するときに

<a name="my_place" id="myplace"/><h2>My Heading</h2> 

これは、問題をレンダリングする原因となります。

​​

または

<h2><a name="my_place" id="myplace">My Heading</a></h2> 

または

<a name="my_place" id="myplace"><a><h2>My Heading</h2> 

誰がこれを経験している:

私は、HTMLソースに挿入されている次の三つのHTML断片の一つは、期待しました?または私が期待したことを達成するための方法を知っている(手動でHTMLを編集することなく)。これは、現在のバージョンのバグですか?

答えて

6

は私のサンプルXSLTテンプレートです:

<template match="a[(@name) and (count(node()) = 0)]"> 
    <copy> 
     <apply-templates select="@*"/> 
     <xhtml:span xmlns:xhtml="http://www.w3.org/1999/xhtml" class="hidden"> </xhtml:span> 
    </copy> 
</template> 

これは厳密に必要なよりも少し追加されますが、我々はコンテンツ配信側のXML操作のために持っているいくつかの他の問題を処理します。

基本的には、name属性を持つすべての空のaタグに一致し、セルフクローズを停止するためにそれらの間に何かを追加します。私たちの場合は、すべてのXMLをXSLTで処理しているので、空のタグが常に閉じているという問題があります。汚れたハックとして、空のタグの間に隠されたspanタグを挿入して、この問題を防ぐようにしました。

4

私はクリスにバグのようです。 Chrome、Firefox、IEで確認しました。現在のテキスト選択を無視するのは完全に直感的です。

これをTridionに報告し、おそらくテンプレートまたはフィルタXSLTを変更して回避することをお勧めします。添付

+0

を助け、私はあなたが正しい@Domていると思う - 私は私のXSLTフィルターを変更しましたスキーマを使用して、推奨されたとおりに問題を処理します。他の人はこれが、この場合には回避策かもしれない –

2

これはTridionのバグです。 1つのワークアラウンド私が提案する(と私たちの特定の設置に実装されている)ということは、次の操作を実行することです:

  1. 編集FormatAreaStyles.css(TridionのCMSプログラムファイルで見つかった)ファイル - だけでなく、あなたのCSSファイルそれは正しくアンカーをフォーマットしますよう

.hiddenanchor { width:1px; height: 1px; display: block; text-indent:-50000px; }

  1. は(新しいクラスに)あなたのCSSファイルを公開します:このようなクラスが含まれるように - ウェブサイトで使用されます。
  2. アンカーを構築するコンポーネントでは、次のようにする必要があります。

    a。 (あなたがターゲットになりたい)コンポーネント内の単語の単語やシリーズ、

    Bを入力します。そのテキストを選択し、そして、それに

    Cをアンカータグを適用します。作成した新しいクラス(.hiddenanchor)をアンカーに適用します。最後に

、あなたの「目に見えない」アンカーは次のようになります。

<a name="anchorname" id="anchorname" class="hiddenanchor">Anchor Name</a> 

それは、粗回避策だ - 完全に認めました。しかし、それは動作します。ハイパーリンク/アンダーラインのスタイルは、次のDOMオブジェクトが終了するまで終了しません。 CSSへの説明として

、アンカーは、技術的にはそれを動作させるとアンカーリンクによってアクセスできるようにするためにDOMに見えなければなりません。したがって、 "display:none"は動作しません。テキストインデントのアプローチをとる代わりに、テキストを絶対的または固定的に画面外に配置することもできます。

+0

を参照して、必ずしも、粗することはできませんので、私は以下の私のXSLTを追加しました。 +1は、リッチテキスト形式の領域に「マージ」フィールドタイプ情報(別名データタグ)を追加するためのすばやく便利な代替技術です。 'hiddenanchor'はここで動作しますが、プレゼンテーションサーバが必要とするものにビジネスフレンドリーな名前を"テンプレート "することができます。代わりに、いくつかのアイテムを目に見えるように保つことができますが、必要に応じてスタイルを変えます。 –

+1

FormatAreaStyles.cssを更新した後、Tridionサーバー上でCOM +またはIISを再起動する必要はないことに注意してください。新しいスタイルを[コンポーネントの書式]ツールバーで使用できるようにするには、ブラウザのキャッシュをクリアする必要があります。また、空のCSSエレメント(例:。ReadMore {/ ** /})も表示されません。表示する書式設定が必要です。 –

6

おかげでクリスは、私は将来的にこの問題を持つ人のために共有したいと思った私の要件に合わせてソリューションを編集しました。

注:これはアンカーの内部のテキストを移動し、テキストを外側に削除します。 HTMLではなく、テキストのみを含むように意図されたアンカーを修正しました。すなわち 私の解決策の修正このタグ:

<p><a name="anchor1" id="anchor1">Anchor text</a></p> 

でもない。これに

<p><a name="anchor1" id="anchor1"></a>Anchor text</p> 

<p><a name="anchor1" id="anchor1"></a><h1>Anchor text</h1></p> 

をここに私のXSLです。うまくいけば、それは私はあなたが簡単に(私は私の解決策のためにこれを必要としない)次のタグを探すためにそれを更新する可能性が確信している、あなたのベースを与えるのに役立ちます。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" method="html" cdata-section-elements="script"/> 
    <xsl:template match="/ | node() | @*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node() | @*"/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- fixes Tridion bug when using interface button to insert anchor in rich text field --> 
    <!-- gets all empty anchor tags with an id and takes any following text and copies it inside anchor --> 
    <xsl:template match="a[(@id) and (count(node()) = 0)]"> 
     <xsl:copy> 
      <xsl:for-each select="@*"> 
       <xsl:attribute name="{name(.)}"> 
        <xsl:value-of select="."/>      
       </xsl:attribute> 
      </xsl:for-each> 
      <xsl:value-of select="normalize-space(following-sibling::text())"/> 
     </xsl:copy> 
    </xsl:template> 
    <!-- delete any text after an empty anchor (template above has already copied this text inside the anchor) --> 
    <xsl:template match="text()[preceding-sibling::a[(@id) and (count(node()) = 0)]]" ></xsl:template> 
</xsl:stylesheet> 

ここに私のテストXMLが

<?xml version ="1.0"?> 
<?xml-stylesheet type="text/xsl" href="tridionhtmlfield.xsl"?> 
<html> 
    <head></head> 
    <body> 
     <p><a id="anchorlink" name="anchorlink" title="Anchor link" href="#Anchor">Anchor link</a>Some text after</p> 
     <p><a name="broken-with-html-name" id="broken-with-html-id"></a><h1>Anchor - broken with html</h1></p> 
     <p><a name="broken-text-only-name" id="broken-text-only-id"></a>Anchor - broken text only</p> 
     <p><a name="broken-notext-name" id="broken-notext-id"></a></p> 
     <p><a name="correct-name" id="correct-id">Anchor - correctly rendered</a> Some text after</p> 
    </body> 
</html> 

だ後変換:

<html> 
    <head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head> 
    <body> 
     <p><a id="anchorlink" name="anchorlink" title="Anchor link" href="#Anchor">Anchor link</a>Some text after</p> 
     <p><a name="broken-with-html-name" id="broken-with-html-id"></a><h1>Anchor - broken with html</h1></p> 
     <p><a name="broken-text-only-name" id="broken-text-only-id">Anchor - broken text only</a></p> 
     <p><a name="broken-notext-name" id="broken-notext-id"></a></p> 
     <p><a name="correct-name" id="correct-id">Anchor - correctly rendered</a> Some text after</p> 
    </body> 
</html> 

希望これは

+0

こんにちはJonathan、これがうれしいことのいくつか - あなたのSO IDを使用してSDL Tridion Area 51の提案にコミットし、Tridion専用のQ&Aエリアを取得することを検討してください:http://area51.stackexchange.com/proposals/38335/tridion?referrer = eo63snjNlUWNn9xqeeO2NA2 –

関連する問題