【问题标题】:TYPO3 object storage is emptyTYPO3 对象存储为空
【发布时间】:2014-12-26 16:29:23
【问题描述】:

我想宣传从一个模型到另一个模型的关系。

/**
 * @var \TYPO3\CMS\Extbase\Object\ObjectManagerInterface
 * @inject
 */
protected $objectManager;



/**
 * action create
 *
 * @param \ReRe\Rere\Domain\Model\Modul $newModul
 * @return void
 */
public function createAction(\ReRe\Rere\Domain\Model\Modul $newModul) {
    $this->addFlashMessage('The object was created. Please be aware that this action is publicly accessible unless you implement an access check. See <a href="http://wiki.typo3.org/T3Doc/Extension_Builder/Using_the_Extension_Builder#1._Model_the_domain" target="_blank">Wiki</a>', '', \TYPO3\CMS\Core\Messaging\AbstractMessage::ERROR);
    $this->modulRepository->add($newModul);
    // Erzeugt ein Leeres Fach
    $fachHelper = new \ReRe\Rere\Domain\Model\Fach();


    $fach = $this->objectManager->create('\ReRe\Rere\Domain\Model\Fach');


    // Fach Werte setzen
    $fach->setFachname($this->request->getArgument('fachname'));
    $fach->setFachnr($this->request->getArgument('fachnummer'));
    $fach->setPruefer($this->request->getArgument('pruefer'));
    $fach->setNotenschema($this->request->getArgument('notenschema'));
    // Fach einem Modul zuordnen

    $fach->setModulnr($newModul->getModulnr());
    //$request = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance("\ReRe\Rere\Domain\Model\Fach");
    //\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($newModul);
    // Fach speichern
    $this->fachRepository->add($fach);

    $newModul->addFach($fach);
    $this->redirect('list');
}

在模块中的数据库中,关系计数器将增加...

数据库如下所示:

但如果我想像这样渲染视图:

<f:for each="{moduls}" as="modul">

{modul.modulname}

<f:for each="{modul.fach}" as="fach">
{fach.fachname} 

没有打印任何对象..

如果我做 &lt;f:debug&gt; of modul 我得到了这个:

这里是 TCA 配置:

模块:

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

