Moin,
im JavaScript sollte ein Aufruf von jr_subtable_refresh() im SuccessCallback ausreichen, damit die Ansicht aktualisiert wird.
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.
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, ...
Moin Moin,
ich sehe zwei Sachen die du mal probieren könntest:
- 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.
- 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
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.
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.
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();
}
}
?>
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
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.
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.