Hallo Stephan,

ich habe jetzt opposite_field in playlist:

$TCA['tx_medialibrary_domain_model_media'] = array(
...
"playlist" => Array (
        "exclude" => 1,
        "label" => "playlist",
        "l10n_mode" => "exclude",
        "config" => Array (
                "type" => "select",
                "allowed" => "tx_medialibrary_domain_model_playlist",
                'foreign_table' => 'tx_medialibrary_domain_model_playlist',
                "size" => 10,
                "minitems" => 0,
                "maxitems" => 100,
                "MM" => "tx_medialibrary_media_playlist_mm",
                "MM_opposite_field" => "playlist",
                )
),
...

Im Backend geht wieder alles.

In setManyToManyRelation() liefert mir $columnConfiguration:

Array
(
    [type] => select
    [allowed] => tx_medialibrary_domain_model_playlist
    [foreign_table] => tx_medialibrary_domain_model_playlist
    [size] => 10
    [minitems] => 0
    [maxitems] => 100
    [MM] => tx_medialibrary_media_playlist_mm
)

und

Array
(
    [type] => group
    [internal_type] => db
    [allowed] => tx_medialibrary_domain_model_media
    [size] => 10
    [minitems] => 0
    [maxitems] => 100
    [MM] => tx_medialibrary_media_playlist_mm
    [MM_opposite_field] => playlist
)

Trotzdem erhalte ich wieder ein SQL-Fehlermeldung:

SELECT .* FROM tx_medialibrary_media_playlist_mm LEFT JOIN ON tx_medialibrary_media_playlist_mm.uid_foreign = .uid WHERE tx_medialibrary_media_playlist_mm.uid_local = '1' AND (tx_medialibrary_domain_model_media.type='Tx_Medialibrary_Domain_Model_Media' OR tx_medialibrary_domain_model_media.type='Tx_Medialibrary_Domain_Model_Media_Video' OR tx_medialibrary_domain_model_media.type='Tx_Medialibrary_Domain_Model_Media_Audio') ORDER BY tx_medialibrary_media_playlist_mm.sorting ASC

Dabei ist doch schon SELECT .* FROM ein Problem, da ein Tabellenname fehlt.

Was ich machen will ist ja medum.playlist.media

Gruß Eike Starkmann


On 14.03.2013 11:20, Stephan Schuler wrote:
Hallo Eike.

Das Feld "MM_opposite_field" zeigt auf den Spaltennamen des anderen Datensatzes.
Du hast zwei Möglichkeiten:
* "playlist.media[ohne opposite_field]; media.playlist[opposite_field=media]", 
hier ist playlist.uid uid_local und media.uid uid_foreign
* "media.playlist[ohne opposite_field]; 
playlist.media[opposite_field=playlist]", hier ist media.uid uid_local und 
playlist.uid uid_foreign

Beides kommt technisch zu keinem Fehler, obwohl der Name der MM-Tabelle die 
zweite Variante nahe legt.

Du hast zur Zeit "playlist.media[opposite_field=media]; media.playlist[ohne 
opposite_field]". Das ist falsch.

Die Aussage von "playlist.media[opposite_field=media]" ist:
Es gibt die Tabelle "playlist", die hat die Spalte "media" in der sich 
Media-Elemente befinden (soweit korrekt)
Dazu muss es media-Elemente geben, in deren Spalte "media" sich die Playlist 
wieder findet (und das ist falsch).

Die Aussage von "media.playlist[ohne opposite_field]" ist:
Es gibt die Tabelle "media", die hat die spalte "playlist" in der sich 
Playlist-Elemente befinden (soweit korrekt)
Da kein opposite_field angegeben ist, ist uns die Rückbeziehung egal.

Den relevanten Teil kannst du in t3lib_loadDBGroup::start() nachvollziehen, 
bzw. anschließend in t3lib_loadDBGroup::readMM(). Die Tatsache dass du ein 
MM_opposite_field hast ist alleine genug, im Select im Backend uid_local und 
uid_foreign zu tauschen. Es gäbe zwar weitere Konfigurationsmöglichkeiten, die 
fallen aber aufgrund des falschen MM_opposite_field alle auf das jeweilige 
default. Vielleicht hilft dir ein Breakpoint da weiter.

Weiterhin könntest du mal einen Breakpoint nach 
Tx_Extbase_Persistence_Mapper_DataMapFactory:: setManyToManyRelation() machen. 
Ich nehme an, dass im Fehlerfall $columnConfiguration einfach kein gültiges 
foreign_table enthält. Grund dafür dürfte sein, dass Extbase im Mapping 
deutlich mehr prüft und umher schiebt als es das TCEMain tut. Das wiederum 
liegt daran, dass das TCEMain ja schon mit Tabellennamen arbeitet, während 
Extbase Objektkonfiguration aufgrund von PHP-Klassennamen beachtet.

Ich bleibe also bei meiner Vermutung: Dein MM_opposite_field ist an der 
falschen Stelle.

