Разработка:storages/cstreams — различия между версиями

Материал из DOF
Перейти к: навигация, поиск
(Дополнительные методы:)
(Дополнительные методы:)
Строка 61: Строка 61:
  
  
===='''get($id)'''====
+
===='''get_teacher_cstream($id, $status = "active")'''====
 
 
Возвращает запись из таблицы плагина с указанным id.
 
 
 
''Аргументы:''
 
* id(int) - id записи в этой таблице.
 
''Возвращаемые значения:''
 
* @return mixed object - запись из таблицы или false в остальных случаях.
 
 
 
 
 
===='''get_field($id,$return)'''====
 
 
 
Возвращает содержимое поля по id записи и имени поля в таблице плагина .
 
 
 
''Аргументы:''
 
* id(int) - id записи в этой таблице.
 
* $return(string) - имя поля.
 
''Возвращаемые значения:''
 
* (mixed) - значение поля.
 
 
 
 
 
===='''get_filter($field1 = /'', $value1 = /'', $field2 = /'', $value2 = /'', $field3 = /'', $value3 = /'', $fields = '*')'''====
 
 
 
Возвращает объект, которые удовлетворяют заданным критериям.
 
 
 
''Аргументы:''
 
* field1(string) - название первого поля поиска, по умолчанию - пусто('').
 
* value1(mixed) - значение, которое ищется в первом поле, по умолчанию - пусто('').
 
* field2(string) - название второго поля поиска, по умолчанию - пусто('').
 
* value2(mixed) - значение, которое ищется во втором поле, по умолчанию - пусто('').
 
* field3(string) - название третьего поля поиска, по умолчанию - пусто('').
 
* value3(mixed) - значение, которое ищется в третьем поле, по умолчанию - пусто('').
 
**''любая переменная $valueX может содержать как одно значение так и массив значений, которые ищутся в соответствующем  поле.''
 
* fields(string) - поля, которые должны быть возвращены, разделенные запятыми.
 
''Возвращаемые значения:''
 
* (object) - объект с указанными полями, если нашлась запись, удовлетворяюшая всем трем критериям поиска.
 
* (bool) - false, если произошла ошибка.
 
 
 
 
 
===='''get_list($field = '', $value = '', $sort = '', $fields = '*', $limitfrom = '', $limitnum = '')'''====
 
 
 
Возвращает массив объектов, удовлетворяющих нескольким значениям одного поля из таблицы плагина.
 
 
 
''Аргументы:''
 
* field(string) - название поля для поиска в этой таблице.
 
* value(mixed) - может содержать как одно значение, так и массив значений, которые ищутся в указанном поле
 
* sort(string) - в каком направлении и по каким полям производится сортировка.
 
* fields(string) - поля, которые надо возвратить.
 
* limitfrom(int) - id, начиная с которого надо искать.
 
* limitnum(int) - максимальное количество записей, которое надо вернуть.
 
''Возвращаемые значения:''
 
* (mixed) - массив объектов если что-то нашлось.
 
* (bool) - false, если произошла ошибка.
 
 
 
 
 
===='''get_teacher_cstream()'''====
 
  
 
Получает список учебных процессов у данного преподавателя.
 
Получает список учебных процессов у данного преподавателя.
Строка 122: Строка 67:
 
''Аргументы:''  
 
''Аргументы:''  
 
* $id(int) - id преподавателя в таблице [[Разработка:storages/persons | persons ]].
 
* $id(int) - id преподавателя в таблице [[Разработка:storages/persons | persons ]].
* $status(string) - статус потока, по умолчанию - идет(go).
+
* $status(string) - статус потока, по умолчанию - идет(active).
 
''Возвращаемые значения:''
 
''Возвращаемые значения:''
* (array) массив процессов.  
+
* (array) - массив процессов.  
* (bool) false если процессы не найдены.
+
* (bool) - false, если процессы не найдены.
 
''Структура работы:''
 
''Структура работы:''
 
* формируем SQL-запрос и возвращаем список процессов:
 
* формируем SQL-запрос и возвращаем список процессов:
 
** если указывается статус - процессы с указанным статусом,
 
** если указывается статус - процессы с указанным статусом,
 
** если статус указывается null - процессы с любым статусом,
 
