Calendar (MediaWiki)

From Wiki4Intranet
Revision as of 17:53, 5 April 2012 by VitaliyFilippov (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Расширение-календарь для MediaWiki.

Форкнут из http://www.mediawiki.org/wiki/Extension:Calendar_(Kenyu73).

Позволяет размещать на Wiki-страницах календари событий, подгружающихся с (других) Wiki-страниц. Каждый календарь имеет имя. Идентифицируется календарь именем вики-страницы (ИМЯ) и именем календаря (КАЛЕНДАРЬ), все его события размещаются как вложенные статьи в статью «ИМЯ/КАЛЕНДАРЬ/» и имеют имена вида «YYYY-MM-DD» (Год-Месяц-День) или «YYYY-MM-DD HH Nxx», где HH — час дня (используется исключительно для удобства именования), а Nxx — номер события в часу или на дне. См. ниже параметр «usesectionevents».

Также у расширения есть некоторые расширенные возможности — RSS-подписка на события, повторяющиеся события, несколько видов (день/неделя/месяц/год) и т. п. Также есть некоторые «кривые» и непроверенные (пока что) лично мною фичи — импорт из vCalendar, учёт времени. Лучше не надо его использовать, не хватало ещё из какого-то календаря багзиллу строить.

Начать использовать расширение проще всего так — нужно добавить на любую вики-страницу тег <calendar />. Это создаст на ней календарь с настройками по умолчанию.

Изменения

Проведён рефакторинг:

  • исправлен стиль кода, части кода переписаны, убраны некоторые костыли.
  • убраны нестандартные методы отладки и профилирования (debug.class.php).
  • убраны неиспользуемые куски кода.
  • убран незадействованный (временно незадействованный?) хук на добавление календаря в MediaWiki:Sidebar в расчёте на то, что при необходимости можно использовать расширения, позволяющие вешать в Sidebar любой вики-код.
  • убраны конфликты имён классов со стандартными классами.
  • код расширения более корректно растащен по файлам — загружается только тогда, когда нужен.
  • файлы переименованы в имена, более стойкие к конфликтам.
  • изменён способ именования статей событий, в сторону большей стандартизации — вместо «5.24.2009 -Event1», к тому же изменяющегося в зависимости от настроек, «2009-05-24» и «2009-05-24 N01» — стандартные «SQL-даты».

Изменения в функциональности:

  • добавлено отслеживание занятости отдельных часов на дне и добавление событий сразу на определённый час: <calendar addeventsbyhour="8..21" />.
  • переделан годовой вид календаря — там теперь AJAX-всплывающие подсказки со списками событий на каждый день, дни покрашены в зависимости от количества событий, а названия месяцов представляют собой ссылки на вид соответствующего месяца в календаре.
  • добавлены RSS-ленты событий для всех календарей.
  • поддержка вики-разметки в тексте событий — их вики-код теперь не очищается, а парсится.
  • сортировка событий по названию в расчёте на то, что в начале названия пишется время события.
  • добавлена русская локализация.
  • отключён переделан ICAL-импорт как представляющий серьёзную дыру в безопасности (читает название файла из cookie и безусловно удаляет его). Правда всё равно по-извратному, из загруженного в вики файла.

Параметры

Значения параметров, содержащие пробелы, должны окружаться кавычками (").

Значения булевых параметров (да/нет) трактуются точно так же, как PHP трактует значения переменных как true/false. То есть, «0» и "" (пустая строка) — это «нет», а всё остальное (например, «1») — «да».

Параметр Описание Пример Значение по умолчанию
name=<value> Имя календаря. Обязательный параметр. Каждый календарь идентифицируется именем страницы, на которую помещён, И значением параметра name. name="Календарь" Public
disableaddevent=1 Ссылки на добавление событий показаны не будут. disableaddevent=1 0
addeventsbyhour=<value> Вместо одной ссылки «Добавить событие» будут показаны ссылки на добавление событий в отдельные часы дня, которые, более того, ещё и красятся в зависимости от наличия события в этом часу дня. При нажатии по ссылке будет показана форма с заполненным по умолчанию временем вида «12:00-13:00» в начале названия события. Время, естественно, можно менять. При показе списка событий на день эти времена вытаскиваются из названий событий, таким образом отслеживается занятость часов и красятся ссылки на добавление. addeventsbyhour="8..21" 0
yearoffset=<value> В выпадающем списке выбора года будут показаны 2*yearoffset+1 лет для выбора — текущий год и по yearoffset в каждую сторону (+/-). yearoffset=3 2
date=<value> Будет показан отдельный день.

Возможные значения:

  • off — обычный вид (месяц, год и т. п.)
  • today — сегодня
  • tomorrow — завтра
  • yesterday — вчера
  • +XXX или -XXX — плюс или минус заданное число дней от сегодняшнего (+1 — завтра, −1 — вчера)
  • YYYY-MM-DD или MM/DD/YYYY или DD.MM.YYYY — заданная дата
date=2010-01-25 off
week=1, year=1 Эти параметры переключают календарь в заданный режим. year=1 month=1
simplemonth=1 Показать месяц в виде, аналогичном отдельному месяцу в годовом виде. simplemonth=1 0
useeventlist=<value> Показать список событий на ближайшие useeventlist дней. useeventlist=30 0
charlimit=<value> Максимальная длина названия события в символах. Если название длиннее, в календаре оно обрезается charlimit=50 20
usetemplates=1 Разрешить повторящиеся события. Чтобы создать повторяющееся событие, его надо разместить на странице с именем «Страница/Календарь/XXXX-XX-XX», где 'не обязательно все части даты заменены на цифры. Если оставить вместо года «XXXX» — событие будет повторяться каждый год, если вместо месяца — каждый месяц. Каждый день событие повторять нельзя. usetemplates=1 0
subscribe=<value> Добавить в календарь события из других календарей — список вида «Страница1/Календарь1, Страница2/Календарь2» (страницы и имена календарей через запятую). Добавление событий всё же будет происходить в текущий календарь (не в другие). subscribe="Main Page/Name, SomePage/Name" пусто
fullsubscribe=<value> Календарь будет полностью копировать другой календарь и события добавляться будут также в другой календарь. fullsubscribe="Tech Group/Team Calendar" пусто
usesectionevents=1 Если true, события будут добавляться не по одному на страницу, а по нескольку на страницы, соответствующие каждой дате. То есть все события за одну и ту же дату идут на одну и ту же страницу в виде подзаголовков 2-го уровня. На выборку событий значение опции не влияет — в любом случае выбираются и добавленные на отдельные страницы события, и добавленные секциями. usesectionevents=1 0
maxdailyevents=<value> Максимальное количество событий за день на отдельных страницах. Если нужно больше — либо поднимаем лимит, либо используем usesectionevents. maxdailyevents=10 5
disablestyles=1 Не показывать кнопку «стили событий…» disablestyles=1 0
lockdown=1 Запретить создание событий в календаре. Нифига оно не работает, потому что для запрещения нужно реально запрещать Wiki создавать страницы, а такой механизм в расширение не включен. (FIXME) lockdown=1 0
enablesummary=<value> Показывать тексты событий, ограниченные enablesummary символами, под названиями. enablesummary=100 0
useconfigpage=1 Брать параметры со страницы «Страница/Календарь/config». Туда их следует записывать по одному параметру на строку в виде «ключ=значение», без каких-либо кавычек. Опции, задаваемые в теге, всегда переопределяют опции со страницы конфигурации. Если значение опции «disablelink», кнопка «настройки» показана не будет. useconfigpage=1
useconfigpage=disablelink
0
css=<value> Подменить CSS стили календаря собственными. Файл с заданным именем должен лежать в подпапке templates расширения. css="olive.css" default.css
disabletimetrack=1 Отключить учёт времени. (FIXME) Прим.вред — учёт времени в данном расширении — это нечто адски кривое и костылистое, и лучше его вообще не использовать. disabletimetrack=1 0
disablemodes=1 Не показывать выпадающий список выбора режима показа календаря. disablemodes=1 0
monday=1 Если TRUE, неделя начинается в понедельник, если FALSE, в воскресенье. А когда ей, блин, ещё начинаться. Эфиопы — прим.вред. monday=1 0
5dayweek=1 Если TRUE, выходные не показываются. (отдыхаем!) 5dayweek=1 0
ical=<value> Включить ICAL-импорт. ical 0
disablerecurrences=1 Отключить загрузку импортированных из vcalendar RRULE со страниц 'Страница/Календарь/recurrences'. disablerecurrences=1 0
disableredirects=1 Не загружать события с перенаправленных страниц. disableredirects=1 0 (редиректы разрешены)
disablesectionevents=1 Отключить загрузку событий из отдельных секций страниц. Иными словами, трактовать каждую страницу как ОДНО событие. disablesectionevents=1 0 (загрузка включена)
style Задать CSS-стиль по умолчанию для всех событий. style="font-size:10px; color: green; font-style:italic" style=""
dayofyear=1 Показывать номер дня в году (1-365) dayofyear=1 0
weekofyear=1 Показывать номер недели в году weekofyear=1 0

Подсказки

Позиция и режим сохраняются
Когда вы двигаетесь по календарю или переключаете режимы (годовой/месячный/недельный виды), настройка сохраняется у вас в Cookies браузера и при следующем открытии календаря сохраняется и ваша позиция, и режим просмотра календаря.
RSS-ленты событий
На все события календаря можно подписаться, кликнув по ссылке «RSS-лента» внизу календаря в месячном или недельном виде, либо выбрав соответствующий пункт из выпадающего при клике по иконке в адресной строке меню.
События-перенаправления
Если создать в календаре событие как страницу-перенаправление на другую, даже «некалендарную» — она тоже будет просканирована на наличие событий. Это поведение можно отключить опцией disableredirects.
Страницы настроек
Если у вашего календаря стало много настроек, их можно утащить на страницу конфигурации Страница/Календарь/config (см. опцию useconfigpage выше).

Пример

    Public
November, 2024
       
Sunday Monday Tuesday Wednesday ThursdayFriday Saturday
         
1 08 09 10 11 12 13 14 15
16 17 18 19 20 21 22 23
    2 08 09 10 11 12 13 14 15
    16 17 18 19 20 21 22 23
      3 08 09 10 11 12 13 14 15
      16 17 18 19 20 21 22 23
        4 08 09 10 11 12 13 14 15
        16 17 18 19 20 21 22 23
          5 08 09 10 11 12 13 14 15
          16 17 18 19 20 21 22 23
            6 08 09 10 11 12 13 14 15
            16 17 18 19 20 21 22 23
              7 08 09 10 11 12 13 14 15
              16 17 18 19 20 21 22 23
                8 08 09 10 11 12 13 14 15
                16 17 18 19 20 21 22 23
                  9 08 09 10 11 12 13 14 15
                  16 17 18 19 20 21 22 23
                    10 08 09 10 11 12 13 14 15
                    16 17 18 19 20 21 22 23
                      11 08 09 10 11 12 13 14 15
                      16 17 18 19 20 21 22 23
                        12 08 09 10 11 12 13 14 15
                        16 17 18 19 20 21 22 23
                          13 08 09 10 11 12 13 14 15
                          16 17 18 19 20 21 22 23
                            14 08 09 10 11 12 13 14 15
                            16 17 18 19 20 21 22 23
                              15 08 09 10 11 12 13 14 15
                              16 17 18 19 20 21 22 23
                                16 08 09 10 11 12 13 14 15
                                16 17 18 19 20 21 22 23
                                  17 08 09 10 11 12 13 14 15
                                  16 17 18 19 20 21 22 23
                                    18 08 09 10 11 12 13 14 15
                                    16 17 18 19 20 21 22 23
                                      19 08 09 10 11 12 13 14 15
                                      16 17 18 19 20 21 22 23
                                        20 08 09 10 11 12 13 14 15
                                        16 17 18 19 20 21 22 23
                                          21 08 09 10 11 12 13 14 15
                                          16 17 18 19 20 21 22 23
                                            22 08 09 10 11 12 13 14 15
                                            16 17 18 19 20 21 22 23
                                              23 08 09 10 11 12 13 14 15
                                              16 17 18 19 20 21 22 23
                                                24 08 09 10 11 12 13 14 15
                                                16 17 18 19 20 21 22 23
                                                  25 08 09 10 11 12 13 14 15
                                                  16 17 18 19 20 21 22 23
                                                    26 08 09 10 11 12 13 14 15
                                                    16 17 18 19 20 21 22 23
                                                      27 08 09 10 11 12 13 14 15
                                                      16 17 18 19 20 21 22 23
                                                        28 08 09 10 11 12 13 14 15
                                                        16 17 18 19 20 21 22 23
                                                          29 08 09 10 11 12 13 14 15
                                                          16 17 18 19 20 21 22 23
                                                            30 08 09 10 11 12 13 14 15
                                                            16 17 18 19 20 21 22 23
                                                              v3.9.1-4intranet (2015-10-19) about... RSS feed


                                                              Дополнительно

                                                              Ниже представлены части справки оригинального расширения, функциональность в которых могла быть признана по-идиотски реализованной, устаревшей или никому не нужной. Короче говоря, это то, что там по идее осталось, но как работает — никто не проверял, потому что вещи всё-таки извращенческие (например, учёт времени). :)

                                                              Recurrence Event

                                                              Recurrence type events are traditional repeating yearly events like holidays, birthdays, etc. To create a recurrence event, choose 'add event' and add the following trigger syntax:

                                                              ##My Birthday
                                                              

                                                              This will convert the event into an vCalendar RRULE event and store it into the 'page/name/recurrence' wiki page. This is also where any ical recurrence events are stored.

                                                              Colors and Formatting

                                                              1. The calendar supports most of the basic MediaWiki text/font properties including the 'ticks' for italic and bold.
                                                                • '''<font color=red>vacation</font>'''
                                                                • Vacation time!! --> <span style="color:red;background:yellow">Vacation time!!</span>
                                                              2. Setup the event style' page by adding as many 'styles' as you wish. These styles are based on keyword matches, so be wary of what words you choose… The styles follow standard html/css style properties.
                                                                • syntax: keyword:: style1; style2; etc
                                                                  • myStyle:: color:green; text-decoration:line-through; --> Whatever
                                                                  • birthday:: color:red; font-style: bold; --> My Birthday
                                                                  • sick:: color: green;background-color: yellow --> Out Sick today
                                                                  • vacation:: color: red; font-style: italic --> Vacation to Florida!

                                                              I’m not sure how far and how many variation of the css and/or Wiki formatting will go, but I’ve tested a good portion of the standard text properties. (<div> is giving me an issue at this time though… but <span> works just fine!)

                                                              • you can default all events to your style preference by using the style="..." preference. However, individual keyword event styles override the global default.

                                                              Time Tracker

                                                              You can keep simple time tracking of events by formatting the event as below. This will track any dynamically created event in a simple table below the calendar in full mode only. The event is triggered by prefixing (2) colons followed by the event then (1) colon or (1) dash followed by a numeric value to add.

                                                              ::Vacation: 8 or ::Vacation -8
                                                              ::Team Project 1 - 3
                                                              ::Sick : 4
                                                              

                                                              Note that events created using the 'add event' link only track time for that month. If you want to track a years total, you need to enable and use month templates (usetemplates)

                                                              vCalendar (iCal) Support

                                                              The calendar supports the basic importing of vCalendar formatted files. The import utility is enabled by adding ical or ical=overwrite to your parameter string or config file settings.

                                                              The calendar accepts the following vCalendar formats

                                                              DTSTART
                                                              DTEND
                                                              SUMMARY
                                                              DESCRIPTION (not with RRULEs though)
                                                              RRULE

                                                              The RRULE evaluates basic calendar event logic only… nothing complex like «every 3rd Monday of every-other month». It does handle typical repeats like Thanksgiving, Mothers Day, etc that required logic like «the 4th Thursday of November» or «the last Monday of March» kinda logic. Basically, it should capture most repeating events like birthdays and holidays.

                                                              The RRULE (repeating) events are stored in a subpage called recurrence. Basically, in the following format page/calendarname/recurrence. You can manually edit or delete these as needed. If you use the ical=overwrite option, it deletes the data before writing in the new ical data.

                                                              Imported single day events, without the RRULE, are created in the calendar as normal pages in the -Event 0 page for the respective day.

                                                              Установка

                                                              Для установки расширения в свою MediaWiki нужно скопировать файлы расширения в папку extensions/Calendar и добавить в LocalSettings.php следующую строку:

                                                              require_once("$IP/extensions/Calendar/Calendar.php");

                                                              И далее, по желанию — задать опции.

                                                              Опции для LocalSettings.php

                                                              Опция Описание
                                                              $wgRestrictCalendarTo = 'sysop'; Запретить создавать события в календаря всем пользователям, кроме входящих в группу… Ни фига не работает, так как расширение не включает механизма разграничения доступа к вики-страницам.
                                                              $wgCalendarURLPath="/w/extensions/Calendar"; Переопределяет путь к папке расширения, если она отличается от extensions/Calendar.
                                                              $wgCalendarDisableRedirects=true Отключить перенаправленные события (disableredirects) везде и глобально.
                                                              $wgCalendarForceNamespace='Calendar' Разрешить использовать календарь только в одном пространстве имён (предположительно специальном). Для включения этой опции, естественно, также нужно, чтобы это пространство имён и его дуальное «обсуждение» существовали. В простейшем случае, когда на вашей Wiki нет нестандартных пространств имён, это делается так:
                                                              $wgExtraNamespaces[100] = "Calendars";
                                                              $wgExtraNamespaces[101] = "Calendars_talk";
                                                              $wgNamespacesWithSubpages[100] = true;
                                                              $wgNamespacesWithSubpages[101] = true;
                                                              

                                                              Категория:Разработка Категория:MediaWiki


                                                              Статья реплицируется в Wiki4IntraNet.