2014-01-15 122 views

回答

10

編輯:

赫爾穆特·胡默爾的TYPO3 CMS團隊,measured,使用EID與Extbase比使用typeNum方法慢的成員。但是由於typeNum方法配置起來很麻煩,他還有第三種方法。

分機typoscript_rendering提供了一種直接調用Extbase操作而無需額外配置的方法。它包含了產生這樣的聯繫,並可以在流體中模板中使用這樣的視圖助手:

{namespace h=Helhum\TyposcriptRendering\ViewHelpers} 
<script> 
var getParticipationsUri = '<h:uri.ajaxAction controller="Participation" action="listByCompetition" arguments="{competition:competition}" />'; 
</script> 

這產生一個URI調用我的「ParticipationController」的行動「listByCompetition」。您可以正常傳遞參數。

唯一的缺點是,出於安全原因,擴展使用cHash來驗證請求參數。 cHash由GET提交,但不能通過GET同時傳遞額外的參數,因爲它會使cHash失效。所以,如果你想通過這樣的申請表的數據,你需要混合GET(一個有效的AJAX調用)和POST(提交用戶數據):

<script> 
var createAddressUri = '<h:uri.ajaxAction controller="Address" action="create" />'; 
$body.on('submit', '#myForm', function(e) { 
    e.preventDefault(); 
    emailAddress = $('#myForm').find('#email'); 
    if (typeof(emailAddress) === 'string') { 
     $.ajax({ 
      url: createAddressUri, 
      type: 'POST', 
      data: { 'tx_myext_pluginname[address][email]' : emailAddress}, 
      success: function() { 
       // things to do on success 
      } 
     }) 
    } 
}); 
</script> 

(當然,這只是一個非常基本的例如,您可能會發布整個模型等)

的EID方式:

是的,你可以使用EID(擴展ID)機制爲。沒有官方聲明(pageType或eID)應該用於Extbase AJAX調用,它似乎只是一個口味問題。

有一個很好的教程,可以發現here,我複製的源代碼在這裏:

<?php 

/** ************************************************************* 
* 
* Extbase Dispatcher for Ajax Calls TYPO3 6.1 namespaces 
* 
* IMPORTANT Use this script only in Extensions with namespaces 
* 
* Klaus Heuer <[email protected]> 
* 
* This script is part of the TYPO3 project. The TYPO3 project is 
* free software; you can redistribute it and/or modify 
* it under the terms of the GNU General Public License as published by 
* the Free Software Foundation; either version 2 of the License, or 
* (at your option) any later version. 
* 
* The GNU General Public License can be found at 
* http://www.gnu.org/copyleft/gpl.html. 
* 
* This script is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
* GNU General Public License for more details. 
* 
* This copyright notice MUST APPEAR in all copies of the script! 
* ************************************************************* */ 

/** ************************************************************ 
* Usage of this script: 
* 
* - Copy this script in your Extension Dir in the Folder Classes 
* - Set the Vendor and Extension Name in Line 82 + 83 
* - Include the next line in the ext_localconf.php, change the ext name! 
* - $TYPO3_CONF_VARS['FE']['eID_include']['ajaxDispatcher'] = \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath('myExtension').'Classes/EidDispatcher.php'; 
* 
* Use for Ajax Calls in your jQuery Code: 
* 
*  $('.jqAjax').click(function(e) { 
*  var uid = $(this).find('.uid').html(); 
*  var storagePid = '11'; 
*  
*  $.ajax({ 
*   async: 'true', 
*   url: 'index.php',  
*   type: 'POST', 
*   
*   data: { 
*    eID: "ajaxDispatcher", 
*    request: { 
*     pluginName: 'patsystem', 
*     controller: 'Todo', 
*     action:  'findTodoByAjax', 
*     arguments: { 
*      'uid': uid, 
*      'storagePid': storagePid 
*     } 
*    } 
*   }, 
*   dataType: "json",  
*   
*   success: function(result) { 
*    console.log(result); 
*   }, 
*   error: function(error) { 
*    console.log(error);    
*   } 
*  }); 
*************************************************************** */ 


/** 
* Gets the Ajax Call Parameters 
*/ 
$ajax = \TYPO3\CMS\Core\Utility\GeneralUtility::_GP('request'); 

/** 
* Set Vendor and Extension Name 
* 
* Vendor Name like your Vendor Name in namespaces 
* ExtensionName in upperCamelCase 
*/ 
$ajax['vendor'] = 'T3Developer'; 
$ajax['extensionName'] = 'ProjectsAndTasks'; 

/** 
* @var $TSFE \TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController 
*/ 
$TSFE = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController', $TYPO3_CONF_VARS, 0, 0); 
\TYPO3\CMS\Frontend\Utility\EidUtility::initLanguage(); 

// Get FE User Information 
$TSFE->initFEuser(); 
// Important: no Cache for Ajax stuff 
$TSFE->set_no_cache(); 

//$TSFE->checkAlternativCoreMethods(); 
$TSFE->checkAlternativeIdMethods(); 
$TSFE->determineId(); 
$TSFE->initTemplate(); 
$TSFE->getConfigArray(); 
\TYPO3\CMS\Core\Core\Bootstrap::getInstance()->loadConfigurationAndInitialize(); 

$TSFE->cObj = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer'); 
$TSFE->settingLanguage(); 
$TSFE->settingLocale(); 