Gruß,




Stephan Schuler

Web-Entwickler

Telefon: +49 (911) 539909 - 0
E-Mail: stephan.schu...@netlogix.de
Website: media.netlogix.de
-----Ursprüngliche Nachricht-----
Von: typo3-german-boun...@lists.typo3.org 
[mailto:typo3-german-boun...@lists.typo3.org] Im Auftrag von Eike Starkmann
Gesendet: Donnerstag, 14. März 2013 10:49
An: German TYPO3 Userlist
Betreff: Re: [TYPO3-german] Problem extbase bidirektionale mm Beziehung

Hallo Stephan,

On 14.03.2013 01:31, Stephan Schuler wrote:
Hallo Eike.

Hast du das TCA selbst geschrieben oder hast du es dir erzeugen lassen?
Funktioniert die Zuordnung denn im TYPO3-Backend oder ist die schon dort leer, 
wenn du die Bearbeitung von der Playlist-Seite bearbeitest?

Ja habe ich selber geschrieben. Müsste aber trotzdem korrekt sein. Im Backend 
funktioniert ja auch alles und mit "manuellen" Queries kann ich die Daten auch 
anfragen.

Wenn deine MM-Tabelle "media_playlist_mm" heißt bedeutet das, dass Media deine 
Local-Side ist und Playlist deine Foreign-Side.
Laut Dokumentation von MM_opposite_field gehört das ins TCA der Foreign-Side 
und muss dort den Property-Name der Local-Side benennen.
Demnach muss das MM_opposite_field ins TCA von Playlist, nicht in das von Media.
Jupp, aber so ist es ja auch ;-)

http://docs.typo3.org/typo3cms/TCAReference/Reference/Columns/Select/I
ndex.html Leider lässt das aktuelle Dokumentationsformat keine
Referenz auf ein Attribut zu.
Und ich hätte als Beispiel nicht unbedingt die Unterscheidung zwischen "a.employees" und 
"b.employers" verwendet.
Da hast du recht. Aber MM_opposite_field ist leider nicht das Problem.
Ich glaube auch das es im Backend dann nicht funktionieren würde.

Gruß, Eike Starkmann

Gruß,


Stephan Schuler

Web-Entwickler

Telefon: +49 (911) 539909 - 0
E-Mail: stephan.schu...@netlogix.de
Website: media.netlogix.de


--
netlogix GmbH & Co. KG
IT-Services | IT-Training | Media
Andernacher Straße 53 | 90411 Nürnberg
Telefon: +49 (911) 539909 - 0 | Fax: +49 (911) 539909 - 99
E-Mail: i...@netlogix.de | Internet: http://www.netlogix.de

netlogix GmbH & Co. KG ist eingetragen am Amtsgericht Nürnberg (HRA
13338) Persönlich haftende Gesellschafterin: netlogix Verwaltungs GmbH
(HRB 20634)
Umsatzsteuer-Identifikationsnummer: DE 233472254
Geschäftsführer: Stefan Buchta, Matthias Schmidt



________________________________________
Von: typo3-german-boun...@lists.typo3.org
[typo3-german-boun...@lists.typo3.org]" im Auftrag von "Eike
Starkmann [starkm...@undkonsorten.com]
Gesendet: Mittwoch, 13. März 2013 17:54
An: German TYPO3 Userlist
Betreff: Re: [TYPO3-german] Problem extbase bidirektionale mm
Beziehung

Ich habe dazu mal ein Ticket gemacht, da ich glaube das das Problem in
extbase liegt:
http://forge.typo3.org/issues/46243

Bis denne, Eike

On 08.03.2013 14:00, Eike Starkmann wrote:

Hallo,
ich habe ein Problem mit einer Extbase Extension die ich gerade schreibe.
Folgende Situation:

Ich habe ein Objekt Media und ein Objekt Playlist Zwischen diesen
besteht eine bidirektionale M:M Beziehung.

Ich möchte jetzt zu einem bestimmten Medium (M) alle anderen Medien
ausgeben, die in der gleichen Playliste (P) sind.

Naive Vorgehensweise (pseudocode):

//alle Playlisten zu dem das Medium gehört for M.paylist as
playlistItem {

       //alle Medien in der aktuellen playliste
       for playlistItem.media as mediaItem{
           ausgabe mediaItem
       }
}
Und genau die innere Schleife funktioniert nicht und liefert einen
SQL-Fehler.

Hier ist der relevante Code:

