ЧТМ:Расширения/BatchTools: различия между версиями

м Diman Russkov переименовал страницу ЧТМ:Отладка/Документация/BatchTools в ЧТМ:BatchTools/1.45/0.9
 
(не показано 18 промежуточных версий 2 участников)
Строка 1: Строка 1:
<pre>{{Extension
{{Extension
|Имя = BatchTools
|Фон = non_vocal_instrumentalist
|name = BatchTools
|name = BatchTools
|status = beta
|status = beta
|type = specialpage
|type = specialpage
|author = Name
|author = Diman Russkov
|description = Предоставляет мощный графический интерфейс для массовых операций со страницами, файлами и участниками.
|description = Предоставляет графический интерфейс для массовых операций со страницами, файлами и участниками.
|version = 0.9
|version = '''[[/1.45/0.9|0.9]]''' (текущая)
|requires = MediaWiki 1.45.0+
|requires = MediaWiki 1.45.0+
}}</pre>
|db_changes = Нет
}}


Расширение '''BatchTools''' (Массовые инструменты) добавляет в MediaWiki служебную страницу <code>Special:BatchTools</code>, которая позволяет администраторам выполнять рутинные массовые операции через удобный графический интерфейс.  
Расширение '''BatchTools''' (Массовые инструменты) добавляет в MediaWiki служебную страницу <code>[[Special:BatchTools]]</code>, которая позволяет администраторам выполнять рутинные массовые операции через удобный графический интерфейс.  


В отличие от многих скриптов или ботов, расширение предоставляет концепцию «Рабочей области» (Workspace) — промежуточной таблицы-буфера. Вы можете массово добавить список страниц или участников, применить к ним общие быстрые настройки (например, задать один срок блокировки для всех), затем точечно скорректировать параметры для отдельных строк и только после этого запустить процесс выполнения.
В отличие от многих скриптов или ботов, расширение предоставляет концепцию «Рабочей области» (Workspace) — промежуточной таблицы-буфера. Вы можете массово добавить список страниц или участников, применить к ним общие быстрые настройки (например, задать один срок блокировки для всех), затем точечно скорректировать параметры для отдельных строк и только после этого запустить процесс выполнения.
Строка 21: Строка 24:
# Скачайте файлы расширения и поместите их в директорию <code>extensions/BatchTools</code> вашего сервера.
# Скачайте файлы расширения и поместите их в директорию <code>extensions/BatchTools</code> вашего сервера.
# Добавьте следующую строку в конец файла <code>LocalSettings.php</code>:
# Добавьте следующую строку в конец файла <code>LocalSettings.php</code>:
# <syntaxhighlight lang="php">wfLoadExtension( 'BatchTools' );</syntaxhighlight>
# <syntaxhighlight lang="php" line>wfLoadExtension( 'BatchTools' );</syntaxhighlight>
# Перейдите на страницу <code>Special:Version</code> вашей вики, чтобы убедиться, что расширение успешно установлено.
# Перейдите на страницу <code>Special:Version</code> вашей вики, чтобы убедиться, что расширение успешно установлено.


Строка 75: Строка 78:
Чтобы выдать права на '''все''' массовые инструменты стандартной группе администраторов (<code>sysop</code>), добавьте следующий код в <code>LocalSettings.php</code>:
Чтобы выдать права на '''все''' массовые инструменты стандартной группе администраторов (<code>sysop</code>), добавьте следующий код в <code>LocalSettings.php</code>:


<syntaxhighlight lang="php">
<syntaxhighlight lang="php" line>
$wgGroupPermissions['sysop']['deletebatch'] = true;
$wgGroupPermissions['sysop']['deletebatch'] = true;
$wgGroupPermissions['sysop']['undeletebatch'] = true;
$wgGroupPermissions['sysop']['undeletebatch'] = true;
Строка 104: Строка 107:
Содержимое рабочей области сохраняется в сессии вашего браузера. Если вы случайно закроете вкладку, обновите страницу или перейдёте в другой инструмент, ваша таблица и введённые в неё данные не пропадут. Для очистки буфера предусмотрена кнопка «Очистить таблицу».
Содержимое рабочей области сохраняется в сессии вашего браузера. Если вы случайно закроете вкладку, обновите страницу или перейдёте в другой инструмент, ваша таблица и введённые в неё данные не пропадут. Для очистки буфера предусмотрена кнопка «Очистить таблицу».