/** 
* Initialize Database 
*/ 
\TYPO3\CMS\Frontend\Utility\EidUtility::connectDB(); 

/** 
* @var $objectManager \TYPO3\CMS\Extbase\Object\ObjectManager 
*/ 
$objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager'); 


/** 
* Initialize Extbase bootstap 
*/ 
$bootstrapConf['extensionName'] = $ajax['extensionName']; 
$bootstrapConf['pluginName'] = $ajax['pluginName']; 

$bootstrap = new TYPO3\CMS\Extbase\Core\Bootstrap(); 
$bootstrap->initialize($bootstrapConf); 

$bootstrap->cObj = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('tslib_cObj'); 

/** 
* Build the request 
*/ 
$request = $objectManager->get('TYPO3\CMS\Extbase\Mvc\Request'); 

$request->setControllerVendorName($ajax['vendor']); 
$request->setcontrollerExtensionName($ajax['extensionName']); 
$request->setPluginName($ajax['pluginName']); 
$request->setControllerName($ajax['controller']); 
$request->setControllerActionName($ajax['action']); 
$request->setArguments($ajax['arguments']); 

$response = $objectManager->create('TYPO3\CMS\Extbase\Mvc\ResponseInterface'); 

$dispatcher = $objectManager->get('TYPO3\CMS\Extbase\Mvc\Dispatcher'); 

$dispatcher->dispatch($request, $response); 

echo $response->getContent(); 
//die(); 
?> 

有一個看看「這個腳本的使用」一節介紹瞭如何註冊的eID。該腳本適用於TYPO3 6.1及更高版本。

2

對於TYPO3 6.2更改以下行:

\TYPO3\CMS\Core\Core\Bootstrap::getInstance()->loadConfigurationAndInitialize(); 

\TYPO3\CMS\Core\Core\Bootstrap::getInstance() 
0

我不得不把makeInstance的第一個0切換到頁面的ID爲它工作。

$id = \TYPO3\CMS\Core\Utility\GeneralUtility::_GP('id'); 
$TSFE = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController', $TYPO3_CONF_VARS, $id, 0); 
0

我使用了一種快速而且可能不帶typeNum的骯髒方法。 我用jQuery ajax調用常用的方法。 我的目標行動以下列結束。

$headers = DivUtilities::createHeader(); 
foreach ($headers as $header => $data) { 
    $this->response->setHeader($header, $data); 
} 
$this->response->sendHeaders(); 
echo $this->view->render(); 
exit; 

的createHeader方法

/** 
    * 
    * @param string $type 
    * @return array 
    */ 
public static function createHeader($type = 'html') 
{ 
    switch ($type) { 
    case 'txt': 
      $cType = 'text/plain'; 
      break; 
    case 'html': 
      $cType = 'text/html'; 
      break; 
    case 'json': 
      $cType = 'application/json'; 
      break; 
    case 'pdf': 
      $cType = 'application/pdf'; 
      break; 
    } 
    $headers = array(
      'Pragma' => 'public', 
      'Expires' => 0, 
      'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0', 
      'Cache-Control' => 'public', 
      'Content-Type' => $cType 
); 
    return $headers; 
} 

輸出是被調用動作的模板。這可以是HTML,JSON或任何你需要的。

2

對於測試擴展。

包括EID在ext_localconf.php文件

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

創建classes目錄 - 類/阿賈克斯/ EidDispatcher.php

namespace TYPO3\Test\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) { 

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

     // 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') : 1; 

     // Create and init Frontend 
     $GLOBALS['TSFE'] = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController', $TYPO3_CONF_VARS, $pid, 0, TRUE); 
     $GLOBALS['TSFE']->connectToDB(); 
     $GLOBALS['TSFE']->fe_user = $feUserObj; 
     $GLOBALS['TSFE']->id = $pid; 
     $GLOBALS['TSFE']->determineId(); 
     $GLOBALS['TSFE']->getCompressedTCarray(); //Comment this line when used for TYPO3 7.6.0 on wards 
     $GLOBALS['TSFE']->initTemplate(); 
     $GLOBALS['TSFE']->getConfigArray(); 
     $GLOBALS['TSFE']->includeTCA(); //Comment this line when used for TYPO3 7.6.0 on wards 

     // Get Plugins TypoScript 
     $TypoScriptService = new \TYPO3\CMS\Extbase\Service\TypoScriptService(); 
     $pluginConfiguration = $TypoScriptService->convertTypoScriptArrayToPlainArray($GLOBALS['TSFE']->tmpl->setup['plugin.']['tx_Test.']); 

     // Set configuration to call the plugin 
     $this->configuration = array (
       'pluginName' => $ajaxRequest['pluginName'], 
       'vendorName' => 'TYPO3', 
       'extensionName' => 'Test', 
       'controller' => $ajaxRequest['controller'], 
       'action' => $ajaxRequest['action'], 
       '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('TYPO3\Test\Ajax\EidDispatcher', $TYPO3_CONF_VARS); 
echo $eid->run(); 

呼叫從腳本

$.ajax({ 
    async: 'true', 
    url: 'index.php',  
    type: 'GET', 
    data: { 
     eID: "Test", 
     tx_ExtName_PluginName: { 
      pluginName: 'Plugin_Name', 
      controller: 'Controller_Name', 
      action:  'Action_Name', 
     } 
    }, 
    success:function(data){ 
     // code 
    } 
});