2015-01-07 29 views
0

我需要將兩個對象放在一個形式的流體中。 背景是:我有一個userDomain和一個排序對象。兩者都不是持久的。我想將這兩個對象發送到一個動作而不使其中一個持久化。 userDomain對象由表單處理,另一個分配給視圖。如果我訂購對象添加到參數部分中的表格,TYPO3的拋出了我這個錯誤:一個流體形式的多個對象

Oops, an error occurred! 

Could not serialize Domain Object Whmcs\Registration\Domain\Model\Ordering. It is neither an Entity with identity properties set, nor a Value Object. 

More information regarding this error might be available online. 

這是因爲對象是不可持久的,沒有任何標識。

所以問題是,我如何將這兩個對象傳遞給下一個動作?

回答

1

爲了在多個動作之間傳遞非持久對象,我建議你存儲序列化在TYPO3會話變量中的對象。這樣做,您可以恢復目標操作中的對象。

下面你可以找到一個工作例子,它也可以找到here

<?php 
namespace derhansen\ValidationExamplesNew\Controller; 

/*************************************************************** 
* Copyright notice 
* 
* (c) 2013 Torben Hansen <[email protected]> 
* 
* All rights reserved 
* 
* 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 3 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! 
***************************************************************/ 

/** 
* Multiple Steps Controller 
* 
* @package validation_examples_new 
* @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3 or later 
* 
*/ 
class MultipleStepsController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController { 

    /** 
    * addressdataRepository 
    * 
    * @var \derhansen\ValidationExamplesNew\Domain\Repository\AddressdataRepository 
    * @inject 
    */ 
    protected $addressdataRepository; 

    /** 
    * API Service 
    * 
    * @var \derhansen\ValidationExamplesNew\Service\ExternalApiService 
    * @inject 
    */ 
    protected $apiService; 

    /** 
    * Step1 
    * 
    * @param \derhansen\ValidationExamplesNew\Domain\Model\Step1Data $step1data 
    * @dontvalidate $step1data 
    */ 
    public function step1Action(\derhansen\ValidationExamplesNew\Domain\Model\Step1Data $step1data = NULL) { 
     /* Check if step1data is available in session */ 
     if ($GLOBALS['TSFE']->fe_user->getKey('ses', 'step1data') && $step1data == NULL) { 
      $step1data = unserialize($GLOBALS['TSFE']->fe_user->getKey('ses', 'step1data')); 
     } 

     $this->view->assign('step1data', $step1data); 
    } 

    /** 
    * Step1 redirect action 
    * 
    * @param \derhansen\ValidationExamplesNew\Domain\Model\Step1Data $step1data 
    */ 
    public function step1redirectAction(\derhansen\ValidationExamplesNew\Domain\Model\Step1Data $step1data) { 
     $GLOBALS['TSFE']->fe_user->setKey('ses', 'step1data', serialize($step1data)); 
     $GLOBALS['TSFE']->fe_user->storeSessionData(); 

     $this->redirect('step2'); 
    } 

    /** 
    * Step2 
    * 
    * @param \derhansen\ValidationExamplesNew\Domain\Model\Step2Data $step2data 
    * @dontvalidate $step2data 
    */ 
    public function step2Action(\derhansen\ValidationExamplesNew\Domain\Model\Step2Data $step2data = NULL) { 
     /* Check if step2data is available in session */ 
     if ($GLOBALS['TSFE']->fe_user->getKey('ses', 'step2data') && $step2data == NULL) { 
      $step2data = unserialize($GLOBALS['TSFE']->fe_user->getKey('ses', 'step2data')); 
     } 

     /* Set external validations errors if available */ 
     $this->setApiValidationErrors('step2'); 

     $this->view->assign('step2data', $step2data); 
    } 

    /** 
    * Step2 redirect action 
    * 
    * @param \derhansen\ValidationExamplesNew\Domain\Model\Step2Data $step2data 
    */ 
    public function step2redirectAction(\derhansen\ValidationExamplesNew\Domain\Model\Step2Data $step2data) { 
     $GLOBALS['TSFE']->fe_user->setKey('ses', 'step2data', serialize($step2data)); 
     $GLOBALS['TSFE']->fe_user->storeSessionData(); 

     $this->redirect('step3'); 
    } 


    /** 
    * Step3 
    * 
    * @param \derhansen\ValidationExamplesNew\Domain\Model\Step3Data $step3data 
    * @dontvalidate $step3data 
    */ 
    public function step3Action(\derhansen\ValidationExamplesNew\Domain\Model\Step3Data $step3data = NULL) { 
     /* Check if step3data is available in session */ 
     if ($GLOBALS['TSFE']->fe_user->getKey('ses', 'step3data') && $step3data == NULL) { 
      $step3data = unserialize($GLOBALS['TSFE']->fe_user->getKey('ses', 'step3data')); 
     } 

     /* Set external validations errors if available */ 
     $this->setApiValidationErrors('step3'); 

     $this->view->assign('step3data', $step3data); 
    } 