== Руководство по инструментам: Работа со страницами ==
== Руководство по инструментам ==


=== Удаление (Delete) ===
=== Работа со страницами ===
 
==== Удаление (Delete) ====
Инструмент для массового удаления страниц.
Инструмент для массового удаления страниц.
* '''Формат ввода:''' Список названий страниц (по одной на строке).
* '''Формат ввода:''' Список названий страниц (по одной на строке).
* '''Особенности:''' При добавлении расширение проверит, существуют ли эти страницы. Если страница уже удалена или имеет некорректное имя, она будет отмечена красным предупреждением и заблокирована для выбора. Операция заносится в журнал удалений с указанной вами причиной.
* '''Особенности:''' При добавлении расширение проверит, существуют ли эти страницы. Если страница уже удалена или имеет некорректное имя, она будет отмечена красным предупреждением и заблокирована для выбора. Операция заносится в журнал удалений с указанной вами причиной.


=== Восстановление (Restore) ===
==== Восстановление (Restore) ====
Инструмент для массового восстановления удалённых страниц.
Инструмент для массового восстановления удалённых страниц.
* '''Формат ввода:''' Список удалённых страниц (по одной на строке).
* '''Формат ввода:''' Список удалённых страниц (по одной на строке).
* '''Особенности:''' Расширение проверяет техническую корректность названия страницы. При выполнении восстанавливаются '''все''' удалённые правки и версии файлов, привязанные к данному названию. Если страница не была удалена (или у неё нет удалённых ревизий), система сообщит об этом в отчёте после выполнения.
* '''Особенности:''' Расширение проверяет техническую корректность названия страницы. При выполнении восстанавливаются '''все''' удалённые правки и версии файлов, привязанные к данному названию. Если страница не была удалена (или у неё нет удалённых ревизий), система сообщит об этом в отчёте после выполнения.


=== Защита (Protect) ===
==== Защита (Protect) ====
Инструмент для массового изменения уровня защиты страниц.
Инструмент для массового изменения уровня защиты страниц.
* '''Формат ввода:''' Список названий страниц (по одной на строке).
* '''Формат ввода:''' Список названий страниц (по одной на строке).
Строка 124: Строка 129:
** В таблице-буфере можно задать уникальный уровень или срок защиты для каждой отдельной страницы перед выполнением.
** В таблице-буфере можно задать уникальный уровень или срок защиты для каждой отдельной страницы перед выполнением.


=== Переименование (Move) ===
==== Переименование (Move) ====
Инструмент для массового переименования страниц.
Инструмент для массового переименования страниц.
* '''Формат ввода:''' Записи в формате <code>Старое название|Новое название</code> (по одной на строке). Если указать просто старое название (без <code>|</code>), в качестве нового будет подставлено оно же (это полезно, чтобы затем вручную прописать новые имена прямо в таблице).
* '''Формат ввода:''' Записи в формате <code>Старое название|Новое название</code> (по одной на строке). Если указать просто старое название (без <code>|</code>), в качестве нового будет подставлено оно же (это полезно, чтобы затем вручную прописать новые имена прямо в таблице).
Строка 134: Строка 139:
** Защита от дурака: система выдаст ошибку, если старое и новое имя совпадают, если новое имя некорректно, или если целевая страница уже существует (API MediaWiki безопасно отклонит такое действие).
** Защита от дурака: система выдаст ошибку, если старое и новое имя совпадают, если новое имя некорректно, или если целевая страница уже существует (API MediaWiki безопасно отклонит такое действие).


== Руководство по инструментам: Работа с участниками ==
=== Работа с участниками ===


