Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Table Manager: be_manager_relation-Feld sortierbar machen mit Prio bei m:n Beziehungen mit Relationstabelle #89

Closed
alxndr-w opened this issue Jun 25, 2016 · 19 comments

Comments

@alxndr-w
Copy link
Contributor

alxndr-w commented Jun 25, 2016

Ich hatte die Problematik mal in einem PR für xform erläutert, laut @gharlan könnte das Problem bei yform noch genauso bestehen:

yakamara/redaxo_xform#339

Das Feld be_relation" legt ja auch in seiner Optik mit den Pfeilen hoch/runter schon nahe, dass man Einträge eines Datensatzes auch nachträglich umsortieren kann und nicht nur beim hinzufügen neuer Datensätze.

@gharlan
Copy link
Member

gharlan commented Jun 27, 2016

Kann bestätigen, bei Nutzung von Relationstabellen klappt das Umsortieren nicht.

(Bei Multiple-Popup-Relations ohne Relationstabelle hingegen schon, funktioniert aber ja auch ganz anders.)

@alxndr-w
Copy link
Contributor Author

PR müsste man doch recht schnell umbauen können? Bin nur gerade so viel mit yform_doku beschäftigt ;)

yakamara/redaxo_xform@018ec5e

@dergel
Copy link
Member

dergel commented Dec 22, 2018

wie im anderen issue bereits beschrieben ist das nicht in dieser Form leicht machbar.

Am besten in diesen Fällen das neue BE Inline Relation Feld nutzen. Dann die Verknüpfungstabelle mit einem Priofeld versehen und schon kann man alles sortieren.

@dergel dergel closed this as completed Dec 22, 2018
@alxndr-w
Copy link
Contributor Author

Moment, Moment, kannst du mir einen Screenshot der Konfiguration schicken?

@dergel
Copy link
Member

dergel commented Dec 24, 2018

bildschirmfoto 2018-12-24 um 13 40 22

Haupttabelle mit inline Verknüpfung
bildschirmfoto 2018-12-24 um 13 41 04

Verknüpfungstabelle. relations zurück
bildschirmfoto 2018-12-24 um 13 41 19

@alxndr-w
Copy link
Contributor Author

Das eignet sich nur begrenzt, weil die Datensätze ja vollständig angezeigt werden, oder?

Eine Sortierung von sagen wir mal 20 Datensätzen ufert in sehr viel drag&drop/pfeilklicken aus, oder? Ich finde das noch unbefriedigend. Die Prios sollten auch in anderen Relations-Optionen funktionieren.

@dergel
Copy link
Member

dergel commented Dec 24, 2018

funktioniert ja nur bei den Relationstabelle nicht wie du es dir wünscht, weil nirgends eine Prio gesetzt werden kannn. Bei den normalen MultipleFeldern gehts ja.

Umbau ist möglich aber aufwändig. In der Relationstabelle müsste man zunächst ein Priofeld anlegen, und das müsste dann beim Sortieren beachtet werden.

@dergel dergel reopened this Dec 24, 2018
@dergel dergel changed the title Table Manager: be_relation-Feld sortierbar machen Table Manager: be_relation-Feld sortierbar machen mit Prio bei Relationstabellen Dec 24, 2018
@tbaddade
Copy link
Member

Hätte dies eben auch gut gebrauchen können.
Haben es jetzt aber mit Inlinerelationen umgesetzt. Ist nur in der Pflege aber eher supoptimal.

@alxndr-w
Copy link
Contributor Author

Finde auch, dass Inline das Problem nicht ausreichend löst

@alxndr-w
Copy link
Contributor Author

Uff, ich bräuchte das jetzt oder portiere wohl meine Lösung aus xform in eine eigene Felddefinition. Eine Lösung ist noch nicht in Aussicht, oder?

@alxndr-w
Copy link
Contributor Author

Entschuldigt, wenn ich hier ein Selbstgespräch führe, aber 3 Jahre später habe ich ein besseres Verständnis von YForm bekommen und sehe das jetzt eigentlich als machbar an:

  • die 2 Relations-Felder in der Relationstabelle werden in ihrer Kombination als UNIQUE definiert
  • die Relationstabelle muss zusätzlich über 2 Prioritätsfelder verfügen
  • beim Speichern bekommen die Datensätze mittels ON DUPLICATE UPDATE grundsätzlich die neue Reihenfolge definiert - je nachdem, von wo ich die Relation bearbeite (es müssen nie beide Prio-Felder ausgefüllt werden)
  • somit wird das Problem gelöst, dass nicht wie bei meiner Lösung neue Datensätze angelegt werden mit neuen IDs, sondern die bestehenden erhalten bleiben.
  • Der Zustand "Sortierbarkeit" sollte zum Standardverhalten werden.

Ich würde gerne einen PR dazu beitragen, habe aber das Gefühl, dass andere das besser könnten.

Die Fragen, die sich für mich stellen sind: Wenn man kein Prio-Feld hat, wird dann vielleicht automatisch eins angelegt? Wie müssen die beiden Prio-Felder heißen oder kann man die manuell verknüpfen? Akzeptiert man einfach ein Fehlverhalten, wenn es die Felder nicht gibt oder bekommt sogar einen Fehler?

Das ganze bezieht sich natürlich nach wie vor nur auf Relationen mit Hilfstabelle.

