[TYPO3-german] Extbase 6 Ext mit FE user als select list

Robert Wildling rowild at gmx.net
Fri Jul 12 12:18:38 CEST 2013


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


More information about the TYPO3-german mailing list