Examples: query, "exact match", wildcard*, wild?ard, wild*rd
Fuzzy search: cake~ (finds cakes, bake)
Term boost: "red velvet"^4, chocolate^2
Field grouping: tags:(+work -"fun-stuff")
Escaping: Escape characters +-&|!(){}[]^"~*?:\ with \, e.g. \+
Range search: properties.timestamp:[1587729413488 TO *] (inclusive), properties.title:{A TO Z}(excluding A and Z)
Combinations: chocolate AND vanilla, chocolate OR vanilla, (chocolate OR vanilla) NOT "vanilla pudding"
Field search: properties.title:"The Title" AND text
Beantwortet
Aktualisierung einer Untertabellenansicht im Dialog nach Anpassung in einer Dialogfunktion

Moin aus dem Norden,

ich kopiere Einträge zwischen zwei Untertabellen in einer PHP Dialogfunktion (insertSubtableRow, deleteSubtableRow) und rufe im Anschluss die save()-Methode zur Übernahme der Änderungen auf. Nach der Rückkehr in den Dialog sind diese Anpassungen jedoch noch nicht sichtbar. Erst ein Sichern des Dialogs mit dem verbundenen Refresh macht diese Einträge dann auch für den Nutzer sichtbar. Aber ich möchte diese natürlich bereits direkt beim Verlassen der jr_execute_dialog_function dem User anzeigen. Wie kann ich das Element der Untertabellenansicht neu laden?

Wir sind auf der derzeit aktuellsten LTS Version des JobRouters.

  
  
Gepostet vor 5 Monaten
Stimmen Neuste

Antworten 5


Moin,

im JavaScript sollte ein Aufruf von jr_subtable_refresh() im SuccessCallback ausreichen, damit die Ansicht aktualisiert wird.

  
  
Gepostet vor 5 Monaten
1
1

Habe ich versucht, aber diese Funktion aktualisiert ja "nur" die SQL-Spalten. Oder kannst du anderes bestätigen?

Swen Niehaus   vor 5 Monaten Melden
  
  

Stimmt, mein Fehler. Bin zufällig letzte Woche auf ähnliche Probleme gelaufen, hatte aber nur SqlList Felder verwendet.

Simon H. Hellmann   vor 5 Monaten Melden

Vor diesem Problem standen wir auch einmal. Daten konnten nur per PHP von einer API abgefragt werden und sollten dann in einer Tabelle dargestellt werden. Wir haben statt einer Subtable dann eine SQL-Tabelle genommen und diese mit Filter auf die aktuelle Schritt-ID refresht, nachdem die PHP die Subtable im Hintergrund neu geschrieben hatte.

Heute würde ich das eher so lösen, dass ich die Zeilen als Objekt an Javascript zurückgebe und dann über jr_subtable_init oder jr_add_subtable_row mit den gelieferten Daten die Tabelle neu befülle bzw. ergänze.

  
  
Gepostet vor 5 Monaten
  
  

War auch schon meine Idee. Ich habe jedoch Dateianhangsfelder. Diese können leider nicht per JS befüllt/kopiert werden. In diesem Fall wird eine JobRouterException geworfen. Mein bisheriger Workaround (da save() im PHP ja "eh" bereits ausgführt wurde, ...

Swen Niehaus   vor 5 Monaten Melden
  
  

... das Speichern im Dialog im SuccessCallback über JS anzustoßen.

Swen Niehaus   vor 5 Monaten Melden

Moin Moin,

ich sehe zwei Sachen die du mal probieren könntest:

  1. Eigentlich brauchst du auf Dialogfunktionen kein save (außer du willst den neuen Zustand wirklich speichern). Wenn du das möchtest, probier mal bitte - und ich weiß wie doof das klingt - save zwei mal hintereinander aufzurufen. Wir haben damit tatsächlich schon so seltsame Verhalten gelöst bekommen.
  2. Die schönere Lösung ist eigentlich aber die Zeilen per JS zu kopieren, dann bekommen die User auch nicht den Ladebildschirm angezeigt und die Datenstrukturen zwischen den Tabellen sind direkt kompatibel zueinander ohne eine Tour über das Backend machen zu müssen.

Grüße

  
  
Gepostet vor 5 Monaten
Stefan Köngeter
309 × 7 Administrator
  
  

Hallo Stefan! Ein doppelter Aufruf der save-Funktion hat leider keine Besserung gebracht. Ein Setzten der UT per JS ist nicht möglich, da Anhangsfelder in UTs nicht per JS gesetzt werden können und es hierbei zu einer Exception kommt.

Swen Niehaus   vor 5 Monaten Melden

Ich lasse euch mal an meinem Lösungansatz teilhaben. Vielleicht hat ja noch jemand eine bessere Idee. Problematisch waren a) die fehlenden DatenbankIDs, da es sich hierbei nicht um die laufende Nummerierung im HTML Code / JS handelt. Diese ID lese ich direkt aus dem DOM-Objekt aus.
Zudem muss der save-Aufruf sowohl im JS als auch im PHP erfolgen, sonst wird die Untertabellenansicht im Dialog nicht aktualisiert.

