2016-11-20 8 views
0

Ich brauche deine Ratschläge, was ist die beste Praxis für das nächste Problem:Laravel Vorschau vor dem DB speichern

Ich habe eine (sehr anspruchsvoll) Form in meinem Admin-Panel, es speichert Bilder, regelmäßige Felder in das Hauptmodell und spart auch viele Beziehungen für das Hauptmodell.

Jetzt möchte ich eine "Vorschau vor dem Speichern" -Funktion hinzufügen, damit der Administrator die Änderungen in der Vorschau anzeigen kann, bevor sie in der Datenbank gespeichert werden, das Problem ist, dass ich das Modell oder seine Beziehungen zur DB nicht speichern kann weil dann die Benutzer die aktualisierten Daten sehen, bevor sie veröffentlicht werden. Ich kann den Post auch nicht entfernen, da die Benutzer keinen Zugriff auf den Post haben.

Update:

Es ist wichtig zu wissen, dass die Lösung generisch sein muss, da ich nicht immer wissen, was die Models sind und Objekte, die die Vorschau-Seite verwendet.

Vielen Dank im Voraus!

+0

Welche Informationen müssen genau angezeigt werden? –

+0

Alle Seiten (wie üblich) einschließlich der Änderungen am Hauptmodell und seinen Beziehungen. –

Antwort

1

Wenn Sie in der Lage sein möchten, die Website mit den Änderungen in Wirkung zu durchsuchen, dann müssen Sie auf eine Weise arbeiten, um einen Beitrag und seine verwandten Modelle in einer Art "Entwurf" -Modus zu identifizieren für bestimmte Benutzer sichtbar.

Sie können Abfrage Bereiche für eloquent zum Beispiel einrichten, die automatisch Abfragen für jedes Modell durch eine bestimmte Spalte/Wert filtern:

https://laravel.com/docs/5.3/eloquent#query-scopes

ich einen Abfragebereich schaffen würde, die eine Auth-Check tut und fügt eine where-Klausel, um Filterergebnisse nach unten, wenn der Benutzer nicht angemeldet ist (Sie optional für eine bestimmte Rolle überprüfen könnten auch hier):

class PublicScope implements ScopeInterface { 

    public function apply(Builder $builder) 
    { 
     if(!Auth::check()) { 
      $builder->where(function($query) { 
       $query->where('is_draft', '!=', 1); 
      }); 
     } 
    } 

    public function remove(Builder $builder) 
    { 
     $query = $builder->getQuery(); 

     foreach((array)$query->wheres as $key => $where) { 
      if($where['column'] == 'is_draft') { 
       unset($query->wheres[$key]); 
       $query->wheres = array_values($query->wheres); 
      } 
     } 
    } 
} 

wenn Sie nicht möchten, dass die Modelle mit Updates sein währenddessen versteckt Wenn sie in der Vorschau angezeigt werden, können Sie im Entwurfsmodus Duplikate jedes Modells erstellen, sodass die alten Modelle unverändert bleiben. Wenn der Benutzer entscheidet, die Änderungen zu entfernen, können Sie einfach die duplizierten Modelle löschen, wenn sie fortfahren und sie speichern möchten, könnten sie die alten überschreiben.

+0

Sie sollten also die Beziehungen in denselben Tabellen speichern oder auch die Tabellen klonen? –

+0

Gleiche Tabellen, eventuell an den Postnamen anhängen (Draft). Verwenden Sie Abfragebereiche, um sicherzustellen, dass Entwürfe nur von Administratoren im System gesehen werden, ohne dass eine where-Klausel manuell zu jeder Abfrage hinzugefügt werden muss. –

+0

Ich würde wahrscheinlich in der Erstellung eines Merkmals für alle Modelle suchen, die Entwürfe haben können, die auf ein "Speichern" oder "Aktualisieren" -Ereignis warten, prüft den Entwurfsstatus und ändert das Verhalten entsprechend. Auf diese Weise müssen Sie keine Änderungen an Ihren Controllern/Befehlen/Jobs vornehmen und mit Formulareingaben umgehen. –

Verwandte Themen