如何将TYPO3前端ajax映射到处理程序

时间:2017-11-06 11:31:41

标签: ajax typo3-7.6.x typo3-extensions

如何从前端TYPO3页面向我的扩展程序中的函数或类方法进行ajax POST?

我一直在使用Extension Builder,默认情况下似乎构建了MVC扩展,但我的扩展不需要是MVC。

我可以在我的页面上放置一个javascript ajax调用,但是如何将其映射到我的处理程序以及我在ajax函数中使用什么url参数?此外,我如何保护网址?

我正在使用TYPO3 v7.6

2 个答案:

答案 0 :(得分:0)

在您的自定义扩展程序中调用ajax,如下所示。

调用Ajax

Javascript

function callAjax(param)
{
    $.ajax({
        async: 'true',
        url: 'index.php',
        type: 'GET',
        dataType: 'json',
        data: {
            eID: "Ajax_call",
            id:pageId,
            param:{
                param1:value
            }
        },
        success:function (data) {
            if (data.succ == 1) {
                $("#ad-success").show();
            }
        }
    });
}

localconf.php 文件

$TYPO3_CONF_VARS['FE']['eID_include']['Ajax_call'] = \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('extension_key').'Classes/Ajax/EidDispatcher.php';

EidDispatcher.php 档案。

<?php

namespace vendor\extension_key\Ajax;

class EidDispatcher
{
    /**
   * @var \array
   */
    protected $configuration;

    /**
   * @var \array
   */
    protected $bootstrap;

    /**
   * The main Method
   *
   * @return \string
   */
    public function run()
    {
        return $this->bootstrap->run('', $this->configuration);
    }

    /**
   * Initialize Extbase
   *
   * @param \array $TYPO3_CONF_VARS
   */
    public function __construct($TYPO3_CONF_VARS)
    {
        // $page = \TYPO3\CMS\Core\Utility\GeneralUtility::_GP('page');

        $ajaxRequest = \TYPO3\CMS\Core\Utility\GeneralUtility::_GP('tx_extension_key');

        // create bootstrap
        $this->bootstrap = new \TYPO3\CMS\Extbase\Core\Bootstrap();

        // get User
        $feUserObj = \TYPO3\CMS\Frontend\Utility\EidUtility::initFeUser();

        // set PID
        $pid = (\TYPO3\CMS\Core\Utility\GeneralUtility::_GET('id')) ? \TYPO3\CMS\Core\Utility\GeneralUtility::_GET('id') : 0;

        // Create and init Frontend
        $GLOBALS['TSFE'] = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
            'TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController',
            $TYPO3_CONF_VARS,
            $pid,
            0,
            true
        );
        \TYPO3\CMS\Frontend\Utility\EidUtility::initLanguage();
        \TYPO3\CMS\Frontend\Utility\EidUtility::initTCA();
        $GLOBALS['TSFE']->connectToDB();
        $GLOBALS['TSFE']->fe_user = $feUserObj;
        $GLOBALS['TSFE']->id = $pid;
        $GLOBALS['TSFE']->determineId();
        $GLOBALS['TSFE']->initTemplate();
        $GLOBALS['TSFE']->getConfigArray();
        $GLOBALS['TSFE']->settingLanguage();

        // Get Plugins TypoScript
        $TypoScriptService = new \TYPO3\CMS\Extbase\Service\TypoScriptService();
        $pluginConfiguration = $TypoScriptService->convertTypoScriptArrayToPlainArray(
            $GLOBALS['TSFE']->tmpl->setup['plugin.']['tx_extension_key*emphasized text*.']
        );
        // Set configuration to call the plugin
        $this->configuration = array(
            'pluginName' => 'plugin_name',
            'vendorName' => 'vendor_name',
            'extensionName' => 'extension_name',
            'controller' => 'controller',
            'action' => 'action',
            'params' => $ajaxRequest['param'],
            'mvc' => array(
                'requestHandlers' => array(
                    'TYPO3\CMS\Extbase\Mvc\Web\FrontendRequestHandler' => 'TYPO3\CMS\Extbase\Mvc\Web\FrontendRequestHandler'
                )
            ),
            'settings' => $pluginConfiguration['settings'],
            'persistence' => array (
                'storagePid' => $pluginConfiguration['persistence']['storagePid']
            )
        );
    }
}
global $TYPO3_CONF_VARS;
// make instance of bootstrap and run
$eid = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
    'vendor\ExtensionKey\Ajax\EidDispatcher',
    $TYPO3_CONF_VARS
);
echo $eid->run();

答案 1 :(得分:0)

我知道至少有3种方法可以在Typo3中提供AJAX端点:

的eID

普通且快速,但默认情况下不加载前端上下文。许多开发人员已经烧坏了自己使用它。

以TYPO3 Developer的答案为例。

如果我想做除了普通的非Extbase PHP以外的任何事情,我不会使用它,因为“手动”构建TYPO3上下文容易出错,并且工作方式已经从版本更改为版本。但是,如果你真的需要它,那么能够控制引导为性能改进提供了可能性。


typeNum

为您的代码提供标准的插件环境。在编写了一个普通的Extbase插件后,你可以在TypoScript中定义另一个PAGE对象,只包含你插件的内容:

ajaxPage = PAGE # call it whatever you want
ajaxPage {
   typeNum = 9787 # use a unique, unused typeNum
   10 < tt_content.list.20.yourextension_yourpluginname
   config {
     disableAllHeaderCode = 1
     additionalHeaders = Content-type:text/html # or application/json, or... 
     xhtml_cleaning = 0 
     admPanel = 0 # suppress Typo3 from adding anything unwanted
     debug = 0 # suppress Typo3 from adding anything unwanted
     no_cache = 1 # control if the output should be cachable
  }
}

要通过AJAX调用您的插件,您可以将页面类型添加到URL。 在Fluid中,您可以像这样构建它:

{f:uri.action(action: 'youraction', pageType: 9787)} # add controller=,  pluginName=, extensionName= as needed


EXT:typoscript_rendering

https://github.com/helhum/typoscript_rendering

一种扩展,可以使您免受typeNum方法中的TypoScript配置的影响,但保留了优势,特别是对于AJAX到Extbase操作。

编写正常的Extbase插件后,您可以使用ViewHelper https://github.com/helhum/typoscript_rendering/blob/master/Classes/ViewHelpers/Uri/AjaxActionViewHelper.php获取Extbase操作的AJAX URL。

流体中的示例:

xmlns:t="http://typo3.org/ns/Helhum/TyposcriptRendering/ViewHelpers" # ViewHelper namespace

{t:uri.ajaxAction(action: 'youraction')} # works just like the Fluid f:uri.ajax.action with the same parameters.



在我看来,最后一种方法是最直接的。最后2个支持所有Typo3标准功能,如FrontendUser权限等。我不会非常信任前端的eID方法。