Подтвердить что ты не робот

Компонент Tridion не разрешен в представлении динамических компонентов

В настоящее время я реализую функциональность в Tridion 2009 SP1, где пользователь может использовать фильтр, который, в свою очередь, запрашивает брокера для соответствия критериям, а затем возвращает компонентные презентации на страницу. Каждый возвращаемый элемент содержит ссылку на компонент.

Первоначально динамические CP были сохранены в DB брокера как фрагменты HTML, но было обнаружено, что при хранении CP таким образом Tridion лишит компонентную ссылку из содержимого и оставляет пустое пространство в HTML.

Затем я переключил настройку так, чтобы динамические CP теперь сохранялись на filestore как элементы управления ascx. Когда этот параметр используется, <tridion:ComponentLink ... /> успешно сохраняется в файле ascx.

Однако, когда я прихожу, чтобы отобразить результаты на экране, ссылка компонента не разрешается, и в моем исходном источнике меня оставляют <tridion:ComponentLink ... />.

В настоящее время я использую метод GetComponentPresentation для возврата содержимого CP, которое затем добавляется в список, прежде чем привязываться к повторителю для отображения.

Обобщенный код ниже:

ComponentPresentationFactory CPFactory = new ComponentPresentationFactory();
List<string> componentPresentations = new List<string>();

for (int i = 0; i < tbl.Rows.Count; i++)
{
    ComponentPresentation cp = CPFactory.GetComponentPresentation(
                                             tbl.Rows[i][0].ToString(), 
                                             strComponentTemplate.ToString());

    if (cp != null)
    {
        componentPresentations.Add(cp.Content);
    }
}

Этот список является обязательным для ретранслятора обычным способом:

rptOffer.DataSource = componentPresentations;
rptOffer.DataBind();

Кто-нибудь знает, как я могу заставить компонентную ссылку разрешить и почему функция GetComponentPresentation не делает этого для меня?

Есть ли что-то, что я должен делать по-другому или это просто невозможно в том, как я это реализую?

Я подтвердил, что тег tridion tagprefix правильно зарегистрирован в файле web.config.

Я новичок в Tridion, поэтому любая помощь очень ценится!

UPDATE

Я попытался реализовать предложение Will, поскольку оно кажется наиболее подходящим решением для моего сценария, но я получаю (довольно мягкую) ошибку, когда я пытаюсь использовать предложение Will с моим кодом ниже:

ComponentPresentationAssembler cpa = new ComponentPresentationAssembler("tcm:35-62652-64");
string content = cpa.GetContent(tbl.Rows[i][0].ToString(), strComponentTemplate.ToString());

На самом деле есть 2 ошибки, которые происходят (по-видимому) случайным образом, но всегда при вызове cpa.GetContent(...). Ошибки:

Exception occurred during configuration callback
OR
com.tridion.dcp.ComponentPresentationFactory

Я не могу понять, почему ошибка изменяется между моментом, когда я запускаю код. Ошибка изменяется даже при отсутствии изменений кода.

Кто-нибудь знает, что мне здесь не хватает? Я предположил, что это будет проблемой с подключением к хранилищу брокеров и т.д., Но потом я вспомнил, что эта часть работала, когда я использовал класс ComponentPresentationFactory.

Если это помогает, DCP, который хранится в хранилище файлов как ascx, содержит следующий HTML:

<div class="content-list-item offer redesign noImage">
<h2><span>Mike Offer 01/06 - 10/06 &amp; 20/06 - 10/07</span> Exp May 20th</h2>
<div class="content-list-item-text">
    <p>Body Text</p> 
    <div class="input-btn burgundy">
        <tridion:ComponentLink runat="server" PageURI="tcm:0-0-0" ComponentURI="tcm:35-31685" TemplateURI="tcm:0-0-0" AddAnchor="false" LinkText="Button Text&lt;span class=&#34;rm&#34;&gt;: Button Text&lt;/span&gt;" LinkAttributes=" alt=&#34;Button Text&#34; target=&#34;_self&#34; " TextOnFail="true"/>    
    </div>
        <p>Sub Title</p>
</div>
<div class="offers-list">        
    <ul>
        <li>Offer ends: 20 May 2012</li>
        <li>Offer available at all hotels</li>
    </ul>
</div>                          
<div class="back-to-top">
    <a href="#content">Back to top</a>
</div>

ОБНОВЛЕНИЕ 2

Благодаря Ryan, я обнаружил, что мои файлы DCP (ASCX) не были опубликованы в папке приложения в папке wwwroot, которая решила проблему с ее тегом <tridion:ComponentLink ... /> непосредственно к источнику. Он теперь отображается, но ссылка все еще не решена. Теги <a ... /> не выводятся. Это то, на что, надеюсь, войдет Ассемблер - как только я смогу заставить это работать.

