TYPO3 9.2.1 Создание ViewHelper в режиме Composer - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь создать ViewHelper с 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.

Шаги для воспроизведения

  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 (Шаблон> Включает)

Автозагрузка кода должна обрабатываться файлами composer.json / ext_emconf.php, сгенерированными sitepackagebuilder.

Скриншот

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

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

При условии, что вы начали с генератора пакетов сайта, предоставленного Бенджамином Коттом, и установили Typo3 в режиме композитора, происходит следующее:


Часть TypoScript в пакете сайта настраивается через бэкэнд Typo3, поэтому загрузка TypoScript, а также шаблонов не зависит от автозагрузки php.

Конфигурация автозагрузки, указанная в public/typo3conf/ext/<extension> в composer.json и ext_emconf.php, игнорируется 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   

Так что, хотя это сбивает с толку, все, что вам нужно сделать, это включить отдельные расширения, такие как 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>
0 голосов
/ 06 июля 2018

Классы распознаются автозагрузчиком. Если вы создаете новый класс, вы должны обновить информацию автозагрузки, удалив информацию автозагрузки.
Эту информацию можно удалить с помощью installtool или вручную, удалив все файлы в папке typo3conf / autoload.
Информация автозагрузки для TYPO3 будет создана тогда.

Edit:
В зависимости от версии каталог autoload может находиться в typo3temp, что, похоже, имеет место в данном случае. Извините за путаницу.

Вероятно, желательно и, возможно, даже необходимо включить viewHelper в файл шаблона или макета в верхней части файла. Это по крайней мере то, что я видел во всех шаблонах жидкости, которые я открыл. Я еще никогда не видел, чтобы в шаблон включался видовой помощник.

...