Commit 8b5bc3e9 authored by Anja Leichsenring's avatar Anja Leichsenring Committed by Christian Kuhn
Browse files

[TASK] Extract symmetric mn scenario from ext:irre_tutorial

The scenario provided by tables tx_irretutorial_mn_sym_* gets
its own test extension and gets loaded where needed.

Resolves: #96445
Releases: main, 11.5
Change-Id: I55a9c3ba1a5e1d238279a641f4e5380d936c23c9
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/72821


Tested-by: core-ci's avatarcore-ci <typo3@b13.com>
Tested-by: Stefan Bürk's avatarStefan Bürk <stefan@buerk.tech>
Tested-by: Christian Kuhn's avatarChristian Kuhn <lolli@schwarzbu.ch>
Reviewed-by: Stefan Bürk's avatarStefan Bürk <stefan@buerk.tech>
Reviewed-by: Christian Kuhn's avatarChristian Kuhn <lolli@schwarzbu.ch>
parent 362b74f9
......@@ -24,7 +24,6 @@ in the "IRRE Tutorial" module. The script looks for a page alias "irre_tutorial_
successfully found, this branch from your TYPO3 installation.
-----------------------------
2. Usage
---------------------------
......@@ -33,20 +32,10 @@ You can just do, what ever you'd like to. The ext_tables.php and tca.php have a
their filenames. This should help you to find the case you're looking fore faster. See the following
description what these strings (e.g. like "tx_irretutorial_<string>_hotel or tca.<string>.php) mean:
* mnasym: m:n bidirectional asymmetric relations using intermediate table
* mnsym: m:n bidirectional symmetric relations using intermediate table
* mnattr: m:n bidirectional asymmetric attributed relations using intermediate table
* mnmmasym: m:n bidirectional asymmetric relations using the default MM feature of TYPO3
-----------------------------
3. To-Do
---------------------------
...
-----------------------------
4. Links
---------------------------
......
......@@ -29,12 +29,6 @@
<trans-unit id="tx_irretutorial_mnasym_price" resname="tx_irretutorial_mnasym_price">
<source>m:n ASym: Prices</source>
</trans-unit>
<trans-unit id="tx_irretutorial_mnsym_hotel" resname="tx_irretutorial_mnsym_hotel">
<source>m:n Sym: Hotels</source>
</trans-unit>
<trans-unit id="tx_irretutorial_mnsym_hotel_rel" resname="tx_irretutorial_mnsym_hotel_rel">
<source>m:n Sym: Hotels&lt;-&gt;Hotels</source>
</trans-unit>
<trans-unit id="tx_irretutorial_mnattr_hotel" resname="tx_irretutorial_mnattr_hotel">
<source>m:n Attr: Hotels</source>
</trans-unit>
......
......@@ -13,5 +13,5 @@ ExtensionManagementUtility::allowTableOnStandardPages(
'tx_irretutorial_mnasym_offer,tx_irretutorial_mnasym_price,tx_irretutorial_mnattr_offer'
);
ExtensionManagementUtility::allowTableOnStandardPages(
'tx_irretutorial_mnsym_hotel,tx_irretutorial_mnsym_hotel_rel,tx_irretutorial_mnattr_hotel,tx_irretutorial_mnattr_hotel_offer_rel'
'tx_irretutorial_mnattr_hotel,tx_irretutorial_mnattr_hotel_offer_rel'
);
......@@ -48,31 +48,6 @@ CREATE TABLE tx_irretutorial_mnasym_price
price varchar(255) DEFAULT '0.00' NOT NULL
);
#######################################################################################################################
# mnsym: m:n bidirectional symmetric relations using intermediate table
#######################################################################################################################
#
# Table structure for table 'tx_irretutorial_mnsym_hotel'
#
CREATE TABLE tx_irretutorial_mnsym_hotel
(
title tinytext NOT NULL,
branches int(11) DEFAULT '0' NOT NULL
);
#
# Table structure for table 'tx_irretutorial_mnsym_hotel_rel'
#
CREATE TABLE tx_irretutorial_mnsym_hotel_rel
(
hotelid int(11) DEFAULT '0' NOT NULL,
branchid int(11) DEFAULT '0' NOT NULL,
hotelsort int(10) DEFAULT '0' NOT NULL,
branchsort int(10) DEFAULT '0' NOT NULL
);
#######################################################################################################################
# mnattr: m:n bidirectional (anti-)symmetric attributed relations using intermediate table
......
......@@ -4,7 +4,7 @@ declare(strict_types=1);
return [
'ctrl' => [
'title' => 'LLL:EXT:irre_tutorial/Resources/Private/Language/locallang_db.xlf:tx_irretutorial_mnsym_hotel',
'title' => 'LLL:EXT:test_irre_mnsymmetric/Resources/Private/Language/locallang_db.xlf:tx_testirremnsymmetric_hotel',
'label' => 'title',
'tstamp' => 'tstamp',
'crdate' => 'crdate',
......@@ -18,7 +18,7 @@ return [
'enablecolumns' => [
'disabled' => 'hidden',
],
'iconfile' => 'EXT:irre_tutorial/Resources/Public/Icons/icon_tx_irretutorial_hotel.gif',
'iconfile' => 'EXT:test_irre_mnsymmetric/Resources/Public/Icons/icon_hotel.gif',
'versioningWS' => true,
'origUid' => 't3_origuid',
],
......@@ -39,8 +39,8 @@ return [
'items' => [
['', 0],
],
'foreign_table' => 'tx_irretutorial_mnsym_hotel',
'foreign_table_where' => 'AND {#tx_irretutorial_mnsym_hotel}.{#pid}=###CURRENT_PID### AND {#tx_irretutorial_mnsym_hotel}.{#sys_language_uid} IN (-1,0)',
'foreign_table' => 'tx_testirremnsymmetric_hotel',
'foreign_table_where' => 'AND {#tx_testirremnsymmetric_hotel}.{#pid}=###CURRENT_PID### AND {#tx_testirremnsymmetric_hotel}.{#sys_language_uid} IN (-1,0)',
'default' => 0,
],
],
......@@ -61,7 +61,7 @@ return [
'title' => [
'exclude' => true,
'l10n_mode' => 'prefixLangTitle',
'label' => 'LLL:EXT:irre_tutorial/Resources/Private/Language/locallang_db.xlf:tx_irretutorial_hotel.title',
'label' => 'LLL:EXT:test_irre_mnsymmetric/Resources/Private/Language/locallang_db.xlf:tx_testirremnsymmetric_hotel.title',
'config' => [
'type' => 'input',
'size' => 30,
......@@ -70,10 +70,10 @@ return [
],
'branches' => [
'exclude' => true,
'label' => 'LLL:EXT:irre_tutorial/Resources/Private/Language/locallang_db.xlf:tx_irretutorial_hotel.branches',
'label' => 'LLL:EXT:test_irre_mnsymmetric/Resources/Private/Language/locallang_db.xlf:tx_testirremnsymmetric_hotel.branches',
'config' => [
'type' => 'inline',
'foreign_table' => 'tx_irretutorial_mnsym_hotel_rel',
'foreign_table' => 'tx_testirremnsymmetric_hotel_rel',
'foreign_field' => 'hotelid',
'foreign_sortby' => 'hotelsort',
'foreign_label' => 'branchid',
......@@ -91,8 +91,8 @@ return [
],
'types' => [
'0' => ['showitem' =>
'--div--;LLL:EXT:irre_tutorial/Resources/Private/Language/locallang_db.xlf:tabs.general, title, branches,' .
'--div--;LLL:EXT:irre_tutorial/Resources/Private/Language/locallang_db.xlf:tabs.visibility, sys_language_uid, l18n_parent, l18n_diffsource, hidden',
'--div--;LLL:EXT:test_irre_mnsymmetric/Resources/Private/Language/locallang_db.xlf:tabs.general, title, branches,' .
'--div--;LLL:EXT:test_irre_mnsymmetric/Resources/Private/Language/locallang_db.xlf:tabs.visibility, sys_language_uid, l18n_parent, l18n_diffsource, hidden',
],
],
'palettes' => [
......
......@@ -4,7 +4,7 @@ declare(strict_types=1);
return [
'ctrl' => [
'title' => 'LLL:EXT:irre_tutorial/Resources/Private/Language/locallang_db.xlf:tx_irretutorial_mnsym_hotel_rel',
'title' => 'LLL:EXT:test_irre_mnsymmetric/Resources/Private/Language/locallang_db.xlf:tx_testirremnsymmetric_hotel_rel',
'label' => 'uid',
'tstamp' => 'tstamp',
'crdate' => 'crdate',
......@@ -17,7 +17,7 @@ return [
'enablecolumns' => [
'disabled' => 'hidden',
],
'iconfile' => 'EXT:irre_tutorial/Resources/Public/Icons/icon_tx_irretutorial_hotel_rel.gif',
'iconfile' => 'EXT:test_irre_mnsymmetric/Resources/Public/Icons/icon_hotel_rel.gif',
'versioningWS' => true,
'origUid' => 't3_origuid',
],
......@@ -38,8 +38,8 @@ return [
'items' => [
['', 0],
],
'foreign_table' => 'tx_irretutorial_mnsym_hotel_rel',
'foreign_table_where' => 'AND {#tx_irretutorial_mnsym_hotel_rel}.{#pid}=###CURRENT_PID### AND {#tx_irretutorial_mnsym_hotel_rel}.{#sys_language_uid} IN (-1,0)',
'foreign_table' => 'tx_testirremnsymmetric_hotel_rel',
'foreign_table_where' => 'AND {#tx_testirremnsymmetric_hotel_rel}.{#pid}=###CURRENT_PID### AND {#tx_testirremnsymmetric_hotel_rel}.{#sys_language_uid} IN (-1,0)',
'default' => 0,
],
],
......@@ -58,21 +58,21 @@ return [
],
],
'hotelid' => [
'label' => 'LLL:EXT:irre_tutorial/Resources/Private/Language/locallang_db.xlf:tx_irretutorial_hotel_rel.hotelid',
'label' => 'LLL:EXT:test_irre_mnsymmetric/Resources/Private/Language/locallang_db.xlf:tx_testirremnsymmetric_hotel_rel.hotelid',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'foreign_table' => 'tx_irretutorial_mnsym_hotel',
'foreign_table' => 'tx_testirremnsymmetric_hotel',
'maxitems' => 1,
'default' => 0,
],
],
'branchid' => [
'label' => 'LLL:EXT:irre_tutorial/Resources/Private/Language/locallang_db.xlf:tx_irretutorial_hotel_rel.branchid',
'label' => 'LLL:EXT:test_irre_mnsymmetric/Resources/Private/Language/locallang_db.xlf:tx_irretutorial_hotel_rel.branchid',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'foreign_table' => 'tx_irretutorial_mnsym_hotel',
'foreign_table' => 'tx_testirremnsymmetric_hotel',
'maxitems' => 1,
'default' => 0,
],
......@@ -90,8 +90,8 @@ return [
],
'types' => [
'0' => ['showitem' =>
'--div--;LLL:EXT:irre_tutorial/Resources/Private/Language/locallang_db.xlf:tabs.general, title, hotelid, branchid,' .
'--div--;LLL:EXT:irre_tutorial/Resources/Private/Language/locallang_db.xlf:tabs.visibility, sys_language_uid, l18n_parent, l18n_diffsource, hidden, hotelsort, branchsort',
'--div--;LLL:EXT:test_irre_mnsymmetric/Resources/Private/Language/locallang_db.xlf:tabs.general, title, hotelid, branchid,' .
'--div--;LLL:EXT:test_irre_mnsymmetric/Resources/Private/Language/locallang_db.xlf:tabs.visibility, sys_language_uid, l18n_parent, l18n_diffsource, hidden, hotelsort, branchsort',
],
],
'palettes' => [
......
<?xml version="1.0" encoding="UTF-8"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file source-language="en" datatype="plaintext" original="EXT:test_irre_mnsymmetric/Resources/Private/Language/locallang_db.xlf" date="2020-06-03T15:50:00Z" product-name="test_irre_mnsymmetric">
<header/>
<body>
<trans-unit id="tabs.general" resname="tabs.general">
<source>General</source>
</trans-unit>
<trans-unit id="tabs.visibility" resname="tabs.visibility">
<source>Visibility</source>
</trans-unit>
<trans-unit id="tx_testirremnsymmetric_hotel" resname="tx_testirremnsymmetric_hotel">
<source>m:n Sym: Hotels</source>
</trans-unit>
<trans-unit id="tx_testirremnsymmetric_hotel_rel" resname="tx_testirremnsymmetric_hotel_rel">
<source>m:n Sym: Hotels&lt;-&gt;Hotels</source>
</trans-unit>
<trans-unit id="tx_testirremnsymmetric_hotel.title" resname="tx_testirremnsymmetric_hotel.title">
<source>Title:</source>
</trans-unit>
<trans-unit id="tx_testirremnsymmetric_hotel.branches" resname="tx_testirremnsymmetric_hotel.branches">
<source>Branches:</source>
</trans-unit>
<trans-unit id="tx_testirremnsymmetric_hotel_rel" resname="tx_testirremnsymmetric_hotel_rel">
<source>Hotels&lt;-&gt;Hotels</source>
</trans-unit>
<trans-unit id="tx_testirremnsymmetric_hotel_rel.hotelid" resname="tx_testirremnsymmetric_hotel_rel.hotelid">
<source>Hotel:</source>
</trans-unit>
<trans-unit id="tx_testirremnsymmetric_hotel_rel.branchid" resname="tx_testirremnsymmetric_hotel_rel.branchid">
<source>Branch:</source>
</trans-unit>
</body>
</file>
</xliff>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path fill="#FF8700" d="M0 0h64v64H0z"/><path fill="#FFF" d="M42.8 32.8c-3.6 0-8.1-10.1-8.1-15.1 0-2.3.9-2.7 3.2-2.7 5.5 0 11 .9 11 4-.1 6.2-4 13.8-6.1 13.8zM28.5 18.5c0 5 6.4 20.2 10.7 20.2.5 0 .9-.1 1.4-.2-3.8 6.1-8.4 10.6-11.2 10.6-5.9 0-14.3-17.9-14.3-25.7 0-1.2.3-2.2.7-2.8 2-2.5 8.4-4.4 13.7-5-.6.4-1 1-1 2.9z"/></svg>
\ No newline at end of file
<?php
declare(strict_types=1);
$EM_CONF[$_EXTKEY] = [
'title' => 'DataHandler Testing test_irre_mnsymmetric',
'description' => 'DataHandler Testing test_irre_mnsymmetric',
'category' => 'example',
'version' => '12.0.0',
'state' => 'beta',
'clearCacheOnLoad' => 0,
'author' => 'Anja Leichsenring',
'author_email' => 'aleichsenring@ab-softlab.de',
'author_company' => '',
'constraints' => [
'depends' => [
'typo3' => '12.0.0',
'workspaces' => '12.0.0',
],
'conflicts' => [],
'suggests' => [],
],
];
<?php
declare(strict_types=1);
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
ExtensionManagementUtility::allowTableOnStandardPages(
'tx_testirremnsymmetric_hotel,tx_testirremnsymmetric_hotel_rel'
);
CREATE TABLE tx_testirremnsymmetric_hotel
(
title tinytext NOT NULL,
branches int(11) DEFAULT '0' NOT NULL
);
CREATE TABLE tx_testirremnsymmetric_hotel_rel
(
hotelid int(11) DEFAULT '0' NOT NULL,
branchid int(11) DEFAULT '0' NOT NULL,
hotelsort int(10) DEFAULT '0' NOT NULL,
branchsort int(10) DEFAULT '0' NOT NULL
);
......@@ -219,7 +219,7 @@ return [
// @todo: Broken. A symmetric MM can not have MM_opposite_field pointing to itself. A symmetric MM
// is probably not supported at all and also has no functional test coverage. We should play
// around with this scenario, but it's probably better to switch to inline symmetric, see
// tx_irretutorial_mnsym_hotel for an example.
// tx_testirremnsymmetric_hotel for an example.
'MM' => 'tx_blogexample_post_post_mm',
'MM_opposite_field' => 'related_posts',
],
......
......@@ -30,6 +30,7 @@ class IrreTutorialRecordsTest extends AbstractImportExportTestCase
protected $testExtensionsToLoad = [
'typo3/sysext/core/Tests/Functional/Fixtures/Extensions/test_irre_csv',
'typo3/sysext/core/Tests/Functional/Fixtures/Extensions/test_irre_mm',
'typo3/sysext/core/Tests/Functional/Fixtures/Extensions/test_irre_mnsymmetric',
'typo3/sysext/core/Tests/Functional/Fixtures/Extensions/test_irre_foreignfield',
'typo3/sysext/core/Tests/Functional/Fixtures/Extensions/irre_tutorial',
];
......
......@@ -74,12 +74,12 @@
,1,1,1,0,0,256,0,0,"Price 1.1.1 (m:n (MM) ASym)",567.00,0,,
,2,1,1,0,0,128,0,0,"Price 1.2.2 (m:n (MM) ASym)",567.00,0,,
,3,1,1,0,0,64,0,0,"Price (m:n (MM) ASym)",223.00,0,,
"tx_irretutorial_mnsym_hotel",,,,,,,,,,,,,
"tx_testirremnsymmetric_hotel",,,,,,,,,,,,,
,"uid","pid","cruser_id","sys_language_uid","l18n_parent","sorting","deleted","hidden","title","branches",,,
,1,1,1,0,0,256,0,0,"Hotel 1 (mm sym)",2,,,
,2,1,1,0,0,128,0,0,"Hotel branch 1.2 (mm sym)",1,,,
,3,1,1,0,0,64,0,0,"Hotel Branch 1.1 (mm sym)",1,,,
"tx_irretutorial_mnsym_hotel_rel",,,,,,,,,,,,,
"tx_testirremnsymmetric_hotel_rel",,,,,,,,,,,,,
,"uid","pid","cruser_id","sys_language_uid","l18n_parent","deleted","hidden","hotelid","branchid","hotelsort","branchsort",,
,1,1,1,0,0,0,0,1,2,2,0,,
,2,1,1,0,0,0,0,1,3,1,1,,
......@@ -644,7 +644,7 @@
<offers>0</offers>
<sorting>512</sorting>
</tx_testirremm_price>
<tx_irretutorial_mnsym_hotel>
<tx_testirremnsymmetric_hotel>
<uid>1</uid>
<pid>1</pid>
<cruser_id>1</cruser_id>
......@@ -657,8 +657,8 @@
<title>Hotel 1 (mm sym)</title>
<branches>2</branches>
<sorting>128</sorting>
</tx_irretutorial_mnsym_hotel>
<tx_irretutorial_mnsym_hotel>
</tx_testirremnsymmetric_hotel>
<tx_testirremnsymmetric_hotel>
<uid>2</uid>
<pid>1</pid>
<cruser_id>1</cruser_id>
......@@ -671,8 +671,8 @@
<title>Hotel Branch 1.1 (mm sym)</title>
<branches>1</branches>
<sorting>256</sorting>
</tx_irretutorial_mnsym_hotel>
<tx_irretutorial_mnsym_hotel>
</tx_testirremnsymmetric_hotel>
<tx_testirremnsymmetric_hotel>
<uid>3</uid>
<pid>1</pid>
<cruser_id>1</cruser_id>
......@@ -685,8 +685,8 @@
<title>Hotel branch 1.2 (mm sym)</title>
<branches>0</branches>
<sorting>512</sorting>
</tx_irretutorial_mnsym_hotel>
<tx_irretutorial_mnsym_hotel_rel>
</tx_testirremnsymmetric_hotel>
<tx_testirremnsymmetric_hotel_rel>
<uid>1</uid>
<pid>1</pid>
<cruser_id>1</cruser_id>
......@@ -699,8 +699,8 @@
<branchid>2</branchid>
<hotelsort>1</hotelsort>
<branchsort>1</branchsort>
</tx_irretutorial_mnsym_hotel_rel>
<tx_irretutorial_mnsym_hotel_rel>
</tx_testirremnsymmetric_hotel_rel>
<tx_testirremnsymmetric_hotel_rel>
<uid>2</uid>
<pid>1</pid>
<cruser_id>1</cruser_id>
......@@ -713,5 +713,5 @@
<branchid>3</branchid>
<hotelsort>2</hotelsort>
<branchsort>0</branchsort>
</tx_irretutorial_mnsym_hotel_rel>
</tx_testirremnsymmetric_hotel_rel>
</dataset>
......@@ -195,7 +195,7 @@ return [
'price',
'offers',
],
'tx_irretutorial_mnsym_hotel' => [
'tx_testirremnsymmetric_hotel' => [
'cruser_id',
'sys_language_uid',
'l18n_parent',
......@@ -205,7 +205,7 @@ return [
'title',
'branches',
],
'tx_irretutorial_mnsym_hotel_rel' => [
'tx_testirremnsymmetric_hotel_rel' => [
'cruser_id',
'sys_language_uid',
'l18n_parent',
......
......@@ -232,6 +232,82 @@
<softrefs type="array"/>
</rec>
</table>
<table index="tx_testirremnsymmetric_hotel" type="array">
<rec index="2" type="array">
<uid>2</uid>
<pid>1</pid>
<title>Hotel Branch 1.1 (mm sym)</title>
<relations index="rels" type="array">
<element index="tx_testirremnsymmetric_hotel_rel:1" type="array">
<id>1</id>
<table>tx_testirremnsymmetric_hotel_rel</table>
</element>
</relations>
<softrefs type="array"></softrefs>
</rec>
<rec index="3" type="array">
<uid>3</uid>
<pid>1</pid>
<title>Hotel branch 1.2 (mm sym)</title>
<relations index="rels" type="array">
<element index="tx_testirremnsymmetric_hotel_rel:2" type="array">
<id>2</id>
<table>tx_testirremnsymmetric_hotel_rel</table>
</element>
</relations>
<softrefs type="array"></softrefs>
</rec>
<rec index="1" type="array">
<uid>1</uid>
<pid>1</pid>
<title>Hotel 1 (mm sym)</title>
<relations index="rels" type="array">
<element index="tx_testirremnsymmetric_hotel_rel:1" type="array">
<id>1</id>
<table>tx_testirremnsymmetric_hotel_rel</table>
</element>
<element index="tx_testirremnsymmetric_hotel_rel:2" type="array">
<id>2</id>
<table>tx_testirremnsymmetric_hotel_rel</table>
</element>
</relations>
<softrefs type="array"></softrefs>
</rec>
</table>
<table index="tx_testirremnsymmetric_hotel_rel" type="array">
<rec index="1" type="array">
<uid>1</uid>
<pid>1</pid>
<title>1</title>
<relations index="rels" type="array">
<element index="tx_testirremnsymmetric_hotel:1" type="array">
<id>1</id>
<table>tx_testirremnsymmetric_hotel</table>
</element>
<element index="tx_testirremnsymmetric_hotel:2" type="array">
<id>2</id>
<table>tx_testirremnsymmetric_hotel</table>
</element>
</relations>
<softrefs type="array"></softrefs>
</rec>
<rec index="2" type="array">
<uid>2</uid>
<pid>1</pid>
<title>2</title>
<relations index="rels" type="array">
<element index="tx_testirremnsymmetric_hotel:1" type="array">
<id>1</id>
<table>tx_testirremnsymmetric_hotel</table>
</element>
<element index="tx_testirremnsymmetric_hotel:3" type="array">
<id>3</id>
<table>tx_testirremnsymmetric_hotel</table>
</element>
</relations>
<softrefs type="array"></softrefs>
</rec>
</table>
<table index="tx_testirreforeignfield_hotel" type="array">
<rec index="1" type="array">
<uid>1</uid>
......@@ -522,82 +598,6 @@
<softrefs type="array"></softrefs>
</rec>
</table>
<table index="tx_irretutorial_mnsym_hotel" type="array">
<rec index="2" type="array">
<uid>2</uid>
<pid>1</pid>
<title>Hotel Branch 1.1 (mm sym)</title>
<relations index="rels" type="array">
<element index="tx_irretutorial_mnsym_hotel_rel:1" type="array">
<id>1</id>
<table>tx_irretutorial_mnsym_hotel_rel</table>
</element>
</relations>
<softrefs type="array"></softrefs>
</rec>
<rec index="3" type="array">
<uid>3</uid>
<pid>1</pid>
<title>Hotel branch 1.2 (mm sym)</title>
<relations index="rels" type="array">
<element index="tx_irretutorial_mnsym_hotel_rel:2" type="array">
<id>2</id>
<table>tx_irretutorial_mnsym_hotel_rel</table>
</element>
</relations>
<softrefs type="array"></softrefs>
</rec>
<rec index="1" type="array">
<uid>1</uid>
<pid>1</pid>
<title>Hotel 1 (mm sym)</title>
<relations index="rels" type="array">
<element index="tx_irretutorial_mnsym_hotel_rel:1" type="array">
<id>1</id>
<table>tx_irretutorial_mnsym_hotel_rel</table>
</element>
<element index="tx_irretutorial_mnsym_hotel_rel:2" type="array">
<id>2</id>
<table>tx_irretutorial_mnsym_hotel_rel</table>
</element>
</relations>
<softrefs type="array"></softrefs>
</rec>
</table>
<table index="tx_irretutorial_mnsym_hotel_rel" type="array">
<rec index="1" type="array">
<uid>1</uid>
<pid>1</pid>
<title>1</title>
<relations index="rels" type="array">
<element index="tx_irretutorial_mnsym_hotel:1" type="array">
<id>1</id>
<table>tx_irretutorial_mnsym_hotel</table>
</element>
<element index="tx_irretutorial_mnsym_hotel:2" type="array">
<id>2</id>
<table>tx_irretutorial_mnsym_hotel</table>
</element>
</relations>
<softrefs type="array"></softrefs>
</rec>
<rec index="2" type="array">
<uid>2</uid>
<pid>1</pid>
<title>2</title>
<relations index="rels" type="array">
<element index="tx_irretutorial_mnsym_hotel:1" type="array">