所以我有一个通过octoberCMS构建器使用“列表”和“表单”视图创建的许可模型。
许可模型与学校模型包含一种关系。
在“表单”视图下,有一个包含学校的下拉列表和一个输入字段(类型=数字),该字段定义了为所选学校创建的许可证数量。
默认行为仅创建1个许可证
如何改为创建输入的许可证数量?
答案 0 :(得分:0)
您需要覆盖默认行为。
注意:该任务需要OctoberCMS的编程知识。
在您的控制器中,您需要添加此方法。
use Flash;
use Backend;
// ...
public function create_onSave($context = null)
{
// 1. init form for your modal and get input data from it
$model = $this->asExtension('FormController')->formCreateModelObject();
$model = $this->asExtension('FormController')->formExtendModel($model) ?: $model;
$this->asExtension('FormController')->initForm($model);
$form = $this->asExtension('FormController')->formGetWidget();
$data = $form->getSaveData();
// 2. get proper count field here and convert to int for loop
$count = intval($data['license_to_create']);
// 3. validation step
// if($validationFailed) {
// Flash::error('Something Went Wrong.');
// return;
// }
// 4. loop
foreach ($i = 1; $i <= $count; $i++) {
$licenseModel = new LicenseModel;
// you can add other data
// you can access $data['school_id'] here
// $licenseModel->school_id = $data['school_id'];
$licenseModel->save();
}
// 5. success message
Flash::success($count . ' License Added');
// 6. just redirect it to desired location
return Backend::redirect('/hardiksatasiya/sotest/skills');
}
说明
在这里我们初始化必需的变量,以便我们可以获取填充在文本框中的数据,这是默认代码,因此我只是从核心代码中复制了它。
一旦有了我们的$ data变量,就可以访问填充数据(在您的情况下,$data['license_to_create']
使用的是100,$data['school_id']
您需要为其创建许可证的学校),
注意:您可能有不同的字段,请相应更改。
验证步骤*可选,您可以在此处添加一些检查,并在错误消息不正确的情况下停止流程。
循环为许可证模式创建新记录,[默认代码将仅创建1条记录],但是这里我们根据给定的计数$data['license_to_create']
只是正常的成功消息。
重定向到通常需要重定向的位置,您需要将其重定向到/author-name/plugin-name/license-controller
注意:您的网址可能不同,请相应地进行更改。
如有疑问,请添加评论。
答案 1 :(得分:0)
实际上我已经通过为 Licenses 控制器编写自定义的 create_onSave 函数来解决了这个问题:
public function create_onSave(){
$quantity = post('License[_quantity]');
$school_id = post('License[school]');
for($i = 1; $i <= $quantity; $i++){
# Create License
$license = new \Acme\Plugin\Models\License();
$license->school_id = $school_id;
$license->save();
}
\Flash::success('Added '.$quantity.' Licenses');
}