【问题标题】:Tridion 2011: Changing a page's file name as it's being publishedTridion 2011:在发布页面时更改页面的文件名
【发布时间】:2012-10-29 00:43:37
【问题描述】:

美好的一天!

我允许我的内容编辑器将 CSS 存储为非常基本的组件(通常包含他们粘贴到的称为“代码”的单个多行字段),然后将这些作为组件演示文稿添加到带有 .css 的页面中文件扩展名。创建页面时,用户可以设置一些配置值:缩小输出(布尔)、文件名前缀和文件名后缀。最后两个的目的是,如果用户在出门时选择了缩小 CSS,则文件名在演示服务器上可能会有所不同。

除了修改文件名外,我已经完成了所有工作。我不想更改 CM 中的文件名;只是因为它驻留在演示服务器上。我假设这可以在放置在 CSS 页面模板中的 TBB 中完成。我试了一下,但想确定我没有遗漏什么。以下示例只是为简洁起见硬编码了一些可配置值的简写。

// Create a reference to the Page object in the package.
Page page = this.GetPage();

// Retrieve a reference to the page's file name.
string currentFileName = Utilities.GetFilename(page.FileName);

// Set the published file name on its way out the door.
page.FileName = currentFileName + "_min";

// ???
// Profit.

【问题讨论】:

  • 您使用的是 SP1 Hotfix Rollup 1,并且您只进行静态发布吗?
  • 嘿,罗伯。如果以下任何答案帮助您解决问题,您能否通过单击左侧显示的大复选标记接受它?
  • 弗兰克,绝对的。我想我太专注于开发了,以至于忘记了回来接受! Nickoli(像往常一样)给出了很好的回应,但现在我将接受 Chris 的建议。感谢大家的回复!

标签: c# tridion tridion-2011


【解决方案1】:

阅读您对@Dylan 回复的回答后,您可能会考虑在发布时创建一个包含最小化代码输出的二进制变体。

在最简单的形式中,您将使用页面的输出创建一个文本文件,然后调用 .AddBinary() 指定文件的内容、文件名、变体名称(我建议使用页面 URI) , 当前 StructureGroup 的 URI 和要绑定 this 的 Component 的 URI(可能是页面上的 Component)。

你可以在米海的博客here看到一些二进制变体示例

Binary binary = m_Engine.PublishingContext.RenderedItem.AddBinary(
    resizedStream, newFilename, variantId, mmc,
    binaryContent.MultimediaType.MimeType);

这将发布一个文件,其中包含除了实际页面之外的页面输出。当您取消发布页面时,您也将取消发布额外文件。

【讨论】:

  • 只是为了清除在某个时候可能出现的任何问题,请注意 Tridion 确实会取消发布该变体,但它可能不会直接与取消发布此页面有关。它与您的“mmc”组件的使用有关,当它不再用于任何已发布页面时,它的所有变体也将被取消发布。
  • 这是最直接的方法。我没有在回答中提出建议的原因是,尽管没有其他项目使用它们,但我遇到了在 Tridion 的 SP1 之前的版本中未发布变体的问题。
  • 克里斯,我非常感谢您的建议。因为它是最接近我当前尝试的,所以我会立即试一试,并将我的发现发回。哎呀,我什至可以把这段经历变成一篇博文,供有同样需求的其他 Tridion 开发人员使用。
  • 克里斯,顺便说一句,我得到了这个工作。非常感谢您的建议。现在我只需要弄清楚为什么 CSS 会被包含在 tcdl:ComponentPresentation 标记中,我就可以开始了。也许这是一个不同的话题。
  • 是的 - 为该主题创建一个新主题 - 但我的猜测是您在调用页面模板的“清理”TBB 之前调用了“创建二进制”TBB
【解决方案2】:

我假设您只进行静态发布,即不使用 Tridion Content Broker。

您应该能够使用基于 TOM.NET 的新 Tridion 事件系统执行此操作,并在启动阶段订阅 Publishing 事件。这意味着就在页面开始发布之前,您将捕获事件并修改页面文件名。但是,这将使页面在 CME 中具有新名称。同样,在发布事务完成后使用另一个事件阶段,TransactionCommitted 阶段,您可以将页面名称更改回来。

您还可以编写自定义部署程序扩展来执行此操作,这将重命名页面。但是,您还需要有代码来管理重命名页面的“取消发布”。请参阅 Jaime 的博客文章,了解如何编写 Deployer 扩展:http://sdltridionworld.com/articles/sdltridion2011/tutorials/Deployer_Extensions_With_Eclipse_1.aspx

【讨论】:

  • 静态发布,是的。修改事件系统并没有让我太沮丧,但我一直希望这可以通过 PT 中的 TBB 更轻松地完成。
  • 感谢您对自定义部署程序扩展的建议。我会读一读,看看这对我来说是否是一条理想的道路。 :D
  • 事件系统可能是比部署程序扩展更简单的方法。我厌倦了能够在 TBB 中执行此操作,因为您已经在发布会话中,并且您可能无法编写会话包中的 TOM.NET 对象。如果你能做到,我希望对 Page 或 Component 对象的任何修改都将在会话完成后进行。
【解决方案3】:

如果不理解不更改 CM 中的文件名而是在外部更改文件名的上下文/原因,很难提供最合适的答案……我通常建议只管理两个页面?

您还可以研究其他选项...

内容部署程序扩展。

Nick 建议的事件系统。

以上两者都需要考虑对取消发布的影响。

您可以让服务器端简单的应用程序监视要发布的文件并将其(它是 Tridion 发布的文件)复制到文件的 {renamed} 版本(克里斯在这里讨论了类似的内容Can we customize Deployer using .NET?))-如果您想避免为内容部署者编写 Java 编码,更是如此。

【讨论】:

  • 此外,我确定自 2011 SP1 以来不建议使用模板方法,因为在我们的模板中调用 PublishEngine.Publish() 不再是开箱即用的,必须使用参数“允许”的allowWriteOperationsInTemplates。
  • 感谢您的回复。驻留在 CM 中的文件名用于文件的基本未压缩版本。如果我将其发布,并且我不希望缩小我的输出,我希望文件名将通过在其末尾不包含“_min”来表明这一点。如果我将它发布出来,并且我希望我的输出缩小,我不仅需要确保我没有覆盖非缩小版本,而且还要给出文件被压缩的视觉指示。
  • 我 / 可以 / 在 Tridion 中管理两个页面,但对于我的内容人员来说,翻转切换的可用性与创建两个包含完全相同的 CP 且文件名略有不同的页面的可用性...便利和效率因素仅在于其中之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 2012-06-11
  • 1970-01-01
  • 2016-10-19
  • 2012-11-30
  • 1970-01-01
相关资源
最近更新 更多