Отображение информации о глобальных группа пользователя в его профиле

Отображение информации о глобальных группа пользователя в его профиле

от Sergey Gorbatov -
Количество ответов: 38
Последнее время жутко не хватало возможности смотреть в профиле пользователя в какой(их) глобальной(ых) группе(ах) он числиться.

Искать в списке долго, хотелось раз прям и в профиле посмотреть.

Написал маленький плагин. Новое поле профиля пользователя. Если его добавить в "Учетные записи" - "Поля профиля пользователя".


и настроить, что показывать о глобальной группе (пока умеет показывать имя, код и описание).


То в профиле пользователя будет отображаться информация о глобальной группе.


Установка: распаковываем в папку /user/profile/field.

P.S. Писал ночью, версия очень начальная. Попортить ничего не может, т.к. ничего не куда не сохраняет, но с 100% работоспособности пока не гарантируюулыбаюсь

В ответ на Sergey Gorbatov

Re: Отображение информации о глобальных группа пользователя в его профиле

от Alexandre Scherbyna -

Спасибо, Сергей. А знаете ли вы, что есть плагин, который решает обратную задачу? Он добавляет студента в когорту (даже, кажется, сам ее создает при необходимости) в зависимости от того, что у него прописано в определенном поле учетной записи.

Сергей, а предложения по дальнейшему улучшению работы с когортами, о которых я написал Марине, вас не заинтересовали?

В ответ на Alexandre Scherbyna

Re: Отображение информации о глобальных группа пользователя в его профиле

от Sergey Gorbatov -
А знаете ли вы, что есть плагин, который решает обратную задачу?

Да, Александр. Мы его правда не используем, у нас группы из нашей внутренней системы деканат прилетают раз в год, но функциональность в нем замечательная.

Сергей, а предложения по дальнейшему улучшению работы с когортами, о которых я написал Марине, вас не заинтересовали?

Конечно заинтересовали, но мне чтобы приступить к решению задачи нужно ее "пережить" глубже, чтобы понять куда и как двигаться. С технической стороны тоже нужно подумать, самый простой способ (я так думаю) написать плагин администратора. Реализовать в нем и загрузку из файла списком и в виде интерфейса (например, выбираем когорту открывается список курсов (но у нас например около 3к курсов) значит выводить список курсов будем с помощью стандартного фильтра (например, как в процессе восстановления курсов). Тогда получается как раз гармонично - выбрали кагорту и по одному по добавляли к ней нужные курсы из фильтра - нажали применить улыбаюсь либо же в поле закинули файл со всеми кагортами и курсами нужными - нажали применить.

Вот тут нужно додумать как лучше.

В ответ на Sergey Gorbatov

Re: Отображение информации о глобальных группа пользователя в его профиле

от Marina Glancy -

Сергей, у меня есть альтернативное предложение. Когорты - это системная функция, профиль пользователя - тоже. Почему бы не добавить такую функциональность в ядро?

Нам нужна будет функция которая будет выводить все когорты пользователя с учетом их видимости. Я Вам могу помочь ее написать. После этого останется только добавить поле на страницу профиля и добавить пункт в administration setting $CFG->hiddenuserfields чтобы можно было это скрыть.

"Видимость" когорт это очень важно. В России когорты используются как потоки студентов, практически во всех остальных странах такое понятие отсутствует и студенты сами себе выбирают курсы. Поэтому когорты могут использоваться для, например, таких понятий как "сексуальные меньшинства", "disabled students", "students at risk", и так далее. То есть можете себе представить, что администрации не очень хочется чтобы это было видно всем. Поэтому есть разные разрешения контролирующие доступ к видимости когорт. Их надо обязательно учитывать. Посмотрите например на функции cohort_get_cohorts() и cohort_get_all_cohorts(). Ваша функция profile_field_get_cohort() не учитывает этого всего. Кстати, в запросах не пишите название таблицы с префиксом , как например mdl_cohort, надо писать {cohort}, префикс может быть разный у разных пользователей

Мне очень нравится Ваша идея добавить список когорт в профиль, казалось бы очевидная вещь, но почему-то issue на эту тему еще не существует.

В ответ на Marina Glancy

Re: Отображение информации о глобальных группа пользователя в его профиле

от Sergey Gorbatov -

Marina это даже еще лучше ;) меня еще вчера мучал вопрос, что я не по назначению использую плагин поля. Да, видимость я как-то не заслужено проигнорировал (тем более видел ее в списке полей базы).

