Динамическое создание настроек для плагина в admin settings

Динамическое создание настроек для плагина в admin settings

от Denis Mykhalovsky -
Количество ответов: 12

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


Например в ПН 7 уроков, и создать сразу 7 полей под ПН с переносом в блок когда они заполняться


Есть такая возможность ? Никто не подскажет из опытных ? Пожалуйста

В ответ на Denis Mykhalovsky

Re: Динамическое создание настроек для плагина в admin settings

от Alexandre Scherbyna -

Мне, например, ваш вопрос непонятен. Ваш плагин как то связан с плагином Admin Settings Config ? Но что он делает тоже не понятно, и не только мне. В описании того плагина люди просят пояснить, что он делает.

Может вы без ссылки на плагин поясните не как, а что вы хотите сделать? Что это за поля и для чего они нужны?

В ответ на Alexandre Scherbyna

Re: Динамическое создание настроек для плагина в admin settings

от Denis Mykhalovsky -
Прошу прощения.

я когда пишу код для страницы настроек плагина (settings.php) пока что не понимаю как динамически добавлять поля текстовые или же другие, возможно было бы круто с использованием настроек форматирование из редактора Atto

например я сейчас знаю как добавлять поля настроек вот так

        $settings->add(new admin_setting_configtext('block_timetable_a/mn51', get_string('mn51', 'block_timetable_a'), '', 'ПН 1 урок'));
$settings->add(new admin_setting_configtext('block_timetable_a/mn52', get_string('mn52', 'block_timetable_a'), '', 'ПН 2 урок'));
$settings->add(new admin_setting_configtext('block_timetable_a/mn53', get_string('mn53', 'block_timetable_a'), '', 'ПН 3 урок'));


Мне нужно создавать поля динамически по клику для создания определенного количества полей для уроков и вывода их в блоке, этот блок называется "рассписание уроков"
там должна быть информация 
5й класс:
1й Математика
2й Физика ....и тд
уроков каждый день разное количество, а плодить на каждый день по 12 строчек под каждый урок это жестко, сам в этом убедился,пустые поля тоже занимают место в блоке

а весь блок выглядит как многоуровневневый аккордеон на css, html5 где нажимаешь на Понедельник и разворачивается перечень уроков в этот день
В ответ на Denis Mykhalovsky

Re: Динамическое создание настроек для плагина в admin settings

от Евгений Мамаев -

Это лучше делать не через settings.php, а создать свою таблицу в базе (файл db/install.xml в папке плагина) . Продумать структуру таблиц для хранения данных и реализовать логику добавления данных через php файл

В ответ на Евгений Мамаев

Re: Динамическое создание настроек для плагина в admin settings

от Denis Mykhalovsky -
тобишь все действия через бд делать ?
В ответ на Denis Mykhalovsky

Re: Динамическое создание настроек для плагина в admin settings

от Евгений Мамаев -
Да, settings.php предназначен для хранения настроек плагина, а не данных, с которыми он работает
В ответ на Евгений Мамаев

Re: Динамическое создание настроек для плагина в admin settings

от Denis Mykhalovsky -
тогда стоит крафтить отдельный php файл где будут забиваться данные и передаваться на блок плагина?
В ответ на Denis Mykhalovsky

Re: Динамическое создание настроек для плагина в admin settings

от Евгений Мамаев -

В блоке можно сделать только отображение данных, а редактирование по ссылке из блока, которая ведет на отдельную php страницу. Там нужно сделать необходимые проверки. Еще нужно сделать в отдельном файле класс формы для редактирования данных. Посмотрите код существующих плагинов и блоков

В ответ на Евгений Мамаев

Re: Динамическое создание настроек для плагина в admin settings

от Denis Mykhalovsky -
настолько солидных у меня к сожалению нету, возможно вы подскажите какой-то образец ?
В ответ на Denis Mykhalovsky

Re: Динамическое создание настроек для плагина в admin settings

от Vadim Dvorovenko -
Изображение пользователя Developers Изображение пользователя Майнтейнер перевода
структуру settings.php нельзя делать динамически, потому что всё дерево настроек кэшируется, и кэш меняется только при очистке кэшей или установке обновлений. Но можно сделать одну настройку, например, block_timetable_a/xxx, и для неё сделать свой класс admin_setting_block_timetable_xxx, в котором сделать нужный интерфейс. Единственное, значение поля должно быть упаковано в строку, например, с помощью json_encode.

