将 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
}
}
我正在通过 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
}
}