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

Материал из DOF
Перейти к: навигация, поиск
(Дополнительные методы:)
(Дополнительные методы:)
Строка 222: Строка 222:
 
* (string).
 
* (string).
  
    /** Получить id всех периодов, в течение которых проходит обучение выбранной группы
+
===='''get_agroup_ageids($agroupid)'''====
    *
+
 
    * @return array|bool - индексированный массив с уникальными значениями id периодов всех потоков или false
+
Получить id всех периодов, в течение которых проходит обучение выбранной группы.
    * если ничего не найдено
+
 
    * @param int $agroupid - id академической группы в таблице agroups
+
''Аргументы:''
    */
+
* @param int $agroupid - id академической группы в таблице [[Разработка:storages/agroups | agroups ]].
    public function get_agroup_ageids($agroupid)
+
''Возвращаемые значения:''
    {
+
* (array) - индексированный массив с уникальными значениями id периодов всех потоков.
        $result = array();
+
* (bool) - false, если ничего не найдено.
        // получаем массив всех потоков академической группы
+
 
        $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;
 
    }
 
 
      
 
      
    /** Создать учебные потоки для группы
+
===='''create_cstreams_for_agroup($agroupid, $ageid, $departmentid, $datebegin, $enddate=null)'''====
    *
+
 
    * @return
+
Создаёт учебные потоки для группы.
    * @param int $agroupid - id акадкмическуой группы (класса) в таблице agroups
+
 
    * @param int $ageid - id учебного периода в таблице ages
+
''Аргументы:''
    * @param int $departmentid - id учебного подразделения в таблице departments
+
* $agroupid(int) - id акадкмическуой группы (класса) в таблице [[Разработка:storages/agroups | agroups ]].
    * @param int $datebegin - дата начала обучения в формате unixtime
+
* $ageid(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]].
    *
+
* $departmentid(int) - id учебного подразделения в таблице [[Разработка:storages/departments | departments ]].
    */
+
* $datebegin(int) - дата начала обучения в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime].
    public function create_cstreams_for_agroup($agroupid, $ageid, $departmentid, $datebegin, $enddate=null)
+
* $enddate(int) - дата окончания обучения в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime], по умолчанию - нет(null).
    {
+
''Возвращаемые значения:''
        if ( ! $agroup = $this->dof->storage('agroups')->get($agroupid) )
+
* (bool) - true, если всё получилось, и false, если возникли ошибки.
        {// не удалось получить академичеескую группу
+
 
            return false;
+
 
        }
+
===='''create_cstreams_for_programm($programmid, $ageid, $agenum, $departmentid, $datebegin, $enddate=null)'''====
        if ( ! $programm = $this->dof->storage('programms')->get($agroup->programmid) )
+
 
        {// не удалось получить учебную программу
+
Создаёт подписку на программу в учебном периоде для выбранной параллели.
            return false;
+
 
        }
+
''Аргументы:''
        if ( ! $programmitems = $this->dof->storage('programmitems')->get_pitems_list
+
* $programmid(int) - id учебной программы в таблице [[Разработка:storages/programms | programms ]].
                              ($programm->id, $agroup->agenum, 'deleted') )
+
* $ageid(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]].
        {// нет потоков, некого подписывать - но считаем, что мы свою работы все равно сделали
+
* $agenum(int) - номер параллели, для которой создается подписка.
            return true;
+
* $departmentid(int) - id учебного подразделения в таблице [[Разработка:storages/departments | departments ]].
        }
+
* $datebegin(int) - дата начала обучения в формате [http://ru.wikipedia.org/wiki/UNIX-время unixtime].
        $result = true;
+
''Возвращаемые значения:''
        // если в программе есть предметы на этот период - создадим для них подписки
+
* (bool) - true, если всё получилось, и false, если возникли ошибки.
        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;
 
       
 
    }
 
 
      
 
      
    /** Создать подписку на программу в учебном периоде для выбранной параллели
+
===='''enrol_agroup_on_cstreams($agroupid, $ageid)'''====
    *
+
 
    * @return bool
+
Подписывает группу на список потоков.
    * @param int $programmid - id учебной программы в таблице programms
+
 
    * @param int $ageid - id учебного периода в таблице ages
+
''Аргументы:''
    * @param int $agenum - номер параллели, для которой создается подписка
+
* $agroupid(int) - id группы в таблице [[Разработка:storages/agroups | agroups ]].
    * @param int $departmentid - id учебного подразделения в таблице departments
+
* $ageid(int) - id учебного периода в таблице [[Разработка:storages/ages | ages ]].
    * @param int $datebegin - дата начала обучения в формате unixtime
+
''Возвращаемые значения:''
    */
