Lieber Renzo - du treue Seele!! Danke für deine immer wiederkehrende Hilfe!

Ich, in meiner Unwissenheit, hab einen fundamentalen Denkfehler gemacht: Ich habe eine eigene Tabelle "Zielgruppe" angelegt, diese mit fe-users gemappt und dann eine Relation hergestellt. Und das ist ganz und gar nicht das, was ich brauche und wahrscheinlich auch nicht, wie es funktionieren soll.

Stattdessen habe ich nun in der Haupttabelle "Termine" ein Relationsfeld "Zielgruppe" als m:n angelegt, das im Feld "Relation to external class" den Verweise "TYPO3\CMS\Extbase\Domain\Model\FrontendUser" bekommt.

Und siehe da: Es funktioniert! Heureka!

Aber nachdem wir schon dabei sind: vielleicht kann mir jemand erklären, worin eigentlich der Unterschied zwischen m:n und m:m Relationen besteht?

Im Extension Builder wird ja eine m:n Relation angeboten, die angelegten Tabellen werden aber mit dem "_mm"-Kürzel versehen. In welchem Szenario müsste man denn nun welche Relation verwenden?

Herzlichen Dank!
LG, Robert



Hallo Robert

ist es ein Fehler des mappings in der setup.txt?
Lass da mal den Record-Type einfach weg. Dann nimmt er normale fe_user
vom Standardtyp.

Gruss Renzo


________________________________________________________________________


Renzo Bauen
conPassione gmbh
T +41 33 345 00 92
M +41 79 330 10 11
http://www.conpassione.ch
TYPO3 Bronce Associate

Am Freitag, den 12.07.2013, 12:18 +0200 schrieb Robert Wildling:

Hi,

Ich stehe vor einem mir unverständlichen Problem:

Eine kleine Extensions soll Termine sammeln, die in zwei von 6 Feldern
auf die Usergruppenmitglieder (einmal "Vortragende", einmal
"Zielgruppe") zugreifen soll, und zwar mit Mehrfachauswahl:

1. Feld: Termin (Datumsfeld)
2. Startzeit (HH:MM)
3. Endzeit (HH:MM)
4. Themenbereich (Selectliste aus der Tabelle "Themenbereiche")
5. Feld: Vortragende(r) (Selectlist aus FE-User der Gruppe 3)
6. Feld: Zielgruppe(n) (Selectlist aus FE-User der Gruppe 1)

Dass im TCA die Mitglieder der Gruppe 3 bzw 1 angezeigt werden, ist
derzeit hardgecoded mittels:
[...]
        'vortragsperson' => array(
                'exclude' => 0,
                'label' =>
'LLL:EXT:lsbtermine/Resources/Private/Language/locallang_db.xlf:tx_lsbtermine_domain_model_termin.vortragsperson',
                'config' => array(
                        'type' => 'select',
                        'foreign_table' => 'fe_users',
                        'foreign_table_where' => 'AND fe_users.usergroup=3',
                        'size' => 3,
                        'autoMaxSize' => 10,
                        'maxitems'      => 9999,
                        'multiple' => 0,
                ),
        ),
)
[...]
)

Im TypoScript ist auch folgendes ergänzt:
plugin.tx_lsbtermine {
        [...]
        persistence {
                storagePid = ...
                classes {
              Tx_Lsbtermine_Domain_Model_Vortragsperson {
                  mapping {
                      tableName = fe_users
                      recordType = Tx_Extbase_Domain_Model_FrontendUser
                  }
              }
          }
        }
        [...]
}

Die Verknüpfung zur FE-User-Tabelle wurde im ExtBuilder als m:n-Relation
angelegt mit \TYPO3\CMS\Extbase\Domain\Model\FrontendUser unter "Extend
existing Model Class".

Nachdem ich im FE die Daten als Terminliste abfrage, steht diese hierim
TerminController, wobei der SourceFolder in einer FlexForm den SysFolder
speichert, wo alle Termine angelegt wurden:

/**
   * @package lsbtermine
   * @license http://www.gnu.org/licenses/gpl.html GNU General Public
License, version 3 or later
   */
class TerminController extends
\TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
        /**
         * terminRepository
         *
         * @var \rowild\Lsbtermine\Domain\Repository\TerminRepository
         * @inject
         */
        protected $terminRepository;

        /**
         * action list
         *
         * @return void
         */
        public function listAction() {
                // check flexform (just a test)
                if (!isset($this->settings['sourceFolderPid'])) {
                        $this->view->assign('sourceFolderPid', "The 
sourceFolderPid must be
set in TypoScript or Flexform");
                        return;
                } else {
                        $sourceFolderPid = 
intval($this->settings['sourceFolderPid']);
                        $this->view->assign('sourceFolderPid', $sourceFolderPid 
);
                }

                // output the data
                $termine = $this->terminRepository->findAll();
                $this->view->assign('termine', $termine);
        }
}

