【问题标题】:TYPO3 9.2.1 Create ViewHelper in Composer ModeTYPO3 9.2.1 在 Composer 模式下创建 ViewHelper
【发布时间】:2018-12-14 22:08:55
【问题描述】:

我正在尝试使用以作曲家模式安装的 TYPO3 和使用 sitepackagebuilder 生成的站点包创建 ViewHelper。

应该正确配置自动加载,但我得到的唯一信息是一条错误消息,即无法找到 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.

复制步骤

  1. 在作曲家模式下安装 TYPO3(最新版本 9.2.1)
  2. 使用https://sitepackagebuilder.com 创建一个站点包 - 简单配置,'foo' 作为公司名称,'bar' 作为扩展键(见下面的屏幕截图)
  3. Classes/ViewHelpers/下创建一个简单的类SomeViewHelper
  4. 修改Page/Default 下的模板以包含SomeViewHelper(仿照docs.typo3.org 中的示例)

    {namespace foobar=Foo\Bar\ViewHelpers} <foobar:some />

  5. 在 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';
    }
}

页面/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',
];

【问题讨论】:

  • 我会删除屏幕截图。您在 composer.json 等中拥有所有必要的信息。

标签: typo3 fluid extbase view-helpers typo3-9.x


【解决方案1】:

类被自动加载器识别。如果您创建一个新类,您必须通过删除自动加载信息来刷新自动加载信息。
可以使用安装工具删除此信息,也可以手动删除typo3conf/autoload 文件夹中的所有文件。
TYPO3 的自动加载信息将被创建新的。

编辑:
根据版本的不同,自动加载目录可能位于typo3temp 中,这里似乎就是这种情况。很抱歉造成混乱。

在文件顶部的模板或布局文件中包含 viewHelper 可能是可取的,甚至可能是必需的。这至少是我在打开的所有流体模板中看到的。 我还没有看到模板中包含 viewhelper。

【讨论】:

  • typo3conf 下没有自动加载文件夹。
  • 我还尝试运行composer dumpautoload,它也执行了typo3cms install:fixfolderstructuretypo3cms install:generatepackagestates,但结果仍然相同。
  • 文件在typo3temp/autoload/
  • 您确定文件中的命名空间正确吗?
  • 如果未重新创建自动加载文件,则可能还有另一个问题。可能是 viewHelper 类中的 php 错误。
【解决方案2】:

假设您从 Benjamin Kott 提供的 sitepackagegenerator 开始并在 composer 模式下安装了 Typo3,会发生以下情况:


站点包的 TypoScript 部分是通过 Typo3 后端配置的,因此 TypoScript 和模板的加载独立于 php 自动加载。

composer.jsonext_emconf.phppublic/typo3conf/ext/&lt;extension&gt; 下指定的自动加载配置被 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 也无法显示有关您的扩展的任何信息:

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/"
  }
}

之后,问题中发布的示例应按预期工作,&lt;foobar:some /&gt; 的结果应为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>

【讨论】:

    【解决方案3】:

    如问题所述,您的网站已安装 Composer。

    基本上有 2 种方法可以通过 Composer 使扩展可用(还有更多,但我们在此进行了简化):

    1. 使用 Composer 从远程源(例如 Packagist)安装它,例如喜欢composer require myvendor/myextension?这样自动加载应该可以工作。您也可以随时使用composer dump-autoload
    2. 不需要扩展,直接配置自动加载。

    我假设您希望将后者用于您的站点包。您不希望通过 Composer 从诸如 Packagist 之类的来源在您的开发机器上安装您的站点包,因为您目前正在开发它。

    为了使自动加载生效,您可以将以下内容添加到您的 composer.json 文件中(替换 myvendor、myextension):

    "autoload": {
        "psr-4": {
            "Myvendor\\Myextension\\": "typo3/sysext/myextension/Classes/",
            ...
        }
    } 
    

    不要对你所有的扩展都这样做,只是那些你不想通过 Composer 安装的扩展!

    添加自动加载配置后,您应该运行

    composer dumpautoload
    

    【讨论】:

      【解决方案4】:

      我的回答涉及 TYPO3 9.5.+(作曲家模式):无法识别未通过作曲家安装的扩展(如站点包)。因此,应该创建一个本地 repo 并将其添加到 composer-json。这是我所做的:

      1. 在根目录中我创建了一个文件夹“packages”

      2. 我将我的站点包扩展移动到该文件夹​​(“packages/my-sitepackage”)

      3. 在 root-composer.json(设置 TYPO3 的那个)中,我向现有的存储库添加了一个“路径”存储库:

        “存储库”:[ { “类型”:“作曲家”, “网址”:“https://composer.typo3.org/” }, { “类型”:“vcs”, "url": "[一些到 github 或 bitbucket 的路径]" }, { “类型”:“路径”, "url": "包/我的站点包", “选项”: { “符号链接”:真 } } ], [...]

      (除了“packages/my-sitepackage”,还应该可以使用“packages/*”;符号链接也可以设置为 false。)

      1. 最终,扩展是这样的:

        “要求”:{ “我的站点包”:“@dev” }

      作曲家文档列出了使用“*”的示例,但在我的情况下,我必须使用“@dev”才能使其工作。

      一些对我有帮助的链接:

      希望对那些稍晚参加比赛并提出问题的人有所帮助。 :-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-19
        • 1970-01-01
        • 2017-01-26
        • 1970-01-01
        • 2012-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多