** если статус указывается null - процессы с любым статусом,
** если статус не указывается - процессы со статусом go.
+
** если статус не указывается - процессы со статусом 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) - статус потока, по умолчанию - идет(go).
+
* $status(string) - статус потока, по умолчанию - идет(active).
 
''Возвращаемые значения:''
 
''Возвращаемые значения:''
* (array) массив процессов.  
+
* (array) - массив процессов.  
* (bool) false если процессы не найдены.
+
* (bool) - false, если процессы не найдены.
 
''Структура работы:''
 
''Структура работы:''
 
* формируем SQL-запрос и возвращаем список процессов:
 
* формируем SQL-запрос и возвращаем список процессов:
 
** если указывается статус - процессы с указанным статусом,
 
** если указывается статус - процессы с указанным статусом,
 
** если статус указывается null - процессы с любым статусом,
 
** если статус указывается null - процессы с любым статусом,
** если статус не указывается - процессы со статусом go.
+
** если статус не указывается - процессы со статусом 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) - статус потока, по умолчанию - идет(go).
+
* $status(string) - статус потока, по умолчанию - идет(active).
 
''Возвращаемые значения:''
 
''Возвращаемые значения:''
* (array) массив процессов.  
+
* (array) - массив процессов.  
* (bool) false если процессы не найдены.
+
* (bool) - false, если процессы не найдены.
 
''Структура работы:''
 
''Структура работы:''
 
* формируем SQL-запрос и возвращаем список процессов:
 
* формируем SQL-запрос и возвращаем список процессов:
 
** если указывается статус - процессы с указанным статусом,
 
** если указывается статус - процессы с указанным статусом,
 
** если статус указывается null - процессы с любым статусом,
 
** если статус указывается null - процессы с любым статусом,
** если статус не указывается - процессы со статусом go.
+
** если статус не указывается - процессы со статусом 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) - статус потока, по умолчанию - идет(go).
+
* $status(string) - статус потока, по умолчанию - идет(active).
 
''Возвращаемые значения:''
 
''Возвращаемые значения:''
* (array) массив процессов.  
+
* (array) - массив процессов.  
* (bool) false если процессы не найдены.
+
* (bool) - false, если процессы не найдены.
 
''Структура работы:''
 
''Структура работы:''
 
* формируем SQL-запрос и возвращаем список процессов:
 
* формируем SQL-запрос и возвращаем список процессов:
 
** если указывается статус - процессы с указанным статусом,
 
** если указывается статус - процессы с указанным статусом,
 
** если статус указывается null - процессы с любым статусом,
 
** если статус указывается null - процессы с любым статусом,
** если статус не указывается - процессы со статусом go.
+
** если статус не указывается - процессы со статусом 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)'''====
  
'''get_agroup_agenum_cstreams()'''
+
Возвращает количество потоков.
  
'''get_agroup_status_cstreams()'''
+
''Аргументы:''
 +
* $select(string) - критерии отбора записей.
 +
''Возвращаемые значения:''
 +
* (int) - количество найденных записей.
  
''' get_prog_age_cstreams()'''
 
  
'''get_listing()'''
+
===='''get_prog_age_cstreams($pitemid, $ageid, $status=null)'''====
  
'''get_select_listing()'''
+
Получить список учебных потоков, допустимых учебной программой и текущим периодом
  
protected-метод.
+
''Аргументы:''
 +
* $programmid(object) - id учебной программы в таблице [[Разработка:storages/programms | programms ]].
 +
* $ageid(object) - id периода в таблице [[Разработка:storages/ages | ages ]].
 +
* $status(string) - статус учебного потока.
 +
''Возвращаемые значения:''
 +
* (array) - массив записей из базы.
 +
* (bool) - false, если произошла ошибка.
  
'''is_teacher()'''
 
  
'''get_agroup_ageids()'''
+
===='''get_programm_age_cstreams($programmid, $ageid = null, $agenum = null, $dpid = null)'''====
  
'''create_cstreams_for_agroup()'''
+
Получает все учебные потоки программы.
 +
 
 +
''Аргументы:''
 +
* $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;
 +
    }
  
'''enrol_agroup_on_cstreams()'''
+
    /** Возвращает список потоков по параметрам
 +
    * @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


Таблица в базе данных

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)