$GLOBALS['TCA']['tx_rere_domain_model_modul'] = array(
   'ctrl' => $GLOBALS['TCA']['tx_rere_domain_model_modul']['ctrl'],
   'interface' => array(
       'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, modulnr, modulname, gueltigkeitszeitraum, fach',
),
'types' => array(
    '1' => array('showitem' => 'sys_language_uid;;;;1-1-1, l10n_parent, l10n_diffsource,    hidden;;1, modulnr, modulname, gueltigkeitszeitraum, fach, --div--;LLL:EXT:cms/locallang_ttc.xlf:tabs.access, starttime, endtime'),
),
'palettes' => array(
    '1' => array('showitem' => ''),
),
'columns' => array(
    'sys_language_uid' => array(
        'exclude' => 1,
        'label' => 'LLL:EXT:lang/locallang_general.xlf: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.xlf:LGL.allLanguages', -1),
                array('LLL:EXT:lang/locallang_general.xlf:LGL.default_value', 0)
            ),
        ),
    ),
    'l10n_parent' => array(
        'displayCond' => 'FIELD:sys_language_uid:>:0',
        'exclude' => 1,
        'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.l18n_parent',
        'config' => array(
            'type' => 'select',
            'items' => array(
                array('', 0),
            ),
            'foreign_table' => 'tx_rere_domain_model_modul',
            'foreign_table_where' => 'AND tx_rere_domain_model_modul.pid=###CURRENT_PID### AND tx_rere_domain_model_modul.sys_language_uid IN (-1,0)',
        ),
    ),
    'l10n_diffsource' => array(
        'config' => array(
            'type' => 'passthrough',
        ),
    ),
    't3ver_label' => array(
        'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.versionLabel',
        'config' => array(
            'type' => 'input',
            'size' => 30,
            'max' => 255,
        )
    ),
    'hidden' => array(
        'exclude' => 1,
        'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.hidden',
        'config' => array(
            'type' => 'check',
        ),
    ),
    'starttime' => array(
        'exclude' => 1,
        'l10n_mode' => 'mergeIfNotBlank',
        'label' => 'LLL:EXT:lang/locallang_general.xlf: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.xlf: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'))
            ),
        ),
    ),
    'modulnr' => array(
        'exclude' => 1,
        'label' => 'LLL:EXT:rere/Resources/Private/Language/locallang_db.xlf:tx_rere_domain_model_modul.modulnr',
        'config' => array(
            'type' => 'input',
            'size' => 30,
            'eval' => 'trim'
        ),
    ),
    'modulname' => array(
        'exclude' => 1,
        'label' => 'LLL:EXT:rere/Resources/Private/Language/locallang_db.xlf:tx_rere_domain_model_modul.modulname',
        'config' => array(
            'type' => 'input',
            'size' => 30,
            'eval' => 'trim,required'
        ),
    ),
    'gueltigkeitszeitraum' => array(
        'exclude' => 1,
        'label' => 'LLL:EXT:rere/Resources/Private/Language/locallang_db.xlf:tx_rere_domain_model_modul.gueltigkeitszeitraum',
        'config' => array(
            'type' => 'input',
            'size' => 30,
            'eval' => 'trim'
        ),
    ),
    'fach' => array(
        'exclude' => 1,
        'label' => 'LLL:EXT:rere/Resources/Private/Language/locallang_db.xlf:tx_rere_domain_model_modul.fach',
        'config' => array(
            'type' => 'inline',
            'foreign_table' => 'tx_rere_domain_model_fach',
            'foreign_field' => 'modulnr',
            'maxitems' => 9999,
            'appearance' => array(
                'collapseAll' => 0,
                'levelLinksPosition' => 'top',
                'showSynchronizationLink' => 1,
                'showPossibleLocalizationRecords' => 1,
                'showAllLocalizationLink' => 1
            ),
        ),
    ),
),
);

还有 TCA 法赫

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

