Database 为什么在typo3扩展中将对象保存到数据库时遇到问题?

Database 为什么在typo3扩展中将对象保存到数据库时遇到问题?,database,repository,typo3,record,extbase,Database,Repository,Typo3,Record,Extbase,为什么在创建新记录时,我的用户和优惠券对象不会保存到数据库中 我正在使用Typo3V4.5.30,并做了一些扩展(我的第一次)来管理一些优惠券。当我创建优惠券时,我保存创建者(frontenduser)并将其正确保存到DB。但是当我为优惠券用户做同样的事情时,用户(和优惠券)不会被保存到数据库中。考虑这个代码FRAG,它试图在使用的优惠券表中保存用户和优惠券。UsedConon表基本上只有两列,一列用于用户,另一列用于优惠券 为了获得UsedCoon对象,我调用了ObjectManager创建方

为什么在创建新记录时,我的用户和优惠券对象不会保存到数据库中

我正在使用Typo3V4.5.30,并做了一些扩展(我的第一次)来管理一些优惠券。当我创建优惠券时,我保存创建者(frontenduser)并将其正确保存到DB。但是当我为优惠券用户做同样的事情时,用户(和优惠券)不会被保存到数据库中。考虑这个代码FRAG,它试图在使用的优惠券表中保存用户和优惠券。UsedConon表基本上只有两列,一列用于用户,另一列用于优惠券

为了获得UsedCoon对象,我调用了ObjectManager创建方法。我已经拥有的用户和优惠券对象,在我将它们转储时看起来是正确的。即使当我从UsedCoon对象获取它们时,它们看起来还可以,但即使创建了新记录,它们也不会保存到数据库中。此代码位于我的CouponController中的action方法中

             $used = $this->objectManager>create('Tx_BpsCoupons_Domain_Model_UsedCoupon');    
             $used->setCoupon($coupon);
             $used->setUser($user);
             $used->setGuest("myemail@ddd.com");

             $userx = $used->getUser();
             $coupx = $used->getCoupon();
             /// var_dumps of userx and coupx  show good objects

             $this->usedCouponRepository->add($used);
             //after this I can examine the db and see the new record but the user and coupon fields are empty, and no errors are seen
谢谢

PS这是我从usedcoon.php获得的TCA

    <?php
if (!defined ('TYPO3_MODE')) {
    die ('Access denied.');
}

$TCA['tx_bpscoupon_domain_model_usedcoupon'] = array(
    'ctrl' => $TCA['tx_bpscoupon_domain_model_usedcoupon']['ctrl'],
    'interface' => array(
        'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, user, coupon, guest',
    ),
    'types' => array(
        '1' => array('showitem' => 'sys_language_uid;;;;1-1-1, l10n_parent, l10n_diffsource, hidden;;1, user, coupon, guest,--div--;LLL:EXT:cms/locallang_ttc.xml:tabs.access,starttime, endtime'),
    ),
    'palettes' => array(
        '1' => array('showitem' => ''),
    ),
    'columns' => array(
        'sys_language_uid' => array(
            'exclude' => 1,
            'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.language',
            'config' => array(
                'type' => 'select',
                'foreign_table' => 'sys_language',
                'foreign_table_where' => 'ORDER BY sys_language.title',
                'items' => array(
                    array('LLL:EXT:lang/locallang_general.xml:LGL.allLanguages', -1),
                    array('LLL:EXT:lang/locallang_general.xml:LGL.default_value', 0)
                ),
            ),
        ),
        'l10n_parent' => array(
            'displayCond' => 'FIELD:sys_language_uid:>:0',
            'exclude' => 1,
            'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.l18n_parent',
            'config' => array(
                'type' => 'select',
                'items' => array(
                    array('', 0),
                ),
                'foreign_table' => 'tx_bpscoupon_domain_model_usedcoupon',
                'foreign_table_where' => 'AND tx_bpscoupon_domain_model_usedcoupon.pid=###CURRENT_PID### AND tx_bpscoupon_domain_model_usedcoupon.sys_language_uid IN (-1,0)',
            ),
        ),
        'l10n_diffsource' => array(
            'config' => array(
                'type' => 'passthrough',
            ),
        ),
        't3ver_label' => array(
            'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.versionLabel',
            'config' => array(
                'type' => 'input',
                'size' => 30,
                'max' => 255,
            )
        ),
        'hidden' => array(
            'exclude' => 1,
            'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.hidden',
            'config' => array(
                'type' => 'check',
            ),
        ),
        'starttime' => array(
            'exclude' => 1,
            'l10n_mode' => 'mergeIfNotBlank',
            'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.starttime',
            'config' => array(
                'type' => 'input',
                'size' => 13,
                'max' => 20,
                'eval' => 'datetime',
                'checkbox' => 0,
                'default' => 0,
                'range' => array(
                    'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y'))
                ),
            ),
        ),
        'endtime' => array(
            'exclude' => 1,
            'l10n_mode' => 'mergeIfNotBlank',
            'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.endtime',
            'config' => array(
                'type' => 'input',
                'size' => 13,
                'max' => 20,
                'eval' => 'datetime',
                'checkbox' => 0,
                'default' => 0,
                'range' => array(
                    'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y'))
                ),
            ),
        ),
        'user' => array(
            'exclude' => 0,
            'label' => 'LLL:EXT:bpscoupon/Resources/Private/Language/locallang_db.xml:tx_bpscoupon_domain_model_usedcoupon.user',
            'config' => array(
                'type' => 'select',
                'foreign_table' => 'fe_users'
            ),
        ), 
        'coupon' => array(
            'exclude' => 0,
            'label' => 'LLL:EXT:bpscoupon/Resources/Private/Language/locallang_db.xml:tx_bpscoupon_domain_model_usedcoupon.coupon',
            'config' => array(
                'type' => 'select',
                'foreign_table' => 'tx_bpscoupons_domain_model_coupon'
            ),
        ),
        'guest' => array(
            'exclude' => 0,
            'label' => 'LLL:EXT:bpscoupon/Resources/Private/Language/locallang_db.xml:tx_bpscoupon_domain_model_usedcoupon.guest',
            'config' => array(
                'type' => 'input',
                'size' => 30,
                'eval' => 'trim'
            ),
        ),
    ),
);