=== Блокировка (Block) ===
==== Блокировка (Block) ====
Один из самых продвинутых инструментов расширения, позволяющий настраивать гибкие ограничения сразу для списка пользователей или IP-адресов.
Один из самых продвинутых инструментов расширения, позволяющий настраивать гибкие ограничения сразу для списка пользователей или IP-адресов.
* '''Формат ввода:''' Список имён участников или IP-адресов (по одному на строке).
* '''Формат ввода:''' Список имён участников или IP-адресов (по одному на строке).
Строка 146: Строка 151:
** Инструмент автоматически проверяет, существует ли пользователь (если это не IP). Несуществующие пользователи помечаются ошибкой и не блокируются.
** Инструмент автоматически проверяет, существует ли пользователь (если это не IP). Несуществующие пользователи помечаются ошибкой и не блокируются.


=== Разблокировка (Unblock) ===
==== Разблокировка (Unblock) ====
Простой инструмент для массового снятия блокировок.
Простой инструмент для массового снятия блокировок.
* '''Формат ввода:''' Имя участника или IP-адрес (по одному на строке).
* '''Формат ввода:''' Имя участника или IP-адрес (по одному на строке).
* '''Особенности:''' Снимает активную блокировку с указанием причины в журнале. Если участник не был заблокирован, операция будет безопасно пропущена.
* '''Особенности:''' Снимает активную блокировку с указанием причины в журнале. Если участник не был заблокирован, операция будет безопасно пропущена.


=== Создание аккаунтов (Create Accounts) ===
==== Создание аккаунтов (Create Accounts) ====
Инструмент для массовой регистрации новых участников администратором (записи в журнале помечаются как созданные другим пользователем).
Инструмент для массовой регистрации новых участников администратором (записи в журнале помечаются как созданные другим пользователем).
* '''Формат ввода:''' Записи в формате <code>Имя|Пароль|Email</code> (по одной на строке). Поля разделяются вертикальной чертой. Email указывать не обязательно.
* '''Формат ввода:''' Записи в формате <code>Имя|Пароль|Email</code> (по одной на строке). Поля разделяются вертикальной чертой. Email указывать не обязательно.
Строка 159: Строка 164:
** Создание происходит с использованием безопасного API <code>AuthManager</code>.
** Создание происходит с использованием безопасного API <code>AuthManager</code>.


== Руководство по инструментам: Создание контента ==
=== Создание контента ===


=== Создание страниц (Create Pages) ===
==== Создание страниц (Create Pages) ====
Инструмент для массовой генерации однотипных страниц на основе шаблона и переменных (полезно для создания сотен карточек товаров, городов, заготовок статей).
Инструмент для массовой генерации однотипных страниц на основе шаблона и переменных (полезно для создания сотен карточек товаров, городов, заготовок статей).
* '''Формат ввода:''' Записи в формате <code>Название страницы|Переменная 1|Переменная 2|Переменная 3</code>.
* '''Формат ввода:''' Записи в формате <code>Название страницы|Переменная 1|Переменная 2|Переменная 3</code>.
Строка 169: Строка 174:
** '''Защита от перезаписи:''' По умолчанию инструмент игнорирует (выдаёт ошибку) страницы, которые уже существуют. Но если поставить галочку «Перезаписывать существующие», инструмент обновит текст существующих страниц (работает как обычная правка).
** '''Защита от перезаписи:''' По умолчанию инструмент игнорирует (выдаёт ошибку) страницы, которые уже существуют. Но если поставить галочку «Перезаписывать существующие», инструмент обновит текст существующих страниц (работает как обычная правка).


