Typo3 extbase json 输出

Typo3 extbase json output

我尝试创建处理 ajax 请求的控制器。

我发现,我必须将其添加到我的 TS 配置中:

ajaxCall = PAGE
ajaxCall {
    typeNum = 999
    config.disableAllHeaderCode = 1
    config.metaCharset = UTF-8
    xhtml_cleaning = 0
    admPanel = 0
    10 = COA
    10 < tt_content.list.20.registration_userregistration
}

我的控制器看起来像这样:

/**
 * JSONController
 */
class JSONController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {

    /**
     * @var string
     */
    protected $defaultViewObjectName = 'TYPO3\CMS\Extbase\Mvc\View\JsonView';

    /**
     * action test
     *
     * @return string
     */
    public function testAction() {
        $this->view->assign('value', "001");
    }
}

这有效,我得到一个空白页,上面有“001”。但是如果我看源代码,有4行空行,“001”在第5行。

-empty-
-empty-
-empty-
-empty-
"001"

我不知道为什么...

我不明白,为什么要使用某些视图进行渲染 JSON ???

public function testAction() {
    $data = array('value'=>'001');
    return json_encode($data);
}

当然你应该设置 Content-type: application/json - 你喜欢在哪里 - 在你的 TS 中或直接在 return;

之前的动作中

其他线索:可能它是由tt_content引起的(只是猜测),对于JSON操作它是最好通过 Bootstrap 直接包含它们,首先在 ext_localconf.php:

中注册新的 FE 插件
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
    'VENDORNAME.' . $_EXTKEY,
    'JsonDataPlugin',
    array('JSON' => 'test',),
    array('JSON' => 'test',)
);

并修改你的TS:

myAjaxPage = PAGE
myAjaxPage {

  typeNum = 999
  10 = USER
  10 {
    userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run
    extensionName = Yourextname
    pluginName = JsonDataPlugin
    vendorName = VENDORNAME
  }

  config {
    disableAllHeaderCode = 1
    additionalHeaders = Content-type:application/json
    xhtml_cleaning = 0
    admPanel = 0
    debug = 0
    no_cache = 1
  }

}

(不要忘记为自己更改 Yourextname 和 VENDORNAME,同时清除系统缓存)

最后: 检查所有文件并确保在 <?php 之前和 ?> 之后没有空行(最好的选择是删除 ?> 来自每个文件 - 并让 PHP 在文件末尾终止脚本)。它也可以在 TYPO3 的源代码中修复,如 other naswer 中所述。

好的,我知道了...

我包含了一个文件,其中包含一些名为 user.php

的函数
/**
 * User service
 *
 * @var \Whmcs\Registration\Service\User
 * @inject
 */
protected $user = NULL;

在此文件中,?> 标记后有空行。这些空行是问题所在。我删除了它们,现在一切正常。 :)