254 lines
12 KiB
PHP
Executable File
254 lines
12 KiB
PHP
Executable File
<?php
|
||
|
||
use common\models\User;
|
||
use common\modules\student\components\academicPlan\models;
|
||
use kartik\grid\GridView;
|
||
use kartik\widgets\Alert;
|
||
use kartik\widgets\DepDrop;
|
||
use yii\data\ArrayDataProvider;
|
||
use yii\helpers\ArrayHelper;
|
||
use yii\helpers\Html;
|
||
use yii\helpers\Url;
|
||
use yii\widgets\Pjax;
|
||
|
||
$this->registerJs(
|
||
<<<JS
|
||
/**
|
||
* Данный кусочек скрипта предназначен для замены кнопки "сабмит". При нажатии на кнопку
|
||
* "Показать" из формы выше собирается POST запрос на отправку в "/student/academicplan",
|
||
* как будто это настоящая кнопка "сабмит". Эот всё ради не перегрузки "DepDrop".
|
||
*/
|
||
$(document).on('click', 'button#_academic_plan_button', function() {
|
||
var data = $("form#_academic_plan_form").serializeArray();
|
||
$.pjax({
|
||
data : data,
|
||
push : true,
|
||
type : 'POST',
|
||
replace : false,
|
||
timeout : 10000,
|
||
"scrollTo" : false,
|
||
url : '/student/academicplan',
|
||
container : '#_academic_table'
|
||
});
|
||
return false;
|
||
});
|
||
|
||
/**
|
||
* Этот скрипт выполняет тоже, что и выше с "псевдов сабмит", отличие только в том что
|
||
* он добавляет атрибут "sort" в отправляемый POST запрос. Это необходимо потому что
|
||
* встроенный запрос на сортировку конфликтует с запросом от формы, в результате чего
|
||
* при выборе НЕ_ПЕРВОГО элемента из "DepDrop" и нажатие на сортировку, таблица перегружается
|
||
* и отрисовывается уже таблица соответствующая ПЕРВОМУ элементу из "DepDrop". Эту
|
||
* проблему можно решить двумя способами:
|
||
* 1) отправлять форму используя GET;
|
||
* 2) и тот что приведён ниже.
|
||
*/
|
||
$(document).on('click', 'th a', function() {
|
||
var data = $("form#_academic_plan_form").serializeArray();
|
||
var buffer = $(this);
|
||
var value = buffer[0].text; /** Определяем какой именно был выбран столбец. */
|
||
if (buffer[0].classList.value == "asc") {
|
||
value = "-" + value; /** Если тип сортировки "A-Z", то передаём атрибут для инверсии */
|
||
}
|
||
data.push({ name: "sort", value: value });
|
||
$.pjax({
|
||
data : data,
|
||
push : true,
|
||
type : 'POST',
|
||
replace : false,
|
||
timeout : 10000,
|
||
"scrollTo" : false,
|
||
url : '/student/academicplan',
|
||
container : '#_academic_table'
|
||
});
|
||
return false;
|
||
});
|
||
JS
|
||
, yii\web\View::POS_END);
|
||
|
||
|
||
$this->title = Yii::$app->name;
|
||
|
||
echo Alert::widget([
|
||
'type' => Alert::TYPE_INFO,
|
||
'title' => '<strong>Информация</strong>: ',
|
||
'titleOptions' => ['icon' => 'info-sign'],
|
||
'body' => 'Для отображения данных укажите параметры поиска и нажмите кнопку "Показать"'
|
||
]);
|
||
|
||
?>
|
||
<div class="site-index">
|
||
<div class="body-content" id="body-content-id">
|
||
<h3>Учебные планы</h3>
|
||
<div class="plan-container">
|
||
<?php if (!empty($plans) && !empty($semesters)) : ?>
|
||
<div class="plan-header">
|
||
<?php echo Html::beginForm(Url::toRoute(['student/academicplan']), 'post', ['id' => '_academic_plan_form']); ?>
|
||
<div class="row">
|
||
<div class="col-12">
|
||
<div class="row">
|
||
<div class="col-12 col-sm-4 col-md-3 col-lg-2">
|
||
<?php if (Yii::$app->user->identity->isInRole(User::ROLE_STUDENT)) {
|
||
echo Html::tag('label', 'Учебный план:', ['for' => 'plan_plan']);
|
||
} elseif (Yii::$app->user->identity->isInRole(User::ROLE_TEACHER)) {
|
||
echo Html::tag('label', 'Место работы:', ['for' => 'plan_plan']);
|
||
} ?>
|
||
</div>
|
||
|
||
<div class="col-12 col-sm-8 col-md-9 col-lg-10">
|
||
<?php echo Html::dropDownList(
|
||
'plan_plan',
|
||
$plan_id,
|
||
ArrayHelper::map($plans, 'id', 'name'),
|
||
['class' => 'form-control form-group', 'id' => 'plan_id']
|
||
); ?>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="col-12 mb-3">
|
||
<div class="row">
|
||
<div class="col-12 col-sm-4 col-md-3 col-lg-2">
|
||
<label for="plan_plan">Семестр:</label>
|
||
</div>
|
||
|
||
<div class="col-12 col-sm-8 col-md-9 col-lg-10">
|
||
<?php echo DepDrop::widget([
|
||
'value' => $semester_id,
|
||
'name' => 'plan_semester',
|
||
'class' => 'form-control form-group',
|
||
'type' => DepDrop::TYPE_SELECT2,
|
||
'data' => ArrayHelper::map($semesters, 'id', 'name'),
|
||
'options' => ['id' => 'semester_id', 'placeholder' => 'Выберите семестр'],
|
||
'select2Options' => ['pluginOptions' => ['allowClear' => false, 'multiple' => false]],
|
||
'pluginOptions' => [
|
||
'initialize' => true,
|
||
'depends' => ['plan_id'],
|
||
'loadingText' => 'Загрузка ...',
|
||
'placeholder' => 'Выберите семестр',
|
||
'dropdownParent' => '#body-content-id',
|
||
'url' => Url::to(['/student/semesters']),
|
||
],
|
||
]); ?>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="col-12">
|
||
<?php echo Html::button('Показать', ['class' => 'btn btn-primary', 'id' => '_academic_plan_button']); ?>
|
||
</div>
|
||
</div>
|
||
<?php echo Html::endForm(); ?>
|
||
</div>
|
||
<?php else : ?>
|
||
<?php if (!empty($plans)) {
|
||
$role = 'данного элемента';
|
||
if (Yii::$app->user->identity->isInRole(User::ROLE_STUDENT)) {
|
||
$role = 'учебного плана';
|
||
} elseif (Yii::$app->user->identity->isInRole(User::ROLE_TEACHER)) {
|
||
$role = 'места работы';
|
||
}
|
||
echo Html::tag(
|
||
'div',
|
||
"Для {$role} записей не обнаружено.",
|
||
['class' => 'alert alert-info', 'role' => 'alert']
|
||
);
|
||
} elseif (!empty($semesters)) {
|
||
echo Html::tag(
|
||
'div',
|
||
'Для семестра записей не обнаружено.',
|
||
['class' => 'alert alert-info', 'role' => 'alert']
|
||
);
|
||
} ?>
|
||
<?php endif; ?>
|
||
<div class="row">
|
||
<div class="col-12 disciplines-container">
|
||
<?php if (isset($disciplines) && $disciplines) {
|
||
$loads = ['Предмет'];
|
||
$loads = array_merge($loads, models\Discipline::getLoads($disciplines));
|
||
$tableArray = [];
|
||
$disc_name = '';
|
||
$row['Предмет'] = '';
|
||
foreach ($loads as $load) {
|
||
$row[$load] = '';
|
||
}
|
||
$empty_row = $row;
|
||
foreach ($disciplines as $discipline) {
|
||
if ($disc_name != $discipline->name && $disc_name != '') {
|
||
$tableArray[] = $row;
|
||
$row = $empty_row;
|
||
}
|
||
$row['Единица измерения'] = $discipline->unit;
|
||
if ($row['Предмет'] == '') {
|
||
$row['Предмет'] = $discipline->name;
|
||
}
|
||
foreach ($loads as $load) {
|
||
if ($discipline->load == $load) {
|
||
$row[$load] = $discipline->getInfo();
|
||
}
|
||
}
|
||
$disc_name = $discipline->name;
|
||
}
|
||
$tableArray[] = $row;
|
||
|
||
$loads[] = 'Единица измерения';
|
||
$dataProvider = new ArrayDataProvider([
|
||
'allModels' => $tableArray,
|
||
'sort' => [
|
||
'attributes' => $loads
|
||
]
|
||
]);
|
||
$columns = [];
|
||
foreach ($loads as $load) {
|
||
$columns[] = [
|
||
'label' => $load,
|
||
'attribute' => $load,
|
||
'contentOptions' => ($load == 'Предмет') ? ['id' => '_academic_table-left', 'class' => 'col-sm-4'] : []
|
||
];
|
||
}
|
||
|
||
Pjax::begin([
|
||
'options' => ['id' => '_academic_table'],
|
||
'timeout' => false,
|
||
'enablePushState' => false,
|
||
'clientOptions' => ['method' => 'POST']
|
||
]);
|
||
echo Html::beginTag('div', ['class' => 'table-responsive']);
|
||
echo GridView::widget([
|
||
'hover' => true,
|
||
'headerContainer' => ['class' => 'thead-light'],
|
||
'tableOptions' => ['class' => 'table-sm'],
|
||
'striped' => false,
|
||
'summary' => false,
|
||
'pager' => [
|
||
'firstPageLabel' => '<<',
|
||
'prevPageLabel' => '<',
|
||
'nextPageLabel' => '>',
|
||
'lastPageLabel' => '>>',
|
||
],
|
||
'columns' => $columns,
|
||
'layout' => '{items}{pager}',
|
||
'dataProvider' => $dataProvider,
|
||
'options' => ['align' => 'left', 'id' => '_academic_table']
|
||
]);
|
||
echo Html::endTag('div');
|
||
Pjax::end();
|
||
} else {
|
||
Pjax::begin([
|
||
'options' => ['id' => '_academic_table'],
|
||
'timeout' => false,
|
||
'enablePushState' => false,
|
||
'clientOptions' => ['method' => 'POST']
|
||
]);
|
||
echo Html::tag(
|
||
'div',
|
||
'Для заданных параметров данные не могут быть предоставлены.',
|
||
['class' => 'alert alert-info', 'role' => 'alert']
|
||
);
|
||
Pjax::end();
|
||
} ?>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|