一种流体形式的多个对象

Multiple objects in one Fluid form

我需要用流体将两个物体放在一个形式中。 背景是:我有一个 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.

这是因为该对象是非持久性对象,没有任何 ID。

所以问题是,我如何将这两个对象传递给下一个动作?

为了在多个操作之间传递非持久对象,我建议您将序列化的对象存储在 TYPO3 会话变量中。这样做,您可以恢复目标操作中的对象。

您在下面找到一个工作示例,该示例也可以在 here.

中找到
<?php
namespace derhansen\ValidationExamplesNew\Controller;

/***************************************************************
 *  Copyright notice
 *
 *  (c) 2013 Torben Hansen <derhansen@gmail.com>
 *
 *  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 会话变量来存储每个表单步骤的输入。