/** * Данная функция фильтрует группы по наполненности расписания для текущего семестра * * @param bool $bool Параметр указыкает какие группы нужны. true - заполненные, false - не заполненные * @return Group */ public function filled($bool = true) { $schedule_table = ScheduleElement::model()->tableName(); $semester = Semesters::model()->actual(); if ($semester) { $criteria = $this->getDbCriteria(); $criteria->params[':semester_id'] = $semester->id; for ($i = 1; $i <= 2; $i++) { for ($j = 1; $j <= 6; $j++) { $sql = "(SELECT COUNT(*) FROM `{$schedule_table}` WHERE `{$schedule_table}`.`week_number` = {$i} AND `{$schedule_table}`.`week_day` = {$j} AND `{$schedule_table}`.`group_id` = `t`.`id` AND `{$schedule_table}`.`semester_id` = :semester_id) " . ($bool ? ">" : "=") . " 0"; $criteria->addCondition($sql, $bool ? 'AND' : 'OR'); } } } return $this; }
public function actionIndex($group = false) { /** @var Group $group */ if ($group != false && !($group = Group::model()->filled()->findByAttributes(['number' => $group]))) { throw new CHttpException(404, 'Данной группы не найден'); } /** @var Semesters $semester */ $semester = Semesters::model()->actual(); $current_date = date('Y-m-d'); $current_time = strtotime($current_date); if (!$semester) { throw new CHttpException(404, 'Сейчас нет семестра :-('); } $group_list = CHtml::listData(Group::model()->filled()->findAll(), 'number', 'number'); $schedule = []; if ($group) { $time_one_day = 60 * 60 * 24; for ($i = $current_time; $i <= $current_time + $time_one_day * 7; $i = $i + $time_one_day) { $week_day = date('N', $i); $date = date('d.n.Y', $i); /** @var Holiday $holiday */ if (($holiday = Holiday::model()->findByAttributes(['date' => date('Y-m-d', $i)])) || $week_day == 7) { $schedule[$date] = ['holiday' => true]; if ($holiday) { $schedule[$date]['name'] = $holiday->name; } continue; } $schedule[$date] = []; $week_number = ($semester->week_number + (date('W', $i) - date('W', strtotime($semester->start_date)))) % 2 ? 1 : 2; $schedule_elements = ScheduleElement::model()->findAllByAttributes(['group_id' => $group->id, 'semester_id' => $semester->id, 'week_number' => $week_number, 'week_day' => $week_day]); $numbers = [1, 2, 3, 4, 5]; /** @var ScheduleElement $schedule_element */ foreach ($schedule_elements as $schedule_element) { unset($numbers[array_search($schedule_element->number, $numbers)]); /** @var GroupReplace $replace */ $replace = GroupReplace::model()->findByAttributes(['date' => date('Y-m-d', $i), 'number' => $schedule_element->number, 'group_id' => $group->id]); if ($replace && $replace->cancel) { $schedule[$date][$schedule_element->number] = ['cancel' => true, 'replace' => true]; } elseif ($replace) { $schedule[$date][$schedule_element->number] = ['subject' => $replace->subject->name, 'replace' => true, 'comment' => $replace->comment]; if ($replace->teacher_id) { $schedule[$date][$schedule_element->number]['teacher'] = $replace->teacher->lastname . ' ' . mb_substr($replace->teacher->firstname, 0, 1, "UTF-8") . '.' . mb_substr($replace->teacher->middlename, 0, 1, "UTF-8") . '.'; } if ($replace->classroom_id) { $schedule[$date][$schedule_element->number]['classroom'] = $replace->classroom->name; } } else { $schedule[$date][$schedule_element->number] = ['subject' => $schedule_element->subject->name]; if ($schedule_element->teacher_id) { $schedule[$date][$schedule_element->number]['teacher'] = $schedule_element->teacher->lastname . ' ' . mb_substr($schedule_element->teacher->firstname, 0, 1, "UTF-8") . '.' . mb_substr($schedule_element->teacher->middlename, 0, 1, "UTF-8") . '.'; } if ($schedule_element->classroom_id) { $schedule[$date][$schedule_element->number]['classroom'] = $schedule_element->classroom->name; } } } if (count($numbers)) { foreach ($numbers as $number) { /** @var GroupReplace $replace */ $replace = GroupReplace::model()->findByAttributes(['date' => date('Y-m-d', $i), 'number' => $number, 'group_id' => $group->id]); if ($replace && $replace->cancel) { $schedule[$date][$replace->number] = ['cancel' => true, 'replace' => true]; } elseif ($replace) { $schedule[$date][$replace->number] = ['subject' => $replace->subject->name, 'replace' => true]; if ($replace->teacher_id) { $schedule[$date][$replace->number]['teacher'] = $replace->teacher->lastname . ' ' . mb_substr($replace->teacher->firstname, 0, 1, "UTF-8") . '.' . mb_substr($replace->teacher->middlename, 0, 1, "UTF-8") . '.'; } if ($replace->classroom_id) { $schedule[$date][$replace->number]['classroom'] = $replace->classroom->name; } } } } ksort($schedule[$date]); } } Yii::app()->clientScript->registerMetaTag('noarchive', 'robots'); $this->render('index', ['group' => $group ? $group->number : false, 'group_list' => $group_list, 'schedule' => $schedule]); }
public function actionDeleteScheduleElement($element_id, $confirm = 0) { $semester = Semesters::model()->actual(); if (!$semester) { throw new CHttpException(404, 'Сейчас нет семестра :-('); } $model = ScheduleElement::model()->with('teacher', 'classroom', 'subject')->findByPk($element_id); if (!$model || $model->semester_id != $semester->id) { throw new CHttpException(404, 'Элемент не найден'); } if ($confirm) { $model->delete(); Yii::app()->user->setFlash('success', 'Элемент успешно удален'); $this->redirect(['schedule', 'id' => self::$group->number]); } $this->render('schedule/delete', ['model' => $model]); }