file

Aufruf im JS mit Prüfung, ob überhaupt ausgewählte Daten vorhanden sind:

function verschiebeDateienZwischenUntertabellen($sourceTable, $targetTable)
{
    $ausgewaehlteRows = erzeugeArrayMitAusgewaehltenEintraegen($sourceTable.replace('MATT', 'UT') , 'checkbox_auswahl');
    if($ausgewaehlteRows.length>0)
    {
        var userParameters = {SOURCE: $sourceTable, TARGET: $targetTable, ROWS: JSON.stringify($ausgewaehlteRows)};
        
        jr_execute_dialog_function('VERSCHIEBE_DATEIEN_ZWISCHEN_UNTERTABELLEN', userParameters, 
            function (successReturnObject) 
            {
                //console.log(successReturnObject.result) ;
                
                jr_execute('save');
            },
            function (errorReturnObject) 
            {
                //console.log(errorReturnObject);
            }
        );
    }
}


function erzeugeArrayMitAusgewaehltenEintraegen($untertabellenansicht, $feldname)
{
    $ausgewaehlteRowIDs = [];
    jr_loop_table($untertabellenansicht, 
        function ($subtable, $rowId) 
        {
            if(jr_get_subtable_value($subtable, $rowId, $feldname) == 1)
            {
                $ausgewaehlteRowIDs.push(document.getElementById($untertabellenansicht.replace('MATT', 'UT')+'_row_id_'+$rowId).value);
                jr_set_subtable_value($subtable, $rowId, $feldname, 0);
                jr_remove_subtable_row($subtable, $rowId);
            }
        }
    );
    return $ausgewaehlteRowIDs;
}

Und dann das einfache PHP:

<?php

class className extends JobRouter\Engine\Runtime\PhpFunction\DialogFunction
{
	public function execute($rowId = null)
	{
		$sourceTable = $this->getParameter('SOURCE');
		$targetTable = $this->getParameter('TARGET');
		$rows = $this->getParameter('ROWS');
		$rows = json_decode($rows, true);
		
        foreach ($rows as $row) 
        {
          
          
            $rowData = array(   'DATEI' => $this->getSubtableValue($sourceTable, $row, 'DATEI', true), 
                                'DATEINAME' => $this->getSubtableValue($sourceTable, $row, 'DATEINAME', true), 
                                'DATEITYP' => $this->getSubtableValue($sourceTable, $row, 'DATEITYP', true)
            );
            $this->insertSubtableRow($targetTable, 1, $rowData);
            $this->deleteSubtableRow($sourceTable, $row);
        }
        
        $this->save();
	}
}
?>
  
  
Gepostet vor 5 Monaten
Bearbeitet vor 5 Monaten

Hi!
Hässlich aber könnte funktionieren: An der Stelle, an der du die Dialogfunktion benutzt, sende den Schritt per JS, führe die Logik als Regelausführungsfunktion aus und öffne den Schritt direkt wieder per "Folgeschritt direkt öffnen".
VG
Jan

  
  
Gepostet vor 5 Monaten
Jan Zimmerbeutel
272 × 4 Administrator
  
  

Danke für deinen Beitrag. Das ist ja im Prinzip der Aufruf "$this->save();" in meinem Skript. Ein save() hat in menien Augen den Vorteil, dass nicht jedesmal ein Incident in der DB erzeugt wird.

Swen Niehaus   vor 5 Monaten Melden
  
  

Richtig, aber wenn du das ganze als Regelausführungsfunktion machst, wird der Dialog neu aufgebaut und die Änderungen sollten sichtbar sein... Natürlcih klar, ein unnötiger Incident wird erzeugt.

Jan Zimmerbeutel   vor 5 Monaten Melden
1K Ansichten
5 Antworten
vor 5 Monaten
vor 5 Monaten
Stichwörter