=== Загрузка файлов (Upload) ===
==== Загрузка файлов (Upload) ====
Единственный инструмент, который работает не через текстовое поле, а напрямую с файловой системой вашего компьютера.
Единственный инструмент, который работает не через текстовое поле, а напрямую с файловой системой вашего компьютера.
* '''Формат выбора:''' Нажмите кнопку «Выбрать файлы» и выделите нужное количество изображений или документов в диалоговом окне операционной системы (можно выбирать сразу несколько файлов).
* '''Формат выбора:''' Нажмите кнопку «Выбрать файлы» и выделите нужное количество изображений или документов в диалоговом окне операционной системы (можно выбирать сразу несколько файлов).
Строка 178: Строка 183:
** В рабочей таблице инструмент показывает размер файлов.
** В рабочей таблице инструмент показывает размер файлов.
** Вы можете изменить '''Конечное имя файла''' прямо в таблице. Например, если вы выбрали файл <code>IMG_2023.jpg</code>, вы можете переименовать его в <code>Логотип_компании.jpg</code> перед загрузкой на сервер. Инструмент автоматически очистит префиксы вроде <code>Файл:</code>, если вы случайно их скопируете.
** Вы можете изменить '''Конечное имя файла''' прямо в таблице. Например, если вы выбрали файл <code>IMG_2023.jpg</code>, вы можете переименовать его в <code>Логотип_компании.jpg</code> перед загрузкой на сервер. Инструмент автоматически очистит префиксы вроде <code>Файл:</code>, если вы случайно их скопируете.
== Changelog ==
{{Начало скрытого блока|Changelog}}
<syntaxhighlight lang="markdown" line># История изменений (BatchTools)
Все заметные изменения в этом проекте будут документироваться в данном файле.
Формат основан на стандартах Keep a Changelog.
## [0.9.0] — 2026-06-03
### Добавлено
- **Новый инструмент «Массовая загрузка файлов»**: Позволяет одновременно выбирать и загружать несколько файлов на вики.
- **Интерактивный интерфейс выбора файлов**: Разработан полностью реактивный клиентский JavaScript-интерфейс. С помощью `DataTransfer` API файлы добавляются в таблицу «на лету» с мгновенным предпросмотром размера и имени, без необходимости промежуточного сохранения тяжёлых файлов в PHP-сессии.
- **Индивидуальная и массовая настройка файлов**: Инструмент поддерживает быстрое переименование файлов перед загрузкой, задание индивидуального текста/описания, а также быструю синхронизацию общего описания для всех файлов разом.
- Опция игнорирования предупреждений (например, для перезаписи существующих дубликатов).
- Новое системное право доступа `uploadbatch` и соответствующая вкладка в навигации.
- Системное сообщение `action-batchtools` для корректного отображения названия группы прав в стандартных ошибках движка.
### Изменено
- **Улучшена обработка глобальной ошибки доступа**: В классе `SpecialBatchTools` исправлен выброс исключения `PermissionsError`. Теперь при отсутствии всех возможных прав выводится корректное, переведённое кастомное сообщение `batchtools-error-nopermissions` вместо системной ошибки, ссылающейся на право `deletebatch`.
- **Локализация (ru)**: Алиас служебной страницы на русском языке изменён с `Пакетные_инструменты` на `Массовые_инструменты` для соответствия остальному переводу интерфейса.
## [0.8.0] — 2026-05-25
### Добавлено
- **Новый инструмент «Массовое создание страниц по шаблону»**: Генерация и публикация списков статей на базе общего текста-шаблона.
- **Параметрический генератор**: Поддерживается до 3 переменных (`$1`, `$2`, `$3`) при импорте строк в формате `Название|Переменная1|Переменная2|Переменная3`.
- **Живой предпросмотр контента**: Интегрирован клиентский JavaScript-сценарий, который на лету выполняет подстановку переменных в общий текст шаблона и отображает итоговый результат в детальной раскрывающейся строке таблицы.
- **Опция «Перезаписывать существующие»**: Позволяет использовать инструмент как для создания новых страниц (`EDIT_NEW`), так и для массовой правки существующих (`EDIT_UPDATE`).
- Автоматическая установка флага бота (`EDIT_FORCE_BOT`), если у текущего администратора есть право `bot`.
- Новое право доступа `createpagebatch`.
### Изменено
- **Повышена стабильность обработчика ошибок**: В методе `BatchToolHandler::formatStatusError()` доработана валидация типов (`Status` и `StatusValue`) для предотвращения PHP Fatal Error в случае несовместимости с изменениями в будущих релизах MediaWiki.
---
## [0.7.0] — 2026-05-25
### Добавлено
- **Новый инструмент «Массовое создание аккаунтов»**: Позволяет быстро регистрировать группы участников списком.
- **Импорт пользователей**: Поддерживается формат импорта `Имя|Пароль|Email` (электронная почта не является обязательной).
- **Нативное журналирование**: Успешно созданные учётные записи регистрируются в официальном логе регистрации участников MediaWiki (`newusers/create2` — «учётная запись создана администратором»).
- **Интерактивная валидация паролей**: На страницу добавлен JavaScript-сценарий, который на лету проверяет заполненность паролей у выбранных пользователей. Строки с пустыми паролями подсвечиваются красным, а кнопка отправки формы блокируется до ввода корректных данных.
- Панель быстрых настроек для мгновенного назначения единого пароля всем пользователям в таблице-буфере.
- Новое право доступа `createaccountbatch`.
### Изменено
- **Визуальная оптимизация навигации**: Названия всех вкладок служебной страницы в файлах локализации сокращены для экономии места (например, «Массовое удаление» -> «Удаление», «Массовая защита» -> «Защита»). Это делает верхнее меню более компактным и улучшает его отображение на мобильных устройствах и планшетах.
---
## [0.6.0] — 2026-05-25
### Добавлено
- **Новый инструмент «Массовая блокировка»**: Позволяет одновременно блокировать группы участников или IP-адресов.
- **Интерактивные параметры блокировки**: Каждая строка таблицы снабжена раскрывающейся панелью детальных настроек. Поддерживаются:
  * Глобальная (Sitewide) или частичная (Partial) блокировка (с ограничением редактирования конкретных страниц или ID пространств имён).
  * Тонкая настройка запретов: создание учётных записей, отправка писем, редактирование собственной страницы обсуждения, автоблокировка IP и скрытие имени пользователя.
  * Ограничения на специфические действия: загрузка файлов, переименование страниц, создание страниц и отправка благодарностей.
