Zum Inhalt springen

N:M Relation

Erstellt am 21. September 2011 · 1 Antwort · letzte Antwort am 23. September 2011

Tags: Frage

Denex ·

Hallo zusammen,

stehe vor einem Problem und finde keine Lösung oder übersehe jene.
Kann ich in Typo3 keine N:M Relationen herstellen wo ich auch Werte in der Zwischentabelle speichern kann?

Es geht darum das ich verschiedene Produkte habe die je nach Produktgruppe verschiedene Eigenschaften haben.
Ich müsste also ein Produkt einer Produktgruppe zuweisen und dann kann ich für die Eigenschaften die Werte eintragen.

Die hässliche Methode wäre alle Eigenschaften in die Produkt-Tabelle aufnehmen aber es besteht die Möglichkeit das evtl. neue Produktgruppen mit anderen Eigenschaften hinzukommen und dann müsste ich halt die Tabelle entsprechend erweitern.

Mein Plan war es eigentlich Eigenschaften, Produktgruppen und Produkte als jeweils eigenständigen Datensätze zu machen.
Ich erstelle diverse Eigenschaften, erstelle dann eine Produktgruppe wo ich Eigenschaften auswähle (welche dann Komma separiert in der DB gespeichert werden). Dann erstelle ich ein Produkt, wähle die Produktgruppe und auf Basis der Auswahl werden mir dann die Felder für die Eigenschaften angezeigt. Die Werte die ich dort eintrage werden dann in der N:M Tabelle gespeichert (Produkt ID, Eigenschaft ID, Wert).

Für diese Umsetzung fehlt mir aber das Wissen wie ich die das TCA für folgendes anpasse:
Wie lade/speichere ich Werte in einer erweiterten N:M Tabelle?
Wie lade ich die Eingabemaske eines Datensatzes neu wenn eine Auswahl getätigt wurde?

Hoffe mir kann jemand helfen 🙂

schöne Grüssen
Dennis

Denex ·

So, melde mich jetzt selbst zu Wort da ich mein Problem fast bewältigt habe 🙂

Das Zauberwort für mein Problem hieß "IRRE". Nachdem ich den Suchtext ein bisschen vereinfacht hatte spuckte mir Google diesen Blogeintrag aus.

Jetzt habe ich nur ein Problem: Ich kann ein Produkt anlegen und ich kann in dem Produkt individuell Eigenschaften hinzufügen. Wenn ich das jetzt speichere, speichert er auch die Verbindung Produkt-Eigenschaft. ABER: Der Datensatz wird in der Datenbank zwar angelegt aber er ist weder in der Listenansicht noch im Produkt zu sehen.

Hatte mich nicht 100% an das Tut gehalten weil ich von Seiten der Eigenschaft nicht die Möglichkeit brauche zu sagen mit mit welchem Produkt Sie in Verbindung steht. Daher fehlt das Feld in der Eigenschaften Tabelle.

Kennt sich jemand besser mit dem Thema uas und kann mir evtl. sagen wo das Problem liegt?

Gruss
Dennis

tca.php

$TCA['tx_pamats_material'] = array (
    'ctrl' => $TCA['tx_pamats_material']['ctrl'],
    'interface' => array (
        'showRecordFieldList' => 'sys_language_uid,l10n_parent,l10n_diffsource,name,properties'
    ),
    'feInterface' => $TCA['tx_pamats_material']['feInterface'],
    '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_pamats_material',
                'foreign_table_where' => 'AND tx_pamats_material.pid=###CURRENT_PID### AND tx_pamats_material.sys_language_uid IN (-1,0)',
            )
        ),
        'l10n_diffsource' => array (
            'config' => array (
                'type' => 'passthrough'
            )
        ),
        'name' => array (
            'exclude' => 0,
            'label' => 'LLL:EXT:pa_mats/locallang_db.xml:tx_pamats_material.name',
            'config' => array (
                'type' => 'input',
                'size' => '30',
                'eval' => 'required,trim',
            )
        ),
        'properties' => array (
            'exclude' => 1,
            'label' => 'LLL:EXT:pa_mats/locallang_db.xml:tx_pamats_material.properties',
            'config' => array (
                'type' => 'inline',
                'foreign_table' => 'tx_pamats_material_properties_mm',
                'foreign_field' => 'mat_id',
                'foreign_label' => 'prop_id',
            )
        ),
    ),
    'types' => array (
        '0' => array('showitem' => 'sys_language_uid;;;;1-1-1, l10n_parent, l10n_diffsource, name, properties')
    ),
    'palettes' => array (
        '1' => array('showitem' => '')
    )
);