class Tx_Medialibrary_Domain_Model_Playlist extends
Tx_Extbase_DomainObject_AbstractEntity {

       /**
        * Media of the playlist
        *
        * @var
Tx_Extbase_Persistence_ObjectStorage<Tx_Medialibrary_Domain_Model_Media>
        * @lazy
        */
       protected $media;

       /**
        * Adds a Media
        *
        * @param Tx_Medialibrary_Domain_Model_Media $media
        * @return void
        */
       public function addMedia(Tx_Medialibrary_Domain_Model_Media $media) {
           $this->media->attach($media);
       }

       /**
        * Removes a Media
        *
        * @param Tx_Medialibrary_Domain_Model_Media $mediaToRemove The
Category to be removed
        * @return void
        */
       public function removeMedia(Tx_Medialibrary_Domain_Model_Media
$mediaToRemove) {
           $this->media->detach($mediaToRemove);
       }

       /**
        * Returns the Media
        *
        * @return
Tx_Extbase_Persistence_ObjectStorage<Tx_Medialibrary_Domain_Model_Med
ia>
$media
        */
       public function getMedia() {
           return $this->media;
       }

       /**
        * Sets the media
        *
        * @param
Tx_Extbase_Persistence_ObjectStorage<Tx_Medialibrary_Domain_Model_Med
ia>
$media
        * @return void
        */
       public function setMedia(Tx_Extbase_Persistence_ObjectStorage
$media) {
           $this->media = $media;
       }

}

TCA:

$TCA['tx_medialibrary_domain_model_playlist'] = array( ...
"media" => Array (
                       "exclude" => 1,
                       "label" =>
"LLL:EXT:medialibrary/Resources/Private/Language/locallang_db.xml:tx_
medialibrary_domain_model_playlist.media",

                       "l10n_mode" => "exclude",
                       "config" => Array (
                               "type" => "group",
                               "internal_type" => "db",
                               "allowed" =>
"tx_medialibrary_domain_model_media",
                               "size" => 10,
                               "minitems" => 0,
                               "maxitems" => 100,
                               "MM" => "tx_medialibrary_media_playlist_mm",
                               "MM_opposite_field" => "media",
                       )
               ),
...

$TCA['tx_medialibrary_domain_model_media'] = array( ...
       "playlist" => Array (
                       "exclude" => 1,
                       "label" => "playlist",
                       "l10n_mode" => "exclude",
                       "config" => Array (
                               "type" => "select",
                               "allowed" =>
"tx_medialibrary_domain_model_playlist",
                               'foreign_table' =>
'tx_medialibrary_domain_model_playlist',
                               "size" => 10,
                               "minitems" => 0,
                               "maxitems" => 100,
                               "MM" => "tx_medialibrary_media_playlist_mm",
                       )
               ),
...

Fluid showAction von Media:

<f:for each="{media.playlist}" as="playlistItem">
           {playlistItem}
           <f:for each="{playlistItem.media}" as="mediaItem">
               {mediaItem}
           </f:for>
       </f:for>

SQL Fehler:

SELECT .* FROM tx_medialibrary_media_playlist_mm LEFT JOIN ON
tx_medialibrary_media_playlist_mm.uid_local = .uid WHERE
tx_medialibrary_media_playlist_mm.uid_foreign = '1' AND
(tx_medialibrary_domain_model_media.type='Tx_Medialibrary_Domain_Model_Media'
OR
tx_medialibrary_domain_model_media.type='Tx_Medialibrary_Domain_Model_Media_Video'
OR
tx_medialibrary_domain_model_media.type='Tx_Medialibrary_Domain_Model
_Media_Audio') ORDER BY
tx_medialibrary_media_playlist_mm.sorting_foreign ASC


Es scheint also so, das bei
tx_medialibrary_media_playlist_mm.uid_local
= .uid Tx_Medialibrary_Domain_Model_Media nicht aufgelöst wird.

Es müsste doch tx_medialibrary_media_playlist_mm.uid_local =
Tx_Medialibrary_Domain_Model_Media.uid heissen, oder?


Ist das jetzt ein Bug ober mache ich hier grundlegend was Falsch?

Bis denne, Eike



--
EIKE STARKMANN
    starkm...@undkonsorten.com
    +49.30.20236354 [fon]

UNDKONSORTEN GBR
    Waldemarstr. 38
    10999 Berlin

    www.undkonsorten.com
    +49.30.20236354 [fon]
    +49.30.20236354-9 [fax]

    thomas alboth, felix althaus + jochen biedermann  [gesellschafter]
_______________________________________________
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



--
EIKE STARKMANN
   starkm...@undkonsorten.com
   +49.30.20236354 [fon]

UNDKONSORTEN GBR
   Waldemarstr. 38
   10999 Berlin

   www.undkonsorten.com
   +49.30.20236354 [fon]
   +49.30.20236354-9 [fax]

   thomas alboth, felix althaus + jochen biedermann  [gesellschafter] 
_______________________________________________
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



--
EIKE STARKMANN
 starkm...@undkonsorten.com
 +49.30.20236354 [fon]

UNDKONSORTEN GBR
 Waldemarstr. 38
 10999 Berlin

 www.undkonsorten.com
 +49.30.20236354 [fon]
 +49.30.20236354-9 [fax]

 thomas alboth, felix althaus + jochen biedermann  [gesellschafter]
_______________________________________________
TYPO3-german mailing list
TYPO3-german@lists.typo3.org
http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german

Antwort per Email an