- **Новый инструмент «Массовая разблокировка»**: Быстрое снятие ограничений со списков участников или IP-адресов.
- Новые права доступа `blockbatch` и `unblockbatch`.
### Изменено
- **Полная унификация интерфейса (UX)**: Инструменты «Массовое удаление» и «Массовое восстановление» полностью переведены на использование интерактивного рабочего стола (`BatchWorkspaceBase`).
- Все 5 вкладок расширения теперь работают по общему стандарту: предварительный импорт списков в таблицу-буфер, валидация существования объектов в реальном времени, возможность выборочной обработки чекбоксами и очистки рабочей области.
- Унифицированы и упорядочены системные сообщения и переводы в файлах `en.json` и `ru.json`.
---
## [0.5.0] — 2026-05-24
### Добавлено
- **Новый инструмент «Массовое переименование страниц»**: Позволяет быстро переносить группы страниц на новые названия.
- **Импорт парных списков**: Поддерживается формат `Старое название|Новое название` при добавлении страниц в интерактивную таблицу.
- **Индивидуальные настройки переноса**: Для каждой страницы в таблице можно отредактировать новое имя вручную, а также настроить флаги «Оставить перенаправление» и «Переименовать подстраницы».
- Новое право доступа `movebatch`.
### Изменено
- **Улучшено отображение ошибок (UI/UX)**: В базовый класс `BatchToolHandler` добавлен метод `formatStatusError()`. Он автоматически очищает сообщения об ошибках, возвращаемые ядром MediaWiki, от HTML-тегов, медиа-файлов, вики-разметки и лишних переносов строк перед выводом пользователю [6].
- Все существующие обработчики (`MassDeleteHandler`, `MassUndeleteHandler`, `MassProtectHandler`) переведены на использование нового метода форматирования ошибок для обеспечения единого чистого стиля интерфейса [6].
---
## [0.4.0] — 2026-05-24
### Добавлено
- **Новый инструмент «Массовая защита страниц»**: Позволяет одновременно ограничивать права на редактирование и перемещение для группы страниц.
- **Интерактивный рабочий стол (Workspace)**: Добавлен промежуточный буфер (таблица) на основе сессий, где можно гибко настраивать параметры для каждой страницы индивидуально перед отправкой запроса.
- **Интеграция с базой данных**: При добавлении страниц в таблицу автоматически считываются их текущие ограничения и сроки защиты с помощью `RestrictionStore`.
- **Быстрые настройки**: Добавлена панель для массовой синхронизации параметров (уровней защиты, сроков действия и флага каскадной защиты) для выбранных строк с помощью встроенного JavaScript-сценария.
- Поддержка **каскадной защиты** (автоматической защиты всех шаблонов и файлов, включённых в страницу).
- Новый базовый класс `BatchWorkspaceBase` для упрощения создания других инструментов, работающих через сессионный буфер таблиц.
- Новое системное право доступа `protectbatch`.
### Изменено
- Оптимизирован метод `SpecialBatchTools::printSessionResult()`: формирование ключей успешного выполнения и ошибок переведено на динамический шаблон `batchtools-mass{$action}-...`. Это избавляет от необходимости писать новые конструкции ветвления при добавлении будущих инструментов.
---
## [0.3.0] — 2026-05-24
### Изменено
- **Архитектурный рефакторинг**: Основной класс служебной страницы `SpecialBatchTools` разделён на изолированные компоненты. Логика работы с кодом перенесена во вложенное пространство имён `Handlers`.
- Создан абстрактный класс `BatchToolHandler`, определяющий структуру для всех будущих пакетных инструментов и предоставляющий удобные методы-хелперы для работы с контекстом MediaWiki.
- Логика массового удаления вынесена в самостоятельный класс `MassDeleteHandler`.
- Логика массового восстановления вынесена в самостоятельный класс `MassUndeleteHandler`.
- Код `SpecialBatchTools` существенно сокращён и переведён на декларативный роутинг вкладок. Это упростит добавление новых пакетных инструментов в будущем.
---
## [0.2.0] — 2026-05-24
### Добавлено
- Новые локализованные сообщения об ошибках при недостатке прав доступа на чтение, удаление или восстановление конкретной страницы.
### Безопасность и исправления
- **Ужесточение проверок прав**: Внедрена проверка прав на уровне отдельных страниц перед выполнением действий.
- Заблокирована возможность несанкционированного удаления/восстановления страниц, скрытых от пользователя настройками прав или сторонними расширениями ограничений доступа (благодаря обязательной проверке права `read` через `$authority->definitelyCan`).
- Добавлена проверка на возможность удаления защищённых страниц — если у пользователя нет явного права на удаление конкретной статьи, она будет пропущена с выводом ошибки, не прерывая обработку остального списка.
---
## [0.1.0] — 2026-05-24
### Добавлено
- Создана служебная страница `Special:BatchTools` (с поддержкой ЧПУ-алиаса «Пакетные инструменты» на русском языке).
- Реализована вкладка «Массовое удаление» для быстрой очистки ненужных страниц списком.
- Реализована вкладка «Массовое восстановление» для группового возврата ранее удалённых страниц.
- Добавлены новые права доступа: `deletebatch` (для удаления) и `undeletebatch` (для восстановления).
- Интегрирована локализация интерфейса на английском (`en`) и русском (`ru`) языках.
### Безопасность и ограничения
- Добавлена проверка прав пользователя (Authority) перед выполнением любых операций.
- Реализована защита от межсайтовой подделки запросов (CSRF) с помощью механизма Edit Token ядра MediaWiki.
- Введено ограничение на размер пакета: за одну операцию допускается обрабатывать не более 500 страниц.
- Реализовано экранирование имён страниц при выводе ошибок для предотвращения уязвимостей типа XSS.</syntaxhighlight>
{{Конец скрытого блока}}
{{BatchTools}}
[[Категория:ЧТМ:Расширения]]