Но более верный совет тут уже дали, нужно хранить всю структуру в таблицах БД. В настройках при этом можно хранить такие параметры, как максимальное число строк/колонок при редактировании или формат отображения.

Теперь о структуре БД. Мой опыт работы с расписаниями говорит о том, что их может быть много разных, поэтому недостаточно иметь одну таблицу расписаний звонков (они могут отличаться в субботу), общую таблицу преподавателей (их может быть очень много), общую таблицу предметов и т.п. В общем, наивно полагать, что будет только одно расписание, поэтому лучше, чтобы данные каждого блока были привязаны к курсу. Для главной страницы couse_id = 1. Но на одной странице может захотеться разместить несколько блоков, например с основным расписанием, и с расписанием консультаций. Поэтому таблицы звонков, списки предметов и преподавателей лучше вязать в БД к id блока. Соответственно в блоке и должны быть ссылки на страницы настроек звонков, предметов и справочников. Это не должны быть страницы settings.php, нужно делать отдельные страницы в папке блока. Записи в расписании должны вязаться к id блока (чтобы при удалении блока можно было быстро их удалить и к соответствующим преподавателям, урокам, предметам)

Теперь про интерфейс. Расписание всей школы / института достаточно большая таблица, поэтому выводить её всю в html при каждой загрузке страницы, чтобы потом убирать лишнее с помощью js, неправильно. Правильнее выводить только первый или первые два уровня, остальное подгружать с помощью ajax. Если не охота заморачиваться с таким комбо, лучше сделайте всю загрузку через ajax, пусть лучше содержимое блока чуть позже появится, чем с каждой страницей.

Ну и самое главное, вы не смотрели, в moodle совсем нет плагинов для отображения расписания? Может быть лучше взять какую-то отдельную систему, которая будет отображать расписание, и просто сделать html-блок и ссылку на неё?
В ответ на Vadim Dvorovenko

Re: Динамическое создание настроек для плагина в admin settings

от Denis Mykhalovsky -
плагины искал, но не нашел совсем от слова...нашел очень старые которые не работают с 3.7.5
В ответ на Denis Mykhalovsky

Re: Динамическое создание настроек для плагина в admin settings

от Евгений Мамаев -

Посмотрите стандартный блок recent_activity, там есть файл db/install.xml, в нем описана одна таблица. Можно аналогично сделать свои таблицы для хранения данных блока


<?xml version="1.0" encoding="UTF-8" ?>
<XMLDB PATH="blocks/recent_activity/db" VERSION="20140120" COMMENT="XMLDB file for Moodle blocks/recent_activity"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd"
>
  <TABLES>
    <TABLE NAME="block_recent_activity" COMMENT="Recent activity block">
      <FIELDS>
        <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
        <FIELD NAME="courseid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="Course id"/>
        <FIELD NAME="cmid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="Course module id"/>
        <FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false"/>
        <FIELD NAME="userid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="User performing the action"/>
        <FIELD NAME="action" TYPE="int" LENGTH="1" NOTNULL="true" SEQUENCE="false" COMMENT="0 created, 1 updated, 2 deleted"/>
        <FIELD NAME="modname" TYPE="char" LENGTH="20" NOTNULL="false" SEQUENCE="false" COMMENT="module type name (for delete action)"/>
      </FIELDS>
      <KEYS>
        <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
      </KEYS>
      <INDEXES>
        <INDEX NAME="coursetime" UNIQUE="false" FIELDS="courseid, timecreated"/>
      </INDEXES>
    </TABLE>
  </TABLES>
</XMLDB>

В ответ на Denis Mykhalovsky

Re: Динамическое создание настроек для плагина в admin settings

от Николай Козловский -
Проще написать блок чем плагин. Берете myprofile за основу и переписываете функцию get_content().
Я вышел из ситуации с расписанием другим способом, у меня блок забирает готовый html из битрикса, таким образом снимается вопрос с кешированием и ajax. Каждый видит свое расписание в зависимости от полей в профиле пользователя.