    /** 
    * Step3 redirect action 
    * 
    * @param \derhansen\ValidationExamplesNew\Domain\Model\Step3Data $step3data 
    */ 
    public function step3redirectAction(\derhansen\ValidationExamplesNew\Domain\Model\Step3Data $step3data) { 
     $GLOBALS['TSFE']->fe_user->setKey('ses', 'step3data', serialize($step3data)); 
     $GLOBALS['TSFE']->fe_user->storeSessionData(); 

     $this->redirect('create'); 
    } 

    /** 
    * Create Action 
    * 
    * @return void 
    */ 
    public function createAction() { 
     $addressdata = $this->getAddressdataFromSession(); 

     /* get validation results from API */ 
     $apiresults = $this->apiService->validateMultipleSteps($addressdata); 
     if (count($apiresults) > 0) { 
      /* Save results to a session variable */ 
      $GLOBALS['TSFE']->fe_user->setKey('ses', 'apiresults', $apiresults); 
      $GLOBALS['TSFE']->fe_user->storeSessionData(); 

      /* Redirect to step with validation errors */ 
      if (array_key_exists('step2', $apiresults)) { 
       $this->redirect('step2'); 
      } 
      if (array_key_exists('step3', $apiresults)) { 
       $this->redirect('step3'); 
      } 
     } 

     $this->addressdataRepository->add($addressdata); 
     $this->cleanUpSessionData(); 

     $this->view->assign('message', 'Addressdata has been created'); 
    } 

    /** 
    * Collects the addressdata from the multiple steps form stored in session variables 
    * and returns an addressdata object. 
    * 
    * @return \derhansen\ValidationExamplesNew\Domain\Model\Addressdata 
    */ 
    protected function getAddressdataFromSession() { 
     /** @var \derhansen\ValidationExamplesNew\Domain\Model\Step1Data $step1data */ 
     $step1data = unserialize($GLOBALS['TSFE']->fe_user->getKey('ses', 'step1data')); 

     /** @var \derhansen\ValidationExamplesNew\Domain\Model\Step2Data $step2data */ 
     $step2data = unserialize($GLOBALS['TSFE']->fe_user->getKey('ses', 'step2data')); 

     /** @var \derhansen\ValidationExamplesNew\Domain\Model\Step3Data $step3data */ 
     $step3data = unserialize($GLOBALS['TSFE']->fe_user->getKey('ses', 'step3data')); 

     /** @var \derhansen\ValidationExamplesNew\Domain\Model\Addressdata $addressData */ 
     $addressData = $this->objectManager->get('derhansen\ValidationExamplesNew\Domain\Model\Addressdata'); 
     $addressData->setFirstname($step1data->getFirstname()); 
     $addressData->setLastname($step1data->getLastname()); 
     $addressData->setStreet($step2data->getStreet()); 
     $addressData->setStreetnr($step2data->getStreetnr()); 
     $addressData->setZip($step3data->getZip()); 
     $addressData->setCity($step3data->getCity()); 

     return $addressData; 
    } 

    /** 
    * Removes all session variables from the multiple steps form 
    * 
    * @return void 
    */ 
    protected function cleanUpSessionData() { 
     $GLOBALS['TSFE']->fe_user->setKey('ses', 'step1data', ''); 
     $GLOBALS['TSFE']->fe_user->setKey('ses', 'step2data', ''); 
     $GLOBALS['TSFE']->fe_user->setKey('ses', 'step3data', ''); 
     $GLOBALS['TSFE']->fe_user->setKey('ses', 'apiresults', ''); 
     $GLOBALS['TSFE']->fe_user->storeSessionData(); 
    } 

    /** 
    * Sets validation errors for fields in the given step 
    * 
    * @param string $step The step 
    * @return void 
    */ 
    protected function setApiValidationErrors($step) { 
     $apiresults = $GLOBALS['TSFE']->fe_user->getKey('ses', 'apiresults'); 
     if (array_key_exists($step, $apiresults)) { 
      /* Set Form Errors manually - get results from property mapper and add new errors */ 
      $result = $this->getControllerContext()->getRequest()->getOriginalRequestMappingResults(); 

      /* Add validation errors */ 
      foreach ($apiresults[$step] as $key => $value) { 
       $error = $this->objectManager->get('TYPO3\\CMS\\Extbase\\Validation\Error', 
        $apiresults[$step][$key], time()); 
       $result->forProperty($step . 'data.' . $key)->addError($error); 
      } 
      $this->getControllerContext()->getRequest()->setOriginalRequestMappingResults($result); 
     } 
    } 

} 
?> 

這個例子是一個多步驟的形式驗證示例的一部分,但爲了存儲每個窗體步驟的輸入使用TYPO3會話變量。

+0

作品,謝謝! :) – Marcel

相關問題