Разработка:storages/cstreams
| Плагин | |
| Название | 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) |