如何从前端TYPO3页面向我的扩展程序中的函数或类方法进行ajax POST?
我一直在使用Extension Builder,默认情况下似乎构建了MVC扩展,但我的扩展不需要是MVC。
我可以在我的页面上放置一个javascript ajax调用,但是如何将其映射到我的处理程序以及我在ajax函数中使用什么url参数?此外,我如何保护网址?
我正在使用TYPO3 v7.6
答案 0 :(得分:0)
在您的自定义扩展程序中调用ajax,如下所示。
调用Ajax Javascriptfunction 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端点:
普通且快速,但默认情况下不加载前端上下文。许多开发人员已经烧坏了自己使用它。
以TYPO3 Developer的答案为例。
如果我想做除了普通的非Extbase PHP以外的任何事情,我不会使用它,因为“手动”构建TYPO3上下文容易出错,并且工作方式已经从版本更改为版本。但是,如果你真的需要它,那么能够控制引导为性能改进提供了可能性。
为您的代码提供标准的插件环境。在编写了一个普通的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
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方法。