$GLOBALS['TCA']['tx_rere_domain_model_fach'] = array(
'ctrl' => $GLOBALS['TCA']['tx_rere_domain_model_fach']['ctrl'],
'interface' => array(
    'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, fachnr, fachname, pruefer, notenschema, modulnr, matrikelnr',
),
'types' => array(
    '1' => array('showitem' => 'sys_language_uid;;;;1-1-1, l10n_parent, l10n_diffsource, hidden;;1, fachnr, fachname, pruefer, notenschema, modulnr, matrikelnr, --div--;LLL:EXT:cms/locallang_ttc.xlf:tabs.access, starttime, endtime'),
),
'palettes' => array(
    '1' => array('showitem' => ''),
),
'columns' => array(

    'sys_language_uid' => array(
        'exclude' => 1,
        'label' => 'LLL:EXT:lang/locallang_general.xlf: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.xlf:LGL.allLanguages', -1),
                array('LLL:EXT:lang/locallang_general.xlf:LGL.default_value', 0)
            ),
        ),
    ),
    'l10n_parent' => array(
        'displayCond' => 'FIELD:sys_language_uid:>:0',
        'exclude' => 1,
        'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.l18n_parent',
        'config' => array(
            'type' => 'select',
            'items' => array(
                array('', 0),
            ),
            'foreign_table' => 'tx_rere_domain_model_fach',
            'foreign_table_where' => 'AND tx_rere_domain_model_fach.pid=###CURRENT_PID### AND tx_rere_domain_model_fach.sys_language_uid IN (-1,0)',
        ),
    ),
    'l10n_diffsource' => array(
        'config' => array(
            'type' => 'passthrough',
        ),
    ),

    't3ver_label' => array(
        'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.versionLabel',
        'config' => array(
            'type' => 'input',
            'size' => 30,
            'max' => 255,
        )
    ),

    'hidden' => array(
        'exclude' => 1,
        'label' => 'LLL:EXT:lang/locallang_general.xlf:LGL.hidden',
        'config' => array(
            'type' => 'check',
        ),
    ),
    'starttime' => array(
        'exclude' => 1,
        'l10n_mode' => 'mergeIfNotBlank',
        'label' => 'LLL:EXT:lang/locallang_general.xlf: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.xlf: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'))
            ),
        ),
    ),

    'fachnr' => array(
        'exclude' => 1,
        'label' => 'LLL:EXT:rere/Resources/Private/Language/locallang_db.xlf:tx_rere_domain_model_fach.fachnr',
        'config' => array(
            'type' => 'input',
            'size' => 30,
            'eval' => 'trim'
        ),
    ),
    'fachname' => array(
        'exclude' => 1,
        'label' => 'LLL:EXT:rere/Resources/Private/Language/locallang_db.xlf:tx_rere_domain_model_fach.fachname',
        'config' => array(
            'type' => 'input',
            'size' => 30,
            'eval' => 'trim,required'
        ),
    ),
    'pruefer' => array(
        'exclude' => 1,
        'label' => 'LLL:EXT:rere/Resources/Private/Language/locallang_db.xlf:tx_rere_domain_model_fach.pruefer',
        'config' => array(
            'type' => 'input',
            'size' => 30,
            'eval' => 'trim'
        ),
    ),
    'notenschema' => array(
        'exclude' => 1,
        'label' => 'LLL:EXT:rere/Resources/Private/Language/locallang_db.xlf:tx_rere_domain_model_fach.notenschema',
        'config' => array(
            'type' => 'input',
            'size' => 30,
            'eval' => 'trim,required'
        ),
    ),
    'modulnr' => array(
        'exclude' => 1,
        'label' => 'LLL:EXT:rere/Resources/Private/Language/locallang_db.xlf:tx_rere_domain_model_fach.modulnr',
        'config' => array(
            'type' => 'input',
            'size' => 30,
            'eval' => 'trim,required'
        ),
    ),
    'matrikelnr' => array(
        'exclude' => 1,
        'label' => 'LLL:EXT:rere/Resources/Private/Language/locallang_db.xlf:tx_rere_domain_model_fach.matrikelnr',
        'config' => array(
            'type' => 'select',
            'foreign_table' => 'tx_rere_domain_model_pruefling',
            'MM' => 'tx_rere_fach_pruefling_mm',
            'size' => 10,
            'autoSizeMax' => 30,
            'maxitems' => 9999,
            'multiple' => 0,
            'wizards' => array(
                '_PADDING' => 1,
                '_VERTICAL' => 1,
                'edit' => array(
                    'type' => 'popup',
                    'title' => 'Edit',
                    'script' => 'wizard_edit.php',
                    'icon' => 'edit2.gif',
                    'popup_onlyOpenIfSelected' => 1,
                    'JSopenParams' => 'height=350,width=580,status=0,menubar=0,scrollbars=1',
                    ),
                'add' => Array(
                    'type' => 'script',
                    'title' => 'Create new',
                    'icon' => 'add.gif',
                    'params' => array(
                        'table' => 'tx_rere_domain_model_pruefling',
                        'pid' => '###CURRENT_PID###',
                        'setValue' => 'prepend'
                        ),
                    'script' => 'wizard_add.php',
                ),
            ),
        ),
    ),

    'modul' => array(
        'config' => array(
            'type' => 'passthrough',
        ),
    ),
    'note' => array(
        'config' => array(
            'type' => 'passthrough',
        ),
    ),
),
);

