2016-01-25 3 views
6

Beispiel: Ich habe Mitglieder (die sich anmelden und ihre Daten aktualisieren können), die eine oder mehrere Qualifikationen haben. Also habe ich ein DataObject 'Members' und ein DataObject 'Qualification' mit einer has_one/has_many-Beziehung.Silverstripe 3.2: Wie fügt man Datenobjekten in einer Frontend-Form dynamisch hinzu?

Etwas wie folgt aus:

class Qualification extends DataObject { 

    private static $db = array (
     'Title' => 'Text', 
     'From' => 'Date', 
     'Till' => 'Date' 
    ); 

    private static $has_one = array (
     'Member' => 'Member', 
    ); 

...

class Member extends DataObject { 

    ... 

    private static $has_many = array (
     'Qualifications' => 'Qualification', 
); 

... 

Jetzt möchte ich ein Formular im Frontend bauen, die das Mitglied auf einmal viele Qualifikationen hinzufügen können und auch bestehende Qualifikationen aktualisieren in der gleichen Form.

es so

Qualifikation One

Titel aussehen könnte: xxx (Textfeld) Von: xxx (Datefield) Bis: xxx (Datefield)

Qualifikation Zwei

Titel: xxx (Textfeld) Von: xxx (Datumsfeld) Bis: xxx (datefield)

+ hinzufügen Qualifikationen

Was ist der beste Weg, das zu tun?

kann ich jQuery verwenden, um Felder wie folgt dynamisch hinzuzufügen: http://jsfiddle.net/nzYAW/

Aber wie kann ich mit ihnen umgehen zu der Datenbank zu aktualisieren und hinzuzufügen. Alles, was ich ausprobierte, war wirklich kompliziert und unordentlich, also denke ich, dass jemand anderes eine Idee hat, die ich gerade nicht sehe. Jede Hilfe wäre willkommen!

+0

Ich habe das vorher noch nie gemacht, aber ich würde versuchen, ein 'GridField' am Frontend mit dem [GridField extensions module] zu verwenden (https://github.com/silverstripe-australia/silverstripe-gridfielddextensions) 'GridFieldEditableColumns' und' GridFieldAddNewInlineButton' Komponenten. – 3dgoo

+0

@iraia Sie brauchen nur eine Aktion, die den Beitrag liest und den Namen des Eingabe-Attributs in ein Format ändert, das als Array gelesen werden kann: http://StackOverflow.com/Questions/2433727/Submitting-A-Multidimensional-Array-Via -post-mit-php. Dann speichern Sie einfach die "Keys" -Daten im Datenobjekt. Natürlich könnten Sie ein verstecktes Feld haben, das die Anzahl der Eingaben, die Sie haben, übergibt und dann verketten und ein Feld bekommen, aber auf diese Weise können Sie einfach die übertragenen Daten einfach iterieren. –

+0

Danke Jungs. Ich werde beide Möglichkeiten ausprobieren und hier meine Ergebnisse melden. :) – iraira

Antwort

3

Ich löste mein Problem mit der Lösung von 3dgoo. Ich verwende ein GridField in meinem Frontend-Formular mit der GridField extension module und den Komponenten GridFieldEditableColumns und GridFieldAddNewInlineButton. Hier ein Beispiel:

public function MyForm() { 

    $config = GridFieldConfig::create(); 
    $config->addComponent(new GridFieldButtonRow('before')); 
    $config->addComponent(new GridFieldEditableColumns()); 
    $config->addComponent(new GridFieldAddNewInlineButton()); 
    $gridField = GridField::create('Qualifications', 'Qualifications', Qualification::get()->filter(array('MemberID' => Member::currentUserID()))),$config); 

    $fields = new FieldList(

      .... here goes some other Fields like Textfields ... 

      TextField::create('MyTextField'), 
      CheckboxField::create('MyCheckboxField'), 
      $gridField, 
    ); 


    $actions = new FieldList(
      FormAction::create('myAction','save'), 
      FormAction::create('myOtherAction','save and next') 
    ); 

    $form = new Form($this, __FUNCTION__, $fields, $actions); 
    $form->loadDataFrom(Member::get()->byID(Member::currentUserID())); 
    return $form; 

} 

public function myAction($data, $form) { 
     $member = Member::get()->byId(Member::currentUserID()); 
     $form->saveInto($member); 
     $member->write();  
} 

Ich musste auch die CANview hinzufügen, CanEdit, CanCreate und CanDelete Funktion der Qualifikation Datenobjekt zu ermöglichen, sie zu bearbeiten und anzuzeigen.

+1

Sicher, fertig! Vielen Dank. – iraira