+
* (bool) - true, если всё получилось, и false, если возникли ошибки.
    public function create_cstreams_for_programm($programmid, $ageid, $agenum, $departmentid, $datebegin, $enddate=null)
+
 
    {
+
 
        $result = true;
+
===='''set_status_complete($id)'''====
        if ( ! $programm = $this->dof->storage('programms')->get($programmid) )
+
 
        {// не удалось получить учебную программу
+
Переводит поток в статус "завершен".
            return false;
+
 
        }
+
''Аргументы:''
        if ( ! $programmitems = $this->dof->storage('programmitems')->get_pitems_list($programmid, $agenum, 'deleted') )
+
* $id(int) - id потока в таблице плагина.
        {// нет потоков, некого подписывать - но считаем, что мы свою работы все равно сделали
+
''Возвращаемые значения:''
            return true;
+
* (bool) - true, если поток удачно завершен, и false - в остальных случаях.
        }
+
 
        // если в программе есть предметы на этот период - создадим для них подписки
+
 
        foreach ( $programmitems as $pitem )
+
===='''get_cstreams_on_parametres($programmitemid, $teacherid = 0, $mycstrems = false, $completecstrems = false)'''====
        {
+
 
           
+
Возвращает список потоков по параметрам.
            $cstream = new object();
+
 
            $cstream->ageid          = $ageid;
+
''Аргументы:''
            $cstream->programmitemid = $pitem->id;
+
* $programmitemid(int) - id дисциплины в таблице [[Разработка:storages/programmitems | programmitems ]].
            // откуда брать id учителя?
+
* $teacherid(int) - id учителя в таблице [[Разработка:storages/persons | persons ]], по умолчанию - нет(0).
            $cstream->teacherid      = 0;
+
* $mycstrems(bool) - показать ли потоки текущего пользователя, по умолчанию - нет(false).
            $cstream->departmentid  = $departmentid;
+
* $completecstrems(bool) - показать ли завершенные потоки, по умолчанию - нет(false).
            $cstream->mdlgroup      = null;
+
''Возвращаемые значения:''
            $cstream->eduweeks = $this->dof->storage('ages')->get_field($ageid,'eduweeks');
+
* (array).
            if ( $pitem->eduweeks )
+
 
            {// или из предмета, если указано там
+
 
                $cstream->eduweeks = $pitem->eduweeks;
+
===='''get_short_name($cstreamid)'''====
            }
+
 
            $cstream->begindate      = $datebegin;
+
Возвращает короткое имя потока.
            $cstream->enddate        = $datebegin + $pitem->maxduration;
+
 
            if ( $enddate )
+
''Аргументы:''
            {// дата окончания указана принудительно
+
* $cstreamid(int) - id потока в таблице плагина.
                $cstream->enddate = $enddate;
+
''Возвращаемые значения:''
            }
+
* (string)
            $cstream->status        = 'plan';
+
* (bool) - false, если возникли ошибки.
            // создаем подписку предмета на программу в текущем периоде
+
 
            $result = $result AND (bool)$this->insert($cstream);
+
 
           
+
===='''enrol_students_on_cstream($cstream, $programmsbcids)'''====
        }
+
 
        return $result;
+
Подписывает учеников на поток.
    }
+
 
 +
''Аргументы:''
 +
* $cstream(object) - объект из таблицы плагина.
 +
* $programmsbcids(object) - массив, состоящий из id подписок на программы в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].
 +
''Возвращаемые значения:''
 +
