digedag / cfc_league_fe

Frontend extension for T3sports
3 stars 5 forks source link

Probleme beim Einschränken der Teamview nach Positionen via SQL #39

Open bastians opened 7 years ago

bastians commented 7 years ago

Ich würde gerne via SQL (und später dann via TypoScript) die Teamview-Ausgabe einschränken und nur Spieler mit einer bestimmten Position ausgeben, die ich via Teamnote zugeordnet habe. Das habe ich soweit auch hinbekommen, indem ich den Debug-Modus der Teamview aktiviert habe, die Abfrage kopiert dann ergänzt habe. Das ergibt dann Beispiels folgende Abfrage:

SELECT tx_cfcleague_profiles.* FROM tx_cfcleague_profiles WHERE 1=1 AND tx_cfcleague_profiles.uid IN (1317,596,711,252,945,5,518,178,179,1100,695,1489,1291,1388,1389,1490,12,556,763,1103,1491,1319,1391,1390) AND tx_cfcleague_profiles.deleted=0 AND tx_cfcleague_profiles.hidden=0 AND tx_cfcleague_profiles.uid IN (SELECT tx_cfcleague_team_notes.player FROM tx_cfcleague_team_notes WHERE tx_cfcleague_team_notes.comment = 'Abwehr')

Ergänzt habe ich folgendes: AND tx_cfcleague_profiles.uid IN (SELECT tx_cfcleague_team_notes.player FROM tx_cfcleague_team_notes WHERE tx_cfcleague_team_notes.comment = 'Abwehr')

Problem nun: Mir werden zu viele Spieler ausgegeben. Nämlich Spieler, die in einer Vorsaison auch im Team waren, damals mit der Position "Abwehr" in der aktuellen Saison aber mit einer anderen Position.

Nun habe ich versucht, die Abfrage nochmals irgendwie einzuschränken, bspw. über das Team aber das bringt ja leider nichts.

Wie komme ich denn zu meinem Ziel? Irgendwelche Ideen?

bastians commented 7 years ago

Hach, kleinen Denkfehler gehabt ;) Natürlich bringt es was, das nochmals über das Team einzuschränken, man sollte es nur an der richtigen Stelle machen ;)

SELECT tx_cfcleague_profiles.* FROM tx_cfcleague_profiles WHERE 1=1 AND tx_cfcleague_profiles.uid IN (1317,596,711,252,945,5,518,178,179,1100,695,1489,1291,1388,1389,1490,12,556,763,1103,1491,1319,1391,1390) AND tx_cfcleague_profiles.deleted=0 AND tx_cfcleague_profiles.hidden=0 AND tx_cfcleague_profiles.uid IN (SELECT tx_cfcleague_team_notes.player FROM tx_cfcleague_team_notes WHERE tx_cfcleague_team_notes.comment = 'Abwehr' AND tx_cfcleague_team_notes.team = 5148)

D.h. letztlich musste ich das Team innerhalb der Abfrage ergänzen, die ich angehängt hatte;

AND tx_cfcleague_profiles.uid IN (SELECT tx_cfcleague_team_notes.player FROM tx_cfcleague_team_notes WHERE tx_cfcleague_team_notes.comment = 'Abwehr' AND tx_cfcleague_team_notes.team = 5148)

So, nun scheitere ich gerade daran, wie ich das ins TypoScript bekomme. Würde das gerne hier integrieren: bildschirmfoto 2017-09-03 um 17 36 54

Das Modul habe ich 1x angelegt und auf den entsprechenden Teamseiten verknüpft. Je Teamseite habe ich die Altersklassen-IDs via TS-Template hinterlegt, worüber die Einschränkung je Altersklasse erfolgt.

bastians commented 7 years ago

Mein Versuch bisher:

#Abfrage nach Postion "Abwehr" einschränken
teamview.team.player.abwehr = CONTENT
abwehr {
   table = tx_cfcleague_team_notes
   select {
      where = (comment = "Abwehr")
      selectFields = player
   }
}

Passiert leider gar nichts.

bastians commented 7 years ago

Ich befürchte, das wird nicht so klappen wie ich mir das vorstelle, da die Spielerzuordnung in einer Spalte der Datenbanktabelle für die Mannschaften gespeichert wird und nicht in einer extra Tabelle.

@digedag Hat das ein Grund wieso das so gelöst wurde? Wäre einen eigene Datenbanktabelle für die Zuordnung von Spieler zu Mannschaften nicht geschickter? Da könnte man dann auch Informationen, die aktuell via Teamnotiz gespeichert werden, abbilden (Position, Spielerbild, Trikotnummer, etc.).

digedag commented 7 years ago

Die Speicherung der Spielerzuordnung ohne MM-Tabelle hat historische Gründe. Das würde ich heute sicher nicht mehr so machen. Bisher hat das aber auch nie große Nachteile gehabt, weil MySQL solche Sets ganz gut unterstützt. Für dein Problem habe ich jetzt mal eine alternative Umsetzung implementiert. Du bist ja eigentlich im Team-View und willst dort die unterschiedlichen Listen anzeigen. Eine ähnliche Funktion gibt es auch im Spielbericht mit den dynamischen Tickerlisten. Also hab ich das mal für die Spieler adaptiert. Per Typoscript kannst du jetzt beliebig viele Listen konfigurieren:

