【问题标题】:Typo3: Use USER_INT with HMENU's special.valueTypo3:将 USER_INT 与 HMENU 的 special.value 一起使用
【发布时间】:2021-06-24 15:41:45
【问题描述】:

我只是想在我的page.typoscript 文件中使用 PHP 代码以编程方式计算一个值。这就是我所做的:

        dataProcessing {
            1010 = TYPO3\CMS\Frontend\DataProcessing\MenuProcessor
            1010 {
                levels = 2
                special = directory
                special.value = USER_INT
                special.value {
                    userFunc = Vendor\Extension\Utils\NavigationBarUtils->getPlatformRootPid
                }
                as = menuMain
            }
         ... 
        }

调用的方法就是这个:

    public function getPlatformRootPid(): int
    {
        return 1;
    }

当我加载任何页面时,menuMain 为空。命名空间是正确的。另外,我使用这样的方法来计算同一个 page.typoscript 文件中的一些其他值,并且它们可以工作。

当将该值设置为special.value = 1 时,它会按预期工作。

MenuProcessor(即 HMENU)special.value 和 USER_INT 是否有问题?它们是否以某种方式不兼容?还是我在这里遗漏了什么?

非常感谢您!

【问题讨论】:

    标签: php typo3 typoscript


    【解决方案1】:

    我认为你错过了类型。

    special.value 需要一个值,该值可能会被.stdWrapfunctions 修改。

    您尝试将属性修改为对象,这是行不通的。
    您分配了值(字符串)USER_INT 和 stdWrap 函数userFunc,它们不存在。

    如果你想使用一个对象作为一个值,你需要使用.cObject。所以你的解决方案可能是:

    1010 {
        levels = 2
        special = directory
        special.value.cObject = USER_INT
        special.value.cObject {
            userFunc = Vendor\Extension\Utils\NavigationBarUtils->getPlatformRootPid
        }
        as = menuMain
    }
    

    【讨论】:

    • 非常感谢您的回复!我想我现在明白问题所在了。问题是我已经按照您的说明进行了更改,但仍然无法正常工作。您对正在发生的事情有任何线索吗?或者我该如何调试?我从来不知道如何在前端调试 TypoScript。
    • 问题在于评估。不是在使用值之前应用每个值.stdWrap。这取决于评估打字稿的 PHP。我不知道数据处理器是否评估所有属性。这样很难调试 TypoScript。通常您在后端查看 TSOB 并相应地设置条件。另一个选项是管理面板。但是你永远不知道 PHP 正在从裸排版中评估什么。因此你需要调试PHP。
    • 啊,我明白了。无论如何,感谢您的 cmets,我找到了一种方法:``` 1010 { levels = 2 special = directory special.value.postUserFunc = Vendor\Extension\Utils\NavigationBarUtils->getPlatformRootPid as = menuMain } `` ` 实际上,它做了我想要的,通过调用 PHP 方法以编程方式设置该值。再次感谢。
    • 将其作为您问题的官方答案并接受它,以便其他人可以看到有一个可行的解决方案。
    【解决方案2】:

    最后,我想出了一个办法:

    1010 { 
      levels = 2
      special = directory
      special.value.postUserFunc = Vendor\Extension\Utils\NavigationBarUtils->getPlatformRootPid
      as = menuMain 
    }
    

    实际上它做了我想要的,通过调用 PHP 方法以编程方式设置该值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-27
      • 2020-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-29
      • 1970-01-01
      相关资源
      最近更新 更多