* (bool) - true, если всё получилось, и false, если возникли ошибки.
 +
 
 +
===='''unenrol_students_from_cstream($cstream, $programmsbcids)'''====
 +
 
 +
Исключает учеников из потока
 +
 
 +
''Аргументы:''
 +
* @param object $cstream - объект из таблицы плагина.
 +
* @param array $programmsbcids - массив, состоящий из id подписок на программы в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].
 +
''Возвращаемые значения:''
 +
* (bool) - true, если всё получилось, и false, если возникли ошибки.
 +
 
 
      
 
      
    /** Подписать группу на список потоков
+
===='''enrol_student_on_cstream($cstream, $programmsbcid)'''====
    *
+
 
    * @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 дисциплины
+
* $cstream(object) - объект из таблицы плагина.
    * @param int $teacherid - id учителя
+
* $programmsbcid(int) - id подписки ученика на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].
    * @param bool $mycstrems - показать ли потоки текущего пользователя
+
''Возвращаемые значения:''
    * @param bool $completecstrems - показать ли завершенные потоки
+
* (bool) - true, если всё получилось, и false, если возникли ошибки.
    * @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;
 
    }
 
 
      
 
      
    /** Исключить учеников из потока
+
===='''unenrol_student_from_cstream($cstream, $programmsbcid)'''====
    *
+
 
    * @return bool
+
Исключает одного ученика из потока.
    * @param object $cstream - объект из таблицы cstreams
+
 
    * @param array $programmsbcids - массив, состоящий из id подписок на программы в таблице programmsbcs
+
''Аргументы:''
    */
+
* $cstream(object) - объект из таблицы плагина.
    public function unenrol_students_from_cstream($cstream, $programmsbcids)
+
* $programmsbcid(int) - id подписки ученика на программу в таблице [[Разработка:storages/programmsbcs | programmsbcs ]].
    {
+
''Возвращаемые значения:''
        if ( ! is_object($cstream) OR ! is_array($programmsbcids) )
+
* (bool) - true, если всё получилось, и false, если возникли ошибки.
        {// неправильный формат данных
+
 
            return false;
+
 
        }
+
===='''get_cstreamname($eventcode, $mixedvar, $cstream = false)'''====
        $result = true;
+
 
        foreach ( $programmsbcids as $programmsbcid )
+
В зависимости от произошедших событий (значение $eventcode) сохраняет информацию о новом (insert), и новом, и старом (update) либо только старом (delete) имени предмето-потока в БД.
        {// перебираем все подписки на программу и отписываем каждого ученика
+
 
            $result = & $this->unenrol_student_from_cstream($cstream, $programmsbcid);
+
''Аргументы:''
        }
+
* $eventcode - произошедшее событие.
        return $result;
+
* $mixedvar(array) - id нового и старого потоков в таблице плагина.
    }
+
* $cstream - данные пришли из таблицы плагина? , по умолчанию - нет(false).
   
