我在控制器级别使用 TYPO3 8 的新页面渲染器通过 initializeAction 添加扩展特定的 css 和 js 文件:
public function initializeAction()
{
$extPath = ExtensionManagementUtility::siteRelPath(
$this->request->getControllerExtensionKey()
);
$extJs = $extPath . 'Resources/Public/Js/ext_booking_manager.min.js';
$extCss = $extPath . 'Resources/Public/Css/ext_booking_manager.css';
/** @var PageRenderer $pageRenderer */
$pageRenderer = $this->objectManager->get(PageRenderer::class);
$pageRenderer->addCssFile($extCss);
$pageRenderer->addJsFooterFile(
$extJs, 'text/javascript', false
);
}
Run Code Online (Sandbox Code Playgroud)
这有时工作正常,但只是有时。这意味着有时 css 文件和 js 文件会被正确添加,有时如果我重新加载页面,则文件将无法正确添加。有什么不对?
对于像 TYPO3 7 这样的旧版本,我使用了类似的东西:
public function initializeAction()
{
$extPath = ExtensionManagementUtility::siteRelPath(
$this->request->getControllerExtensionKey()
);
$extJs = $extPath . 'Resources/Public/Js/ext_booking_manager.min.js';
$GLOBALS['TSFE']->getPageRenderer()->addJsFooterFile(
$extJs, 'text/javascript', false
);
parent::initializeAction();
}
Run Code Online (Sandbox Code Playgroud)
但这将不再适用于 TYPO3 8。有什么建议?
我创建了一个小扩展,它使用日期时间来查看一些特定事件(事件日期和事件时间),但如果我尝试从数据库获取正确的日期时间到前端,我总是会遇到麻烦。
我可以通过 TYPO3 后端设置每个事件的日期时间:
但是如果我尝试在前端获取这个值,例如:
<f:format.date format="d.m.Y - H:i:s">{event.appointment}</f:format.date>
Run Code Online (Sandbox Code Playgroud)
那么输出不是“10.04.2016 - 08:00:00”,而是“10.04.2016 - 10:00:00”。
我怎样才能避免这种行为?我也通过安装工具设置了时区:
[SYS][phpTimeZone] = Europe/Berlin
Run Code Online (Sandbox Code Playgroud)
但我总是得到错误的日期时间。如果我尝试这样的事情:
DebugUtility::debug(new \DateTime());
Run Code Online (Sandbox Code Playgroud)
然后我得到正确的输出:
{"date":"2016-04-09 20:23:38.000000","timezone_type":3,"timezone":"Europe\/Berlin"}
Run Code Online (Sandbox Code Playgroud)
如果我查看数据库,我可以看到存储了正确的日期时间:
所以我不知道为什么我得到了错误的日期时间,有什么建议吗?
我想在安装扩展时创建对象.例如,我有以下两个简单的域模型:
class Product extends AbstractEntity
{
protected $name = '';
protected $sku = '';
...
}
class Location extends AbstractEntity
{
protected $name = '';
protected $city = '';
...
}
Run Code Online (Sandbox Code Playgroud)
和第三个域模型,如:
class Mapper extends AbstractEntity
{
protected $domainModelName = '';
protected $domainModelProperty = '';
}
Run Code Online (Sandbox Code Playgroud)
现在我想要添加这样的条目:
domain_model_name | domain_model_property
Product | name
Product | sku
Location | city
....
Run Code Online (Sandbox Code Playgroud)
在扩展安装期间或直接安装之后,这样tx_foxexample_domain_model_mapper表将自动填充,这可能吗?
我知道我可以使用initializeAction,但是只有在我添加插件并访问页面等时才会生成条目,但我希望在使用插件或添加一些对象之前条目/对象已经存在.
我想通过 PSR-14 事件监听器注册替换旧的信号注册。所以我从 ext_localconf.php 中删除了以下内容:
ext_localconf.php
...
$signalSlotDispatcher = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\SignalSlot\Dispatcher::class);
$signalSlotDispatcher->connect(
\TYPO3\CMS\Extensionmanager\Utility\InstallUtility::class,
'afterExtensionInstall',
\My\Example\Slots\InstallUtility::class,
'afterExtensionInstall'
);
...
Run Code Online (Sandbox Code Playgroud)
此外,我还创建了以下文件:
配置/服务.yaml
services:
My\Example\Slots\InstallUtility:
tags:
- name: event.listener
identifier: 'afterExtensionInstall'
event: TYPO3\CMS\Core\Package\Event\AfterPackageActivationEvent
Run Code Online (Sandbox Code Playgroud)
之后,我向 My\Example\Slots\InstallUtility 添加了一个调用函数:
namespace My\Example\Slots;
use TYPO3\CMS\Core\Package\Event\AfterPackageActivationEvent;
class InstallUtility
{
/**
* @param AfterPackageActivationEvent $event
*/
public function __invoke(AfterPackageActivationEvent $event): void
{
\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump('event got triggered'); die();
}
...
}
Run Code Online (Sandbox Code Playgroud)
但这是行不通的。如果通过扩展管理器停用我的扩展然后再次重新激活它,则不会发生任何情况。
我在这里错过了什么吗?