?>

PPS根据型号代码添加UsedCoon:

    <?php

/***************************************************************
 *  Copyright notice
 *
 *  (c) 2013 Cory Taylor <cory@bigplayersystems.com>, Big Player Systems
 *  
 *  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!
 ***************************************************************/

/**
 *
 *
 * @package bps_coupons
 * @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3 or later
 *
 */
class Tx_BpsCoupons_Domain_Model_UsedCoupon extends Tx_Extbase_DomainObject_AbstractEntity {


    /**
     * Used By
     *
     * @var Tx_BpsCoupons_Domain_Model_FrontendUser
     */
    protected $user;


    /**
     * Returns the $user
     *
     * @return Tx_BpsCoupons_Domain_Model_FrontendUser $user
     */
    public function getUser() {
            echo "<br/>" . __FUNCTION__ . __LINE__ . "  <br/>";
            return $this->user;
    }

    /**
     * Sets the $user
     *
     * @param @param Tx_BpsCoupons_Domain_Model_FrontendUser $user  
     * @return void
     */
    public function setUser(Tx_BpsCoupons_Domain_Model_FrontendUser $user) {
        $this->user = $user;
    }

     /**
     * the used coupon
     *
     * @var Tx_BpsCoupons_Domain_Model_Coupon
     */
    protected $coupon;


    /**
     * Returns the $coupon
     *
     * @return Tx_BpsCoupons_Domain_Model_Coupon $coupon
     */
    public function getCoupon() {
        return $this->coupon;
    }

    /**
     * Sets the $coupon
     *
     * @param @param Tx_BpsCoupons_Domain_Model_Coupon $coupon  
     * @return void
     */
    public function setCoupon(Tx_BpsCoupons_Domain_Model_Coupon $coupon) {
        $this->coupon = $coupon;
    }


    /**
 * the guest email
 *
 * @var string
 */
protected $guest;


/**
 * Returns the $guest
 *
 * @return string $guest
 */
public function getGuest() {
    return $this->guest;
}

/**
 * Sets the $guest email
 *
 * @param string $guest
 * @return void
 */
public function setGuest( $guest) {
    $this->guest = $guest;
}

}
?>

购买力平价:我试着为电子邮件地址添加一个基本的文本字段,但结果证明它们也没有被保存。我原以为问题在于用户和优惠券字段是对其他表中行的引用,但现在发现更简单的东西也不会被保存

PP S:也可以查看我的ext_tables文件:

<?php
if (!defined('TYPO3_MODE')) {
    die ('Access denied.');
}

Tx_Extbase_Utility_Extension::registerPlugin(
    $_EXTKEY,
    'Bpscoupons',
    'BPS_Coupons'
);

t3lib_extMgm::addStaticFile($_EXTKEY, 'Configuration/TypoScript', 'BPS_Coupons');

