Extbase-Join-Sprachen-Problem

  • wp_bube wp_bube
    TYPO3-Anwärter
    0 x
    6 Beiträge
    1 Hilfreiche Beiträge
    24. 06. 2013, 10:53

    Moin Moin,

    schreibe gerade an meiner ersten mehrsprachigen Extbase-Extension. Hat auch soweit alles super geklappt und Extbase nimmt einem echt viel Arbeit in Sachen Mehrsprachigkeit ab.

    Jetzt bin ich aber auf ein Problem gestoßen.
    Ich habe in meiner Extension "Satellitenbild"-Datensätze, denen 0-mehrere Kontinente zugeordnet sind.

    Bei der Englischen Übersetzung habe ich die Felder für die Kontinent-Zuordnung mit der Zeile

    1. $TCA['tx_wpsatellite_domain_model_image']['columns']['continent']["l10n_mode"] = 'exclude';

    ausgeblendet. Das Bild gehört ja zu keinem anderen Kontinent, nur weil ich es übersetzt habe. Daher lasse ich das Feld gleich weg, damit es der Backenduser nicht jedesmal übersetzen muss.

    So weit so gut.

    Wenn ich nun mein Query zusammenbaue und den Constraint

    1. $query->equals('continent.uid', $params["continent"]);

    definiere, und nach einem Satellitenbild in Europa suche (Habe eine HTML-Suchmaske mit Selectbox), dann findet er es nicht.

    Also habe ich mir das Statement angesehen, das von Extbase generiert wird:

    1. SELECT COUNT(DISTINCT tx_wpsatellite_domain_model_image.uid)
    2. FROM tx_wpsatellite_domain_model_image
    3. LEFT JOIN tx_wpsatellite_image_continent_mm
    4. ON tx_wpsatellite_domain_model_image.uid =
    5. tx_wpsatellite_image_continent_mm.uid_local
    6. LEFT JOIN tx_wpsatellite_domain_model_continent
    7. ON
    8. tx_wpsatellite_image_continent_mm.uid_foreign = tx_wpsatellite_domain_model_continent.uid
    9. WHERE tx_wpsatellite_domain_model_continent.uid = 2
    10. AND tx_wpsatellite_domain_model_image.deleted = 0
    11. AND tx_wpsatellite_domain_model_image.t3ver_state <= 0
    12. AND tx_wpsatellite_domain_model_image.pid <>- 1
    13. AND tx_wpsatellite_domain_model_image.hidden = 0
    14. AND tx_wpsatellite_domain_model_image.starttime <= 1372061460
    15. AND ( tx_wpsatellite_domain_model_image.endtime = 0
    16. OR tx_wpsatellite_domain_model_image.endtime > 1372061460 )
    17. AND ( tx_wpsatellite_domain_model_image.sys_language_uid IN ( 1, -1 )
    18. OR ( tx_wpsatellite_domain_model_image.sys_language_uid = 0
    19. AND tx_wpsatellite_domain_model_image.uid NOT IN (SELECT
    20. tx_wpsatellite_domain_model_image.l10n_parent
    21. FROM
    22. tx_wpsatellite_domain_model_image
    23. WHERE
    24. tx_wpsatellite_domain_model_image.l10n_parent > 0
    25. AND
    26. tx_wpsatellite_domain_model_image.sys_language_uid > 0
    27. AND
    28. tx_wpsatellite_domain_model_image.deleted = 0) ) )
    29. AND tx_wpsatellite_domain_model_image.pid IN ( 30 )
    30. AND tx_wpsatellite_domain_model_continent.deleted = 0
    31. AND tx_wpsatellite_domain_model_continent.t3ver_state <= 0
    32. AND tx_wpsatellite_domain_model_continent.pid <>- 1
    33. AND tx_wpsatellite_domain_model_continent.hidden = 0
    34. AND tx_wpsatellite_domain_model_continent.starttime <= 1372061460
    35. AND ( tx_wpsatellite_domain_model_continent.endtime = 0
    36. OR tx_wpsatellite_domain_model_continent.endtime > 1372061460 )
    37. AND ( tx_wpsatellite_domain_model_continent.sys_language_uid IN ( 1, -1 )
    38. OR ( tx_wpsatellite_domain_model_continent.sys_language_uid = 0
    39. AND tx_wpsatellite_domain_model_continent.uid NOT IN (SELECT
    40. tx_wpsatellite_domain_model_continent.l10n_parent
    41. FROM
    42. tx_wpsatellite_domain_model_continent
    43. WHERE
    44. tx_wpsatellite_domain_model_continent.l10n_parent > 0
    45. AND
    46. tx_wpsatellite_domain_model_continent.sys_language_uid > 0
    47. AND
    48. tx_wpsatellite_domain_model_continent.deleted = 0) ) )
    49. AND tx_wpsatellite_domain_model_continent.pid IN ( 30 )

    Das Problem ist die Zeile "AND ( tx_wpsatellite_domain_model_continent.sys_language_uid IN ( 1, -1 ) " in der WHERE-Clause.
    Er lest damit nur Kontinente mit der Language-Uid 1 aus, also Englische. Allerdings sind meine zugewiesenen Kontinente ja nur in der Standardsprache zugewiesen.
    Ändere ich die Zeile auf "AND ( tx_wpsatellite_domain_model_continent.sys_language_uid IN ( 0, -1 )" dann klappt es.

    Ich müsste daher die Mehrsprachigkeit im JOIN mit dem Kontinent ausschalten. Oder hat jemand eine andere Idee wie man dieses Problem lösen könnte?
    Habe mich schon durch etliche Google-Einträge und Bücher gekämpft aber keine Antwort gefunden.

    Bin für alle Vorschläge offen

    Liebe Grüße und Danke!


  • 1
  • LuP LuP
    Jedi-Meister
    0 x
    496 Beiträge
    1 Hilfreiche Beiträge
    24. 06. 2013, 16:45

    Hallo,

    das Flag für language overlay ist defaultmäßig aktiviert.

    Mit

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

    kannst Du es in Deiner Abfrage ausschalten.

    VG,
    LuP

  • wp_bube wp_bube
    TYPO3-Anwärter
    0 x
    6 Beiträge
    1 Hilfreiche Beiträge
    26. 06. 2013, 12:36

    Danke erstmal. Jetzt werden zwar alle Datensätze gefunden, aber wenn ich nach einem Text suche, der im englischen und im deutschen Datensatz vorkommt, findet er beide. Klar, ich habe ja die Mehrsprachigkeit ausgeschaltet. Ich möchte aber dass er z.B. wenn Englisch eingestellt ist, nur die englischen Datensätze findet. Kann ich auch mit Constraints abdecken und mir genau die herauspicken. Allerdings habe ich dann den englischen Datensatz, bei dem die nicht übersetzten Daten natürlich fehlen. Das heißt ich müsste jetzt noch händisch den Overlay ausführen. Geht das irgendwie?

    Oder ich baue das ganze SQL-Statement selbst und joine mir alles selbst zusammen wie ich es brauche, aber ich kann mir irgendwie nicht vorstellen dass das nicht besser geht.

    Also falls noch jemand einen Vorschlag hat, dann immer her damit :-)

    lg!

  • 1