TYPO3 9.2.1在Composer模式下创建ViewHelper

时间:2018-07-06 10:09:38

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

我正在尝试使用在作曲家模式下安装的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. SomeViewHelper下创建一个简单的类Classes/ViewHelpers/
  4. 修改Page/Default下的模板以包含SomeViewHelper(以下为docs.typo3.org中的示例)

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

  5. 在TYPO3中使用简单的内容创建一个新的根页面,并包含bar扩展名(“模板”>“包含”)

代码的自动加载应由sitepackagebuilder生成的composer.json / ext_emconf.php文件处理。

屏幕截图

site package builder configuration

代码

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

4 个答案:

答案 0 :(得分:1)

自动装带器可以识别类。如果创建新类,则必须通过删除自动加载信息来刷新自动加载信息。
可以使用installtool删除此信息,也可以通过删除文件夹typo3conf / autoload中的所有文件来手动删除此信息。
TYPO3的自动加载信息将在随后创建。

修改:
取决于版本,自动加载目录可能位于typo3temp中,在这里似乎是这种情况。抱歉造成混乱。

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

答案 1 :(得分:0)

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


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

public/typo3conf/ext/<extension>会忽略composer.jsonext_emconf.phpcomposer下指定的自动加载配置,因为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的末尾-您还指定了{{ 1}}):

"require": { "typo3/minimal": "^9.3" }

此后,问题中发布的示例应可以正常工作,并且, "autoload": { "psr-4": { "Foo\\Bar\\": "public/typo3conf/ext/<extension>/Classes/" } } 的结果应为<foobar:some />

Hello World

答案 2 :(得分:0)

您的站点已按照问题中的说明安装了Composer。

基本上有两种方法可以通过Composer提供扩展(还有更多方法,我们在这里简化):

  1. 通过Composer从远程来源(例如Packagist)安装了它,例如像composer require myvendor/myextension一样?这样,自动加载应该起作用。您也可以随时执行composer dump-autoload
  2. 不需要扩展名,而是直接配置自动加载。

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

要使自动加载正常工作,可以将以下内容添加到composer.json文件中(替换myvendor,myextension):

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

不要对您所有的扩展都执行此操作,仅对那些您不想通过Composer安装的扩展执行此操作!

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

composer dumpautoload

请参见

答案 3 :(得分:0)

我的答案与TYPO3 9.5。+(composer模式)有关:未识别未通过composer安装的扩展(如站点程序包)。因此,应创建本地存储库并将其添加到composer-json。这是我所做的:

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

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

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

    “存储库”:[ { “ type”:“ composer”, “ url”:“ https://composer.typo3.org/” }, { “ type”:“ vcs”, “ url”:“ [github或bitbucket的某些路径]” }, { “ type”:“路径”, “ url”:“ packages / my-sitepackage”, “选项”:{ “ symlink”:是 } } ], [...]

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

  1. 最终,像这样需要扩展名:

    “要求”:{ “ my-sitepackage”:“ @dev” }

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

一些对我有帮助的链接

希望能帮助那些后来才参加比赛的人,然后提出问题。 :-)