Разработка:storages/cstreams — различия между версиями
(→Дополнительные методы:) |
(→Дополнительные методы:) |
||
| Строка 61: | Строка 61: | ||
| − | ====''' | + | ===='''get_teacher_cstream($id, $status = "active")'''==== |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
Получает список учебных процессов у данного преподавателя. | Получает список учебных процессов у данного преподавателя. | ||
| Строка 122: | Строка 67: | ||
''Аргументы:'' | ''Аргументы:'' | ||
* $id(int) - id преподавателя в таблице [[Разработка:storages/persons | persons ]]. | * $id(int) - id преподавателя в таблице [[Разработка:storages/persons | persons ]]. | ||
| − | * $status(string) - статус потока, по умолчанию - идет( | + | * $status(string) - статус потока, по умолчанию - идет(active). |
''Возвращаемые значения:'' | ''Возвращаемые значения:'' | ||
| − | * (array) массив процессов. | + | * (array) - массив процессов. |
| − | * (bool) false если процессы не найдены. | + | * (bool) - false, если процессы не найдены. |
''Структура работы:'' | ''Структура работы:'' | ||
* формируем SQL-запрос и возвращаем список процессов: | * формируем SQL-запрос и возвращаем список процессов: | ||
** если указывается статус - процессы с указанным статусом, | ** если указывается статус - процессы с указанным статусом, | ||
** если статус указывается null - процессы с любым статусом, | ** если статус указывается null - процессы с любым статусом, | ||
| − | ** если статус не указывается - процессы со статусом | + | ** если статус не указывается - процессы со статусом active. |
| + | |||
| − | '''get_department_cstream()''' | + | ===='''get_department_cstream($id, $status = "active")'''==== |
Получает список учебных процессов у данного подразделения. | Получает список учебных процессов у данного подразделения. | ||
| Строка 138: | Строка 84: | ||
''Аргументы:'' | ''Аргументы:'' | ||
* $id(int) - id подразделения в таблице [[Разработка:storages/departments | departments ]]. | * $id(int) - id подразделения в таблице [[Разработка:storages/departments | departments ]]. | ||
| − | * $status(string) - статус потока, по умолчанию - идет( | + | * $status(string) - статус потока, по умолчанию - идет(active). |
''Возвращаемые значения:'' | ''Возвращаемые значения:'' | ||
| − | * (array) массив процессов. | + | * (array) - массив процессов. |
| − | * (bool) false если процессы не найдены. | + | * (bool) - false, если процессы не найдены. |
''Структура работы:'' | ''Структура работы:'' | ||
* формируем SQL-запрос и возвращаем список процессов: | * формируем SQL-запрос и возвращаем список процессов: | ||
** если указывается статус - процессы с указанным статусом, | ** если указывается статус - процессы с указанным статусом, | ||
** если статус указывается null - процессы с любым статусом, | ** если статус указывается null - процессы с любым статусом, | ||
| − | ** если статус не указывается - процессы со статусом | + | ** если статус не указывается - процессы со статусом active. |
| − | '''get_age_cstream()''' | + | |
| + | ===='''get_age_cstream($id, $status = "active")'''==== | ||
Получает список учебных процессов для данного учебного периода. | Получает список учебных процессов для данного учебного периода. | ||
| Строка 154: | Строка 101: | ||
''Аргументы:'' | ''Аргументы:'' | ||
* $id(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]]. | * $id(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]]. | ||
| − | * $status(string) - статус потока, по умолчанию - идет( | + | * $status(string) - статус потока, по умолчанию - идет(active). |
''Возвращаемые значения:'' | ''Возвращаемые значения:'' | ||
| − | * (array) массив процессов. | + | * (array) - массив процессов. |
| − | * (bool) false если процессы не найдены. | + | * (bool) - false, если процессы не найдены. |
''Структура работы:'' | ''Структура работы:'' | ||
* формируем SQL-запрос и возвращаем список процессов: | * формируем SQL-запрос и возвращаем список процессов: | ||
** если указывается статус - процессы с указанным статусом, | ** если указывается статус - процессы с указанным статусом, | ||
** если статус указывается null - процессы с любым статусом, | ** если статус указывается null - процессы с любым статусом, | ||
| − | ** если статус не указывается - процессы со статусом | + | ** если статус не указывается - процессы со статусом active. |
| − | '''get_programmitem_cstream()''' | + | |
| + | ===='''get_programmitem_cstream($id, $status = "active")'''==== | ||
Получает список учебных процессов по данной дисциплине. | Получает список учебных процессов по данной дисциплине. | ||
| Строка 170: | Строка 118: | ||
''Аргументы:'' | ''Аргументы:'' | ||
* $id(int) - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]]. | * $id(int) - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]]. | ||
| − | * $status(string) - статус потока, по умолчанию - идет( | + | * $status(string) - статус потока, по умолчанию - идет(active). |
''Возвращаемые значения:'' | ''Возвращаемые значения:'' | ||
| − | * (array) массив процессов. | + | * (array) - массив процессов. |
| − | * (bool) false если процессы не найдены. | + | * (bool) - false, если процессы не найдены. |
''Структура работы:'' | ''Структура работы:'' | ||
* формируем SQL-запрос и возвращаем список процессов: | * формируем SQL-запрос и возвращаем список процессов: | ||
** если указывается статус - процессы с указанным статусом, | ** если указывается статус - процессы с указанным статусом, | ||
** если статус указывается null - процессы с любым статусом, | ** если статус указывается null - процессы с любым статусом, | ||
| − | ** если статус не указывается - процессы со статусом | + | ** если статус не указывается - процессы со статусом active. |
| − | '''get_agroup_cstream''' | + | ===='''get_agroup_cstream($id)'''==== |
Получает список учебных процессов для академической группы. | Получает список учебных процессов для академической группы. | ||
| Строка 187: | Строка 135: | ||
* $id(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]]. | * $id(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]]. | ||
''Возвращаемые значения:'' | ''Возвращаемые значения:'' | ||
| − | * (array) массив процессов. | + | * (array) - массив процессов. |
| − | * (bool) false если процессы не найдены. | + | * (bool) - false, если процессы не найдены. |
| + | |||
| + | |||
| + | ===='''get_agroup_agenum_cstreams($agroupid, $ageid)'''==== | ||
| + | |||
| + | Получить Список программ по академической группе, и периоду. | ||
| + | |||
| + | ''Аргументы:'' | ||
| + | * $agroupid(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]]. | ||
| + | * $ageid(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]]. | ||
| + | ''Возвращаемые значения:'' | ||
| + | * (array) - массив записей из этой таблицы, если они есть. | ||
| + | * (bool) - false, если ничего не нашлось. | ||
| + | |||
| + | |||
| + | ===='''get_agroup_status_cstreams($agroupid, $status)'''==== | ||
| + | Получить Список программ по академической группе, и статусу. | ||
| + | |||
| + | ''Аргументы:'' | ||
| + | * $agroupid(int) - id академической группы в таблице [[Разработка:storages/agroups | agroups ]]. | ||
| + | * $status(string) - статус потока. | ||
| + | ''Возвращаемые значения:'' | ||
| + | * (array) - массив записей из таблицы cstreams если они есть. | ||
| + | * (bool) - false, если ничегг не нашлось. | ||
| + | |||
| + | |||
| + | ===='''get_numberof_cstreams($select)'''==== | ||
| − | + | Возвращает количество потоков. | |
| − | ''' | + | ''Аргументы:'' |
| + | * $select(string) - критерии отбора записей. | ||
| + | ''Возвращаемые значения:'' | ||
| + | * (int) - количество найденных записей. | ||
| − | |||
| − | ''' | + | ===='''get_prog_age_cstreams($pitemid, $ageid, $status=null)'''==== |
| − | + | Получить список учебных потоков, допустимых учебной программой и текущим периодом | |
| − | + | ''Аргументы:'' | |
| + | * $programmid(object) - id учебной программы в таблице [[Разработка:storages/programms | programms ]]. | ||
| + | * $ageid(object) - id периода в таблице [[Разработка:storages/ages | ages ]]. | ||
| + | * $status(string) - статус учебного потока. | ||
| + | ''Возвращаемые значения:'' | ||
| + | * (array) - массив записей из базы. | ||
| + | * (bool) - false, если произошла ошибка. | ||
| − | |||
| − | ''' | + | ===='''get_programm_age_cstreams($programmid, $ageid = null, $agenum = null, $dpid = null)'''==== |
| − | ''' | + | Получает все учебные потоки программы. |
| + | |||
| + | ''Аргументы:'' | ||
| + | * $programmid(int) - id учебной программы в таблице [[Разработка:storages/programms | programms ]]. | ||
| + | * $ageid(int) - id периода в таблице [[Разработка:storages/ages | ages ]], по умолчанию нет. | ||
| + | * $agenum - номер паралели в таблице [[Разработка:storages/programmitems | programmitems ]], по умолчанию нет(null). | ||
| + | * $dpid - id подразделения в таблице [[Разработка:storages/departments | departments ]], по умолчанию - нет(null). | ||
| + | ''Возвращаемые значения:'' | ||
| + | * (array) - массив потоков. | ||
| + | * (bool) - false, если потоки не найдены. | ||
| + | |||
| + | |||
| + | ===='''get_listing($limitfrom, $limitnum, $conds=null, $countonly=false)'''==== | ||
| + | |||
| + | Возвращает список учебных потоков по заданным критериям. | ||
| + | |||
| + | ''Аргументы:'' | ||
| + | * $limitfrom(int) - начиная с какой записи просматривается фрагмент списка записей. | ||
| + | * $limitnum(int) - сколько записей нужно извлечь из базы. | ||
| + | * $conds(object) - объект со списком свойств, по которым будет происходить поиск, по умолчанию - нет(null), | ||
| + | * $countonly(object) - вернуть список записей по указанным условиям или только их количество, по умолчанию - список(false), | ||
| + | ''Возвращаемые значения:'' | ||
| + | * (array) - массив записей из базы. | ||
| + | * (bool) - false, в случае ошибки. | ||
| + | |||
| + | |||
| + | ===='''get_select_listing($inputconds)'''==== | ||
| + | |||
| + | Возвращает фрагмент sql-запроса после слова WHERE. | ||
| + | |||
| + | ''Аргументы:'' | ||
| + | * $inputconds(object) - список полей с условиями запроса в формате "поле_БД->значение". | ||
| + | ''Возвращаемые значения:'' | ||
| + | * (string). | ||
| − | '''create_cstreams_for_programm()''' | + | /** Получить id всех периодов, в течение которых проходит обучение выбранной группы |
| + | * | ||
| + | * @return array|bool - индексированный массив с уникальными значениями id периодов всех потоков или false | ||
| + | * если ничего не найдено | ||
| + | * @param int $agroupid - id академической группы в таблице agroups | ||
| + | */ | ||
| + | public function get_agroup_ageids($agroupid) | ||
| + | { | ||
| + | $result = array(); | ||
| + | // получаем массив всех потоков академической группы | ||
| + | $agcstreams = $this->get_agroup_cstream($agroupid); | ||
| + | // получаем все id периодов | ||
| + | if ( ! $agcstreams ) | ||
| + | {// не найдено ни одного потока | ||
| + | return false; | ||
| + | } | ||
| + | foreach ( $agcstreams as $agcstream ) | ||
| + | {// перебираем все элементы массива, и вытаскиваем только id | ||
| + | $result[] = $agcstream->ageid; | ||
| + | } | ||
| + | // оставляем только уникальные значения | ||
| + | $result = array_unique($result); | ||
| + | // сортируем массив по возрастанию | ||
| + | sort($result); | ||
| + | return $result; | ||
| + | } | ||
| + | |||
| + | /** Создать учебные потоки для группы | ||
| + | * | ||
| + | * @return | ||
| + | * @param int $agroupid - id акадкмическуой группы (класса) в таблице agroups | ||
| + | * @param int $ageid - id учебного периода в таблице ages | ||
| + | * @param int $departmentid - id учебного подразделения в таблице departments | ||
| + | * @param int $datebegin - дата начала обучения в формате unixtime | ||
| + | * | ||
| + | */ | ||
| + | public function create_cstreams_for_agroup($agroupid, $ageid, $departmentid, $datebegin, $enddate=null) | ||
| + | { | ||
| + | if ( ! $agroup = $this->dof->storage('agroups')->get($agroupid) ) | ||
| + | {// не удалось получить академичеескую группу | ||
| + | return false; | ||
| + | } | ||
| + | if ( ! $programm = $this->dof->storage('programms')->get($agroup->programmid) ) | ||
| + | {// не удалось получить учебную программу | ||
| + | return false; | ||
| + | } | ||
| + | if ( ! $programmitems = $this->dof->storage('programmitems')->get_pitems_list | ||
| + | ($programm->id, $agroup->agenum, 'deleted') ) | ||
| + | {// нет потоков, некого подписывать - но считаем, что мы свою работы все равно сделали | ||
| + | return true; | ||
| + | } | ||
| + | $result = true; | ||
| + | // если в программе есть предметы на этот период - создадим для них подписки | ||
| + | foreach ( $programmitems as $pitem ) | ||
| + | { | ||
| + | $cslink=false; | ||
| + | if ( $cstreams = $this->get_list_filter('ageid',$ageid,'programmitemid',$pitem->id, | ||
| + | 'status', array('plan', 'active', 'suspend')) ) | ||
| + | {// если уже есть такой поток | ||
| + | foreach ( $cstreams as $cstream ) | ||
| + | {// и на него подписана группа | ||
| + | if ( $this->dof->storage('cstreamlinks')->get_filter('cstreamid',$cstream->id,'agroupid',$agroupid) ) | ||
| + | {// поток не создаем | ||
| + | $cslink=true; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | if ( ! $cslink ) | ||
| + | {// нету связи создаем поток и привязываем | ||
| + | $cstream = new object(); | ||
| + | $cstream->ageid = $ageid; | ||
| + | $cstream->programmitemid = $pitem->id; | ||
| + | // откуда брать id учителя? | ||
| + | $cstream->teacherid = 0; | ||
| + | $cstream->departmentid = $departmentid; | ||
| + | $cstream->mdlgroup = null; | ||
| + | $cstream->eduweeks = $this->dof->storage('ages')->get_field($ageid,'eduweeks'); | ||
| + | if ( $pitem->eduweeks ) | ||
| + | {// или из предмета, если указано там | ||
| + | $cstream->eduweeks = $pitem->eduweeks; | ||
| + | } | ||
| + | $cstream->begindate = $datebegin; | ||
| + | $cstream->enddate = $datebegin + $pitem->maxduration; | ||
| + | if ( $enddate ) | ||
| + | {// дата окончания указана принудительно | ||
| + | $cstream->enddate = $enddate; | ||
| + | } | ||
| + | $cstream->status = 'plan'; | ||
| + | // создаем подписку предмета на программу в текущем периоде | ||
| + | if ( $id = $this->insert($cstream) ) | ||
| + | {// удалось вставить запись в базу | ||
| + | if ( $this->dof->storage('cstreamlinks')-> | ||
| + | is_exists_filter('cstreamid', $id, 'agroupid', $agroupid) ) | ||
| + | {// если запись для такого потока и такой группы существует - не создаем такую запись еще раз | ||
| + | continue; | ||
| + | } | ||
| + | // запомним, если что-то пошло не так | ||
| + | $result = $result AND (bool)$this->dof->storage('cstreamlinks')-> | ||
| + | enrol_agroup_on_cstream($agroupid, $id); | ||
| + | }else | ||
| + | {// во время вставки произошла ошибка | ||
| + | $result = $result AND false; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | // возвращаем результат | ||
| + | return $result; | ||
| + | |||
| + | } | ||
| + | |||
| + | /** Создать подписку на программу в учебном периоде для выбранной параллели | ||
| + | * | ||
| + | * @return bool | ||
| + | * @param int $programmid - id учебной программы в таблице programms | ||
| + | * @param int $ageid - id учебного периода в таблице ages | ||
| + | * @param int $agenum - номер параллели, для которой создается подписка | ||
| + | * @param int $departmentid - id учебного подразделения в таблице departments | ||
| + | * @param int $datebegin - дата начала обучения в формате unixtime | ||
| + | */ | ||
| + | public function create_cstreams_for_programm($programmid, $ageid, $agenum, $departmentid, $datebegin, $enddate=null) | ||
| + | { | ||
| + | $result = true; | ||
| + | if ( ! $programm = $this->dof->storage('programms')->get($programmid) ) | ||
| + | {// не удалось получить учебную программу | ||
| + | return false; | ||
| + | } | ||
| + | if ( ! $programmitems = $this->dof->storage('programmitems')->get_pitems_list($programmid, $agenum, 'deleted') ) | ||
| + | {// нет потоков, некого подписывать - но считаем, что мы свою работы все равно сделали | ||
| + | return true; | ||
| + | } | ||
| + | // если в программе есть предметы на этот период - создадим для них подписки | ||
| + | foreach ( $programmitems as $pitem ) | ||
| + | { | ||
| + | |||
| + | $cstream = new object(); | ||
| + | $cstream->ageid = $ageid; | ||
| + | $cstream->programmitemid = $pitem->id; | ||
| + | // откуда брать id учителя? | ||
| + | $cstream->teacherid = 0; | ||
| + | $cstream->departmentid = $departmentid; | ||
| + | $cstream->mdlgroup = null; | ||
| + | $cstream->eduweeks = $this->dof->storage('ages')->get_field($ageid,'eduweeks'); | ||
| + | if ( $pitem->eduweeks ) | ||
| + | {// или из предмета, если указано там | ||
| + | $cstream->eduweeks = $pitem->eduweeks; | ||
| + | } | ||
| + | $cstream->begindate = $datebegin; | ||
| + | $cstream->enddate = $datebegin + $pitem->maxduration; | ||
| + | if ( $enddate ) | ||
| + | {// дата окончания указана принудительно | ||
| + | $cstream->enddate = $enddate; | ||
| + | } | ||
| + | $cstream->status = 'plan'; | ||
| + | // создаем подписку предмета на программу в текущем периоде | ||
| + | $result = $result AND (bool)$this->insert($cstream); | ||
| + | |||
| + | } | ||
| + | return $result; | ||
| + | } | ||
| + | |||
| + | /** Подписать группу на список потоков | ||
| + | * | ||
| + | * @return | ||
| + | * @param int $agroupid- id группы в таблице agroups | ||
| + | * @param int $ageid - id учебного периода в таблице ages | ||
| + | * | ||
| + | * @todo выяснить, нужно ли реализовать возможность подписки группы не по определененому периоду, | ||
| + | * а для всех периодов? | ||
| + | */ | ||
| + | public function enrol_agroup_on_cstreams($agroupid, $ageid) | ||
| + | { | ||
| + | $return = true; | ||
| + | if ( ! $agroup = $this->dof->storage('agroups')->get($agroupid) ) | ||
| + | {// не удалось получить академичеескую группу | ||
| + | return false; | ||
| + | } | ||
| + | // @todo нужно ли указывать agenum? | ||
| + | if ( ! $programmitems = $this->dof->storage('programmitems')->get_pitems_list($agroup->programmid, $agroup->agenum) ) | ||
| + | {// в программе группы нет предметов для текущего периода | ||
| + | return true; | ||
| + | } | ||
| + | foreach ( $programmitems as $pitem ) | ||
| + | {// подписываем группу на все потоки | ||
| + | $cstreams = $this->get_prog_age_cstreams($pitem->id, $ageid); | ||
| + | foreach ($cstreams as $cstream ) | ||
| + | {// создаем подписку группы на учебный поток | ||
| + | if ( $this->dof->storage('cstreamlinks')-> | ||
| + | is_exists_filter('cstreamid', $cstream->id, 'agroupid', $agroupid) ) | ||
| + | {// если запись для такого потока и такой группы существует - не создаем такую запись еще раз | ||
| + | continue; | ||
| + | } | ||
| + | // запомним, если что-то пошло не так | ||
| + | $return = $return AND (bool)$this->dof->storage('cstreamlinks')-> | ||
| + | enrol_agroup_on_cstream($agroupid, $cstream->id); | ||
| + | } | ||
| + | } | ||
| + | return $return; | ||
| + | } | ||
| + | |||
| + | /** Переводит поток в статус "завершен" | ||
| + | * @param int $id - id потока | ||
| + | * @return bool true - если поток удачно завершен и | ||
| + | * false в остальных случаях | ||
| + | */ | ||
| + | public function set_status_complete($id) | ||
| + | { | ||
| + | if ( ! is_int_string($id) ) | ||
| + | {// входные данные неверного формата | ||
| + | return false; | ||
| + | } | ||
| + | if ( ! $obj = $this->get($id) ) | ||
| + | {// объект не найден | ||
| + | return false; | ||
| + | } | ||
| + | if ( $obj->status == 'completed' ) | ||
| + | {// поток уже завершен | ||
| + | return true; | ||
| + | } | ||
| + | if ( $obj->status == 'plan' OR $obj->status == 'canceled' OR $obj->status == 'suspend') | ||
| + | {// поток запланирован, приостановлен или отменен - его нельзя завершить | ||
| + | return false; | ||
| + | } | ||
| + | $rez = true; | ||
| + | // дата окончания действия подписки | ||
| + | $obj->enddate = time(); | ||
| + | if ( ! $this->update($obj,$id) ) | ||
| + | {// не удалось обновить запись БД | ||
| + | return false; | ||
| + | } | ||
| + | // переместить в статс "неудачно завершены" | ||
| + | if ( $cpassed = $this->dof->storage('cpassed')->get_list_filter('cstreamid',$id, | ||
| + | 'status',array('plan','active','suspend')) ) | ||
| + | {// если есть незавершенные подписки на дисциплину сменим им статус | ||
| + | foreach($cpassed as $cpass) | ||
| + | {// переведем каждую в статус неуспешно завершена | ||
| + | $rez = $rez & $this->dof->storage('cpassed')->set_final_grade($cpass->id); | ||
| + | } | ||
| + | } | ||
| + | if ( $rez ) | ||
| + | {// если все в порядке - меняем статус потока | ||
| + | return $this->dof->workflow('cstreams')->change($id,'completed'); | ||
| + | } | ||
| + | return $rez; | ||
| + | } | ||
| − | ''' | + | /** Возвращает список потоков по параметрам |
| + | * @param int $programmitemid - id дисциплины | ||
| + | * @param int $teacherid - id учителя | ||
| + | * @param bool $mycstrems - показать ли потоки текущего пользователя | ||
| + | * @param bool $completecstrems - показать ли завершенные потоки | ||
| + | * @return array | ||
| + | */ | ||
| + | public function get_cstreams_on_parametres($programmitemid, $teacherid = 0, $mycstrems = false, $completecstrems = false) | ||
| + | { | ||
| + | // составляем условие | ||
| + | // предмет обязателен | ||
| + | $select = ' programmitemid = '.$programmitemid; | ||
| + | if ( $teacherid ) | ||
| + | {// если указан учитель выведем только для него | ||
| + | $select .= ' AND teacherid = '.$teacherid; | ||
| + | }elseif ( $mycstrems ) | ||
| + | {// если учителя нет, но надо показать потоки текущего пользователя | ||
| + | if ( $teacherid = $this->dof->storage('persons')->get_by_moodleid_id() ) | ||
| + | {// если только он есть в БД | ||
| + | $select .= ' AND teacherid = '.$teacherid; | ||
| + | } | ||
| + | } | ||
| + | if ( $completecstrems ) | ||
| + | {// скахзано что надо вывести завершенные потоки вместе с активными | ||
| + | $select .= ' AND status IN (\'active\',\'completed\')'; | ||
| + | }else | ||
| + | {// выведем только активные | ||
| + | $select .= ' AND status = \'active\''; | ||
| + | } | ||
| + | // возвращаем найденные потоки | ||
| + | return $this->dof->storage('cstreams')->get_list_select($select); | ||
| + | } | ||
| + | /** Возвращает короткое имя потока | ||
| + | * @return string | ||
| + | */ | ||
| + | public function get_short_name($cstreamid) | ||
| + | { | ||
| + | if ( ! $cstream = $this->get($cstreamid) ) | ||
| + | { | ||
| + | return false; | ||
| + | } | ||
| + | $pitem = stripslashes_recursive($this->dof->storage('programmitems')->get_field($cstream->programmitemid, 'name')); | ||
| + | $teacher = stripslashes_recursive($this->dof->storage('persons')->get_fullname($cstream->teacherid)); | ||
| + | |||
| + | $cstreamname = $pitem; | ||
| + | if ( $teacher ) | ||
| + | {// если есть учитель - добавим его | ||
| + | $cstreamname .= ', '.$teacher; | ||
| + | } | ||
| + | $cstreamname .= ' ['.$cstream->id.']'; | ||
| + | return $cstreamname; | ||
| + | } | ||
| + | |||
| + | /** Подписать учеников на поток | ||
| + | * | ||
| + | * @return bool | ||
| + | * @param object $cstream - объект из таблицы cstreams | ||
| + | * @param object $programmsbcids - массив, состоящий из id подписок на программы в таблице programmsbcs | ||
| + | */ | ||
| + | public function enrol_students_on_cstream($cstream, $programmsbcids) | ||
| + | { | ||
| + | if ( ! is_object($cstream) OR ! is_array($programmsbcids) ) | ||
| + | {// неправильный формат данных | ||
| + | return false; | ||
| + | } | ||
| + | foreach ( $programmsbcids as $programmsbcid ) | ||
| + | {// перебираем все подписки на программу и отписываем каждого ученика | ||
| + | $result = & $this->enrol_student_on_cstream($cstream, $programmsbcid); | ||
| + | } | ||
| + | return $result; | ||
| + | } | ||
| + | |||
| + | /** Исключить учеников из потока | ||
| + | * | ||
| + | * @return bool | ||
| + | * @param object $cstream - объект из таблицы cstreams | ||
| + | * @param array $programmsbcids - массив, состоящий из id подписок на программы в таблице programmsbcs | ||
| + | */ | ||
| + | public function unenrol_students_from_cstream($cstream, $programmsbcids) | ||
| + | { | ||
| + | if ( ! is_object($cstream) OR ! is_array($programmsbcids) ) | ||
| + | {// неправильный формат данных | ||
| + | return false; | ||
| + | } | ||
| + | $result = true; | ||
| + | foreach ( $programmsbcids as $programmsbcid ) | ||
| + | {// перебираем все подписки на программу и отписываем каждого ученика | ||
| + | $result = & $this->unenrol_student_from_cstream($cstream, $programmsbcid); | ||
| + | } | ||
| + | return $result; | ||
| + | } | ||
| + | |||
| + | /** Подписать одного ученика на поток | ||
| + | * | ||
| + | * @return bool | ||
| + | * @param object $cstream - объект из таблицы cstreams | ||
| + | * @param int $programmsbcid - id подписки ученика на программу в таблице programmsbcs | ||
| + | * | ||
| + | * @todo проверить, не подписан ли уже ученик на этот поток | ||
| + | * @todo добавить полную проверку объекта $cpassed, если к тому времени не введем функции безопасной вставки | ||
| + | */ | ||
| + | public function enrol_student_on_cstream($cstream, $programmsbcid) | ||
| + | { | ||
| + | $programmsbcid = intval($programmsbcid); | ||
| + | if ( ! is_object($cstream) OR ! $programmsbc = $this->dof->storage('programmsbcs')->get($programmsbcid) ) | ||
| + | {// неправильный формат данных | ||
| + | return false; | ||
| + | } | ||
| + | if ( ! $studentid = $this->dof->storage('programmsbcs')->get_studentid_by_programmsbc($programmsbcid) ) | ||
| + | {// не нашли id ученика - это ошибка | ||
| + | // @todo поймать здесь исключение которое будет генерироваться функцией get_studentid_by_programmitem | ||
| + | return false; | ||
| + | } | ||
| + | if ( ! $programmitem = $this->dof->storage('programmitems')->get($cstream->programmitemid) ) | ||
| + | {// предмет потока на который подписывается ученик не найден | ||
| + | // @todo сгенерировать исключение и записать это событие в лог, когда станет возможно | ||
| + | return false; | ||
| + | } | ||
| + | // создаем объект для будущей подписки на предмет | ||
| + | $cpassed = new object; | ||
| + | $cpassed->cstreamid = $cstream->id; | ||
| + | $cpassed->programmsbcid = $programmsbcid; | ||
| + | $cpassed->programmitemid = $cstream->programmitemid; | ||
| + | $cpassed->studentid = $studentid; | ||
| + | $cpassed->agroupid = $programmsbc->agroupid; | ||
| + | $cpassed->gradelevel = $programmitem->gradelevel; | ||
| + | $cpassed->ageid = $cstream->ageid; | ||
| + | // @todo с типом синхронизации разобраться когда станет окончательно ясно как обавлять обычные cpassed | ||
| + | //$cpassed->typesync = 0; | ||
| + | // @todo добавить сюда сведения о часах из дисциплины, когда эти поля появятся в таблице cpassed | ||
| + | |||
| + | // Устанавливаем статус прошлой подписки в положение "неуспешно завершен" | ||
| + | // @todo в будущем проверять результат выполнения этой функции и записывать его в лог | ||
| + | // когда это станет возможно | ||
| + | if ( $repeatid = $this->set_previos_cpassed_to_failed($cstream, $programmsbcid) ) | ||
| + | {// если ученик пересдавал предмет в этом потоке - то запомним это | ||
| + | $cpassed->repeatid = $repeatid; | ||
| + | } | ||
| + | |||
| + | // вставляем новую запись в таблицу cpassed, тем самым подписывая ученика на поток | ||
| + | if ( ! $newid = $this->dof->storage('cpassed')->insert($cpassed) ) | ||
| + | {// не удалось создать новую запись | ||
| + | return false; | ||
| + | } | ||
| + | // после создания установим подписке нужный статус: | ||
| + | return $this->set_new_status_to_cpassed($newid, $cstream); | ||
| + | } | ||
| + | |||
| + | /** Устанавливает предыдущие подписки в статус "неуспешно завершено" если они были | ||
| + | * | ||
| + | * @return bool | ||
| + | * @param object $cstream - учебный поток, объект из таблицы cstreams | ||
| + | * @param object $programmsbcid - id подписки на программу в таблице programmsbcs | ||
| + | * | ||
| + | * @todo различать случаи ошибок и случаи когда просто нет предыдущей записи в cpassed | ||
| + | */ | ||
| + | private function set_previos_cpassed_to_failed($cstream, $programmsbcid) | ||
| + | { | ||
| + | $select = 'programmsbcid = '.$programmsbcid. | ||
| + | ' AND cstreamid = '.$cstream->id. | ||
| + | " AND repeatid IS NULL AND status != 'canceled' "; | ||
| + | $cpass = $this->dof->storage('cpassed')->get_list_select($select); | ||
| + | if ( $cpass AND is_array($cpass) ) | ||
| + | {// если нашли запись - то она единственная | ||
| + | $cpass = current($cpass); | ||
| + | }else | ||
| + | {// подписка не найдена - все нормально, ничего не надо делать | ||
| + | return false; | ||
| + | } | ||
| + | |||
| + | // найдем наследника | ||
| + | $successorid = $this->dof->storage('cpassed')->get_last_successor($cpass->id); | ||
| + | if ( ! $successorid ) | ||
| + | {// нет наследника - все нормально | ||
| + | return false; | ||
| + | } | ||
| + | // устанавливаем предыдущие подписки в статус "отменен" или "неуспешно завершен", если они есть, | ||
| + | // используя для этого функцию выставления итоговых оценок | ||
| + | // @todo проверить результат работы этой функции и записать в лог возможные ошибки, если они возникнут | ||
| + | $this->dof->storage('cpassed')->set_final_grade($successorid); | ||
| + | |||
| + | return $successorid; | ||
| + | } | ||
| + | |||
| + | /** установить статус новой созданной подписки в зависимости от статуса потока неа который она создается | ||
| + | * | ||
| + | * @return bool | ||
| + | * @param int $id - id подписки на поток в таблице cpassed | ||
| + | * @param object $cstream - объект из таблицы cstreams. Поток на который была произведена запись | ||
| + | */ | ||
| + | private function set_new_status_to_cpassed($id, $cstream) | ||
| + | { | ||
| + | switch ( $cstream->status ) | ||
| + | {// в зависимости от статуса потока меняем статус подписки | ||
| + | case 'active': return $this->dof->workflow('cpassed')->change($id, 'active'); break; | ||
| + | case 'suspend': return $this->dof->workflow('cpassed')->change($id, 'suspend'); break; | ||
| + | // подписка уже в нужном статусе | ||
| + | case 'plan': return true; break; | ||
| + | // неизвестный или недопустимый статус потока | ||
| + | default: return false; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | /** Подписать одного ученика на поток. | ||
| + | * | ||
| + | * @return bool | ||
| + | * @param object $cstream - объект из таблицы cstreams | ||
| + | * @param int $programmsbcid - id подписки ученика на программу в таблице programmsbcs | ||
| + | * | ||
| + | * @todo перенести эту функцию в storage/cstreams | ||
| + | */ | ||
| + | public function unenrol_student_from_cstream($cstream, $programmsbcid) | ||
| + | { | ||
| + | $programmsbcid = intval($programmsbcid); | ||
| + | if ( ! is_object($cstream) OR ! $programmsbcid ) | ||
| + | {// неправильный формат данных | ||
| + | return false; | ||
| + | } | ||
| + | if ( ! $cpassed = $this->dof->storage('cpassed')-> | ||
| + | get_list_filter('cstreamid', $cstream->id, 'programmsbcid', $programmsbcid, | ||
| + | 'status', array('plan', 'active', 'suspend')) ) | ||
| + | {// не нашли ни одной подписки, значит ученик уже отписан | ||
| + | return true; | ||
| + | } | ||
| + | |||
| + | $result = true; | ||
| + | foreach ( $cpassed as $cpitem ) | ||
| + | {// отписываем всех учеников от потока, устанавливая подпискам статус "отменен" | ||
| + | // @todo выяснить какой статус устанавливать: "отменен" или "успешно завершен" | ||
| + | $result = & $this->dof->workflow('cpassed')->change($cpitem->id, 'canceled'); | ||
| + | } | ||
| + | return $result; | ||
| + | } | ||
| + | |||
| + | /** Получить id программы, к которой привязан указанный поток | ||
| + | * | ||
| + | * @return int|bool - id программы, которой принадлежит поток или false в случае ошибки | ||
| + | * @param int $cstreamid - id потока в таблице cstreams | ||
| + | */ | ||
| + | private function get_cstream_programmid($cstreamid) | ||
| + | { | ||
| + | if ( ! $this->get($cstreamid) ) | ||
| + | { | ||
| + | return false; | ||
| + | } | ||
| + | // получаем id программы из предмета, по которому проходит этот поток | ||
| + | return $this->dof->storage('programmitems')->get_field($cstreamid->programmitemid, 'programmid'); | ||
| + | } | ||
| + | |||
| + | /** Сохраняет имя предмето-потока в БД | ||
| + | * @param int $cstreamid - id предмето-поток | ||
| + | * @return bool true - если запись прошла успешно или false | ||
| + | */ | ||
| + | public function get_cstreamname($eventcode, $mixedvar, $cstream = false) | ||
| + | { | ||
| + | //узнаем с объектами из каких таблиц мы имеем дело'; | ||
| + | //и найдем cstreamid | ||
| + | if ( $cstream ) | ||
| + | {//пришли данные из таблицы cstream | ||
| + | if ( $eventcode == 'delete' AND isset($mixedvar['old']->id) ) | ||
| + | {//это удаление- старый объект обязательно должен быть | ||
| + | $oldid = $mixedvar['old']->id; | ||
| + | }elseif ( $eventcode == 'insert' AND isset($mixedvar['new']->id) ) | ||
| + | {//это вставка - новая запись всегда должна быть | ||
| + | $newid = $mixedvar['new']->id; | ||
| + | }elseif ( $eventcode == 'update' AND isset($mixedvar['old']->id) | ||
| + | AND isset($mixedvar['new']->id) ) | ||
| + | {//это обновление - оба объекта должны быть | ||
| + | $newid = $mixedvar['new']->id; | ||
| + | $oldid = $mixedvar['old']->id; | ||
| + | }else | ||
| + | {//но это не так | ||
| + | return false; | ||
| + | } | ||
| + | }else | ||
| + | {//пришли данные из других таблиц'; | ||
| + | if ( $eventcode == 'delete' AND isset($mixedvar['old']->cstreamid) ) | ||
| + | {//это удаление - старый объект обязательно должен быть | ||
| + | $oldid = $mixedvar['old']->cstreamid; | ||
| + | }elseif ( $eventcode == 'insert' AND isset($mixedvar['new']->cstreamid) ) | ||
| + | {//это вставка - новая запись всегда должна быть | ||
| + | $newid = $mixedvar['new']->cstreamid; | ||
| + | }elseif ( $eventcode == 'update' AND isset($mixedvar['old']->cstreamid) | ||
| + | AND isset($mixedvar['new']->id) ) | ||
| + | {//это обновление - оба объекта должны быть | ||
| + | $newid = $mixedvar['new']->cstreamid; | ||
| + | $oldid = $mixedvar['old']->cstreamid; | ||
| + | }else | ||
| + | {//но это не так | ||
| + | return false; | ||
| + | } | ||
| + | } | ||
| + | //путь к файлу с методами формирования имени файла | ||
| + | $path = $this->dof->plugin_path('storage','cstreams','/cfg/namestream.php'); | ||
| + | if ( ! file_exists($path) ) | ||
| + | {//если файла нет - сообщим об этом | ||
| + | return false; | ||
| + | } | ||
| + | //файл есть - подключаем файл | ||
| + | include_once($path); | ||
| + | //создаем объект для генерации имени | ||
| + | $csname = new block_dof_storage_cstreams_namecstream; | ||
| + | switch ( $eventcode ) | ||
| + | { | ||
| + | case 'insert': | ||
| + | { | ||
| + | return $csname->save_cstream_name($newid); | ||
| + | } | ||
| + | case 'update': | ||
| + | { | ||
| + | $old = $csname->save_cstream_name($oldid); | ||
| + | $new = $csname->save_cstream_name($newid); | ||
| + | return ($old AND $new); | ||
| + | } | ||
| + | case 'delete': | ||
| + | { | ||
| + | return $csname->save_cstream_name($oldid); | ||
| + | } | ||
| + | } | ||
| + | return false; | ||
| + | } | ||
===Планы:=== | ===Планы:=== | ||
Версия 19:43, 10 ноября 2010
| Плагин | |
| Название | cstreams |
| Тип | storages |
Содержание
- 1 Таблица в базе данных
- 2 Дополнительные методы:
- 2.1 insert($dataobject, $id = NULL, $quiet=false)
- 2.2 delete($id,$quiet=false)
- 2.3 update($dataobject, $id = NULL, $quiet=false)
- 2.4 get_teacher_cstream($id, $status = "active")
- 2.5 get_department_cstream($id, $status = "active")
- 2.6 get_age_cstream($id, $status = "active")
- 2.7 get_programmitem_cstream($id, $status = "active")
- 2.8 get_agroup_cstream($id)
- 2.9 get_agroup_agenum_cstreams($agroupid, $ageid)
- 2.10 get_agroup_status_cstreams($agroupid, $status)
- 2.11 get_numberof_cstreams($select)
- 2.12 get_prog_age_cstreams($pitemid, $ageid, $status=null)
- 2.13 get_programm_age_cstreams($programmid, $ageid = null, $agenum = null, $dpid = null)
- 2.14 get_listing($limitfrom, $limitnum, $conds=null, $countonly=false)
- 2.15 get_select_listing($inputconds)
- 3 Планы:
- 4 События
Таблица в базе данных
cstreams - учебный поток. Представляет учебный процесс, идущий по учебной дисциплине/предмету в течение одного учебного периоду с конкретным преподавателем, одним или несколькими учащимися или группой.
Подробный формат полей в таблице:
- ageid - учебный период в таблице ages
- programmitemid - дисциплина в таблице programmitems
- teacherid - id преподавателя в таблице persons . После создания поля appointmentid стало ненужным. Все старые обращения к этому полю будут переделаны на обращения к appointmentid, при создании новых обращений они должны обращаться к appointmentid. После переработки старых методов данное поле удалиться.
- departmentid - подразделение, которому принадлежит учебный процесс в таблице departments
- appointmentid - id назначения на должность в таблице appointments .
- mdlgroup - id группы moodle, соответствующей учебному потоку
- eduweeks - количество учебных недель/циклов (каждая соответствует одному циклу в расписании) продолжительности курса, по-умолчанию берется из programmitems, если там не указано - из ages. Нужны для подсчета часов при составлении расписания.
- begindate - дата и время, когда учебный процесс был впервые переведен в состояние "идет обучение" по UTC
- enddate - дата и время окончания по UTC, когда учебный процесс был в последний раз выведен из состояния "идет обучение"
- status - список статусов указан в одноименном плагине рабочих процессов cstreams
- hours - часов всего
- hoursweek - часов в неделю
- name - имя предмето-потока
- hoursweekdistance - количество часов в неделю дистанционно
Дополнительные методы:
insert($dataobject, $id = NULL, $quiet=false)
Вставляет запись в таблицу плагина.
Аргументы:
- dataobject(object) - данные для записи в таблицу.
- $id = NULL
- quiet(bool) - генерировать или нет события, по умолчанию - нет(false).
Возвращаемые значения:
- (int) - id вставленной записи.
- (bool) - false, если операция не удалась.
delete($id,$quiet=false)
Удаляет запись из таблицы плагина с указанным id.
Аргументы:
- id(int) - id записи в этой таблице .
- quiet(bool) - генерировать или нет события, по умолчанию - нет(false).
Возвращаемые значения:
- (bool) - true, если запись удалена или ее нет, false - в остальных случаях.
update($dataobject, $id = NULL, $quiet=false)
Обновляет запись в таблице плагина данными из объекта. Отсутствующие в объекте записи не изменяются. Если id передан, то обновляется запись с переданным id. Если id не передан обновляется запись с id, который передан в объекте.
Аргументы:
- dataobject(object) - данные, которыми надо заменить запись в таблице.
- id(int) - id обновляемой записи в этой таблице.
- quiet(bool) - не генерировать событий.
Возвращаемые значения:
- (bool) - true, если обновление прошло успешно, и false - во всех остальных случаях.
get_teacher_cstream($id, $status = "active")
Получает список учебных процессов у данного преподавателя.
Аргументы:
- $id(int) - id преподавателя в таблице persons .
- $status(string) - статус потока, по умолчанию - идет(active).
Возвращаемые значения:
- (array) - массив процессов.
- (bool) - false, если процессы не найдены.
Структура работы:
- формируем SQL-запрос и возвращаем список процессов:
- если указывается статус - процессы с указанным статусом,
- если статус указывается null - процессы с любым статусом,
- если статус не указывается - процессы со статусом active.
get_department_cstream($id, $status = "active")
Получает список учебных процессов у данного подразделения.
Аргументы:
- $id(int) - id подразделения в таблице departments .
- $status(string) - статус потока, по умолчанию - идет(active).
Возвращаемые значения:
- (array) - массив процессов.
- (bool) - false, если процессы не найдены.
Структура работы:
- формируем SQL-запрос и возвращаем список процессов:
- если указывается статус - процессы с указанным статусом,
- если статус указывается null - процессы с любым статусом,
- если статус не указывается - процессы со статусом active.
get_age_cstream($id, $status = "active")
Получает список учебных процессов для данного учебного периода.
Аргументы:
- $id(int) - id учебного периода в таблице ages .
- $status(string) - статус потока, по умолчанию - идет(active).
Возвращаемые значения:
- (array) - массив процессов.
- (bool) - false, если процессы не найдены.
Структура работы:
- формируем SQL-запрос и возвращаем список процессов:
- если указывается статус - процессы с указанным статусом,
- если статус указывается null - процессы с любым статусом,
- если статус не указывается - процессы со статусом active.
get_programmitem_cstream($id, $status = "active")
Получает список учебных процессов по данной дисциплине.
Аргументы:
- $id(int) - id дисциплины в таблице programmitems .
- $status(string) - статус потока, по умолчанию - идет(active).
Возвращаемые значения:
- (array) - массив процессов.
- (bool) - false, если процессы не найдены.
Структура работы:
- формируем SQL-запрос и возвращаем список процессов:
- если указывается статус - процессы с указанным статусом,
- если статус указывается null - процессы с любым статусом,
- если статус не указывается - процессы со статусом active.
get_agroup_cstream($id)
Получает список учебных процессов для академической группы.
Аргументы:
- $id(int) - id академической группы в таблице agroups .
Возвращаемые значения:
- (array) - массив процессов.
- (bool) - false, если процессы не найдены.
get_agroup_agenum_cstreams($agroupid, $ageid)
Получить Список программ по академической группе, и периоду.
Аргументы:
- $agroupid(int) - id академической группы в таблице agroups .
- $ageid(int) - id учебного периода в таблице ages .
Возвращаемые значения:
- (array) - массив записей из этой таблицы, если они есть.
- (bool) - false, если ничего не нашлось.
get_agroup_status_cstreams($agroupid, $status)
Получить Список программ по академической группе, и статусу.
Аргументы:
- $agroupid(int) - id академической группы в таблице agroups .
- $status(string) - статус потока.
Возвращаемые значения:
- (array) - массив записей из таблицы cstreams если они есть.
- (bool) - false, если ничегг не нашлось.
get_numberof_cstreams($select)
Возвращает количество потоков.
Аргументы:
- $select(string) - критерии отбора записей.
Возвращаемые значения:
- (int) - количество найденных записей.
get_prog_age_cstreams($pitemid, $ageid, $status=null)
Получить список учебных потоков, допустимых учебной программой и текущим периодом
Аргументы:
- $programmid(object) - id учебной программы в таблице programms .
- $ageid(object) - id периода в таблице ages .
- $status(string) - статус учебного потока.
Возвращаемые значения:
- (array) - массив записей из базы.
- (bool) - false, если произошла ошибка.
get_programm_age_cstreams($programmid, $ageid = null, $agenum = null, $dpid = null)
Получает все учебные потоки программы.
Аргументы:
- $programmid(int) - id учебной программы в таблице programms .
- $ageid(int) - id периода в таблице ages , по умолчанию нет.
- $agenum - номер паралели в таблице programmitems , по умолчанию нет(null).
- $dpid - id подразделения в таблице departments , по умолчанию - нет(null).
Возвращаемые значения:
- (array) - массив потоков.
- (bool) - false, если потоки не найдены.
get_listing($limitfrom, $limitnum, $conds=null, $countonly=false)
Возвращает список учебных потоков по заданным критериям.
Аргументы:
- $limitfrom(int) - начиная с какой записи просматривается фрагмент списка записей.
- $limitnum(int) - сколько записей нужно извлечь из базы.
- $conds(object) - объект со списком свойств, по которым будет происходить поиск, по умолчанию - нет(null),
- $countonly(object) - вернуть список записей по указанным условиям или только их количество, по умолчанию - список(false),
Возвращаемые значения:
- (array) - массив записей из базы.
- (bool) - false, в случае ошибки.
get_select_listing($inputconds)
Возвращает фрагмент sql-запроса после слова WHERE.
Аргументы:
- $inputconds(object) - список полей с условиями запроса в формате "поле_БД->значение".
Возвращаемые значения:
- (string).
/** Получить id всех периодов, в течение которых проходит обучение выбранной группы
*
* @return array|bool - индексированный массив с уникальными значениями id периодов всех потоков или false
* если ничего не найдено
* @param int $agroupid - id академической группы в таблице agroups
*/
public function get_agroup_ageids($agroupid)
{
$result = array();
// получаем массив всех потоков академической группы
$agcstreams = $this->get_agroup_cstream($agroupid);
// получаем все id периодов
if ( ! $agcstreams )
{// не найдено ни одного потока
return false;
}
foreach ( $agcstreams as $agcstream )
{// перебираем все элементы массива, и вытаскиваем только id
$result[] = $agcstream->ageid;
}
// оставляем только уникальные значения
$result = array_unique($result);
// сортируем массив по возрастанию
sort($result);
return $result;
}
/** Создать учебные потоки для группы
*
* @return
* @param int $agroupid - id акадкмическуой группы (класса) в таблице agroups
* @param int $ageid - id учебного периода в таблице ages
* @param int $departmentid - id учебного подразделения в таблице departments
* @param int $datebegin - дата начала обучения в формате unixtime
*
*/
public function create_cstreams_for_agroup($agroupid, $ageid, $departmentid, $datebegin, $enddate=null)
{
if ( ! $agroup = $this->dof->storage('agroups')->get($agroupid) )
{// не удалось получить академичеескую группу
return false;
}
if ( ! $programm = $this->dof->storage('programms')->get($agroup->programmid) )
{// не удалось получить учебную программу
return false;
}
if ( ! $programmitems = $this->dof->storage('programmitems')->get_pitems_list
($programm->id, $agroup->agenum, 'deleted') )
{// нет потоков, некого подписывать - но считаем, что мы свою работы все равно сделали
return true;
}
$result = true;
// если в программе есть предметы на этот период - создадим для них подписки
foreach ( $programmitems as $pitem )
{
$cslink=false;
if ( $cstreams = $this->get_list_filter('ageid',$ageid,'programmitemid',$pitem->id,
'status', array('plan', 'active', 'suspend')) )
{// если уже есть такой поток
foreach ( $cstreams as $cstream )
{// и на него подписана группа
if ( $this->dof->storage('cstreamlinks')->get_filter('cstreamid',$cstream->id,'agroupid',$agroupid) )
{// поток не создаем
$cslink=true;
}
}
}
if ( ! $cslink )
{// нету связи создаем поток и привязываем
$cstream = new object();
$cstream->ageid = $ageid;
$cstream->programmitemid = $pitem->id;
// откуда брать id учителя?
$cstream->teacherid = 0;
$cstream->departmentid = $departmentid;
$cstream->mdlgroup = null;
$cstream->eduweeks = $this->dof->storage('ages')->get_field($ageid,'eduweeks');
if ( $pitem->eduweeks )
{// или из предмета, если указано там
$cstream->eduweeks = $pitem->eduweeks;
}
$cstream->begindate = $datebegin;
$cstream->enddate = $datebegin + $pitem->maxduration;
if ( $enddate )
{// дата окончания указана принудительно
$cstream->enddate = $enddate;
}
$cstream->status = 'plan';
// создаем подписку предмета на программу в текущем периоде
if ( $id = $this->insert($cstream) )
{// удалось вставить запись в базу
if ( $this->dof->storage('cstreamlinks')->
is_exists_filter('cstreamid', $id, 'agroupid', $agroupid) )
{// если запись для такого потока и такой группы существует - не создаем такую запись еще раз
continue;
}
// запомним, если что-то пошло не так
$result = $result AND (bool)$this->dof->storage('cstreamlinks')->
enrol_agroup_on_cstream($agroupid, $id);
}else
{// во время вставки произошла ошибка
$result = $result AND false;
}
}
}
// возвращаем результат
return $result;
}
/** Создать подписку на программу в учебном периоде для выбранной параллели
*
* @return bool
* @param int $programmid - id учебной программы в таблице programms
* @param int $ageid - id учебного периода в таблице ages
* @param int $agenum - номер параллели, для которой создается подписка
* @param int $departmentid - id учебного подразделения в таблице departments
* @param int $datebegin - дата начала обучения в формате unixtime
*/
public function create_cstreams_for_programm($programmid, $ageid, $agenum, $departmentid, $datebegin, $enddate=null)
{
$result = true;
if ( ! $programm = $this->dof->storage('programms')->get($programmid) )
{// не удалось получить учебную программу
return false;
}
if ( ! $programmitems = $this->dof->storage('programmitems')->get_pitems_list($programmid, $agenum, 'deleted') )
{// нет потоков, некого подписывать - но считаем, что мы свою работы все равно сделали
return true;
}
// если в программе есть предметы на этот период - создадим для них подписки
foreach ( $programmitems as $pitem )
{
$cstream = new object();
$cstream->ageid = $ageid;
$cstream->programmitemid = $pitem->id;
// откуда брать id учителя?
$cstream->teacherid = 0;
$cstream->departmentid = $departmentid;
$cstream->mdlgroup = null;
$cstream->eduweeks = $this->dof->storage('ages')->get_field($ageid,'eduweeks');
if ( $pitem->eduweeks )
{// или из предмета, если указано там
$cstream->eduweeks = $pitem->eduweeks;
}
$cstream->begindate = $datebegin;
$cstream->enddate = $datebegin + $pitem->maxduration;
if ( $enddate )
{// дата окончания указана принудительно
$cstream->enddate = $enddate;
}
$cstream->status = 'plan';
// создаем подписку предмета на программу в текущем периоде
$result = $result AND (bool)$this->insert($cstream);
}
return $result;
}
/** Подписать группу на список потоков
*
* @return
* @param int $agroupid- id группы в таблице agroups
* @param int $ageid - id учебного периода в таблице ages
*
* @todo выяснить, нужно ли реализовать возможность подписки группы не по определененому периоду,
* а для всех периодов?
*/
public function enrol_agroup_on_cstreams($agroupid, $ageid)
{
$return = true;
if ( ! $agroup = $this->dof->storage('agroups')->get($agroupid) )
{// не удалось получить академичеескую группу
return false;
}
// @todo нужно ли указывать agenum?
if ( ! $programmitems = $this->dof->storage('programmitems')->get_pitems_list($agroup->programmid, $agroup->agenum) )
{// в программе группы нет предметов для текущего периода
return true;
}
foreach ( $programmitems as $pitem )
{// подписываем группу на все потоки
$cstreams = $this->get_prog_age_cstreams($pitem->id, $ageid);
foreach ($cstreams as $cstream )
{// создаем подписку группы на учебный поток
if ( $this->dof->storage('cstreamlinks')->
is_exists_filter('cstreamid', $cstream->id, 'agroupid', $agroupid) )
{// если запись для такого потока и такой группы существует - не создаем такую запись еще раз
continue;
}
// запомним, если что-то пошло не так
$return = $return AND (bool)$this->dof->storage('cstreamlinks')->
enrol_agroup_on_cstream($agroupid, $cstream->id);
}
}
return $return;
}
/** Переводит поток в статус "завершен"
* @param int $id - id потока
* @return bool true - если поток удачно завершен и
* false в остальных случаях
*/
public function set_status_complete($id)
{
if ( ! is_int_string($id) )
{// входные данные неверного формата
return false;
}
if ( ! $obj = $this->get($id) )
{// объект не найден return false; }
if ( $obj->status == 'completed' )
{// поток уже завершен return true; }
if ( $obj->status == 'plan' OR $obj->status == 'canceled' OR $obj->status == 'suspend')
{// поток запланирован, приостановлен или отменен - его нельзя завершить return false; } $rez = true; // дата окончания действия подписки $obj->enddate = time(); if ( ! $this->update($obj,$id) ) {// не удалось обновить запись БД return false; } // переместить в статс "неудачно завершены" if ( $cpassed = $this->dof->storage('cpassed')->get_list_filter('cstreamid',$id, 'status',array('plan','active','suspend')) ) {// если есть незавершенные подписки на дисциплину сменим им статус foreach($cpassed as $cpass) {// переведем каждую в статус неуспешно завершена $rez = $rez & $this->dof->storage('cpassed')->set_final_grade($cpass->id); } } if ( $rez ) {// если все в порядке - меняем статус потока return $this->dof->workflow('cstreams')->change($id,'completed'); } return $rez;
}
/** Возвращает список потоков по параметрам
* @param int $programmitemid - id дисциплины
* @param int $teacherid - id учителя
* @param bool $mycstrems - показать ли потоки текущего пользователя
* @param bool $completecstrems - показать ли завершенные потоки
* @return array
*/
public function get_cstreams_on_parametres($programmitemid, $teacherid = 0, $mycstrems = false, $completecstrems = false)
{
// составляем условие
// предмет обязателен
$select = ' programmitemid = '.$programmitemid;
if ( $teacherid )
{// если указан учитель выведем только для него
$select .= ' AND teacherid = '.$teacherid;
}elseif ( $mycstrems )
{// если учителя нет, но надо показать потоки текущего пользователя
if ( $teacherid = $this->dof->storage('persons')->get_by_moodleid_id() )
{// если только он есть в БД
$select .= ' AND teacherid = '.$teacherid;
}
}
if ( $completecstrems )
{// скахзано что надо вывести завершенные потоки вместе с активными
$select .= ' AND status IN (\'active\',\'completed\')';
}else
{// выведем только активные
$select .= ' AND status = \'active\;
}
// возвращаем найденные потоки
return $this->dof->storage('cstreams')->get_list_select($select);
}
/** Возвращает короткое имя потока
* @return string
*/
public function get_short_name($cstreamid)
{
if ( ! $cstream = $this->get($cstreamid) )
{
return false;
}
$pitem = stripslashes_recursive($this->dof->storage('programmitems')->get_field($cstream->programmitemid, 'name'));
$teacher = stripslashes_recursive($this->dof->storage('persons')->get_fullname($cstream->teacherid));
$cstreamname = $pitem;
if ( $teacher )
{// если есть учитель - добавим его
$cstreamname .= ', '.$teacher;
}
$cstreamname .= ' ['.$cstream->id.']';
return $cstreamname;
}
/** Подписать учеников на поток
*
* @return bool
* @param object $cstream - объект из таблицы cstreams
* @param object $programmsbcids - массив, состоящий из id подписок на программы в таблице programmsbcs
*/
public function enrol_students_on_cstream($cstream, $programmsbcids)
{
if ( ! is_object($cstream) OR ! is_array($programmsbcids) )
{// неправильный формат данных
return false;
}
foreach ( $programmsbcids as $programmsbcid )
{// перебираем все подписки на программу и отписываем каждого ученика
$result = & $this->enrol_student_on_cstream($cstream, $programmsbcid);
}
return $result;
}
/** Исключить учеников из потока
*
* @return bool
* @param object $cstream - объект из таблицы cstreams
* @param array $programmsbcids - массив, состоящий из id подписок на программы в таблице programmsbcs
*/
public function unenrol_students_from_cstream($cstream, $programmsbcids)
{
if ( ! is_object($cstream) OR ! is_array($programmsbcids) )
{// неправильный формат данных
return false;
}
$result = true;
foreach ( $programmsbcids as $programmsbcid )
{// перебираем все подписки на программу и отписываем каждого ученика
$result = & $this->unenrol_student_from_cstream($cstream, $programmsbcid);
}
return $result;
}
/** Подписать одного ученика на поток
*
* @return bool
* @param object $cstream - объект из таблицы cstreams
* @param int $programmsbcid - id подписки ученика на программу в таблице programmsbcs
*
* @todo проверить, не подписан ли уже ученик на этот поток
* @todo добавить полную проверку объекта $cpassed, если к тому времени не введем функции безопасной вставки
*/
public function enrol_student_on_cstream($cstream, $programmsbcid)
{
$programmsbcid = intval($programmsbcid);
if ( ! is_object($cstream) OR ! $programmsbc = $this->dof->storage('programmsbcs')->get($programmsbcid) )
{// неправильный формат данных
return false;
}
if ( ! $studentid = $this->dof->storage('programmsbcs')->get_studentid_by_programmsbc($programmsbcid) )
{// не нашли id ученика - это ошибка
// @todo поймать здесь исключение которое будет генерироваться функцией get_studentid_by_programmitem
return false;
}
if ( ! $programmitem = $this->dof->storage('programmitems')->get($cstream->programmitemid) )
{// предмет потока на который подписывается ученик не найден
// @todo сгенерировать исключение и записать это событие в лог, когда станет возможно
return false;
}
// создаем объект для будущей подписки на предмет
$cpassed = new object;
$cpassed->cstreamid = $cstream->id;
$cpassed->programmsbcid = $programmsbcid;
$cpassed->programmitemid = $cstream->programmitemid;
$cpassed->studentid = $studentid;
$cpassed->agroupid = $programmsbc->agroupid;
$cpassed->gradelevel = $programmitem->gradelevel;
$cpassed->ageid = $cstream->ageid;
// @todo с типом синхронизации разобраться когда станет окончательно ясно как обавлять обычные cpassed
//$cpassed->typesync = 0;
// @todo добавить сюда сведения о часах из дисциплины, когда эти поля появятся в таблице cpassed
// Устанавливаем статус прошлой подписки в положение "неуспешно завершен"
// @todo в будущем проверять результат выполнения этой функции и записывать его в лог
// когда это станет возможно
if ( $repeatid = $this->set_previos_cpassed_to_failed($cstream, $programmsbcid) )
{// если ученик пересдавал предмет в этом потоке - то запомним это
$cpassed->repeatid = $repeatid;
}
// вставляем новую запись в таблицу cpassed, тем самым подписывая ученика на поток
if ( ! $newid = $this->dof->storage('cpassed')->insert($cpassed) )
{// не удалось создать новую запись
return false;
}
// после создания установим подписке нужный статус:
return $this->set_new_status_to_cpassed($newid, $cstream);
}
/** Устанавливает предыдущие подписки в статус "неуспешно завершено" если они были
*
* @return bool
* @param object $cstream - учебный поток, объект из таблицы cstreams
* @param object $programmsbcid - id подписки на программу в таблице programmsbcs
*
* @todo различать случаи ошибок и случаи когда просто нет предыдущей записи в cpassed
*/
private function set_previos_cpassed_to_failed($cstream, $programmsbcid)
{
$select = 'programmsbcid = '.$programmsbcid.
' AND cstreamid = '.$cstream->id.
" AND repeatid IS NULL AND status != 'canceled' ";
$cpass = $this->dof->storage('cpassed')->get_list_select($select);
if ( $cpass AND is_array($cpass) )
{// если нашли запись - то она единственная
$cpass = current($cpass);
}else
{// подписка не найдена - все нормально, ничего не надо делать return false; }
// найдем наследника
$successorid = $this->dof->storage('cpassed')->get_last_successor($cpass->id);
if ( ! $successorid )
{// нет наследника - все нормально
return false;
}
// устанавливаем предыдущие подписки в статус "отменен" или "неуспешно завершен", если они есть,
// используя для этого функцию выставления итоговых оценок
// @todo проверить результат работы этой функции и записать в лог возможные ошибки, если они возникнут
$this->dof->storage('cpassed')->set_final_grade($successorid);
return $successorid;
}
/** установить статус новой созданной подписки в зависимости от статуса потока неа который она создается
*
* @return bool
* @param int $id - id подписки на поток в таблице cpassed
* @param object $cstream - объект из таблицы cstreams. Поток на который была произведена запись
*/
private function set_new_status_to_cpassed($id, $cstream)
{
switch ( $cstream->status )
{// в зависимости от статуса потока меняем статус подписки
case 'active': return $this->dof->workflow('cpassed')->change($id, 'active'); break;
case 'suspend': return $this->dof->workflow('cpassed')->change($id, 'suspend'); break;
// подписка уже в нужном статусе
case 'plan': return true; break;
// неизвестный или недопустимый статус потока
default: return false;
}
}
/** Подписать одного ученика на поток.
*
* @return bool
* @param object $cstream - объект из таблицы cstreams
* @param int $programmsbcid - id подписки ученика на программу в таблице programmsbcs
*
* @todo перенести эту функцию в storage/cstreams
*/
public function unenrol_student_from_cstream($cstream, $programmsbcid)
{
$programmsbcid = intval($programmsbcid);
if ( ! is_object($cstream) OR ! $programmsbcid )
{// неправильный формат данных
return false;
}
if ( ! $cpassed = $this->dof->storage('cpassed')->
get_list_filter('cstreamid', $cstream->id, 'programmsbcid', $programmsbcid,
'status', array('plan', 'active', 'suspend')) )
{// не нашли ни одной подписки, значит ученик уже отписан
return true;
}
$result = true;
foreach ( $cpassed as $cpitem )
{// отписываем всех учеников от потока, устанавливая подпискам статус "отменен"
// @todo выяснить какой статус устанавливать: "отменен" или "успешно завершен"
$result = & $this->dof->workflow('cpassed')->change($cpitem->id, 'canceled');
}
return $result;
}
/** Получить id программы, к которой привязан указанный поток
*
* @return int|bool - id программы, которой принадлежит поток или false в случае ошибки
* @param int $cstreamid - id потока в таблице cstreams
*/
private function get_cstream_programmid($cstreamid)
{
if ( ! $this->get($cstreamid) )
{
return false;
}
// получаем id программы из предмета, по которому проходит этот поток
return $this->dof->storage('programmitems')->get_field($cstreamid->programmitemid, 'programmid');
}
/** Сохраняет имя предмето-потока в БД
* @param int $cstreamid - id предмето-поток
* @return bool true - если запись прошла успешно или false
*/
public function get_cstreamname($eventcode, $mixedvar, $cstream = false)
{
//узнаем с объектами из каких таблиц мы имеем дело';
//и найдем cstreamid
if ( $cstream )
{//пришли данные из таблицы cstream
if ( $eventcode == 'delete' AND isset($mixedvar['old']->id) )
{//это удаление- старый объект обязательно должен быть
$oldid = $mixedvar['old']->id;
}elseif ( $eventcode == 'insert' AND isset($mixedvar['new']->id) )
{//это вставка - новая запись всегда должна быть
$newid = $mixedvar['new']->id;
}elseif ( $eventcode == 'update' AND isset($mixedvar['old']->id)
AND isset($mixedvar['new']->id) )
{//это обновление - оба объекта должны быть
$newid = $mixedvar['new']->id;
$oldid = $mixedvar['old']->id;
}else
{//но это не так
return false;
}
}else
{//пришли данные из других таблиц';
if ( $eventcode == 'delete' AND isset($mixedvar['old']->cstreamid) )
{//это удаление - старый объект обязательно должен быть
$oldid = $mixedvar['old']->cstreamid;
}elseif ( $eventcode == 'insert' AND isset($mixedvar['new']->cstreamid) )
{//это вставка - новая запись всегда должна быть
$newid = $mixedvar['new']->cstreamid;
}elseif ( $eventcode == 'update' AND isset($mixedvar['old']->cstreamid)
AND isset($mixedvar['new']->id) )
{//это обновление - оба объекта должны быть
$newid = $mixedvar['new']->cstreamid;
$oldid = $mixedvar['old']->cstreamid;
}else
{//но это не так
return false;
}
}
//путь к файлу с методами формирования имени файла
$path = $this->dof->plugin_path('storage','cstreams','/cfg/namestream.php');
if ( ! file_exists($path) )
{//если файла нет - сообщим об этом
return false;
}
//файл есть - подключаем файл
include_once($path);
//создаем объект для генерации имени
$csname = new block_dof_storage_cstreams_namecstream;
switch ( $eventcode )
{
case 'insert':
{
return $csname->save_cstream_name($newid);
}
case 'update':
{
$old = $csname->save_cstream_name($oldid);
$new = $csname->save_cstream_name($newid);
return ($old AND $new);
}
case 'delete':
{
return $csname->save_cstream_name($oldid);
}
}
return false;
}
Планы:
Дополнительные методы:
- Получить список учебных процессов для данного ученика с учетом персональной подписки и академических групп (второй параметр - статус, по умолчанию - "идет").
События
В этом разделе описан список всех событий, которые генерируются, перехватываются и обрабатываются этим плагином.
Перехватываемые события
| Тип плагина | Код плагина | Код события | Доп. данные | Пояснение |
|---|---|---|---|---|
| Этот плагин не перехватывает никаких событий | ||||
Генерируемые события
| Тип плагина | Код плагина | Код события | Доп. данные | Пояснение |
|---|---|---|---|---|
| storage | cstreams | insert | Массив, содержащий в поле "new" объект с данными для вставки в таблицу.
Пример: array('new' => $dataobject) |
Генерируется каждый раз при вставке новой записи в таблицу cstreams. |
| storage | cstreams | update | Массив, содержащий в поле "new" обновленный объект, и в поле "old" объект со старыми данными, до обновления записи.
Пример: array('old' => $dataobject_old, 'new' => $dataobject_new) |
Генерируется каждый раз при обновлении записи в таблице cstreams. |
| storage | cstreams | delete | Массив, содержащий в поле "old" объект с данными, которые удаляются из таблицы
Пример: array('old' => $dataobject) |
Генерируется каждый раз при удалении записи из таблицы cstreams. |
| storage | cstreams | changestatus | Массив, содержащий id учебного потока
Пример: array('cstreamid'=>$id) |
Событие посылается при изменении статуса учебного потока на "активный" (active) |