Разработка: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) |