$TCA['tx_pamats_material_properties_mm'] = array(
    'ctrl' => $TCA['tx_pamats_material_properties_mm']['ctrl'],
    'interface' => array (
        'showRecordFieldList' => 'mat_id,prop_id,val'
    ),
    'feInterface' => $TCA['tx_pamats_material_semis_mm']['feInterface'],
    'columns' => array(
        'mat_id' => array(
            'label' => 'LLL:EXT:uk_db_tutorial/locallang_db.xml:tx_pamats_material',
            'config' => array(
                'type' => 'select',
    			'items' => array(
        			array('', 0),
        		),
                'foreign_table' => 'tx_pamats_material',
        		'foreign_table_where' => 'ORDER BY tx_pamats_material.name',
                'size' => 1,
                'minitems' => 0,
                'maxitems' => 1,
            ),
        ),
        'prop_id' => array(
            'label' => 'LLL:EXT:uk_db_tutorial/locallang_db.xml:tx_pamats_properties',
            'config' => array(
                'type' => 'select',
        		'items' => array(
        			array('', 0),
        		),
                'foreign_table' => 'tx_pamats_properties',
        		'foreign_table_where' => 'ORDER BY tx_pamats_properties.name',
                'size' => 1,
                'minitems' => 0,
                'maxitems' => 1,
        		'wizards' => array(
                    '_PADDING'  => 2,
                    '_VERTICAL' => 1,
                    'add' => array(
                        'type'   => 'script',
                        'title'  => 'Create new record',
                        'icon'   => 'add.gif',
                        'params' => array(
                            'table'    => 'tx_pamats_properties',
                            'pid'      => '###CURRENT_PID###',
                            'setValue' => 'prepend'
                        ),
                        'script' => 'wizard_add.php',
                    ),
                    'edit' => array(
                        'type'                     => 'popup',
                        'title'                    => 'Edit',
                        'script'                   => 'wizard_edit.php',
                        'popup_onlyOpenIfSelected' => 1,
                        'icon'                     => 'edit2.gif',
                        'JSopenParams'             => 'height=350,width=580,status=0,menubar=0,scrollbars=1',
                    ),
                ),
            ),
        ),
        'val' => array(
            'label' => 'LLL:EXT:uk_db_tutorial/locallang_db.xml:tx_pamats_material_properties_mm.val',
            'config' => array(
                'type' => 'text',
                'cols' => '30',
                'rows' => '3',
            ),
        ),
    ),
    'types' => array (
        '0' => array('showitem' => 'mat_id;;;;1-1-1,prop_id,val')
    ),
    'palettes' => array (
        '1' => array('showitem' => '')
    )
);

ext_tables.php

$TCA['tx_pamats_material'] = array (
    'ctrl' => array (
        'title'     => 'LLL:EXT:pa_mats/locallang_db.xml:tx_pamats_material',
        'label'     => 'name',
        'tstamp'    => 'tstamp',
        'crdate'    => 'crdate',
        'cruser_id' => 'cruser_id',
        'languageField'            => 'sys_language_uid',
        'transOrigPointerField'    => 'l10n_parent',
        'transOrigDiffSourceField' => 'l10n_diffsource',
        'default_sortby' => 'ORDER BY name',
        'dynamicConfigFile' => t3lib_extMgm::extPath($_EXTKEY).'tca.php',
        'iconfile'          => t3lib_extMgm::extRelPath($_EXTKEY).'icon_tx_pamats_material.gif',
    ),
);

$TCA['tx_pamats_material_properties_mm'] = array (
    'ctrl' => array (
        'title'     => 'LLL:EXT:pa_mats/locallang_db.xml:tx_pamats_material_properties_mm',
        'label'     => 'uid',
        'tstamp'    => 'tstamp',
        'crdate'    => 'crdate',
        'cruser_id' => 'cruser_id',
        'default_sortby' => 'ORDER BY name',
        'dynamicConfigFile' => t3lib_extMgm::extPath($_EXTKEY).'tca.php',
        'iconfile'          => t3lib_extMgm::extRelPath($_EXTKEY).'icon_tx_pamats_properties.gif',
	'feInterface' => array (
		'fe_admin_fieldList' => 'mat_id, prop_id, val',
	),
    ),
);

ext_tables.sql

#
# Table structure for table 'tx_pamats_material'
#
CREATE TABLE tx_pamats_material (
    uid int(11) NOT NULL auto_increment,
    pid int(11) DEFAULT '0' NOT NULL,
    tstamp int(11) DEFAULT '0' NOT NULL,
    crdate int(11) DEFAULT '0' NOT NULL,
    cruser_id int(11) DEFAULT '0' NOT NULL,
    sys_language_uid int(11) DEFAULT '0' NOT NULL,
    l10n_parent int(11) DEFAULT '0' NOT NULL,
    l10n_diffsource mediumtext,
    name varchar(255) DEFAULT '' NOT NULL,
    properties int(11) DEFAULT '0' NOT NULL,
    
    PRIMARY KEY (uid),
    KEY parent (pid)
);

#
# Table structure for table 'tx_pamats_material_properties_mm'
# 
CREATE TABLE tx_pamats_material_properties_mm (
  uid int(11) NOT NULL auto_increment,
  pid int(11) DEFAULT '0' NOT NULL,
  tstamp int(11) DEFAULT '0' NOT NULL,
  crdate int(11) DEFAULT '0' NOT NULL,
  cruser_id int(11) DEFAULT '0' NOT NULL,
  deleted tinyint(4) DEFAULT '0' NOT NULL,
  tablenames varchar(30) DEFAULT '' NOT NULL,
  sorting int(11) DEFAULT '0' NOT NULL,
  mat_id int(11) DEFAULT '0' NOT NULL,
  prop_id int(11) DEFAULT '0' NOT NULL,
  val text,
  
  PRIMARY KEY (uid),
  KEY parent (pid)
);