javascript - TYPO3:如何在自己的后端模块中使用元素浏览器?

标签 javascript module typo3 backend

我想在自己的 TYPO3 8.7 后端模块中有一个简单的输入字段,在元素浏览器中单击页面后应该填充 pageid。

我过去尝试过很多次,但主要问题是当单击带有错误 - 对主窗口的引用未正确设置的页面时,元素浏览器中会出现错误警报!

我的 module.js 文件现在看起来像:

var setFormValueOpenBrowser;

define(['jquery', 'TYPO3/CMS/Lux/Vendor/Chart.min'], function($) {

	// define(['jquery', 'TYPO3/CMS/Lux/Vendor/Chart.min', 'TYPO3/CMS/Backend/FormEngine'], function($) {

	// main options
	// var FormEngine = {
	// 	formName: TYPO3.settings.FormEngine.formName
	// 	,backPath: TYPO3.settings.FormEngine.backPath
	// 	,openedPopupWindow: null
	// 	,legacyFieldChangedCb: function() { !$.isFunction(TYPO3.settings.FormEngine.legacyFieldChangedCb) || TYPO3.settings.FormEngine.legacyFieldChangedCb(); }
	// };

	var url = '/typo3/index.php?route=%2Fwizard%2Frecord%2Fbrowse&token=53b5d23e8e661e465636a96ca618426cb293d0b5&mode=db&bparams=data[pages][2][content_from_pid]|||pages|';
	var popup = window.open(url, 'Typo3WinBrowser', 'height=600,width=800,status=0,menubar=0,resizable=1,scrollbars=1');
	popup.focus();

});

当然,此示例中的 token 是硬编码的 - 但这不是问题。 顺便说一句:如果我尝试通过 require.js 加载 FormEngine,控制台会抛出 TypeError: TYPO3.settings.FormEngine is undefined

有人有在自己的后端模块中使用元素浏览器(文件或页面)的工作代码吗?或者是否有一个现有的扩展可以让我深入研究代码?

最佳答案

虽然这个问题有点过时,但我是这样做的:

这是在我的扩展程序的 Controller 中

$options = [
        'renderType' => 'inputLink',
        'tableName' => 'myTable',
        'fieldName' => 'url',
        'databaseRow' => [
            'uid' => $myModel->getUid(),
            'pid' => 0
        ],
        'parameterArray' => [
            'fieldConf' => [
                'label' => 'URL',
                'config' => [
                    'eval' => 'trim',
                    'size' => 1024,
                ],
            ],
            'itemFormElValue' => $myModel->getUrl(),
            'itemFormElName' => 'data[myTable][editform][url]',
            'itemFormElID' => 'data[mytable][editform][url]',
            'field' => 'url',
            'fieldChangeFunc' => [
                'TBE_EDITOR_fieldChanged' => "TBE_EDITOR.fieldChanged('mytable','editform','url','data[mytable][editform][url]');"
                ],

        ]
    ];

        $nodeFactory = new NodeFactory();
        $linkField = new InputLinkElement($nodeFactory, $options);
        $urlField = $linkField->render();

        $this->view->assign('renderedUrlField', $urlField['html']);

其中,“mytable”是 Controller 使用的表,“editform”是表单名称,“url”是用于存储值的数据库字段。

出于某种原因,您需要将表单命名为“editform”,因为 sysext-JS 引用了该表单。

您需要将其添加到 Controller 中才能使其正常工作:

use TYPO3\CMS\Backend\Form\Element\InputLinkElement;
use TYPO3\CMS\Backend\Form\NodeFactory;

在流体模板中,您必须使用:

<f:format.raw>{renderedUrlField}</f:format.raw>

因为它返回 html 代码。

关于javascript错误:那是因为FormEngine没有初始化。

将此添加到 Default.html 的 <f:be.container...> 部分中:

includeJsFiles="{
        1:'/typo3/sysext/backend/Resources/Public/JavaScript/jsfunc.tbe_editor.js',
3:'/typo3/sysext/backend/Resources/Public/JavaScript/jsfunc.inline.js',
        4:'/typo3/sysext/backend/Resources/Public/JavaScript/backend.js'
    }"

            includeRequireJsModules="{
        0:'{f:uri.resource(path:\'JavaScript/ckeditor/ckeditor.js\')}',
        4:'TYPO3/CMS/Backend/FormEngine',
        5:'TYPO3/CMS/Backend/FormEngineValidation',
        7:'TYPO3/CMS/Backend/ContextMenu',
        8:'TYPO3/CMS/Backend/FormEngineReview',
        9:'{f:uri.resource(path:\'JavaScript/main.js\')}'
      }"

我在这里也包含了 ckeditor。

现在,您需要初始化 FormEngine。我在 main.js 中这样做了:

TYPO3.settings.FormEngine = {"formName":"editform"};

define(['jquery', 'TYPO3/CMS/Backend/FormEngine'], function($){
    'use strict';

    $(function(){
        TYPO3.FormEngine.initialize();
    });
});

第一行很重要,否则JS会抛出上述错误。

希望这对某人有帮助。

关于javascript - TYPO3:如何在自己的后端模块中使用元素浏览器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48962886/

相关文章:

javascript - 在 while 循环内更新了一个 div

python - python支持哪些模块来生成c代码?

Python:在一个项目中使用支持不同 Python 版本的模块

typo3 - 在Typo3中,设置,常量和TSConfig之间有什么区别

mysql - 使用 SSL 将 TYPO3 连接到 MySQL

javascript - 为什么这是 javascript 的输出?

php - JavaScript 不工作的句子

TYPO3 后端用户对列的权限

javascript - 单击按钮之前控件激活

perl - 在 Perl 中为模块提供备用名称