Сейчас попробую, для начала, плагин адаптировать с учетом видимости поправлю запрос и начну смотреть как все это в ядре работает улыбаюсь и как аккуратно похожем стилем написать.


Офтоп.

P.S. Marina! Поздравляю Вас и всю прекрасную половину нашего сообщества от лица всех мужчин с международным женским днем улыбаюсь

Приложение images.jpg
В ответ на Marina Glancy

Re: Отображение информации о глобальных группа пользователя в его профиле

от Sergey Gorbatov -

Marina, подскажите, пожалуйста, как мне лучше шагать:

1. Сначала создать (чтобы номер забронировать) issueили уже перед опубликованием?

2. Функцию кладем в файл lib.php

3. В файл profile.php в раздел (// Print all the little details in a list) выводим.

4. А где хранить настройки что выводить (показывать ли скрытые, описание, idnamber?).

5. Пользователю стоит давать возможность показывать или скрывать информацию о группах в которые он входит для других пользователей? или это уже лишнее?

В ответ на Sergey Gorbatov

Re: Отображение информации о глобальных группа пользователя в его профиле

от Marina Glancy -
1. на Ваш выбор
2. cohort/lib.php
3. да, user/profile.php
что-то вроде:
if (!isset($hiddenfields['cohorts']) && ($usercohorts = cohorts_get_user_cohorts($user, $context))) {
    echo html_writer::tag('dt', get_string('cohorts'));
    echo html_writer::tag('dd', join(', ', $usercohorts));
}
может немножко посложнее, если хотите со ссылками, посмотрите на блок который список курсов пишет
Я бы еще то же самое добавила на страницу user/view.php, только там выводить только когорты относящиеся к текущему курсу
4. настройка должна быть только одна, не усложняйте. Невидимые должны показываться только тем у кого есть capability чтобы их видеть. Это все функция cohorts_get_user_cohorts($user, $context) должна делать.
надо только одну строчку добавить в https://github.com/moodle/moodle/blob/master/admin/settings/users.php#L155
5. лишнее по моему мнению
В ответ на Sergey Gorbatov

Re: Отображение информации о глобальных группа пользователя в его профиле

от Marina Glancy -

Сергей, как у Вас дела с этим проектом? Я хочу напомнить что осталось две недели до "code freeze", после этого новый фичи не будут приниматься интеграторами. Последний шанс что-то в 2.9 добавить

В ответ на Marina Glancy

Re: Отображение информации о глобальных группа пользователя в его профиле

от Sergey Gorbatov -

Marina, эту неделю мы посвятили интеграции с Mahara, у нас, как обычно, заморочки с ФГОС 3+ улыбаюсь В понедельник отчитываемся и я вернусь к профилю. К среде успею.

В ответ на Marina Glancy

Re: Отображение информации о глобальных группа пользователя в его профиле

от Sergey Gorbatov -

Marina, сделал функцию cohorts_get_user_cohorts. Блок вывода в user/profile.php сделал по аналогии со списком курсов, но тут появилось несколько вопросов:

Теперь в поле "глобальные группы" через запятую перечислены когорты в которых зачислен студент, код практически полностью аналогичен списку курсов (сереньким отображаются при наличии прав скрытые когорты), но:

1. перечислены только названия групп, а иногда (в нашем случае практически всегда) гораздо интереснее видеть описание. Насколько корректно будет если ссылка на названии будет переводить на поиск в списке когорты /cohort/index.php?search=%D0%90.080000%D0%AD%D0%BA-11 чтобы можно было узнать подробности по группе? или как лучше этот момент сделать?

2.Идея с переходом на user/view.php?id= тоже интересная, но тут у меня с теоретической точки зрения вопрос, что значит "когорты относящиеся к текущему курсу" - когорты которые указаны в списке записи на курс данного курса? т.е. заходим в курс, например, "БД" в нем настроена синхронизация с когортой "И2" и скорее всего создана группа "И2" - в профиле будет видно два раза "И2". Может быть в user/view.php?id= тоже лучше показывать весь список когорт? или их там вообще не нужно показывать? т.к. в курсе лучше все таки обращать внимание на группу, а не на когорту?


В ответ на Sergey Gorbatov

Re: Отображение информации о глобальных группа пользователя в его профиле

от Marina Glancy -

1. Я боюсь что пока что надо будет без ссылки список вывести, у нас нет никакой информационной странице о когорте. Появится - добавим ссылку.

2. "когорты относящиеся к текущему курсу" это значит те, которые определены на уровне системы или категорий к которым относится курс. Это не связано с enrol_cohort. См функцию cohort_get_cohorts($coursecontext->id)


В ответ на Sergey Gorbatov

Re: Отображение информации о глобальных группа пользователя в его профиле

от Sergey Gorbatov -
Вот еще одна версия в виде плагина и начинаю смотреть как реализовать красиво, чтобы в ядро не стыдно было предложить интегрировать.

Изменения:

1. Добавлена настройка "Показывать скрытые когорты". Если установлена скрытые когорты будут отображаться с затемнением, иначе не будут показаны вообще.

2. Запрос привел в соответствие + еще мелкие "глюки" убрал.

В ответ на Sergey Gorbatov

Re: Отображение информации о глобальных группа пользователя в его профиле

от Evgeniy Schuetz -

Поставил на старенькую Moodle 2.5 . Не прокатило - поле mdl_cohort.visible в таблице отсутствует. Что в этом случае плохо - в случае активации плагина при входе в профиль происходит "зависание" интерфейса. Тогда надо либо мин. версию Мудла указать, либо проверку наличия поля в код встроить. Эх, жаль....

Диагностику приложил:

Debug info: Unknown column 'mdl_cohort.visible' in 'field list'
SELECT name, mdl_cohort.idnumber, mdl_cohort.description, mdl_cohort.visible FROM (mdl_cohort INNER JOIN mdl_cohort_members ON mdl_cohort.id=mdl_cohort_members.cohortid) INNER JOIN mdl_user ON mdl_cohort_members.userid=mdl_user.id WHERE mdl_user.id = ? and mdl_cohort.visible = 1
[array (
0 => '2220',
)]
Error code: dmlreadexception
Stack trace:

    line 423 of /lib/dml/moodle_database.php: dml_read_exception thrown
    line 1005 of /lib/dml/mysqli_native_moodle_database.php: call to moodle_database->query_end()
    line 50 of /user/profile/field/cohort/field.class.php: call to mysqli_native_moodle_database->get_records_sql()
    line 102 of /user/profile/field/cohort/field.class.php: call to profile_field_cohort->profile_field_get_cohort()
    line 36 of /user/profile/lib.php: call to profile_field_cohort->load_data()
    line 453 of /user/profile/lib.php: call to profile_field_base->profile_field_base()
    line 345 of /user/profile.php: call to profile_display_fields()



В ответ на Evgeniy Schuetz

Re: Отображение информации о глобальных группа пользователя в его профиле

от Sergey Gorbatov -
Поставьте первую версию плагина, она как раз отличается тем, что там нет проверки на видимость. Честно говоря не знал что это поле появилось позже... Поправлю требования к версии Moodle в настройках.
В ответ на Sergey Gorbatov

Re: Отображение информации о глобальных группа пользователя в его профиле

от Vadim Tabunshchik -
Изображение пользователя Developers

Сергей, используйте в SQL-запросах алиасы (синонимы) для названий таблиц, будет читабельней код:

SELECT name, c.idnumber, c.description, c.visible '
                . 'FROM ({cohort} c INNER JOIN {cohort_members} cm'
                . 'ON c.id=cm.cohortid) '
                . 'INNER JOIN {user} u '
                . 'ON cm.userid=u.id '
                . 'WHERE u.id = ?

В ответ на Vadim Tabunshchik

Re: Отображение информации о глобальных группа пользователя в его профиле

от Sergey Gorbatov -

Вадим, спасибо! Сейчас попытаюсь интегрировать эту историю красиво в "базу", непременно воспользуюсь улыбаюсь там такой робот "четкий" улыбаюсь проверяет код, что стыдно становиться ;) за код. Редактор вчера вот искал который вместо табов пробелы ставит улыбаюсь после .NET непривычно.

