【问题标题】:TYPO3 8.7.13 - getArguments() return no responseTYPO3 8.7.13 - getArguments() 返回无响应
【发布时间】:2023-03-12 15:02:02
【问题描述】:

\Templates\Snippets\Search.html

<f:form id="snippetSearchForm"
        action="search"
        controller="Snippets"
        extensionName="snippet_highlight_syntax"
        pluginName="feshs"
        name="searchSnippets"
        method="POST"
        pageType="5513">
    <f:form.textfield class="form-control" property="searchWords"/>
    <f:form.submit id="searchBtn" value="Search"/>
</f:form>

SnippetsController.php

public function searchAction()
    {
        $arguments = $this->request->getArguments();
        \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($arguments);
    }

ajax.js

$("#snippetSearchForm").submit(function (event) {
    event.preventDefault();
    var form = $(this);
    var action = form.attr("action"),
        method = form.attr("method"),
        data = form.serialize();

    $.ajax({
        url: action,
        type: method,
        data: data,
        cache: false
    }).done(function (data) {
        console.log(data);
    }).fail(function () {
        ( "div.tx-feshs" ).replaceWith("errorMessage");
    }).always(function () {

    });
});

请求网址

index.php?id=148&type=5513&tx_snippet_highlight_syntax_feshs[action]=search&tx_snippet_highlight_syntax_feshs[controller]=Snippets&cHash=4662b6b5a3fa0dc4e590e8d5c90fa

我无法用getArguments() 解决这个问题。响应和 console.log 是(空的)。好像我错过了一些东西,但我无法确定在哪里:/