@alxndr-w
Copy link
Contributor Author

alxndr-w commented Jul 26, 2019

in

https://github.com/yakamara/redaxo_yform/blob/beec3f064dda79263f03d42a666af72eca3fe98b/plugins/manager/lib/yform/value/be_manager_relation.php#L436-L443

tauschen durch


        try {
            rex_sql_table::get(rex::getTable($relationTable))
            ->ensurePrimaryIdColumn()
            ->ensureColumn(new rex_sql_column($relationTableField['source']."_prio", 'int(10) unsigned'))
            ->ensureColumn(new rex_sql_column($relationTableField['source'], 'int(10) unsigned'))
            ->ensureColumn(new rex_sql_column($relationTableField['target'], 'int(10) unsigned'))
            ->ensureColumn(new rex_sql_column($relationTableField['target']."_prio", 'int(10) unsigned'))
            ->ensureIndex(new rex_sql_index($relationTableField['source']."_".$relationTableField['target'], [$relationTableField['source'], $relationTableField['target']], rex_sql_index::UNIQUE))
            ->ensure();
        } catch (PDOException $ex) {
        }

        $prio = 1;
        foreach ($values as $value) {
            
            rex_sql::factory()->setDebug(1)->setQuery('INSERT INTO '.$sql->escapeIdentifier($relationTable).'(`id`,'.$sql->escapeIdentifier($relationTableField['source']."_prio").','.$sql->escapeIdentifier($relationTableField['source']).','.$sql->escapeIdentifier($relationTableField['target']).') VALUES (NULL, :prio, :source, :target) ON DUPLICATE KEY UPDATE '.$sql->escapeIdentifier($relationTableField['source']."_prio").' = :prio, '.$sql->escapeIdentifier($relationTableField['source']) .' = :source, '.$sql->escapeIdentifier($relationTableField['target']).' = :target', [":prio"=>$prio++, ":source" => $source_id, ":target" => $value]);
        }     

Leider wird ensure() nicht übernommen, aber das ist ein guter Weg imho. Gespeichert wird jetzt auf jeden Fall in der richtigen Reihenfolge.

Wie kann ich, sofern ein prio-Feld vorhanden ist, dieses auch wieder auslesen, wenn die Reihenfolge für das Feld zusammengestellt wird?

edit: vermutlich hier, aber ich kann ja hier nicht order by source_prio machen, da ich ja nicht weiß, ob das Feld existiert. Wie löst man das?

https://github.com/yakamara/redaxo_yform/blob/beec3f064dda79263f03d42a666af72eca3fe98b/plugins/manager/lib/yform/value/be_manager_relation.php#L678-L697

@tbaddade
Copy link
Member

vermutlich hier, aber ich kann ja hier nicht order by source_prio machen, da ich ja nicht weiß, ob das Feld existiert. Wie löst man das?

Über die Methode getValueFields(['type_name' => 'prio']); kannst du schauen ob ein pro Feld existiert.

@alxndr-w
Copy link
Contributor Author

alxndr-w commented Jul 26, 2019

ich muss aber prüfen, ob ein Priofeld (von zweien) mit bestimmtem Namen existiert, wie müsste das dann aussehen? Kann ich da getValueFields(['name' => $relationTableFields['source'].'_prio' ]) schreiben?

edit: oder noch besser: ob ein Priofeld existiert, das auf ein bestimmtes Feld in dieser Tabelle beschränkt ist - und dessen Feldnamen bräuchte ich dann.

@tbaddade
Copy link
Member

Die Methode gibt dir ein Array zurück, wo der Key der Spaltenname ist. Schau dir mal diese Zeilen an, wo alle Choice-Felder geholt werden.

yakamara/redaxo_yform_docs#139

Ich vermute das ist das, was du benötigst.

@alxndr-w
Copy link
Contributor Author

Ich probiere es Mal aus...

dergel pushed a commit that referenced this issue Sep 4, 2019
vorbereitende Maßnahme für #89
@dergel
Copy link
Member

dergel commented Dec 6, 2021

habe es nicht komplett durchgelesen. Aber ich nehme mal den Titel und denke dass dieses Issue durch ist - wenn nein, gerne nochmal den zentralen Punkt einzeln aufschreiben :)

@dergel dergel closed this as completed Dec 6, 2021
@alxndr-w
Copy link
Contributor Author

alxndr-w commented Dec 6, 2021

Nicht, dass ich wüsste. Gibt's dazu etwas in YForm 4?

Ich wüsste immer noch nicht, dass das geht.

@alxndr-w alxndr-w changed the title Table Manager: be_relation-Feld sortierbar machen mit Prio bei Relationstabellen Table Manager: be_manager_relation-Feld sortierbar machen mit Prio bei Relationstabellen Nov 13, 2023
@alxndr-w
Copy link
Contributor Author

alxndr-w commented Nov 13, 2023

image

Diese sind ohne Funktion, sobald der Datensatz einmal gespeichert wurde bzw. die Sortierung kann logischerweise nicht gespeichert werden.

@alxndr-w alxndr-w changed the title Table Manager: be_manager_relation-Feld sortierbar machen mit Prio bei Relationstabellen Table Manager: be_manager_relation-Feld sortierbar machen mit Prio bei m:n Beziehungen mit Relationstabelle Nov 13, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants