0

我使用 TBS 和 OpenTBS 来解析 PHP 脚本中的 office 模板。rtf类型或类型的文件txt使用 TBS 和类型的文件docxpptx使用 OpenTBS 处理。

合并后的文件在办公环境中用于信件、提交和批次,因此我希望在生成文件之前删除最初没有合并的标签,例如由于丢失数据。涵盖 TBS 和 OpenTBS 的解决方案将是理想的。

目前我使用[onload.nonexistant;ifempty=’’]TBS 之类的字段,但冗长的语法有点笨拙,容易出错,并且不适用于 OpenTBS。

如果空的默认值不起作用,那么可能对剩余字段进行了某种清理操作?

4

2 回答 2

1

在 TBS 文档中翻来覆去之后,我终于决定编写一个简单的插件。它捕获 TBS 的输出事件并删除任何未合并的字段。这是代码:

<?php

define('TBS_CLEANER','clsTbs_Cleaner');

class clsTbs_Cleaner {

    function OnInstall() {
        $this->Version = '0.0.1';
        return array('AfterShow');
    }

    function AfterShow(&$Render) {
        $this->TBS->Source = preg_replace('/\[(onload|onshow)\..*\]/', '', $this->TBS->Source);
        return true;
    }
}

该插件可以通过包含$TBS->PlugIn(TBS_INSTALL,TBS_CLEANER);在处理 PHP 文件中来使用,就在$TBS = new clsTinyButStrong;.

请随时在此方法的基础上进行构建。请注意,给定的搜索过滤器可能需要一些改进。也许是平衡方括号表达式的递归过滤器?

于 2018-03-16T23:24:31.103 回答
1

实际上,当您合并诸如 的字段时,存在不一致的 TBS 行为(版本 3.10.1 及之前)[onload.nonexistant;ifempty=display_me],假设您$nonexistant在全局 PHP 范围内或$TBS->VarRef范围内都没有变量。

  • 默认情况下,此类字段在模板中显示 TBS 错误消息:« item 'nonexistant' is not an existing key in the array »。
  • 如果您noerr在字段中添加参数,则它会正确合并并替换为“display_me”。
  • 但是,如果您不使用参数noerr并将选项 'noerr' 设置为 true,则不会显示错误,但该字段根本不会合并。

最后一点的预期行为是该字段应替换为“display_me”。就像使用 MergeField() 时一样。

所以这是一种错误,将在下一个 TBS 版本中修复。

您可以通过替换所有补丁来修补当前的 TBS 版本 (3.10.1)

if (isset($Loc->PrmLst['noerr'])) {

if ( $this->NoErr || isset($Loc->PrmLst['noerr']) ) {

在功能meth_Merge_AutoVar()上。他们是其中的 3 个。

在您的情况下,另一个解决方案只是在您要修复的所有字段中添加参数“noerr”。

于 2018-03-18T23:06:24.397 回答