Typo3:无法找到ViewHelper

问题描述 投票:0回答:1

我目前在Typo3 8.7中遇到奇怪的行为。更确切地说,我不能在我的机器上工作,但是可以在其他机器上和我们的质量检查环境中工作。

我正在构建一个需要简单的ViewHelper的扩展。不幸的是,每次我尝试使用ViewHelper时,都会出现以下异常:

#1407060572: Fluid parse error in template Default_action_Default_3595d4917583aa65277b432499e522ff39c573c7, line 48 at character 1. Error: The ViewHelper "<website:string.idFromTitle>" could not be resolved. Based on your spelling, the system would load the class "Domain\Website\ViewHelpers\String\IdFromTitleViewHelper", however this class does not exist. (error code 1407060572). Template source chunk: {title -> website:string.idFromTitle(string: '{title}') -> v:variable.set(name: 'targetId')} <div class="alternative-content-lightbox-fce"> <div class="header"> <a href="#" class="lightbox-trigger" data-target="{targetId}">{linkTitle}</a> <h1>{title}</h1> </div> <div class="main-content">

我正在“ Composer Mode”中使用Typo3,安装根目录下的文件为“ composer.json”,特定扩展名为“ composer.json”文件。在主“ composer.json”文件中,有以下几行:

"repositories": {
    "website": {
        "type": "path",
        "url": "sources/website",
        "options": {
            "symlink": true
        }
    },
    ...
}
...
"require": {
    "domain/website": "@dev",
}
...

因此,扩展名设置为本地程序包。

我的扩展程序的“ composer.json”文件包含以下行:

"autoload": {
    "psr-4": {
        "Domain\\Website\\": "Classes"
    }
}

在“ autoload_classmap.php文件中,我可以看到以下行:

return array(
    'Domain\\Website\\ViewHelpers\\String\\IdFromTitleViewHelper' => $baseDir . '/Classes/ViewHelpers/String/IdFromTitleViewHelper.php'
);

autoload_static.php”文件具有以下行:

public static $classMap = array (
    'Domain\\Website\\ViewHelpers\\String\\IdFromTitleViewHelper' => __DIR__ . '/../..' . '/Classes/ViewHelpers/String/IdFromTitleViewHelper.php',
);

最后,“ autoload_psr4.php”文件包含以下行:

return array(
    'Domain\\Website\\' => array($baseDir . '/Classes'),
);

所以,我想我的文件已自动加载。可以在目录“ Classes / ViewHelpers / String”中找到ViewHelper,如下所示:

<?php
namespace Domain\Website\ViewHelpers\String;

use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager;

class IdFromTitleViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper
{
    public function initialize()
    {
    }

    public function render($string)
    {
        $id = trim($string);
        $id = strtolower($id);
        $id = str_replace(' ', '', $id);
        $id = preg_replace('/[^A-Za-z0-9\-]/', '', $id);
        $id .= uniqid();

        return $id;
    }
}

当我使用ViewHelper时,我会像这样:

xmlns:f="http://typo3.org/ns/TYPO3/Fluid/ViewHelpers"
f:schemaLocation="https://fluidtypo3.org/schemas/fluid-master.xsd"

xmlns:flux="http://typo3.org/ns/FluidTYPO3/Flux/ViewHelpers"
flux:schemaLocation="https://fluidtypo3.org/schemas/flux-master.xsd"

xmlns:v="http://typo3.org/ns/FluidTYPO3/Vhs/ViewHelpers"
v:schemaLocation="https://fluidtypo3.org/schemas/vhs-master.xsd"

xmlns:website="http://typo3.org/ns/Domain/Website/ViewHelpers"

data-namespace-typo3-fluid="true">

...

<f:section name="Main">

    {title -> website:string.idFromTitle(string: '{title}') -> v:variable.set(name: 'targetId')}

    <div class="alternative-content-lightbox-fce">
        <div class="header">
            <a href="#" class="lightbox-trigger" data-target="{targetId}">{linkTitle}</a>
            <h1>{title}</h1>
        </div>
        <div class="main-content">
            <f:format.html>{mainContent}</f:format.html> 
        </div>
        <div id="{targetId}" class="alternative-content">
            <f:format.html>{alternativeContent}</f:format.html> 
        </div>
    </div>

</f:section>

[不幸的是,它在我的机器上不起作用,但是在其他地方也可以。我对放置在“ Classes / ViewHelpers”中的任何其他ViewHelper都存在相同的问题,就像是否忽略了“ Classes”目录中的内容一样。

我检查了我的Typo3配置,我的php.ini文件和我的环境变量。我清除了Typo3Composer的缓存一千次。我完全重新安装了Typo3。最初,我使用的是Typo3 8.7.27,所以我将安装更新为8.7.28,但它没有任何改变。为了防止万一,我什至用另一个数据库交换了数据库。

我的环境是使用Wamp 3.1.9 64bitPHP 7.0.33Windows 10环境。

我注意到的另一件事是以下内容:运行composer update时,涉及到我的软件包时,出现以下错误:

[RuntimeException]
Package domain/website cannot install to "C:\wamp64\www\mysite\sources\website" inside its source at "C:\wamp64\www\mysite\sources\website"

我不知道是否相关,但是可以提供提示。我想到了权限问题,但一切似乎都很好。

我们对其他项目使用相同的设置,并且效果很好,所以我并没有真正错过我想要的东西。在“ Classes”目录中的内容旁边,一切正常。

我发现的另一件事,正如下面的[[Claus Due所建议的那样,是我收到一条错误消息,指出如果我尝试执行以下操作找不到该类:

use Domain\Website\ViewHelpers\String; $foo = new IdFromTitleViewHelper(); print_r($foo);
但是,如果我执行以下操作(例如),则可以使用:

include __DIR__ .'/../../../Classes/ViewHelpers/String/IdFromTitleViewHelper.php'; $foo = new Domain\Website\ViewHelpers\String\IdFromTitleViewHelper(); print_r($foo);

有人对此问题有任何线索吗?任何帮助将不胜感激。

非常感谢。

最诚挚的问候,

php composer-php typo3 typo3-8.x view-helpers
1个回答
0
投票
区分大小写的文件系统可能会出现问题-因为它可以在其他计算机上工作,但不能在您自己的计算机上工作。如果列出了该类,并且文件名正确,并且可以加载文件,则ViewHelper当然应该解析。

没有特殊的处理过程来加载类,在构建模式下,TYPO3完全依赖于作曲家类的加载。但是,预期的类名称是根据您提供的“ uri”(ns标识符,不是实际的uri)生成的。

如果您明确指定了类名,则可以通过检查该类是否可以在其他地方加载来确认。如果失败,则原因很明确:某种程度上,您的类文件未加载或其中的类具有错误的名称空间或类名称。

© www.soinside.com 2019 - 2024. All rights reserved.