将 requestVars 保存到 Silverstripe 中的数据库模型

Save requestVars to database model in Silverstripe

我正在通过 getRequest() 从表单中获取一些值 - 这些值很好,但只是想弄清楚如何将其保存到数据库中 - 模型已设置并且与表单正在发布 - 我正在尝试这个,但它不起作用,所以显然我必须先转换请求数组??:

$request = $this->getRequest();
$vars = $request->requestVars();

//Create submission object
$submission = new Submission();     
$vars->saveInto($submission);
$submission->write();

$request->requestVars() 将 return 一个数组...并且您正在对 $vars(数组)中 returned 的内容使用 saveInto() 方法,这是不正确的...

你应该有类似 $form->saveInto($submission);

下面是一个非常简短的示例,说明如何使用简单的通讯表单和提交数据对象。

这里有一个页面控制器,其中定义了表单。当用户点击表单的提交按钮(在本例中为订阅)时,表单数据将在 doSubmitNewsletterForm() 方法中处理,您基本上将提交的数据保存到新的 Submission 数据对象中。

class Page_Controller extends ContentController {

    private static $allowed_actions = array (
        'NewsletterForm'
    );

    public function NewsletterForm() {
        // Form Fields
        $fields = FieldList::create(
          $firstname = TextField::create('Firsname', 'First Name'),
          $lastname = TextField::create('Lastname', 'Last Name'),
          $email = EmailField::create('Email', 'Email Address')
        );

        // Actions
        $submit = FormAction::create('doSubmitNewsletterForm', 'Subscribe');
        $actions = FieldList::create($submit);

        // Validators
        $validator = RequiredFields::create(array('Firstname', 'Lastname', 'Email'));

        // Form
        $form = Form::create($this, 'NewsletterForm', $fields, $actions);

        return $form;
    }


    /**
     * Process the form data
     */
    public function doSubmitNewsletterForm($data, Form $form) {
      $submission = new Submission();

      $form->saveInto($submission);

      $submission->write();
    }
}

这是提交数据对象:

class Submission extends DataObject {

  private static $db = array(
    'Firstname'   =>  'Varchar(100)',
    'Lastname'    =>  'Varchar(100)',
    'Email'       =>  'Varchar(100)',
  );

  public static getCMSFields() {
    // bla bla bla
  }

  // bla bla bla - other methods

}

就是这样了!!!

现在,如果您不使用表单,您所能做的就是这样:

$request = $this->getRequest();
$vars = $request->requestVars();

$sumbission = new Submission();
$submission->Firstname = $vars['Firstname'];
$submission->Lastname = $vars['Lastname'];
$submission->Email = $vars['Email'];
$submission->write();

...或者您可以试试这个(从未使用过,所以我不确定它是否有效):

$request = $this->getRequest();
$vars = $request->requestVars();

$submission = new Submission();
$submission->update($vars);
$submission->write();

...如果尚未保存提交数据对象,则不确定 update() 方法是否有效,因此如果上述方法无效,请尝试以下操作:

$submission = new Submission();
$submission->write();
$submission->update($vars);
$submission->write();

总而言之,查看 DataObject class(DataObject.php 文件)中的 update() 方法,您将了解它的作用(您会看到它期望的唯一参数是 key/value 对的数组,所以我想它应该像我上面提到的那样工作:

/**
 * Update a number of fields on this object, given a map of the desired changes.
 *
 * The field names can be simple names, or you can use a dot syntax to access $has_one relations.
 * For example, array("Author.FirstName" => "Jim") will set $this->Author()->FirstName to "Jim".
 *
 * update() doesn't write the main object, but if you use the dot syntax, it will write()
 * the related objects that it alters.
 *
 * @param array $data A map of field name to data values to update.
 * @return DataObject $this
 */
public function update($data) {
  foreach($data as $k => $v) {
    // some other core Silverstrip code
  }
}