Pregunta

Why won't my user and coupon objects get saved to the database when a new record is created?

I am using typo3 v 4.5.30 and making a little extension (my first) to manage some coupons. When I create a coupon I save the creator (a frontenduser) and it gets saved to the DB correctly. But when I do the same thing for a coupon user that user ( and the coupon ) do not get saved to the db. Consider this code frag which attempts to save the user and the coupon in a usedcoupon table. The usedcoupon table basically just has 2 columns one for the user and one for the coupon.

To get a usedcoupon object I called the objectmanagers create method. The user and coupon objects I already have and look right when I var_dump them. Even when I get them from the usedcoupon object they look ok but they don't get saved to the db even when the new record gets created. This code in in my CouponController in an action method.

             $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

Thanks

PS here is my TCA from Usedcoupon.php

    <?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 adding usedcoupon model code:

    <?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;
}

}
?>

PPPS: I tried adding a basic text field for email addresses but it turns out they don't get saved either. I had thought the issue was that the user and coupon filed were references to rows in other tables but now it turns out that simpler things do not get saved either.

PP PP S: may as well look into my ext_tables file too:

<?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'
    ),
);


?>
¿Fue útil?

Solución

If that happens, most probably your objects are not persisted. Normally Extbase persists changes to objects after the end of a request. But if you e.g. return your response as JSON and then exit your action, the persistenceManager is not called.

You can persist manually by injecting the persistenceManager to your controller:

/**
* @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;
}

and then call it after you added the new object:

$persistenceManager->persistAll();

In TYPO3 4.7+, you can use the @inject annotation in the doc comment of $persistenceManager to inject the persistenceManager and don't need the inject function.

If this doesn't solve the problem, maybe there's a problem with your TCA.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top