В настоящее время я реализую функциональность в 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 & 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<span class="rm">: Button Text</span>" LinkAttributes=" alt="Button Text" target="_self" " 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, он выдает указанную выше ошибку.
Я также попытался добавить страницу в конструктор, как было предложено Элвином, но результат тот же.