У меня есть модуль настройки от старшего программиста, и я столкнулся с проблемой, так как я новичок в Yii2. Буду краток, есть два контроллера:
1-DefaultController. php
2-SettingCatController. php
С одной стороны, есть actionCreate (по умолчанию / создать), который будет отображать вид страницы настроек, где оператор может устанавливать разные настройки для разных целей.
С другой стороны, существует еще одно действие Создать Ajax в SettingCatController (setting-cat / create- ajax), который позволит оператору создавать различные категории.
В default / create (который отображает страницу настроек) оператор может установить категорию настроек с помощью модальной формы на основе setting-cat / create - ajax от pjax, но это не работает, и ничего не будет отправлено, если нажать кнопку «Отправить» в модальной форме!
Я долго просматривал различные разделы, и я уверен, что пакеты активов были правильно, но я не смог найти проблему: (
Заранее спасибо за любую помощь, которую вы можете предоставить.
PS: если кому-то нужна дополнительная информация, пожалуйста, скажите мне, что я буду Я делюсь дополнительной информацией.
SettingCatController / actionCreate Ajax:
public function actionCreateAjax()
{
$model = new SettingCategory();
if ($model->load(Yii::$app->request->post()) && $model->save()) {
Yii::$app->response->format = Response::FORMAT_JSON;
return [
'status' => 'success',
'category' => ['id' => $model->id, 'title' => $model->title]
];
}
$this->performAjaxValidation($model);
return $this->renderAjax('create', [
'model' => $model,
]);
}
SettingCatController / executeAjaxValidation:
protected function performAjaxValidation(Model $model, $attributes = null)
{
if (\Yii::$app->request->isAjax && $model->load(\Yii::$app->request->post())) {
\Yii::$app->response->format = Response::FORMAT_JSON;
\Yii::$app->response->data = ActiveForm::validate($model, $attributes);
\Yii::$app->response->send();
\Yii::$app->end();
}
}
DefaultController / actionCreate (View):
<div class="setting-form">
<?php $form = ActiveForm::begin([
'id' => 'dynamic-settings',
'options' => ['data' => ['action' => 'save-setting']]
]); ?>
<div class="row">
<div class="col-sm-3">
<?= $form->field($model, 'cat_id', [
'template' => "{label}\n
<div class='input-group mb-3'>
{input}
<div class='input-group-append'>
<span data-toggle='modal' data-target='#add-category-modal' data-action='add-category'
data-url=\"" . Url::to(['/moresettings/setting-cat/create-ajax']) . "\" >
<button class='btn btn-success' type='button' data-toggle='tooltip'
title=\"" . Yii::t('more-settings', 'Create new category!') . "\" >
<i class='fas fa-plus'></i>
</button>
</div>
{hint}\n{error}
</div>",
]
</div>
</div>
</div>
<?php ActiveForm::end(); ?>
DefaultController / actionCreate (Партия Jquery / Pjax):
<?php
Pjax::end();
?>
<?php
$loadingTag = CustomHtmlHelper::loadingTag();
$loadingText = Yii::t('app', 'Loading ...');
Modal::begin([
'id' => 'add-category-modal',
'size' => Modal::SIZE_EXTRA_LARGE,
'bodyOptions' => [
'id' => 'create-form-container',
'class' => 'bg-light',
]
]);
echo $loadingTag;
Modal::end();
$js = <<< JS
jQuery('#dynamic-settings .select-type').on('change', function(event){
resetFields(this); // lib.js
});
resetFields($('#dynamic-settings .select-type')); // lib.js
var modalAddCategory = $('#add-category-modal');
modalAddCategory.on('shown.bs.modal', function (e) {
var button = $(e.relatedTarget)
var pjaxSettings = {
timeout: 20000,
scrollTo: false,
push: false,
skipOuterContainers: true,
url: button.data('url'),
container: '#create-form-container'
};
$('#create-form-container').off('pjax:error');
$('#create-form-container').on('pjax:error', function (event, xhr, textStatus, error, options) {
swal({
title: xhr.responseText,
type: "error",
confirmButtonText: '<i class="fa fa-thumbs-up font-22"></i>',
});
return false;
});
$('#create-form-container').off('pjax:complete');
$('#create-form-container').on('pjax:complete', function (event, xhr, textStatus, options) {
modalAddCategory.off('submit', 'form');
modalAddCategory.on('submit', 'form', function(e) {
var submitBtn = $(this).find(':submit');
var submitBtnOldHtml = submitBtn.html();
submitBtn.attr('disabled', true).text('$loadingText');
$.post($(this).attr('action'), $(this).serialize(), function (data) {
if (data.status === 'success') {
var newOption = new Option(data.category.title, data.category.id, true, true);
$(newOption).html(data.category.title);
$("#settings-cat_id").append(newOption).trigger('change');
modalAddCategory.modal('hide');
}
// errors handling
else {
$('#setting-cat-form').yiiActiveForm('updateMessages', data, true);
}
}).fail(function (xhr, status, error) {
submitBtn.attr('disabled', false).text(submitBtnOldHtml);
swal({
title: xhr.responseText,
type: "error",
confirmButtonText: '<i class="fa fa-thumbs-up font-22"></i>',
});
}).then(function (result) {
submitBtn.attr('disabled', false).text(submitBtnOldHtml);
});
return false;
})
});
$.pjax(pjaxSettings);
});
modalAddCategory.on('hidden.bs.modal', function (e) {
$(this).find('.modal-body').html('$loadingTag');
});
JS;
$this->registerJs($js, yii\web\View::POS_READY);
SettingCatController / actionCreate Ajax (представление, отображаемое в модальной форме DefaultController / actionCreate):
<?php
use yii\helpers\Html;
use yii\bootstrap4\ActiveForm;
?>
<div class="setting-cat-form">
<?php $form = ActiveForm::begin([
'id' => 'setting-cat-form'
]); ?>
//the fileds
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? Yii::t('more-settings', 'Create') : Yii::t('more-settings', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>