HalliHallo,
folgende Sachlage:
Derweil schreibe ich an einer kleinen "Feedback"-Extension - sozusagen ein kleines Gästebuch. Ein Plugin gibt die Einträge als Liste aus, ein anderes Plugin stellt ein Formular zur Verfügung, um Feedback-Kommentare zu senden.
Alles schön und gut, wenn da nicht mehrere Sprachen wären.
Ein Feedback-Eintrag einer bestimmten Sprache ausgeben funktioniert in etwa so, dass man im Repository die Query-Settings ändert und eine Abfrage nach der aktuellen Sprache tätigt:
public function findLatestFirst() {
$query = $this->createQuery();
$query->getQuerySettings()->setRespectSysLanguage(FALSE);
$query->matching(
$query->equals('sys_language_uid', $GLOBALS['TSFE']->sys_language_uid)
);
$query->setOrderings(array('crdate' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING));
return $query->execute();
}
Ok, die Sprache soll Extbase wohl selbstständig verwalten - das geht hier aber nicht, weil der Eintrag in der zusätzlichen Sprache ja keine Übersetzung ist. Ein Feedback-Eintrag existiert ja nur in der Sprache des Verfassers... und dieser Eintrage soll nur in der passenden Sprache der Webseite ausgegeben werden. Wie erwähnt... das sprachenabhängige auslesen aus dem Repository funktioniert.
Nun zum eigentlichen Problem (Daten einfügen):
Das zweite Plugin stellt ein Formular dar. Die Daten werden an den Controller gesendet und dort findet ein "add()" mit dem zugehörigen Repository statt:
$newEntry = new Tx_ExtensionName_Domain_Model_Entry;
$newEntry->setIrgendwas($args['irgendwas']);
$entryRepository = t3lib_div::makeInstance('Tx_ExtensionName_Domain_Repository_EntryRepository');
$entryReposirory->add($newEntry);
Egal in welcher Sprache sich das Frontend gerade befindet - es wird immer "0" im Datenbankfeld "sys_language_uid" eingetragen - schade.
Dann bin ich hergegangen und habe dem Model das Feld sys_language_uid beigebracht, in der Hoffnung, dass man dann die Sprache setzen kann:
Model:
/**
* sys_language_uid
*
* @var int $sys_language_uid
*/
protected $sys_language_uid;
/**
* Setter for sys_language_uid
*
* @param int $sys_language_uid sys_language_uid
* @return void
*/
public function setSys_language_uid($sys_language_uid) {
$this->sys_language_uid = $sys_language_uid;
}
/**
* Getter for sys_language_uid
*
* @return int sys_language_uid
*/
public function getSys_language_uid() {
return $this->sys_language_uid;
}
Controller:
$newEntry = new Tx_ExtensionName_Domain_Model_Entry;
$newEntry->setIrgendwas($args['irgendwas']);
$newEntry->setSys_language_uid(1); // bzw. $GLOBALS['TSFE']->sys_language_uid
$entryRepository = t3lib_div::makeInstance('Tx_ExtensionName_Domain_Repository_EntryRepository');
$entryReposirory->add($newEntry);
Leider greift das auch noch nicht. Extbase verwaltet ja auch die sys_language_uid.
Mein letzter Versuch war folgender "Constructor" im Repository, bei dem ich mir aber nicht sicher bin, ob der beim add() aufgrufen wird - Erfolg hat er leider auch nicht gebracht:
public function initializeObject() {
$querySettings = $this->objectManager->create('Tx_Extbase_Persistence_Typo3QuerySettings');
$querySettings->setRespectSysLanguage(FALSE);
$this->setDefaultQuerySettings($querySettings);
}
Gibt es einen Weg die Query-Settings beim INSERT bzw. add() -Query zu überschreiben? Ähnlich dem wie beim findAll() bzw. SELECT?
Vielen Dank für Hinweise und Lösungsansätze.
Schönen Abend
sun
PS: Ein anderes Beispiel wäre, wenn man beim Eintragen von Daten in das Repository die Query-Einstellung für die PID überschreiben möchte. Beim Holen von Daten geht das, beim Speichern wird strikt die PID benutzt, welche im TypoScript definiert ist.
Beispiel: Daten holen und abweichende PID verwenden:
public function findAllOnPid($pid) {
$query = $this->createQuery();
$query->getQuerySettings()->setRespectStoragePage(FALSE);
$query->matching(
$query->equals('pid', $pid)
);
return $query->execute();
}
PPS: Da kommt mir noch eine Idee...
Wenn ein Eintrag im Repository gespeichert ist, kann man sich den Eintrag anhand der UID holen und ein Update durchführen? Beim Update wird evtl. nicht die PID und sys_language_uid von Extbase verwaltet. Gibt es ein Äquivalent zum "last_insert_id()" in Extbase?
Prinzip:
$newEntry = new myModel;
$repository->add($newEntry);
$updateEntry = $repository->findLastInserted();
$updateEntry->setSys_language_uid(1);
$repositroy->update($updateEntry);
Edith sagt: Ähnliches Thema: #92124