2012-05-10 3 views
6

Я пытаюсь использовать кнопку привязки в поле RTF компонента и получать неожиданное поведение. Используя браузер Chrome из проектного представления, я выделяю/выбираю заголовок (т. Е. <h2>My Heading</h2>). Я хочу использовать в качестве привязки и нажать кнопку привязки и ввести имя привязки (то есть my_place).Создание привязных ссылок в текстовых полях с расширенными полями с SDL Tridion 2011 SP1

Это приводит следующий код отображается в моей закладке Источник:

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

Это приводит к визуализации проблемы при отображении HTML в браузере из-за закрывающиеся <a/> тега.

я ожидал бы один из следующих трех HTML фрагментов вставляется в источник HTML:

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

или

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

или

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

Кто-нибудь еще сталкивался с этим ? или знаете способ достижения того, что я ожидал (без ручного редактирования 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 на стороне контента доставки.

По существу он соответствует всем пустым a тегам с атрибутом name и добавляет что-то между ними, чтобы остановить их закрытие. В нашем случае мы отправляем весь процесс XML с помощью XSLT, поэтому у нас есть проблемы с закрытием закрытых тегов. Так как грязный взломать, мы теперь вставляем скрытый тег span между пустым тегами, чтобы предотвратить проблему.

4

Это похоже на ошибку для меня Крис. Я только что подтвердил это в Chrome, Firefox и IE. Совершенно контр-интуитивно понятно, что текущий выбор текста следует игнорировать. (С другой стороны, как только вы исправляете его вручную на вкладке источника, все выглядит отлично.)

Я предлагаю вам сообщить об этом Tridion и, возможно, обойти его, изменив шаблоны или фильтр XSLT.

+0

Я думаю, что вы правильно @Dom - Я изменил мой XSLT Фильтр для схему для решения проблемы, как вы рекомендовали. Я добавил свой XSLT ниже, чтобы другие могли видеть –

2

Это ошибка в Тридионе. Одна работа вокруг, что я предлагаю (и реализован в нашей конкретной установке), чтобы сделать следующее:

  1. Отредактируйте файл FormatAreaStyles.css (в файлах программы Tridion CMS) - а также файл CSS используется на веб-сайте - включить класс вроде этого:

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

  1. Publish ваш файл CSS (с новым классом), так что это будет форматировать якоря правильно.
  2. А потом в компоненте, где вы строите из якоря, вы должны:

    а. введите слово или ряд слов в свой компонент (где вы хотите, чтобы цель была),

    b. выберите этот текст и примените к нему привязывающий тег,

    c. затем примените новый класс, который вы создали (.hiddenanchor) к якорю.

В конце концов, ваш «невидимый» якорь будет выглядеть следующим образом:

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

Это грубая работа вокруг - полностью признал. Но это работает. Вы не заканчиваете стиль гиперссылки/подчеркивания до закрытия следующего объекта DOM.

Как пояснение к CSS, якорь технически должен быть видимым в DOM, чтобы он работал и был доступен с помощью привязки. Так что «display: none» не будет работать. В качестве альтернативы для подбора текста с отступом вы можете полностью или полностью фиксировать текст с экрана.

+0

Это может быть обходным в этом случае, но не обязательно грубым. +1 как быстрый и полезный альтернативный метод для добавления информации типа поля слияния (так называемые теги данных) в области форматированного текста. «hiddenanchor» работает здесь, но мы можем «создавать шаблоны» дружественных к бизнесу имен во все, что требуется серверу презентаций. В качестве альтернативы вы можете сохранить некоторые элементы видимыми, но при необходимости по-разному по-разному. –

+1

Возможно, стоит отметить, что после обновления FormatAreaStyles.css нет необходимости перезапускать COM + или IIS на сервере Tridion. Возможно, вам придется очистить кеш браузера, чтобы новый стиль был доступен на панели инструментов «Формат компонента». Также обратите внимание, что любые пустые элементы CSS (например, a.ReadMore {/ ** /}) тоже не появится - у них должны быть настройки форматирования для показа. –

6

Спасибо Крис, я отредактировал ваше решение в соответствии с моими требованиями, поэтому хотел бы поделиться для всех с этой проблемой в будущем.

Примечание: Это перемещает текст внутри якоря и удаляет текст снаружи. Фиксирует якоря, которые должны были содержать только текст, а не html. т.е. мое решение устраняет этот тег:

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

Для

<p><a name="anchor1" id="anchor1">Anchor text</a></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

Привет, Джонатан, Рад, что это помогло вам. Пожалуйста, подумайте о том, чтобы совершить сделку с нашим предложением SDL Tridion Area 51 с использованием вашего SO ID, чтобы мы могли получить выделенную область Q & A для Tridion: http://area51.stackexchange.com/proposals/38335/Tridion? ссылающейся = eo63snjNlUWNn9xqeeO2NA2 –

Смежные вопросы