В ответ на Sergey Gorbatov

Re: Отображение информации о глобальных группа пользователя в его профиле

от Marina Glancy -

Сергей, робот запускает скрипты из плагинов

https://github.com/moodlehq/moodle-local_codechecker и https://github.com/moodlehq/moodle-local_moodlecheck, Вы их можете себе сами установить и проверять. Единственное, что часто в существующем коде есть ошибки, их исправлять не надо, следите только за ошибками в строках которые Вы поменяли.

По поводу табов - любой редактор должен иметь настройку-галочку, что-нибудь вроде "автоматически заменять табы пробелами". Какой редактор Вы используете?

В ответ на Marina Glancy

Re: Отображение информации о глобальных группа пользователя в его профиле

от Sergey Gorbatov -
В ответ на Sergey Gorbatov

Re: Отображение информации о глобальных группа пользователя в его профиле

от Marina Glancy -
Откройте Tools->Options, выберите Editor, потом вкладку Formatting, и там будет галочка Expand Tabs to Spaces (можно установить для всех языков, можно только для php, по Вашему желанию)




Еще одна полезная опция On save: Remove trailing Whitespaces  From: Modified Lines Only - включите ее и у вас автоматически будут пробелы в конце строк удаляться.



В ответ на Marina Glancy

Re: Отображение информации о глобальных группа пользователя в его профиле