plugin.tx_cfcleaguefe_report.teamview.team {
      # Konfiguration von verschiedenen Spielerlisten
      playerLists {
        # damit werden die Listen mit dem Prefix ###TEAM_PLAYERLIST bereitgestellt
        # Das sind nur Beispiele
        defence {
            profile =< lib.t3sports.profile
          filter.fields.TEAMNOTE.COMMENT.OP_EQ = Abwehr
          filter.options {
          }
        }
        midfield =< plugin.tx_cfcleaguefe_report.teamview.team.playerLists.defence
        midfield.filter.fields.TEAMNOTE.COMMENT.OP_EQ = Mittelfeld
        offence =< plugin.tx_cfcleaguefe_report.teamview.team.playerLists.defence
        offence.filter.fields.TEAMNOTE.COMMENT.OP_EQ = Angriff
      }
}

Die Bedingung auf das aktuelle Team wird automatisch hinzugefügt, sobald eine Filterung auf die Team-Notes gefunden wird. Und bei der Ausgabe werden die Marker für die Liste per Konvention zusammengebaut:

      <!-- ###TEAM_PLAYERLISTDEFENCES### begin -->
        <h2>Abwehr</h2>
        <ul>
      <!-- ###TEAM_PLAYERLISTDEFENCE### begin -->
        <li>###TEAM_PLAYERLISTDEFENCE_DCNAME###
      <!-- ###TEAM_PLAYERLISTDEFENCE### end -->
        </ul>
      <!-- ###TEAM_PLAYERLISTDEFENCES### end -->

Wenn du die Liste im Typoscript defence nennst, dann wird daraus also der Marker ###TEAM_PLAYERLISTDEFENCES###

Ich denke, damit solltest du dein Problem lösen können... :smile:

bastians commented 7 years ago

@digedag Stark, danke! Ich habe es natürlich gleich mal ausgetestet. So ganz habe ich es noch nicht hinbekommen. Brauche ich die aktuellsten Versionen von cfcleague_fe, cfcleague und rn_base?

digedag commented 7 years ago

Du musst cfc_league mit aktualisieren. Über meinem Kommentar siehst du die drei Commits zu dem Feature.

bastians commented 7 years ago

Ok, jetzt hat er etwas ausgeworfen. Aber durch die Updates der Extensions läuft es nun teilweise an anderen Stellen nicht mehr, das muss ich nun Mal prüfen. Bis dahin nochmals vielen Dank! :)

digedag commented 7 years ago

Ich hab die Suche nach Personen etwas angepasst. Da wird jetzt immer der Alias PROFILE für die Tabelle tx_cfcleague_profiles genutzt.

bastians commented 7 years ago

Nun läuft es stabiler, die TYPO3-Version meiner Testumgebung war noch eine ältere ;) Aber schau mal hier: http://test.fvloechgau.de/index.php?id=55

Dort lasse ich den kompletten Kader wie bisher ausgeben und darunter nur die Spieler, die Abwehr als Teamnotiz hinterlegt haben. Da werden aber zu viel angezeigt. Woran kann das liegen?

Und noch ein anderes Topic: Nach dem Update der Extensions auf den aktuellen Stand bekomme ich ich im Backend mit dem T3Sports-Modul nur eine leere Seite, Error-Log zeigt das hier:

PHP Fatal error: Class 'tx_rnbase' not found in [...]/typo3conf/ext/cfc_league/mod1/index.php on line 48

Neues Issue? Meine TYPO3-Version ist noch die 6.2.29

bastians commented 7 years ago

Ich hab's, nun passt es. Und zwar existierten noch alte Teamnotizen vom Kopieren der Vorsaison im Papierkorb. Kann man die noch irgendwie ausschließen?

digedag commented 7 years ago

Bitte nochmal die beiden Extensions aktualisieren. Dann sollten die gelöschten TeamNotes ignoriert werden. Besteht das Problem im BE noch? Ich hab es mit den aktuellen Versionen in einer 6.2 ausprobiert - keine Fehler.

bastians commented 7 years ago

Klasse, passt nun. Aber das Problem im BE tritt immer noch auf. Soll ich ein neues Issue erstellen?

bastians commented 3 years ago

@digedag Bekomme hier seit kurzem folgenden Fehler und die Ansicht wird nicht mehr geladen:

Core: Exception handler (WEB): Uncaught TYPO3 Exception: [] operator not supported for strings | Error thrown in file /[...]/typo3conf/ext/cfc_league/Classes/Search/ProfileSearch.php in line 80.

Kann das damit zusammenhängen oder läuft da etwas anderes schief?

digedag commented 3 years ago

@bastians ich hab eben in cfc_league einen Fix hochgeladen. Da war noch ein Bug drin. :slightly_frowning_face:

bastians commented 3 years ago

@digedag Danke, ich leite es weiter, scheint aber gut auszusehen.

Zwei Rückfragen:

  1. Bei dieser Variante ist definitiv ein Teamnotiz Pflicht, damit was ausgegeben wird, korrekt? Das Fallback auf die Position aus einem Spieler greift hier nicht, oder?
  2. Könnte man die Ausgabe gebündelt nach Positionen eigentlich auch über mehrere Plugins auf einer Seite lösen (ein Plugin je Position) und dann die Ausgabe jeweils über das TS des Plugins einschränken?
bastians commented 3 years ago

Noch ergänzend: Ich habe folgendes TS als Fallback für die Position, falls es keine Teamnotiz gibt:

### Teamnote Position ###
lib.t3sports.profile {
    tnposition =< lib.t3sports.teamnote
    tnposition {
        stdWrap.ifEmpty.cObject = TEXT
        stdWrap.ifEmpty.cObject {
            field = position
        }
    }
}

Kann man das in dem TS für die dynamische Teamliste berücksichtigen?