【问题讨论】:

    标签: typo3 typo3-8.x


    【解决方案1】:

    您的代码中有一些常见错误,其中大部分已在此处提及,但请允许我总结一下。

    扩展键/名称

    首先,很多人将扩展名扩展键混淆了。您的扩展的目录名称是您的扩展键,在本例中为snippet_highlight_syntax扩展密钥在 TYPO3 中被用作扩展的唯一标识符。对于 Extbase,确实出现了一个名为 extension name 的新约定,以满足 PSR2 coding convention 的要求,并且主要用于 Extbase 上下文。 扩展名是您的扩展键的大写驼峰式版本。

    ExtbaseFluidBook: CodingGuidelines - 这是一个旧的出价但仍然有效

    UpperCamelCase 中的扩展名。例如,如果 extension-key 是 blog_example,那么这部分类名就是 BlogExample。

    分机键:snippet_highlight_syntax
    扩展名:SnippetHighlightSyntax

    注意 TYPO3/Extbase 框架要求什么,键或名称 - 这会对您有很大帮助。


    插件名称

    您还声明了一个名为feshs 的插件。根据 \TYPO3\CMS\Extbase\Utility\ExtensionUtility::(configure|register)Plugin() 两种方法的 DocBlock 文档,与扩展名一样,它应该采用大写驼峰式格式,如 Feshs。它没有很好的记录,我认为它对您的应用程序没有任何负面影响,但现在您知道并且可以通过更正它来证明您的应用程序的未来。

    /**
     * ...
     *
     * @param string $extensionName The extension name (in UpperCamelCase) or the extension key (in lower_underscore)
     * @param string $pluginName must be a unique id for your plugin in UpperCamelCase (the string length of the extension key added to the length of the plugin name should be less than 32!)
     * @param array $controllerActions is an array of allowed combinations of controller and action stored in an array (controller name as key and a comma separated list of action names as value, the first controller and its first action is chosen as default)
     * @param array $nonCacheableControllerActions is an optional array of controller name and  action names which should not be cached (array as defined in $controllerActions)
     * @param string $pluginType either \TYPO3\CMS\Extbase\Utility\ExtensionUtility::PLUGIN_TYPE_PLUGIN (default) or \TYPO3\CMS\Extbase\Utility\ExtensionUtility::PLUGIN_TYPE_CONTENT_ELEMENT
     * @throws \InvalidArgumentException
     */
    public static function configurePlugin($extensionName, $pluginName, array $controllerActions, array $nonCacheableControllerActions = [], $pluginType = self::PLUGIN_TYPE_PLUGIN)
    

    插件签名

    与您的扩展名一起,它将形成一个名为snippethighlightsyntax_feshs 的插件签名。此签名是存储在tt_content 数据库表中的值,为list_typectype,具体取决于插件配置。

    插件签名在 TypoScript 和 GET/POST 参数中进一步使用,前缀为 tx_。在你的情况下tx_snippethighlightsyntax_feshs


    流体和 Extbase 表格

    在您的表单 sn-p 中,您声明了一个带有 property 标记的元素 &lt;f:form:textfield /&gt;property 标签仅与 &lt;f:form /&gt; 元素上的 objectobjectName 标签一起使用,用于将值绑定到此对象的属性(自动填充、验证结果等)。

    \TYPO3\CMS\Fluid\ViewHelpers\Form\AbstractFormFieldViewHelper::initializeArguments

    对象属性的名称。如果与&lt;f:form object="..."> 结合使用,“name”和“value”属性将被忽略。

    在您的情况下,您应该正确地使用 name 而不是 property

    您更新后的表单应如下所示:

    <f:form id="snippetSearchForm"
            action="search"
            controller="Snippets"
            extensionName="SnippetHighlightSyntax"
            pluginName="Feshs"
            method="POST"
            pageType="5513">
        <f:form.textfield class="form-control" name="searchWords"/>
        <f:form.submit id="searchBtn" value="Search"/>
    </f:form>
    

    控制器参数

    您应该将您的参数声明为控制器参数。

    /**
     * @param string $searchWords
     */
    public function searchAction(string $searchWords = null)
    {
        if (is_string($searchWords)) {
            // TODO: Do something here...
        }
    }
    

    注意我是如何给参数一个默认值的。这应该会抑制您收到的错误 Required argument "searchWords" is not set for...


    这是一篇很长的文章。希望它对您或其他人有所帮助。

    快乐编码

    【讨论】:

    • 非常感谢您的总结。它将帮助我在下周的考试中解释我的程序:D
    【解决方案2】:

    $this-&gt;request-&gt;getArguments() 只会返回以扩展/插件标识符为前缀的字段值参数,例如 tx_anything_pi1[anything] 请检查字段的“名称”标签是否正确。也许这些标签是错误的,因为您在文本字段中引用了对象的“属性”,但没有对象绑定到您的 f:form 标签。

    由于响应至少应返回空调试的 HTML,因此您的操作可能有问题。可以在浏览器中调用吗?

    【讨论】:

    • 这就是我正在寻找的地方,我将搜索object标签并验证name
    • 该操作有效,我已发送$this-&gt;view-&gt;assign('test', 'searchAction test'); 并正确显示。
    【解决方案3】:

    首先在&lt;f:form.textfield&gt;标签中使用name属性而不是property

    然后你需要注册参数如下

    公共函数 searchAction(string $searchWords)

    此外,PHP 文档块必须包含@param string $searchWords 形式的参数。清除安装工具中的所有缓存后,您应该得到您的参数。

    【讨论】:

    • property 更改为 name 给了我 tx_snippethighlightsyntax_feshs[searchWords]: my_search_input 但如果我尝试在我的控制器中注册 $searchWordsRequired argument \"searchWords\" is not set for SnippetHighlightSyntax\\SnippetHighlightSyntax\\Controller\\SnippetsController-&gt;search
    【解决方案4】:

    假设您的扩展键(=文件夹名称)是“sn-p_highlight_syntax”,URL 的参数通常是这样的:

    tx_snippethighlightsyntax_feshs
    

    这意味着扩展键的所有下划线都被删除。
    也许可以让它变得不同,但这不是标准的。
    因此$this-&gt;request-&gt;getArguments() 永远不会返回任何东西。
    您必须像这样调整 url 中的参数:

    index.php?id=148&type=5513&tx_snippethighlightsyntax_feshs[action]=search&tx_snippethighlightsyntax_feshs[controller]=Snippets&cHash=4662b6b5a3fa0dc4e590e8d5c90fa
    

    在 TypoScript-Object-Browser 中,您应该会找到具有该名称的插件:

    plugin.tx_snippethighlightsyntax_feshs
    

    【讨论】:

    • 扩展的文件夹名称是“sn-p_highlight_syntax”所以我写了extensionName="snippet_highlight_syntax"。尝试更改它而不使用下划线给出相同的结果。
    • 这不是关于那个,而是关于你的 URL 中的参数。只需在 HTML 代码中的输入字段中查看生成的“名称”属性,它们是如何标注的。 [编辑:] 看到你有一个文本字段,所以看看那里
    • extensionName 被重命名为 snippethighlightsyntax 以便名称属性为 name="tx_snippethighlightsyntax_feshs[__referrer] 似乎是这样?
    • 应该可以,可以在TypoScript-Object-Browser中控制。
    【解决方案5】:

    经过多次尝试,我已将扩展程序发送到另一台计算机上进行测试,它可以正常工作。

    我已清除所有缓存、禁用/启用等等。看来我的环境有问题。

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 2013-11-22
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      相关资源
      最近更新 更多