TYPO3 9.2.1 在 Composer 模式下创建 ViewHelper
TYPO3 9.2.1 Create ViewHelper in Composer Mode
我正在尝试创建一个 ViewHelper,其中包含以 composer 模式安装的 TYPO3 和使用 sitepackagebuilder.
生成的站点包
自动加载应该正确配置,但是我唯一得到的是一条错误消息,找不到 ViewHelper:
#1407060572: Fluid parse error in template Standard_action_Default_9cc8c1fca58b49310db5d43052e614cefdb1c728, line 5 at character 6. Error: The ViewHelper "<foobar:some>" could not be resolved. Based on your spelling, the system would load the class "Foo\Bar\ViewHelpers\SomeViewHelper", however this class does not exist. (error code 1407060572). Template source chunk: <foobar:some /> (More information)
TYPO3Fluid\Fluid\Core\Parser\Exception thrown in file
/var/www/html/vendor/typo3fluid/fluid/src/Core/Parser/TemplateParser.php in line 157.
重现步骤
- 在 composer 模式下安装 TYPO3(最新版本 9.2.1)
- 使用 https://sitepackagebuilder.com 创建站点包 - 简单配置,'foo' 作为公司名称,'bar' 作为扩展密钥(见下面的屏幕截图)
- 在
Classes/ViewHelpers/
下创建一个简单的 class SomeViewHelper
修改 Page/Default
下的模板以包含 SomeViewHelper
(仿照 docs.typo3.org 中的示例)
{namespace foobar=Foo\Bar\ViewHelpers}
<foobar:some />
在 TYPO3 中创建一个内容简单的新根页面并包含 bar
扩展名(模板 > 包含)
代码的自动加载应该由 sitepackagebuilder 生成的 composer.json
/ext_emconf.php
文件处理。
截图
代码
SomeViewHelper.php
<?php
namespace Foo\Bar\ViewHelpers;
use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper;
class SomeViewHelper extends AbstractViewHelper
{
public function render() {
return 'Hello World';
}
}
Page/Default.html
<f:layout name="Default" />
<f:section name="Main">
{namespace foobar=Foo\Bar\ViewHelpers}
<foobar:some />
<f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '0'}" />
</f:section>
在文档顶部声明命名空间也没有帮助
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:foobar="http://typo3.org/ns/Foo/Bar/ViewHelpers">
<f:layout name="Default" />
<f:section name="Main">
<foobar:some />
<f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '0'}" />
</f:section>
</html>
composer.json
{
"name": "foo/bar",
"type": "typo3-cms-extension",
"description": "",
"homepage": "https://www.foo.com",
"license": ["GPL-2.0-or-later"],
"keywords": ["TYPO3 CMS"],
"version": "1.0.0",
"require": {
"typo3/cms-core": "^8.7 || ^9.0",
"typo3/cms-rte-ckeditor": "^8.7 || ^9.0",
"typo3/cms-fluid-styled-content": "^8.7 || ^9.0"
},
"autoload": {
"psr-4": {
"Foo\Bar\": "Classes/"
}
}
}
ext_emconf.php
<?php
/**
* Extension Manager/Repository config file for ext "bar".
*/
$EM_CONF[$_EXTKEY] = [
'title' => 'Bar',
'description' => '',
'category' => 'templates',
'constraints' => [
'depends' => [
'typo3' => '8.7.0-9.5.99',
'fluid_styled_content' => '8.7.0-9.5.99',
'rte_ckeditor' => '8.7.0-9.5.99'
],
'conflicts' => [
],
],
'autoload' => [
'psr-4' => [
'Foo\Bar\' => 'Classes'
],
],
'state' => 'stable',
'uploadfolder' => 0,
'createDirs' => '',
'clearCacheOnLoad' => 1,
'author' => 'John Doe',
'author_email' => 'jd@foo.com',
'author_company' => 'foo',
'version' => '1.0.0',
];
类 被磁带自动加载机识别。如果您创建一个新的 class,您必须通过删除自动加载信息来刷新自动加载信息。
可以使用安装工具或通过删除文件夹 typo3conf/autoload.
中的所有文件手动删除此信息
届时将创建新的 TYPO3 自动加载信息。
编辑:
根据版本的不同,自动加载目录可能位于 typo3temp 中,这里似乎就是这种情况。抱歉造成混淆。
在文件顶部的模板或布局文件中包含 viewHelper 可能是明智的,甚至可能是必需的。这至少是我在打开的所有流体模板中看到的。
我还没有看到模板中包含 viewhelper。
假设您从 Benjamin Kott 提供的站点包生成器开始,并以 composer 模式安装了 Typo3,会发生以下情况:
站点包的 TypoScript 部分是通过 Typo3 后端配置的,因此 TypoScript 和模板的加载独立于 php 自动加载。
在 composer.json
和 ext_emconf.php
中的 public/typo3conf/ext/<extension>
下指定的自动加载配置被 composer
忽略,因为 composer
不 了解这些扩展,但 composer 仍会在扩展列表中显示您的扩展:
The following extensions have been added to the generated PackageStates.php file: core, extbase, fluid, frontend, fluid_styled_content, install, setup, rte_ckeditor, about, adminpanel, backend, belog, beuser, documentation, extensionmanager, felogin, filelist, form, impexp, info, recordlist, redirects, reports, saltedpasswords, scheduler, sys_note, t3editor, tstemplate, viewpage, <extension>
即使自动加载配置正确,作曲家也无法显示有关您的扩展的任何信息:
composer info foo/bar
[InvalidArgumentException]
Package foo/bar not found
因此,虽然这令人困惑,但您所要做的就是 include individual extensions like sitepackages(将以下内容添加到 root composer.json
的末尾 - 您还可以在此处指定的东西如 "require": { "typo3/minimal": "^9.3" }
):
,
"autoload": {
"psr-4": {
"Foo\Bar\": "public/typo3conf/ext/<extension>/Classes/"
}
}
之后,问题中发布的示例应按预期工作,<foobar:some />
的结果应为 Hello World
。
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:foobar="http://typo3.org/ns/Foo/Bar/ViewHelpers">
<f:layout name="Default" />
<f:section name="Main">
<foobar:some />
<f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '0'}" />
</f:section>
</html>
您的网站安装了问题中所述的 Composer。
基本上有两种方法可以通过 Composer 提供扩展(还有更多,但我们在这里简化):
- 从远程源(例如 Packagist)使用 Composer 安装它,例如喜欢
composer require myvendor/myextension
?这样自动加载应该可以工作。您也可以随时执行 composer dump-autoload
。
- 不需要扩展,直接配置自动加载。
我假设您希望将后者用于您的网站包。您不希望通过 Composer 从 Packagist 等源在您的开发计算机上安装您的站点包,因为您当前正在开发它。
要使自动加载正常工作,您可以将以下内容添加到 composer.json 文件(替换 myvendor、myextension):
"autoload": {
"psr-4": {
"Myvendor\Myextension\": "typo3/sysext/myextension/Classes/",
...
}
}
不要对所有扩展都执行此操作,只需对那些您不想通过 Composer 安装的扩展执行此操作!
添加自动加载配置后,您应该运行
composer dumpautoload
见
我的回答涉及 TYPO3 9.5.+(作曲家模式):无法识别未通过作曲家安装的扩展(如站点包)。因此,应该创建一个本地存储库并将其添加到 composer-json。这是我所做的:
在根目录中我创建了一个文件夹“packages”
我将我的站点包扩展移到了那个文件夹中 ("packages/my-sitepackage")
在 root-composer.json(设置 TYPO3 的那个)中,我添加了一个“路径”存储库到我现有的:
“存储库”:[
{
“类型”:“作曲家”,
"url": "https://composer.typo3.org/"
},
{
“类型”:“VC”,
"url": "[github 或 bitbucket 的一些路径]"
},
{
“类型”:“路径”,
"url": "packages/my-sitepackage",
“选项”: {
“符号链接”:真
}
}
],
[...]
(代替“packages/my-sitepackage”,也应该可以使用“packages/*”;符号链接也可以设置为 false。)
最终需要这样的扩展:
“要求”:{
"my-sitepackage": "@dev"
}
作曲家文档列出了使用“*”的示例,但在我的情况下,我必须使用“@dev”才能使其正常工作。
一些对我有帮助的链接:
- https://getcomposer.org/doc/05-repositories.md#path
- https://getcomposer.org/doc/faqs/how-do-i-install-a-package-to-a-custom-path-for-my-framework.md
希望对那些稍晚才来游戏然后提出问题的人有所帮助。 :-)
我正在尝试创建一个 ViewHelper,其中包含以 composer 模式安装的 TYPO3 和使用 sitepackagebuilder.
生成的站点包自动加载应该正确配置,但是我唯一得到的是一条错误消息,找不到 ViewHelper:
#1407060572: Fluid parse error in template Standard_action_Default_9cc8c1fca58b49310db5d43052e614cefdb1c728, line 5 at character 6. Error: The ViewHelper "<foobar:some>" could not be resolved. Based on your spelling, the system would load the class "Foo\Bar\ViewHelpers\SomeViewHelper", however this class does not exist. (error code 1407060572). Template source chunk: <foobar:some /> (More information)
TYPO3Fluid\Fluid\Core\Parser\Exception thrown in file
/var/www/html/vendor/typo3fluid/fluid/src/Core/Parser/TemplateParser.php in line 157.
重现步骤
- 在 composer 模式下安装 TYPO3(最新版本 9.2.1)
- 使用 https://sitepackagebuilder.com 创建站点包 - 简单配置,'foo' 作为公司名称,'bar' 作为扩展密钥(见下面的屏幕截图)
- 在
Classes/ViewHelpers/
下创建一个简单的 class 修改
Page/Default
下的模板以包含SomeViewHelper
(仿照 docs.typo3.org 中的示例){namespace foobar=Foo\Bar\ViewHelpers} <foobar:some />
在 TYPO3 中创建一个内容简单的新根页面并包含
bar
扩展名(模板 > 包含)
SomeViewHelper
代码的自动加载应该由 sitepackagebuilder 生成的 composer.json
/ext_emconf.php
文件处理。
截图
代码
SomeViewHelper.php
<?php
namespace Foo\Bar\ViewHelpers;
use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper;
class SomeViewHelper extends AbstractViewHelper
{
public function render() {
return 'Hello World';
}
}
Page/Default.html
<f:layout name="Default" />
<f:section name="Main">
{namespace foobar=Foo\Bar\ViewHelpers}
<foobar:some />
<f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '0'}" />
</f:section>
在文档顶部声明命名空间也没有帮助
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:foobar="http://typo3.org/ns/Foo/Bar/ViewHelpers">
<f:layout name="Default" />
<f:section name="Main">
<foobar:some />
<f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '0'}" />
</f:section>
</html>
composer.json
{
"name": "foo/bar",
"type": "typo3-cms-extension",
"description": "",
"homepage": "https://www.foo.com",
"license": ["GPL-2.0-or-later"],
"keywords": ["TYPO3 CMS"],
"version": "1.0.0",
"require": {
"typo3/cms-core": "^8.7 || ^9.0",
"typo3/cms-rte-ckeditor": "^8.7 || ^9.0",
"typo3/cms-fluid-styled-content": "^8.7 || ^9.0"
},
"autoload": {
"psr-4": {
"Foo\Bar\": "Classes/"
}
}
}
ext_emconf.php
<?php
/**
* Extension Manager/Repository config file for ext "bar".
*/
$EM_CONF[$_EXTKEY] = [
'title' => 'Bar',
'description' => '',
'category' => 'templates',
'constraints' => [
'depends' => [
'typo3' => '8.7.0-9.5.99',
'fluid_styled_content' => '8.7.0-9.5.99',
'rte_ckeditor' => '8.7.0-9.5.99'
],
'conflicts' => [
],
],
'autoload' => [
'psr-4' => [
'Foo\Bar\' => 'Classes'
],
],
'state' => 'stable',
'uploadfolder' => 0,
'createDirs' => '',
'clearCacheOnLoad' => 1,
'author' => 'John Doe',
'author_email' => 'jd@foo.com',
'author_company' => 'foo',
'version' => '1.0.0',
];
类 被磁带自动加载机识别。如果您创建一个新的 class,您必须通过删除自动加载信息来刷新自动加载信息。
可以使用安装工具或通过删除文件夹 typo3conf/autoload.
中的所有文件手动删除此信息
届时将创建新的 TYPO3 自动加载信息。
编辑:
根据版本的不同,自动加载目录可能位于 typo3temp 中,这里似乎就是这种情况。抱歉造成混淆。
在文件顶部的模板或布局文件中包含 viewHelper 可能是明智的,甚至可能是必需的。这至少是我在打开的所有流体模板中看到的。 我还没有看到模板中包含 viewhelper。
假设您从 Benjamin Kott 提供的站点包生成器开始,并以 composer 模式安装了 Typo3,会发生以下情况:
站点包的 TypoScript 部分是通过 Typo3 后端配置的,因此 TypoScript 和模板的加载独立于 php 自动加载。
在 composer.json
和 ext_emconf.php
中的 public/typo3conf/ext/<extension>
下指定的自动加载配置被 composer
忽略,因为 composer
不 了解这些扩展,但 composer 仍会在扩展列表中显示您的扩展:
The following extensions have been added to the generated PackageStates.php file: core, extbase, fluid, frontend, fluid_styled_content, install, setup, rte_ckeditor, about, adminpanel, backend, belog, beuser, documentation, extensionmanager, felogin, filelist, form, impexp, info, recordlist, redirects, reports, saltedpasswords, scheduler, sys_note, t3editor, tstemplate, viewpage, <extension>
即使自动加载配置正确,作曲家也无法显示有关您的扩展的任何信息:
composer info foo/bar
[InvalidArgumentException]
Package foo/bar not found
因此,虽然这令人困惑,但您所要做的就是 include individual extensions like sitepackages(将以下内容添加到 root composer.json
的末尾 - 您还可以在此处指定的东西如 "require": { "typo3/minimal": "^9.3" }
):
,
"autoload": {
"psr-4": {
"Foo\Bar\": "public/typo3conf/ext/<extension>/Classes/"
}
}
之后,问题中发布的示例应按预期工作,<foobar:some />
的结果应为 Hello World
。
<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
xmlns:foobar="http://typo3.org/ns/Foo/Bar/ViewHelpers">
<f:layout name="Default" />
<f:section name="Main">
<foobar:some />
<f:cObject typoscriptObjectPath="lib.dynamicContent" data="{colPos: '0'}" />
</f:section>
</html>
您的网站安装了问题中所述的 Composer。
基本上有两种方法可以通过 Composer 提供扩展(还有更多,但我们在这里简化):
- 从远程源(例如 Packagist)使用 Composer 安装它,例如喜欢
composer require myvendor/myextension
?这样自动加载应该可以工作。您也可以随时执行composer dump-autoload
。 - 不需要扩展,直接配置自动加载。
我假设您希望将后者用于您的网站包。您不希望通过 Composer 从 Packagist 等源在您的开发计算机上安装您的站点包,因为您当前正在开发它。
要使自动加载正常工作,您可以将以下内容添加到 composer.json 文件(替换 myvendor、myextension):
"autoload": {
"psr-4": {
"Myvendor\Myextension\": "typo3/sysext/myextension/Classes/",
...
}
}
不要对所有扩展都执行此操作,只需对那些您不想通过 Composer 安装的扩展执行此操作!
添加自动加载配置后,您应该运行
composer dumpautoload
见
我的回答涉及 TYPO3 9.5.+(作曲家模式):无法识别未通过作曲家安装的扩展(如站点包)。因此,应该创建一个本地存储库并将其添加到 composer-json。这是我所做的:
在根目录中我创建了一个文件夹“packages”
我将我的站点包扩展移到了那个文件夹中 ("packages/my-sitepackage")
在 root-composer.json(设置 TYPO3 的那个)中,我添加了一个“路径”存储库到我现有的:
“存储库”:[ { “类型”:“作曲家”, "url": "https://composer.typo3.org/" }, { “类型”:“VC”, "url": "[github 或 bitbucket 的一些路径]" }, { “类型”:“路径”, "url": "packages/my-sitepackage", “选项”: { “符号链接”:真 } } ], [...]
(代替“packages/my-sitepackage”,也应该可以使用“packages/*”;符号链接也可以设置为 false。)
最终需要这样的扩展:
“要求”:{ "my-sitepackage": "@dev" }
作曲家文档列出了使用“*”的示例,但在我的情况下,我必须使用“@dev”才能使其正常工作。
一些对我有帮助的链接:
- https://getcomposer.org/doc/05-repositories.md#path
- https://getcomposer.org/doc/faqs/how-do-i-install-a-package-to-a-custom-path-for-my-framework.md
希望对那些稍晚才来游戏然后提出问题的人有所帮助。 :-)