от Oleksandr Szpinkowski -

Будьте добры

Есть ли возможность группировать (хранить) множество когорт в разных категориях (папках) для удобства поиска, редактирования, печати? Спасибо 

В ответ на Oleksandr Szpinkowski

Re: Отображение информации о глобальных группа пользователя в его профиле

от Alexandre Scherbyna -

Когорты можно создавать или в контексте всего сайта, или в контексте имеющихся в нем категорий (подкатегорий) курсов.

Т.е., если вы говорите о категориях курсов, то ответ - да. А если о категориях (папках) для одних только когорт, то - нет.

В ответ на Alexandre Scherbyna

Re: Отображение информации о глобальных группа пользователя в его профиле

от Oleksandr Szpinkowski -

Спасибо

Но пока в курсах (через субкурс) видны только когорты уровня сайта.

Когорты уровня подкатегорий сайта не видны. Есть возможность настройки видимости когорт?

В ответ на Oleksandr Szpinkowski

Re: Отображение информации о глобальных группа пользователя в его профиле

от Alexandre Scherbyna -

В любом курсе видны все когорты уровня сайта и, разумеется, когорты только тех категорий (подкатегорий) курсов, в которых содержится этот курс. Настроек видимости нет и быть не может. Но всегда есть возможность перенести когорту туда, где (согласно приведенному выше правилу) она станет видимой.

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

В ответ на Alexandre Scherbyna

Re: Отображение информации о глобальных группа пользователя в его профиле

от Oleksandr Szpinkowski -

Через спецкурс - Специальность, год поступления связь с конкретными предметами именно через субкурс. 

Записать на предмет (синхронизацией ГГ) пока только получается ГГ уровня сайта, а не подкатегорий (например деканата)

Согласен что субкурсы возможно не при чем.  Но как сделать ГГ (не ядра системы) видимыми на дочерних категориях и курсах?

