TYPO3: ViewHelper не может быть найден - PullRequest
1 голос
/ 23 октября 2019

В настоящее время я сталкиваюсь со странным поведением с 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 Mode " с "Файл composer.json"в корне установки и файл" composer.json"для определенного расширения. В основном файле " composer.json " у меня есть следующие строки:

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

Итак, расширение установлено как локальный пакет.

The "*Файл 1025 * 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>

К сожалению, это не работает на моей машине, но работает в другом месте. И у меня та же проблема с любым другим ViewHelper , помещенным в " Classes / ViewHelpers ", например, если игнорируется то, что находится в каталоге " Classes ".

Я проверил свою конфигурацию TYPO3 , мой файл php.ini и переменные окружения. Я очистил кэш TYPO3 и Composer тысячу раз. Я переустановил TYPO3 полностью. Сначала я использовал TYPO3 8.7.27 , поэтому я обновил установку до 8.7.28 , но это ничего не изменило. Я даже на всякий случай поменял базу данных на другую.

Моя среда - это среда Windows 10 , использующая Wamp 3.1.9 64bit и PHP 7.0.33 .

Еще одна вещь, которую я заметил, заключается в следующем: когда я запускаю 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);

Я также заметил, что мое расширение полностью отсутствует в файлах " autoload_classmap.php ", " autoload_psr4.php " и " autoload_static.php " в корнеустановки (". / vendor / composer "). Даже если я композитор dump-autoload -o, он не появляется. На него также нет ссылок в файле " instal.json " и в файле " composer.lock ".

У кого-нибудь есть подсказки по поводу этой проблемы? Любая помощь будет высоко ценится.

Большое спасибо заранее.

С наилучшими пожеланиями,

РЕШЕНИЕ

Только потому, что я был в отчаянии, я попытался повторить

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

в девятый раз и ... проблема решена!

1 Ответ

0 голосов
/ 23 октября 2019

Это может быть проблема с чувствительными к регистру файловыми системами - так как она работает на других компьютерах, но не на ваших собственных. Если класс указан в списке, имя файла правильное, и файл может быть загружен - тогда ViewHelper, конечно, должен разрешить.

Никакой специальной обработки для загрузки класса не происходит, TYPO3 полностью полагается назагрузка класса композитора в режиме компоновки. Однако ожидаемое имя класса генерируется на основе предоставленного вами «uri» (идентификатор ns, а не настоящий uri).

Возможно, вы сможете подтвердить это, проверив, можно ли загрузить класс в другом месте, если указатьимя класса явно. Если это не удается, причина ясна: каким-то образом ваш файл класса не загружается или класс внутри имеет неправильное пространство имен или имя класса.

...