Wenn ich nun im Fluid Template ein <f:debug>{termine}</f:debug>
eintrage, werden auch alle (derzeit 4) Einträge erkannt. Stellvertretend
für einen Termin wird folgendes ausgegeben:

TYPO3\CMS\Extbase\Persistence\Generic\QueryResultprototypeobject (4 items)
     0 => rowild\Lsbtermine\Domain\Model\Terminprototypepersistent entity
(uid=1, pid=52)
        date => DateTimeprototypeobject (2013-09-10T00:00:00+02:00,
1378764000)
        anmerkung => '' (0 chars)
        zielgruppe =>
TYPO3\CMS\Extbase\Persistence\ObjectStorageprototypeobject (empty)
        vortragsperson =>
TYPO3\CMS\Extbase\Persistence\ObjectStorageprototypeobject (empty)
        themenbereiche =>
TYPO3\CMS\Extbase\Persistence\ObjectStorageprototypeobject (2 items)
           000000000c8d22020000000038fe4cfd =>
rowild\Lsbtermine\Domain\Model\Themenbereichprototypepersistent entity
(uid=4, pid=52)
           000000000c8d221d0000000038fe4cfd =>
rowild\Lsbtermine\Domain\Model\Themenbereichprototypepersistent entity
(uid=3, pid=52)
        uid => 1 (integer)
        _localizedUid => 1 (integer)modified
        _languageUid => 0 (integer)modified
        pid => 52 (integer)


"zielgruppe" und "vortragsperson" ist EMPTY, während Themenbereich die
jeweils zugeordneten Einträge findet.



WICHTIGSTE FRAGE:
Was muss ich bei den FE-Usern in welchen Files machen, damit auch da
eine Ergebnisanzahl gefunden wird? (Und eventuell auch, wie ich diese
dann im fluid template anzeigen kann...)

Muss ich im TerminController noch ein weiteres Repository anlegen? Oder
muss im VortragspersonenRepository eine andere Abfrage als findAll()
definiert werden? Falls letzteres, wie kann ich diese dann com
TerminController aus abrufen?



WEITERES:
Was ich wirklich gar nicht verstehe ist, dass der Ext-Builder im
ext_tables.php file so etwas anlegt:

t3lib_extMgm::addTCAcolumns('fe_users',$tmp_lsbtermine_columns);

$TCA['fe_users']['columns'][$TCA['fe_users']['ctrl']['type']]['config']['items'][]
=
array('LLL:EXT:lsbtermine/Resources/Private/Language/locallang_db.xlf:fe_users.tx_extbase_type.Tx_Lsbtermine_Vortragsperson','Tx_Lsbtermine_Vortragsperson');

$TCA['fe_users']['types']['Tx_Lsbtermine_Vortragsperson']['showitem'] =
$TCA['fe_users']['types']['1']['showitem'];
$TCA['fe_users']['types']['Tx_Lsbtermine_Vortragsperson']['showitem'] .=
',--div--;LLL:EXT:lsbtermine/Resources/Private/Language/locallang_db.xlf:tx_lsbtermine_domain_model_vortragsperson,';
$TCA['fe_users']['types']['Tx_Lsbtermine_Vortragsperson']['showitem'] .= '';

...und dabei einen neuen Objekttyp für FE-User definiert, der im BE beim
Anlegen neues FE-User auch auswählbar ist, nur mit dem Effekt, dass das
Eingabeformular verschwindet, wenn nicht der reguläre Typ
"Tx_Extbase_Domain_Model_FrontendUser" gesetzt wird.

Wozu dieser neue Typ? Wie setzt man ihn ein?


FAZIT:
Mir fehlt ganz offensichtlich ein grundlegendes Verständnis zum Thema
"Objekttyp", und das, obwohl ich S. Kurfürsts Buch und vieles anderes
gelesen habe. Allerdings muss man wohl auch sagen, dass die
Dokumentation zu Extbase 6 mehr als dürftig ist und vieles von früher
einfach veraltert ist (debugging zB). Also leicht wird es einem ja auch
nicht gerade gemacht... deswegen hoffe ich, dass ihr mir helfen könnt!

Hab mir Mühe gegeben, so ausführlich wie möglich zu sein!

Danke!
Beste Grüße, Robert
_______________________________________________
TYPO3-german mailing list
TYPO3-german@lists.typo3.org
http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german

_______________________________________________
TYPO3-german mailing list
TYPO3-german@lists.typo3.org
http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german

Antwort per Email an