Спасибо

В ответ на Oleksandr Szpinkowski

Re: Отображение информации о глобальных группа пользователя в его профиле

от Oleksandr Szpinkowski -

Вышестоящее сообщение устарело и не удаляется

Вопрос глобальнее:

Как в схеме учебного процесса из http://2016.moodlemoot.in.ua/pluginfile.php/2574/mod_resource/content/0/1312-5022-1-PB.pdf обеспечить видимость ГГ категорий служ. курсов для всех кафедр и дисциплин вуза?

Спасибо 

В ответ на Oleksandr Szpinkowski

Re: Отображение информации о глобальных группа пользователя в его профиле

от Alexandre Scherbyna -

Если разместить ГГ служебных курсов на уровне сайта, то они точно будут видимыми.

Можно ли их разместить в категориях? На этот вопрос вы можете и должны ответить сами. На моем сайте, например, расположены категории факультетов, а в них - подкатегории кафедр. Студентам одного факультета некоторые дисциплины преподают кафедры другого факультета. Следовательно, в категориях факультетов ГГ размещать нельзя. Можно только на уровне системы.

Но если у вас есть, например, филиалы и студентам филиала читают курсы только кафедры этого филиала, то ГГ можно разместить в категории курсов этого филиала.

В ответ на Alexandre Scherbyna

Re: Отображение информации о глобальных группа пользователя в его профиле

от Oleksandr Szpinkowski -

"Студентам одного факультета некоторые дисциплины преподают кафедры другого факультета. "

Да такая ситуация по половине дисциплин 1-3 курсов

И в этом проблема, пока не решаемая

Спасибо

В ответ на Oleksandr Szpinkowski

Re: Отображение информации о глобальных группа пользователя в его профиле

от Alexandre Scherbyna -

Ну почему же не решаемая? Размещайте все глобальные группы на уровне сайта - это и есть единственно правильное решение для такой ситуации.

В ответ на Alexandre Scherbyna

Re: Отображение информации о глобальных группа пользователя в его профиле

от Oleksandr Szpinkowski -

Александр, не появилась ли в последних версиях возможность видеть глобальные группы на уровнях ниже уровня сайта?

И как ограничить видимость ГГ на уровне сайта? Каждый факультет должен видеть свои группы и не более. 

Возможно ли ограничение (расширение) прав менеджеров-сотрудников деканатов и ограничение прав преподавателей не профильных факультетов?

Спасибо

В ответ на Oleksandr Szpinkowski

Re: Отображение информации о глобальных группа пользователя в его профиле

от Alexandre Scherbyna -

Нет, это общее правило для чего угодно: переменных, глобальных групп, ролей и т.п. Объект созданный в некотором контексте виден в нем самом и во вложенных в него контекстах. Например, ГГ, созданная в категории курсов, видна только в ней самой и в ее подкатегориях.

Я ответил вам подробнее в другой ветке.

В ответ на Sergey Gorbatov

Re: Отображение информации о глобальных группа пользователя в его профиле

от Alexandre Scherbyna -

Здравствуйте, Сергей! Скажите, пожалуйста, можно ли сделать так, чтобы дополнительное поле с название глобальной группы могло экспортироваться (см. это обсуждение)?

В ответ на Sergey Gorbatov

Re: Отображение информации о глобальных группа пользователя в его профиле

от Александр Степанов -

Здравствуйте!

Есть ли рабочий модуль для 3.4? Пробовал вторую версию - выводит только название поля и больше ничего.

В ответ на Александр Степанов

Re: Отображение информации о глобальных группа пользователя в его профиле

от Vadim Tabunshchik -
Изображение пользователя Developers
Есть ли рабочий модуль для 3.4?

Нет. Голосуйте за MDL-49690 или предлагайте своё решение, дело пойдет быстрее. Патч из указанного тикета к Мудл 3.4 не подходит.

Как временное решение могу предложить свой патч, см. вложение.