t3lib_extMgm::addLLrefForTCAdescr('tx_bpscoupons_domain_model_coupon', 'EXT:bps_coupons/Resources/Private/Language/locallang_csh_tx_bpscoupons_domain_model_coupon.xml');
t3lib_extMgm::allowTableOnStandardPages('tx_bpscoupons_domain_model_coupon');
$TCA['tx_bpscoupons_domain_model_coupon'] = array(
    'ctrl' => array(
        'title' => 'LLL:EXT:bps_coupons/Resources/Private/Language/locallang_db.xml:tx_bpscoupons_domain_model_coupon',
        'label' => 'name',
        'tstamp' => 'tstamp',
        'crdate' => 'crdate',
        'cruser_id' => 'cruser_id',
        'dividers2tabs' => TRUE,
        'sortby' => 'sorting',
        'versioningWS' => 2,
        'versioning_followPages' => TRUE,
        'origUid' => 't3_origuid',
        'languageField' => 'sys_language_uid',
        'transOrigPointerField' => 'l10n_parent',
        'transOrigDiffSourceField' => 'l10n_diffsource',
        'delete' => 'deleted',
        'enablecolumns' => array(
            'disabled' => 'hidden',
            'starttime' => 'starttime',
            'endtime' => 'endtime',
        ),
        'searchFields' => 'name,description,expiry,hall,date_created,creator,barcode,',
        'dynamicConfigFile' => t3lib_extMgm::extPath($_EXTKEY) . 'Configuration/TCA/Coupon.php',
        'iconfile' => t3lib_extMgm::extRelPath($_EXTKEY) . 'Resources/Public/Icons/tx_bpscoupons_domain_model_coupon.gif'
    ),
);



t3lib_extMgm::addLLrefForTCAdescr('tx_bpscoupons_domain_model_usedcoupon', 'EXT:bpscoupons/Resources/Private/Language/locallang_csh_tx_bpscoupons_domain_model_usedcoupon.xml');
t3lib_extMgm::allowTableOnStandardPages('tx_bpscoupons_domain_model_usedcoupon');
$TCA['tx_bpscoupons_domain_model_usedcoupon'] = array(
    'ctrl' => array(
        'title' => 'LLL:EXT:bpscoupons/Resources/Private/Language/locallang_db.xml:tx_bpscoupons_domain_model_usedcoupon',
        'label' => 'user',
        'tstamp' => 'tstamp',
        'crdate' => 'crdate',
        'cruser_id' => 'cruser_id',
        'dividers2tabs' => TRUE,

        'versioningWS' => 2,
        'versioning_followPages' => TRUE,
        'origUid' => 't3_origuid',
        'languageField' => 'sys_language_uid',
        'transOrigPointerField' => 'l10n_parent',
        'transOrigDiffSourceField' => 'l10n_diffsource',
        'delete' => 'deleted',
        'enablecolumns' => array(
            'disabled' => 'hidden',
            'starttime' => 'starttime',
            'endtime' => 'endtime',
        ),
        'searchFields' => 'user,coupon,guest,',
        'dynamicConfigFile' => t3lib_extMgm::extPath($_EXTKEY) . 'Configuration/TCA/Usedcoupon.php',
        'iconfile' => t3lib_extMgm::extRelPath($_EXTKEY) . 'Resources/Public/Icons/tx_bpscoupons_domain_model_usedcoupon.gif'
    ),
);


?>

如果发生这种情况,很可能您的对象没有持久化。通常,Extbase会在请求结束后保存对对象的更改。但是,如果您以JSON的形式返回响应,然后退出操作,则不会调用persistenceManager

您可以通过将persistenceManager注入控制器来手动持久化:

/**
* @var Tx_Extbase_Persistence_Manager
*/
protected $persistenceManager;

/**
* @param Tx_Extbase_Persistence_Manager $persistanceManager
* @return void
*/
public function injectPersistenceManager(Tx_Extbase_Persistence_Manager $persistenceManager) {
  $this->persistenceManager = $persistenceManager;
}
然后在添加新对象后调用它:

$persistenceManager->persistAll();
在TYPO3 4.7+中,您可以在$persistenceManager的文档注释中使用@inject注释来注入persistenceManager,而不需要注入函数


如果这不能解决问题,那么您的TCA可能有问题。

您是否在UsedCupons表中为您的字段设置了propper TCA配置?可能没有,但我尝试过调整它,我无法将其添加到extension builder中的扩展中,因为每当我尝试保存时,它都会崩溃。所以我在一个新的扩展中创建了这个模型,并试图复制它。我将用TCA更新我的Q。在Q中更新了一点我的TCA。但仍然不工作。直到明天…最好向我们展示您的
Tx\u bpshopons\u Domain\u Model\u usedcoon
作为一般性评论:您认为有必要拥有一个模型“优惠券”和“usedcoon”吗?如果只有一个模型的“优惠券”带有使用过的布尔值或使用过的日期和“使用过的用户”不是更好吗?嗨,Lorenz,现在尝试了,但仍然没有运气。记录会像以前一样保存,并且用户和优惠券字段为空。是的,它在我的UsedCoon tca中,拼写错误-tx_bpshoupon。。。应该是tx_BPSChopons。。。