В настоящее время я сталкиваюсь со странным поведением с 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
в девятый раз и ... проблема решена!