Silverstripe 3.2:如何在前端表单中动态添加和更新数据对象?

Posted

技术标签:

【中文标题】Silverstripe 3.2:如何在前端表单中动态添加和更新数据对象?【英文标题】:Silverstripe 3.2: How to add and update Dataobjects in a frontend form dynamically? 【发布时间】:2016-05-02 03:51:48 【问题描述】:

示例:我的成员(可以登录并更新其数据)具有一项或多项资格。所以我有一个具有 has_one/has_many 关系的 DataObject 'Members' 和一个 DataObject 'Qualification'。

类似这样的:

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

...

现在我想在前端构建一个表单,允许会员一次添加多个资格,并在同一个表单中更新现有的资格。

可能是这样的

资格证一

Title: xxx (textfield) From: xxx (datefield) Till: xxx (日期字段)

资格赛二

Title: xxx (textfield) From: xxx (datefield) Till: xxx (日期字段)

+添加资格

最好的方法是什么?

我可以使用 jQuery 像这样动态添加字段:http://jsfiddle.net/nzYAW/

但是我该如何处理更新并将它们添加到数据库中。我尝试的所有东西都非常复杂和混乱,所以我想也许其他人有一个我目前看不到的想法。我们将不胜感激!

【问题讨论】:

我以前从未这样做过,但我会考虑尝试在前端使用 GridField 和 GridField extensions module GridFieldEditableColumnsGridFieldAddNewInlineButton 组件。 @iraia 您只需要一个读取帖子并将输入属性名称更改为可以作为数组读取的格式的操作:***.com/questions/2433727/…。然后只需将“键”数据保存到数据对象。当然,您可以有一个隐藏字段来提交您拥有的输入计数,然后将其连接并获取一个字段,但是这样您就可以很容易地迭代提交的数据。 谢谢你们。我将尝试这两种选择,并将在这里报告我的结果。 :) 好的。我从 GridField 扩展模块开始,它非常简单并且按预期工作,我只是保持这种方式。不过还是谢谢你们! @iraia 您能否提交自己的解决方案作为答案。或者至少是重要的部分:) 【参考方案1】:

我用 3dgoo 的解决方案解决了我的问题。我在前端表单中使用了 GridField,带有 GridField extension module 和组件 GridFieldEditableColumnsGridFieldAddNewInlineButton。这是一个例子:

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

我还必须将 canView、canEdit、canCreate 和 canDelete 函数添加到 Qualification DataObject 以允许对其进行编辑和显示。

【讨论】:

以上是关于Silverstripe 3.2:如何在前端表单中动态添加和更新数据对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SilverStripe 4 CMS 中添加自定义样式

SilverStripe:如何向另一个网站发出 HTTP 请求?

Silverstripe - 在模板中循环非关联数组

使用 SilverStripe 的计划任务

如何从SilverStripe管理员中的DataObject分离文件系统时删除文件(图像)?

Silverstripe 3:如何按标题,日期等对CMS网站树中的页面进行排序