repository add() sys_language_uid

  • sunixzs sunixzs
    R2-D2
    0 x
    123 Beiträge
    2 Hilfreiche Beiträge
    16. 06. 2011, 22:27

    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:

    1. public function findLatestFirst() {
    2. $query = $this->createQuery();
    3. $query->getQuerySettings()->setRespectSysLanguage(FALSE);
    4. $query->matching(
    5. $query->equals('sys_language_uid', $GLOBALS['TSFE']->sys_language_uid)
    6. );
    7. $query->setOrderings(array('crdate' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING));
    8. return $query->execute();
    9. }

    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:

    1. $newEntry = new Tx_ExtensionName_Domain_Model_Entry;
    2. $newEntry->setIrgendwas($args['irgendwas']);
    3. $entryRepository = t3lib_div::makeInstance('Tx_ExtensionName_Domain_Repository_EntryRepository');
    4. $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:

    1. /**
    2.  * sys_language_uid
    3.  *
    4.  * @var int $sys_language_uid
    5.  */
    6. protected $sys_language_uid;
    7.  
    8. /**
    9.  * Setter for sys_language_uid
    10.  *
    11.  * @param int $sys_language_uid sys_language_uid
    12.  * @return void
    13.  */
    14. public function setSys_language_uid($sys_language_uid) {
    15. $this->sys_language_uid = $sys_language_uid;
    16. }
    17. /**
    18.  * Getter for sys_language_uid
    19.  *
    20.  * @return int sys_language_uid
    21.  */
    22. public function getSys_language_uid() {
    23. return $this->sys_language_uid;
    24. }

    Controller:

    1. $newEntry = new Tx_ExtensionName_Domain_Model_Entry;
    2. $newEntry->setIrgendwas($args['irgendwas']);
    3. $newEntry->setSys_language_uid(1); // bzw. $GLOBALS['TSFE']->sys_language_uid
    4. $entryRepository = t3lib_div::makeInstance('Tx_ExtensionName_Domain_Repository_EntryRepository');
    5. $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:

    1. public function initializeObject() {
    2. $querySettings = $this->objectManager->create('Tx_Extbase_Persistence_Typo3QuerySettings');
    3. $querySettings->setRespectSysLanguage(FALSE);
    4. $this->setDefaultQuerySettings($querySettings);
    5. }

    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:

    1. public function findAllOnPid($pid) {
    2. $query = $this->createQuery();
    3. $query->getQuerySettings()->setRespectStoragePage(FALSE);
    4. $query->matching(
    5. $query->equals('pid', $pid)
    6. );
    7. return $query->execute();
    8. }

    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: http://www.typo3.net/forum/beitraege/extensions_schreiben/92124/


  • 1
  • sunixzs sunixzs
    R2-D2
    0 x
    123 Beiträge
    2 Hilfreiche Beiträge
    17. 06. 2011, 08:38

    Hallo,

    für die, die vor ähnlichen Problemen stehen:

    Da ich keine Lösung fand, habe ich nun für jede Sprache einen SysOrdner für die Einträge und jeweils eine TypoScript-Definition verwendet.

    1. # Standardsprache
    2. plugin.tx_extensionname {
    3. view {
    4. templateRootPath = fileadmin/path/extensionname/de/Templates/
    5. partialRootPath = fileadmin/path/extensionname/de/Partials/
    6. layoutRootPath = fileadmin/path/extensionname/de/Layouts/
    7. }
    8.  
    9. persistence {
    10. storagePid = 21
    11. }
    12. }
    13. # Zusatzsprache
    14. [globalVar = GP:L = 1]
    15. plugin.tx_extensionname {
    16. view {
    17. templateRootPath = fileadmin/path/extensionname/en/Templates/
    18. partialRootPath = fileadmin/path/extensionname/en/Partials/
    19. layoutRootPath = fileadmin/path/extensionname/en/Layouts/
    20. }
    21.  
    22. persistence {
    23. storagePid = 22
    24. }
    25. }[global]

    Das Thema lasse ich mal offen - es ist ja noch recht frisch und vllt. tut sich ja noch was.

    LG sun

  • BlackPixel BlackPixe...
    Sternenflotten-Admiral
    0 x
    230 Beiträge
    3 Hilfreiche Beiträge
    07. 07. 2011, 12:09

    Irgendwie hatte ich das gleiche Problem mit der sys_language_uid und hab mich durch den Framework gehangelt bis zum entsprechenden Part wo extabse die sys_language_uid setzt. Extbase holt sich zwar aus der TCA den Spaltenname zur sys_language_uid (in aller Regel heisst das Feld auch so), allerdings erwartet extbase den Wert im Property _languageUid (extbase/Classes/Persistence/Backend.php:726):

    1. if($dataMap->getLanguageIdColumnName() !== NULL) {
    2. $row[$dataMap->getLanguageIdColumnName()] = $object->_getProperty('_languageUid');
    3. if ($object->_getProperty('_localizedUid') !== NULL) {
    4. $row['uid'] = $object->_getProperty('_localizedUid');
    5. }
    6. }

    Wenn man im Object einen getter/setter beibringt geht es ohne probleme. Siehe hier:
    http://www.typo3.net/forum/beitraege/extensions_schreiben/106176/beitrag/seite/#pid378645

    Gruß Manfred

    TYPO3 Slider Revolution: https://www.rutschmann.biz/extensions/typo3-slider-revolution/
    TYPO3 Layerslider Extension: http://www.rutschmann.biz/extensions/typo3-layerslider/
    TYPO3 Responsive Flipbook Extension: http://www.rutschmann.biz/extensions/typo3-responsive-flipbook/
    TYPO3 PayPal Download Checkout: http://www.rutschmann.biz/extensions/typo3-paypal-download/

    http://www.rutschmann.biz/
    ----------------------------------------------------
    Extbase, Fluid, HTML & CSS Development

  • Eydamos Eydamos
    Padawan
    0 x
    54 Beiträge
    0 Hilfreiche Beiträge
    08. 07. 2011, 10:25

    Das Feld sys_language_uid ist dafür da die Sprache für das default Element und für die Übersetzungen des defaults anzulegen.

    Da du aber keine Übersetzung eines Eintrages machst, sondern einen Beitrag in Relation zu einer bestimmten Sprache speichern willst, würde ich einfach empfehlen nicht das "arme" ;) sys_language_uid zu missbrauchen, sondern einfach ein Feld language in deiner Tabelle hinzuzufügen. Das speichern dieses Wertes und die Abfrage ist dann viel einfacher.

    Dann brauchst du auch nicht die QuerySettings ändern.

  • phafner phafner
    TYPO3-Anwärter
    0 x
    7 Beiträge
    0 Hilfreiche Beiträge
    22. 08. 2012, 16:30

    Ich weiß nicht, ob ich lachen oder weinen soll, Extbase macht so viel "Kleinmist", wie in diesem Thread zu riesigen Hürden, welche nur mit viel Zeit und Nerven bewältigt werden können.

    Ich stehe gerade vor exakt dem selben Problem. Die PID eines Datensatzes kann ich mittlerweile so setzen:

    TCA Config:

    1. 'pid' => array(
    2. 'exclude' => 0,
    3. 'label' => '',
    4. 'config' => array(
    5. 'type' => 'input',
    6. 'size' => 30,
    7. 'eval' => 'trim'
    8. ),
    9. ),

    Im Model musste ich witzigerweise keine Getter/Setter und die Variable setzen.

    Im Controller wird die PID nun so gesetzt:

    1. $l10nElement = new Tx_Slideshow_Domain_Model_SlideshowElement();
    2. $l10nElement->setPid($element->getUid());
    3. $this->slideshowElementRepository->add($l10nElement);

    Funktioniert. Wenn ich das nun mit der sys_language_uid machen möchte, bleibt der Wert 0, auch wenn die Getter/Setter Methoden manuell im Model eingefügt wurden.

    Werde nun wohl ein eigenes Sprachfeld anlegen, was ich allerdings für falsch halte, doch das funktioniert wenigstens ohne Probleme.

  • Bauen Bauen
    Jar Jar Binks
    0 x
    1 Beiträge
    0 Hilfreiche Beiträge
    13. 11. 2012, 00:33

    Ich weiss, man sollte so alte Threads nicht wieder ausgraben, aber ich habe dazu eine Lösung und es wäre doch schön, wenn die beim Problem stehen könnte!

    Mein Problem war:
    TabelleA mit Feld "promoter" (im wesentlichen die uid aus der TabelleB)
    TabelleB mit Feld "promoterTitel"

    Im Multi_Language Umfeld wird sowohl Tabelle A wie auch Tabelle B übersetzt, d.h. es gibt bei beiden einen Overlay Datensatz.

    Origianl Datensatz aus Tabelle A hat promoter = 1
    Zugehöriger Datensatz aus Tabelle B hat uid = 1, damit sind beide schön verknüpft

    Übersetzter Datensatz aus Tabelle A hat promoter = 2
    Zugehöriger, übersetzter Datensatz aus Tabelle B hat uid = 2

    Tabelle A sind Events, Tabelle B sind Veranstalter damit ergibt sich folgende Paarung:
    Veranstaltung "Weihnachtsessen" wird von Abteilung "Verkauf" durchgeführt und übersetzt:
    Veranstaltung "Christmas dinner" wird von Abteilung "Sales" durchgeführt

    Wenn ich jetzt alle Events, die von "Sales" durchgeführt werden auslesen will, kommt ein leeres Resultset zurück. Gehe ich zurück auf die Defaultsprache Deutsch, dann kann ich problemlos alle Veranstaltungen der Abteilung "Verkauf" auslesen.

    Nun, wo liegt das Problem?
    Es ist eine unnötige Umsetzung der Sprachanpassung. Extbase schaut in der Tabelle B nach dem Veranstalter "Sales" (uid=2) und sucht sich den Parent-Record heraus, das wäre "Verkauf" und der hat die uid=1. Die Suche in Tabelle A findet in den englischen Datensätzen aber keinen promoter=1.

    Diese "falsche" Umsetzung der Sprachanpassung kann man mit einer einzigen Zeile Code korrigieren!

    Im Repository definiere ich die Suchfunktionen, d.h. da werden die queries zusammen gestellt, welche die Datensätze auslesen sollen. Bisher war dies so gelöst:

    1. /**
    2.  *
    3.  * @var int $promoterPid
    4.  */
    5. public function findByPromoterPid ( $promoterPid) {
    6. $query = $this->createQuery();
    7. $query->matching($query->equals('promoter', $promoterPid));
    8. return $query->execute();
    9. }

    Was bei der Defaultsprache auch perfekt funktioniert. Mein Problem konnte ich lösen, in dem ich folgenden Code verwende:

    1. /**
    2.  *
    3.  * @var int $promoterPid
    4.  */
    5. public function findByPromoterPid ( $promoterPid) {
    6. $query = $this->createQuery();
    7. $query->matching($query->equals('promoter', $promoterPid));
    8. $query->getQuerySettings()->setRespectSysLanguage(FALSE);
    9. return $query->execute();
    10. }

    D.h. es genügt die Zeile

    1. $query->getQuerySettings()->setRespectSysLanguage(FALSE);

    zu ergänzen und schon funktioniert alles perfekt!

    Ich hoffe, dass dies dem einen oder anderen weiterhilft, auch wenn ich etwas spät komme mit der Lösung...

    Mit freundlichen Grüssen
    Renzo Bauen
    conPassione gmbh

    Renzo Bauen
    conPassione gmbh

  • 1