将请求变量保存到 Silverstripe 中的数据库模型



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

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

$request->requestVars()将返回一个数组...并且您正在对$vars(数组)中返回的内容使用 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 类(DataObject.php 文件中的update()方法,你会看到它的作用(你会看到它期望的唯一参数是一个键/值对数组,所以我想它应该像我上面提到的那样工作:

/**
* 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
}
}

最新更新