+
''Возвращаемые значения:''
    /** Подписать одного ученика на поток
+
* (bool) - true, если запись прошла успешно, и false - в случае ошибок.
    *
 
    * @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;
 
    }
 
  
 
===Планы:===
 
===Планы:===

Версия 20:49, 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).

get_agroup_ageids($agroupid)

Получить id всех периодов, в течение которых проходит обучение выбранной группы.

Аргументы:

  • @param int $agroupid - id академической группы в таблице agroups .

Возвращаемые значения:

  • (array) - индексированный массив с уникальными значениями id периодов всех потоков.
  • (bool) - false, если ничего не найдено.


create_cstreams_for_agroup($agroupid, $ageid, $departmentid, $datebegin, $enddate=null)

Создаёт учебные потоки для группы.

Аргументы:

  • $agroupid(int) - id акадкмическуой группы (класса) в таблице agroups .
  • $ageid(int) - id учебного периода в таблице ages .
  • $departmentid(int) - id учебного подразделения в таблице departments .
  • $datebegin(int) - дата начала обучения в формате unixtime.
  • $enddate(int) - дата окончания обучения в формате unixtime, по умолчанию - нет(null).

Возвращаемые значения:

  • (bool) - true, если всё получилось, и false, если возникли ошибки.


create_cstreams_for_programm($programmid, $ageid, $agenum, $departmentid, $datebegin, $enddate=null)

Создаёт подписку на программу в учебном периоде для выбранной параллели.

Аргументы:

  • $programmid(int) - id учебной программы в таблице programms .
  • $ageid(int) - id учебного периода в таблице ages .
  • $agenum(int) - номер параллели, для которой создается подписка.
  • $departmentid(int) - id учебного подразделения в таблице departments .
  • $datebegin(int) - дата начала обучения в формате unixtime.

Возвращаемые значения:

  • (bool) - true, если всё получилось, и false, если возникли ошибки.

enrol_agroup_on_cstreams($agroupid, $ageid)

Подписывает группу на список потоков.

Аргументы:

  • $agroupid(int) - id группы в таблице agroups .
  • $ageid(int) - id учебного периода в таблице ages .

Возвращаемые значения:

  • (bool) - true, если всё получилось, и false, если возникли ошибки.


set_status_complete($id)

Переводит поток в статус "завершен".

Аргументы:

  • $id(int) - id потока в таблице плагина.

Возвращаемые значения:

  • (bool) - true, если поток удачно завершен, и false - в остальных случаях.


get_cstreams_on_parametres($programmitemid, $teacherid = 0, $mycstrems = false, $completecstrems = false)

Возвращает список потоков по параметрам.

Аргументы:

  • $programmitemid(int) - id дисциплины в таблице programmitems .
  • $teacherid(int) - id учителя в таблице persons , по умолчанию - нет(0).
  • $mycstrems(bool) - показать ли потоки текущего пользователя, по умолчанию - нет(false).
  • $completecstrems(bool) - показать ли завершенные потоки, по умолчанию - нет(false).

Возвращаемые значения:

  • (array).


get_short_name($cstreamid)

Возвращает короткое имя потока.

Аргументы:

  • $cstreamid(int) - id потока в таблице плагина.

Возвращаемые значения:

  • (string)
  • (bool) - false, если возникли ошибки.


enrol_students_on_cstream($cstream, $programmsbcids)

Подписывает учеников на поток.

Аргументы:

  • $cstream(object) - объект из таблицы плагина.
  • $programmsbcids(object) - массив, состоящий из id подписок на программы в таблице programmsbcs .

Возвращаемые значения:

  • (bool) - true, если всё получилось, и false, если возникли ошибки.

unenrol_students_from_cstream($cstream, $programmsbcids)

Исключает учеников из потока

Аргументы:

  • @param object $cstream - объект из таблицы плагина.
  • @param array $programmsbcids - массив, состоящий из id подписок на программы в таблице programmsbcs .

Возвращаемые значения:

  • (bool) - true, если всё получилось, и false, если возникли ошибки.


enrol_student_on_cstream($cstream, $programmsbcid)

Подписывает одного ученика на поток.

Аргументы:

  • $cstream(object) - объект из таблицы плагина.
  • $programmsbcid(int) - id подписки ученика на программу в таблице programmsbcs .

Возвращаемые значения:

  • (bool) - true, если всё получилось, и false, если возникли ошибки.


unenrol_student_from_cstream($cstream, $programmsbcid)

Исключает одного ученика из потока.

Аргументы:

  • $cstream(object) - объект из таблицы плагина.
  • $programmsbcid(int) - id подписки ученика на программу в таблице programmsbcs .

Возвращаемые значения:

  • (bool) - true, если всё получилось, и false, если возникли ошибки.


get_cstreamname($eventcode, $mixedvar, $cstream = false)

В зависимости от произошедших событий (значение $eventcode) сохраняет информацию о новом (insert), и новом, и старом (update) либо только старом (delete) имени предмето-потока в БД.

Аргументы:

  • $eventcode - произошедшее событие.
  • $mixedvar(array) - id нового и старого потоков в таблице плагина.
  • $cstream - данные пришли из таблицы плагина? , по умолчанию - нет(false).

Возвращаемые значения:

  • (bool) - true, если запись прошла успешно, и 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)