簡體   English   中英

TYPO3:找不到 ViewHelper

[英]TYPO3: ViewHelper cannot be found

我目前正面臨TYPO3 8.7的奇怪行為。 更准確地說,我所做的不能在我的機器上運行,但它可以在其他機器和我們的 QA 環境中運行。

我正在構建一個需要簡單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">

我在“作曲家模式”中使用 TYPO3,在安裝的根目錄下有一個“ composer.json ”文件和一個用於特定擴展名的“ composer.json ”文件。 在主要的“ composer.json ”文件中,我有以下幾行:

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

因此,擴展名設置為本地 package。

我的擴展的“ 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'),
);

所以,我猜我的文件是自動加載的。 ViewHelper可以在目錄“ Classes/ViewHelpers/String ”中找到,它看起來像這樣:

<?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時,當涉及到我的 package 時,我收到以下錯誤:

[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 ) 在下面所建議的那樣,如果我嘗試執行以下操作,則會收到一條錯誤消息,指出找不到 class:

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);

I also noticed that my extension is completely missing in the files " autoload_classmap.php ", " autoload_psr4.php " and " autoload_static.php " at the root of the installation (" ./vendor/composer "). 即使我 composer dump-autoload -o ,它也不會出現。 installed.json ”文件和“ composer.lock ”文件中也沒有引用它。

有人知道這個問題嗎? 任何幫助將非常感激。

提前謝謝了。

此致,

解決方案

只是因為絕望,我試圖重做

rm -rf vendor
rm -rf htdocs\typo3conf\ext
composer clearcache
composer install

第n次......問題解決了!

這可能是區分大小寫的文件系統的問題 - 因為它可以在其他機器上運行,但不能在您自己的機器上運行。 如果列出了 class,並且文件名正確,並且可以加載文件 - 那么 ViewHelper 當然應該解決。

為了加載 class,TYPO3 在撰寫模式下完全依賴作曲家 class 加載,無需進行特殊處理。 但是,預期的 class 名稱是根據您提供的“uri”(ns 標識符,不是真正的 uri)生成的。

如果您明確指定 class 名稱,您也許可以通過檢查 class 是否可以在其他地方加載來確認這一點。 如果失敗,原因很清楚:不知何故,您的 class 文件未加載,或者 class 中的命名空間或 class 名稱錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM