2016-07-14 5 views
0

Hallo allerseits Ich arbeite derzeit an einem Formular, das Zeilen aus einer verwandten Tabelle enthält und Verarbeitung des Formulars hat eine präsentiert Herausforderung: Was ist in F3 die beste Methode, um ein Formular zu bearbeiten, das dazu führen kann, dass Zeilen in einer verknüpften Tabelle hinzugefügt, geändert oder gelöscht werden?Fat-Free-Framework: Hinzufügen/Ändern/Löschen von Datensätzen verwandter Tabelle mit DB SQL Mapper

DB Schema

practitioner 
------------------------------ 
id   | int(10) 
first_name | varchar(255) 
last_name | varchar(255) 
abn  | char(11) 
mobile  | varchar(20) 
email  | varchar(255) 

practice_site 
------------------------------ 
id   | int(10) 
name  | varchar(255) 

provider_number 
------------------------------ 
id    | int(10) 
practice_site_id | int(10) 
practitioner_id | int(10) 
provider_number | varchar(20) 

Das Form

  • Provider Nummern dynamisch hinzugefügt werden, Formularnamen sind mit _n geändert, z.B. provider_number_3
  • Die Schaltfläche Löschen entfernt die insgesamt Reihe, dort Sinn provider_number_1 sein kann und provider_number_3 aber keine provider_number_2

enter image description here

Formularausgabe

Die Provider Zahlen in etwas ein bisschen umgewandelt werden überschaubarer als *_n.

Andere Felder, id, first_name, usw. werden dank copyfrom() leicht aktualisiert.

Array 
(
    [id] => 1 
    [first_name] => Jon 
    [last_name] => Doctor 
    [abn] => 12345678902 
    [mobile] => 0491729472 
    [email] => [email protected] 
    [provider_numbers] => Array 
     (
      [0] => Array 
       (
        [provider_number] => ASBDF24 
        [practice_site_id] => 2 
       ) 

      [1] => Array 
       (
        [provider_number] => 1249FBK 
        [practice_site_id] => 2 
       ) 

     ) 

) 

Das Problem

Einige Bedingungen über Providernummern können auftreten, wenn das Formular abgeschickt wird:

  • Eine neue Anbieter Nummer
  • Ein Anbieter Nummer hinzugefügt wird, geändert
  • Eine Übungsstelle wurde geändert
  • Ein Anbieter Nummer

entfernt Wie der beste Weg, um dies zu realisieren wäre? (Vorzugsweise mit der Klasse DB\SQL\Mapper von Fat-Free-Framework).

Mögliche Lösung:

  • ein $db->exec() Sie eine Reihe von bestehenden provider_number Tisch zu bekommen, wo provider_id = POST.id
  • ein array_diff() Führen Sie alle Einträge in der Datenbank zu finden, die nicht in Form ist dann eine Aussage über DELETE diese Aufzeichnungen. Truncate das ursprüngliche Array.
  • Traverse durch Array suchen, ob die s übereinstimmen. Wenn sie es tun, aber practice_site_id ist anders, aktualisieren. Wenn practice_site_id gleich ist, nichts tun.
  • Wie kann man genau bestimmen, ob sich eine provider_number für eine bestimmte practice_site_id geändert hat?

Eine andere Möglichkeit:

  • Ändern der Form provider_number.id aufzunehmen, wenn eine neue Zeile hinzugefügt wird, die neueste verfügbare ID aus der von @ xfra35
+1

Ihr letzter Vorschlag sieht wie die einfachste Lösung aus (include 'provider_number.id'). Auf diese Weise brauchen Sie nur '$ providerNumber-> load (['id =?', $ Id])' und der Mapper wird automatisch eingefügt oder aktualisiert, je nachdem ob die ID mit einem existierenden Datensatz übereinstimmt oder nicht. Sie müssen auch gelöschte Datensätze verfolgen. Dies könnte mit einem zusätzlichen versteckten booleschen Löschfeld erreicht werden. – xfra35

Antwort

0

Nach dem Vorschlag Datenbank greifen in meine Frage, ich ging mit der zweiten Möglichkeit - provider_number.id zum Formular selbst hinzufügen und von dort aus gehen. Wenn Sie weitere Vorschläge oder Ratschläge haben, zögern Sie nicht zu teilen! Das Formular wurde so geändert, dass Werte in provider_numbers[provider_number][] and provider_numbers[practice_site_id][] anstelle von practice_site_1, practice_site_2, etc eingefügt wurden. Dies hat den Code für das dynamische Einfügen der Zeilen viel einfacher gemacht als *_n muss nicht mehr verfolgt werden.

<div class="delete-array"> wurde in das Formular eingefügt und jedes Mal, wenn auf die Schaltfläche zum Löschen geklickt wurde, wurde Folgendes eingefügt: <input type="hidden" name="provider_numbers[delete][]" value="' + id + '" />.

Der neue Knopf holt den nächsten AUTO_INCREMENT Wert von der Datenbank und hat einige grundlegende Logik, wenn mehr als eine Lieferantennummer zur Zeit hinzugefügt wird. (Caveat: Wird brechen, wenn mehrere Benutzer diese Funktion zur gleichen Zeit zu manipulieren)

var new_id; 
$('.btn-add-provider-number').click(function() { 

    if (typeof(new_id) === "undefined") { 
     $.getJSON({url:'{{ @BASE }}/provider_numbers/new_id.json', async:false}).done(function(data) { 
      new_id = data; 
     }); 
    } else { 
     new_id++; 
    } 

    var newRow = ' .... '; 
    $('.provider-numbers').append(newRow); 
} 

Ein Formular sieht nun so etwas wie:

Array 
(
    [id] => 1 
    [first_name] => Amy 
    [last_name] => Doctor 
    [abn] => 66627819264 
    [mobile] => 0472888798 
    [email] => [email protected] 
    [provider_numbers] => Array 
     (
      [delete] => Array 
       (
        [0] => 6 
       ) 

      [provider_number] => Array 
       (
        [0] => 64872HJF 
        [1] => 182947KD 
       ) 

      [practice_site_id] => Array 
       (
        [0] => 1 
        [1] => 2 
       ) 

      [id] => Array 
       (
        [0] => 1 
        [1] => 7 
       ) 
     ) 
) 

dann mit der folgenden behandelt wird code:

$updated = []; 
$provider_numbers = []; 
$provider_numbers_delete = []; 

foreach ($f3->get('POST') as $key => $val) { 
    if ($key == 'provider_numbers') { 
     foreach ($val as $pn_key => $pn_val) { 
      if ($pn_key !== 'delete') { 
       foreach ($pn_val as $pnk_key => $pnk_val) { 
        $provider_numbers[$pnk_key][$pn_key] = $pnk_val; 
       } 
      } else { 
       $provider_numbers_delete = $pn_val; 
      } 
     } 
    } else if (is_scalar($val) && $practitioner->exists($key)) { 
     $practitioner->set($key, $val); 
     $updated[] = $key; 
    } 
} 

if (!empty($provider_numbers)) { 
    foreach($provider_numbers as $pn) { 
     $provider_number->load(['id = ?', $pn['id']]); 
     if ($provider_number->dry()) { 
      $provider_number->set('practitioner_id', $f3->get('POST.id')); 
     } 
     $provider_number->copyfrom($pn); 
     $provider_number->save(); 
     $updated['provider_numbers'][] = $pn; 
    } 
} 

if (!empty($provider_numbers_delete)) { 
    foreach ($provider_numbers_delete as $pnd) { 
     $provider_number->load(['id = ?', $pnd]); 
     if (!$provider_number->dry()) { 
      $provider_number->delete(); 
     }  
    } 
} 
+1

Hinweis: Sie müssen die nächste auto_increment ID nicht erraten. Ein 'NULL'-Wert ist ausreichend. – xfra35

+0

Oh großartig! Ich werde so schnell wie möglich ändern – mulquin

Verwandte Themen