2016-01-25 18 views
6

Örnek: Bir veya daha fazla niteliğe sahip olan Üyelerim (verilerinize giriş yapan ve güncelleyen) sahibim. Bu yüzden bir DataObject 'Üyeleri' ve bir has_one/has_many ilişkisi olan bir DataObject 'Kalifikasyon'um var. BöyleSilverstripe 3.2: Bir ön formdaki Data Nesneleri dinamik olarak nasıl ekleyebilir ve güncelleyebilirim?

şey:

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', 
); 

... 

Şimdi üye aynı anda birçok nitelikleri eklemek ve aynı zamanda mevcut nitelikleri güncellemesini sağlayan önyüzdeki bir form inşa etmek istiyor aynı formda.

Bu

Qualifikation Bir

Başlık gibi görünebilir: Gönderen xxx (textfield): xxx (DateField) Till: xxx (DateField)

Qualifikation İki

Başlık: xxx (textfield) Kimden: xxx (datefield) Till: xxx (DateField)

+ nitelikleri

Bunu yapmanın en iyi yolu nedir eklemek? http://jsfiddle.net/nzYAW/

Ama nasıl güncellemek ve veritabanına eklemek için işleyebilir:

böyle dinamik alanları eklemek için jQuery kullanabilirsiniz. Denediğim her şey gerçekten karmaşık ve dağınıktı, yani bence başka birinin şu anda görmediğim bir fikri var. Her yardım mutluluk duyacaktır!

+0

Bunu daha önce hiç yapmadım, ama [GridField uzantı modülü] ile ön uçta bir "GridField" kullanmaya çalışıyorum (https://github.com/silverstripe-australia/silverstripe-gridfieldextensions) "GridFieldEditableColumns" ve "GridFieldAddNewInlineButton" bileşenleri. – 3dgoo

+0

@iraia sadece gönderiyi okuyan ve giriş niteliği ismini bir dizi olarak okunabilecek bir formatta değiştiren bir eyleme ihtiyacın var: http://stackoverflow.com/questions/2433727/submitting-a-multidimensional-array-via -post-php ile. Ardından "tuşlar" verilerini veri nesnesine kaydedin. Tabii ki, sahip olduğunuz girişlerin sayısını gönderen gizli bir alana sahip olabilirsiniz ve ardından bunu birleştirip bir alan elde edebilirsiniz, ancak bu şekilde sunulan verileri kolayca yineleyebilirsiniz. –

+0

Teşekkürler beyler. Her iki seçeneği de deneyeceğim ve sonuçlarımı burada bildireceğim. :) – iraira

cevap

3

Sorunumu 3dgoo çözümüyle çözdüm. Ön uç formumda GridField extension module ve GridFieldEditableColumns ve GridFieldAddNewInlineButton bileşenleri ile bir GridField kullanın. İşte bir örnek:

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();  
} 

Ben de düzenlemek ve bunu göstermek için izin Yeterlilik DataObject için canView, canEdit, canCreate ve canDelete işlev eklemek zorunda kaldı.

+1

Elbette, tamam! Teşekkürler. – iraira

İlgili konular