Вопрос по – Создание ссылок привязки в полях с расширенным текстом с помощью SDL Tridion 2011 SP1

6

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

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

<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). Или это ошибка в текущей версии продукта.

Ваш Ответ

4   ответа
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 тег между пустыми тегами, чтобы предотвратить проблему.

2

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

  1. Edit the FormatAreaStyles.css file (found in the Tridion CMS program files) — as well as your CSS file used by the website — to include a class like this:

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

  1. Publish out your CSS file (with the new class) so that it'll format your anchors properly.
  2. And then in the component where you are building out the anchors, you will have to:

    a. type a word or series of words in your component (where you want the target to be),

    b. select that text, and apply the anchor tag to it,

    c. then apply the new class you've created (.hiddenanchor) to the anchor.

В конце концов, ваш & quot; невидимый & quot; якорь будет выглядеть так:

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

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

В качестве объяснения CSS, якорь технически должен быть видим в DOM, чтобы он работал и был доступен по ссылке якоря. Так & quot; дисплей: нет & quot; не будет работать. В качестве альтернативы подходу с отступом текста, вы также можете установить абсолютное или фиксированное положение текста за пределами экрана.

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

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

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

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

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

Note: Это перемещает текст внутри якоря и удаляет текст снаружи. Исправлены якоря, которые должны были содержать только текст, но не 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>

Надеюсь это поможет

Привет, Джонатан, рад, что кое-что из этого помогло тебе. Пожалуйста, рассмотрите возможность присоединения к нашему предложению SDL Tridion Area 51, используя свой SO ID, чтобы мы могли получить выделенную область вопросов и ответов для Tridion:area51.stackexchange.com/proposals/38335/… Chris Summers

Похожие вопросы