Я выполнил больше протоколирования и проверки и получил дополнительную информацию об ошибке, которая говорит о том, что мне может не хватать файл jar или иметь неправильную версию:

Exception Details: Java.Lang.ClassNotFoundException: com.tridion.dcp.ComponentPresentationFactory

Интересно, что когда я использую класс ComponentPresentationFactory, он работает (без разрешения внутренней ссылки), но как только я использую Assembler, он выдает указанную выше ошибку.

Я также попытался добавить страницу в конструктор, как было предложено Элвином, но результат тот же.

4b9b3361

Ответ 1

Как уже говорилось, для решения вашей проблемы вам нужно использовать класс ComponentPresentationAssembler, а не класс ComponentPresentationFactory, но вам нужно убедиться, что вы используете класс ComponentPresentationAssembler внутри пространства имен Tridion.ContentDelivery.WAI:

Tridion.ContentDelivery.WAI.ComponentPresentationAssembler presentationAssembler = new Tridion.ContentDelivery.WAI.ComponentPresentationAssembler("tcm:5-44410-64",this.Page);
Response.Write(presentationAssembler.GetContent("tcm:5-62700", "tcm:5-62627-32"));

Вам также необходимо убедиться:

  • Ваши файлы ASCX публикуются в файловой системе Это устанавливается в файле cd_broker_conf.xml внутри раздела <Bindings>, например. <Binding Name="ASPComponentPresentation" Class="com.tridion.broker.componentpresentations.FSASCXComponentPresentationHome"/>

  • Ваши файлы ASCX публикуются внутри вашего веб-приложения .Net. Это устанавливается в файле cd_broker_conf.xml внутри раздела <Publications>, например.

    <Publication Id="5" DocumentRoot="C:/Inetpub/wwwroot/website1" DataRoot="C:/Inetpub/wwwroot/website1/dcp">
        <Dcp>
            <Asp Location="C:/Inetpub/wwwroot/website1/dcp"/>
        </Dcp>
    </Publication>
    

Помните, что места, которые вы видите выше, чувствительны к регистру

Ответ 2

Чтобы выполнить DCP, а не просто получить опубликованный контент, вам нужно использовать класс ComponentPresentationAssembler, а не класс ComponentPresentationFactory.

Простой пример ниже:

ComponentPresentationAssembler cpa = 
   new ComponentPresentationAssembler("tcm:69-6212-64",this.Page);
Response.Write(cpa.GetContent("tcm:69-2882", "tcm:69-6339-32"));

Обратите внимание: если вы публикуете много (то есть сотни) презентаций компонентов (и часто публикуете их), это не очень хорошая идея для использования ascx - вы можете столкнуться с некоторыми проблемами производительности с пакетной перекомпиляцией ASP.NET папки, содержащей их всех или перезапуск приложения.

Безопаснее публиковать их как (X) фрагменты HTML в базе данных и обрабатывать ссылки, как упоминает Марк.

Как упоминает Фрэнк в 2011 году SP1, вы можете использовать REL для этой последующей обработки. Подробнее см. в этой статье

Ответ 3

Отметить ответ уже охватывает самую важную часть вашей версии Tridion: вы должны опубликовать файлы ASCX на диск, чтобы элементы управления tridion:CompontentLink выполнялись ASP.NET.. p >

Tridion 2011 представила REL как альтернативное решение для этого. При использовании REL вы снова публикуете фрагменты HTML, а tcdl:ComponentLink будет храниться как есть в базе данных (поэтому при развертывании он не преобразуется в tridion:ComponentLink). Затем, когда вы загружаете контент (через ComponentPresentationTransformer или через новую веб-службу OData доставки контента), теги tcdl:ComponentLink (и другие теги tcdl:*) будут разрешены, и вы получите нужный результат.

Ответ 4

Вы загружаете содержимое презентации динамического компонента в виде строки, а не выполняете строку, как пользовательский элемент управления.

Чтобы решить вашу проблему, вы можете использовать 1 из 2 решений:

1) Используйте Regex на cp.Content для обработки ссылок через Tridion API.

2) Публикуйте динамический контент в файловой системе, когда пользователь контролирует и загружает этот элемент управления на свой пользовательский/пользовательский элемент управления, выполняя его

using (var cpf = new ComponentPresentationFactory(publicationId))
{
    var cp = cpf.GetComponentPresentation(componentId, componentTemplateId);
    fileLocation = cp.FileLocation;
}

if (!String.IsNullOrEmpty(fileLocation))
{
    var crtl = this.LoadControl(MapPathReverse(fileLocation));
    phldControls.Controls.Add(crtl);
}