OctoberCMS builder - массовое создание моделей
Итак, у меня есть модель Лицензии, созданная через конструктор octoberCMS с представлениями List и Form.
Модель лицензии содержит одно отношение к модели школы.
Под представлением формы есть раскрывающийся список со школами и полем ввода (тип = число), который определяет, сколько лицензий нужно создать для выбранной школы.
Поведение по умолчанию создает только 1 лицензию
Как создать введенное количество лицензий вместо этого?
2 ответа
Ну, на самом деле я решил это также написав собственную функцию create_onSave для контроллера Licenses:
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');
}
Вам нужно переопределить поведение по умолчанию.
Примечание. Для выполнения этой задачи требуются знания программирования на 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
Примечание: у вас может быть другой URL, пожалуйста, измените соответственно.
пожалуйста, добавьте комментарий, если у вас есть какие-либо сомнения.