【问题讨论】:

    标签: typo3 relation fluid extbase typo3-6.2.x


    【解决方案1】:

    模型类看起来不错,所有注释似乎都正确。

    能否请您为 Modul 和 Fach 发布您的 TCA 配置(两者的关系条目应该足够了)。

    快速提问,你能在后端看到两个对象之间的关系吗?如果可以,你能从两边看到吗? 转到 BE 并使用列表工具检查您是否可以在“Modul”对象中看到相关的“Fach”对象,反之亦然。

    可能 TCA 关系没有正确设置,您只能从一侧访问该关系。

    您从哪一侧创建了关系(Modul->Fach 或 Fach->Modul)? 当然,无论哪种方式,它都应该工作。

    更新 1

    您的表“tx_rere_domain_model_fach”中的“modulnr”列是否包含正确的 Modul-UID?

    -> 为了加快这个过程,你能给我一个你的扩展的下载链接吗?然后我会在测试系统上安装它,我们会很快找出问题所在。

    更新 2

    我发现您的扩展程序出了什么问题。在创建一个新的 Modul 和 Fach 之后,类 \ReRe\Rere\Controller\ModulController 处理表单数据。在第 116 行

    $fach->setModulnr($newModul->getModulnr());
    

    引用的值,应该是Modul的UID设置为Modulnr。由于对外表的引用配置为UID,所以这里需要设置Modul的UID。将行更改为以下内容即可:

    $fach->setModulnr($newModul->getUid());
    

    您必须在创建新 Fach-Modul 关系的每个控制器操作中更改此设置。所以这只是你需要做的一个例子。

    旁注

    作为附加提示,您可能想了解如何在 Extbase 中处理表单数据的最佳实践。

    这样的电话

    $fach->setFachnr($this->request->getArgument('fachnummer'));
    

    会起作用,但在注射时会打开一个痛苦的世界,因为没有验证等。

    设置基本验证并使代码更具可读性的一种非常简单快捷的方法是在控制器操作中使用注释和参数。因此,与其自己获取参数,不如让框架为您工作:

    /**
     * action create
     *
     * @param \ReRe\Rere\Domain\Model\Modul $newModul
     * @param string                        $fachname
     * @param int                           $fachnummer
     */
    public function createAction(\ReRe\Rere\Domain\Model\Modul $newModul, $fachname, $fachnummer) {
    ...
    

    如果你想让一个参数可选,只需在方法调用中给它一个值:

    public function createAction(\ReRe\Rere\Domain\Model\Modul $newModul, $fachname = "foo", $fachnummer="bar") {
    ...
    

    正如我所说,这只是一个提示,您可能需要考虑 :)

    【讨论】:

    • 您好,感谢您的帮助。我添加了 Domain/Modul.php 和两个 TCA-Configs。在我的第一个 Posting 中创建的动作是在 ModulController.php 中。整个事情是一个后端 Modul。我在哪里可以查看后端的关系?
    • 要检查您只需要登录后端的关系,请转到左侧的“列表”工具,然后从页面树中选择包含您的实体的存储系统文件夹。如果您不确定实体的存储位置,只需检查您的数据库表,“pid”列会为您提供存储文件夹的 UID。然后,您只需在 TYPO3 后端的搜索字段中键入 UID,您应该会找到包含您的实体的文件夹。要检查关系,只需编辑一个 Modul 对象并查看 Fach 对象是否存在,与另一侧相同。
    • 没有列表模块(或者你的意思是 web 下的那个)你看过 tca 配置吗?
    • 列表模块应该是“web”类别中的第三个模块。默认情况下,您有“页面、视图、列表、功能...”。我现在就去看看 TCA
    • 我想我不保存uid,我保存整个对象? .. 这是链接,dl.dropboxusercontent.com/u/3756778/rere.zip 请告诉我你什么时候下载的
    【解决方案2】:

    请检查 ObjectStorage 是否与模型中的正确类相关。有时,extensionbuilder 确实设置了 ObjectStorage,但会弄乱注释。

    检查 ReRe\Rere\Domain\Model\Modul 类中“fach”的注释是否包含引用的类。它应该是这样的:

    @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage

    如果假设你看起来像这样,这是错误的并导致 FE 中的 ObjectStorage 为空: @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage

    查看 ObjectStorage 包含的类是如何丢失的。

    【讨论】:

    • 感谢您的回答。我的模型看起来像这样:/** * fach * * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage&lt;\ReRe\Rere\Domain\Model\Fach&gt; * @cascade remove */ protected $fach = NULL; 看起来还可以吗?你还有其他想法吗?为什么我有这个问题?
    • 是的,看起来没问题。您能否发布整个类 \ReRe\Rere\Domain\Model\Modul 可能是对象存储的初始化或其他注释(例如 getter 注释)有问题
    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多