Атестаційні завдання K2 ERP/CMS: відмінності між версіями
R (обговорення | внесок) Перенос з Гугл док. |
R (обговорення | внесок) Немає опису редагування |
||
| Рядок 1: | Рядок 1: | ||
{{DISPLAYTITLE:Атестаційні завдання K2 ERP/CMS}} | |||
== Назва == | '''Атестаційне завдання K2 ERP — CMS''' — це практична задача для перевірки навичок розробника або впроваджувача [[K2 ERP]] у створенні модуля управління контентом сайту або корпоративного порталу. | ||
'''Модуль CMS: | |||
Модуль має забезпечувати роботу зі сторінками, новинами, статтями, оголошеннями, медіафайлами, багатомовністю, SEO-полями, публікацією, історією змін і правами доступу. | |||
<div style="border:3px solid #1565c0; background:#e3f2fd; padding:14px; margin:16px 0;"> | |||
'''Коротко.''' Потрібно реалізувати CMS-модуль, який дозволяє менеджерам самостійно створювати й редагувати матеріали сайту, працювати з медіафайлами, публікувати контент різними мовами, керувати статусами та бачити історію змін. | |||
</div> | |||
__TOC__ | |||
== Назва завдання == | |||
'''Модуль CMS: управління контентом сайту і корпоративного порталу'''. | |||
== Мета завдання == | |||
Мета завдання — створити в K2 ERP CMS-модуль, який дозволяє керувати контентом сайту або внутрішнього корпоративного порталу без постійного залучення розробників. | |||
Система повинна дозволяти: | |||
* створювати сторінки; | |||
* створювати новини, статті та оголошення; | |||
* редагувати матеріали через WYSIWYG-редактор; | |||
* працювати з категоріями контенту; | |||
* публікувати матеріали різними мовами; | |||
* завантажувати зображення, PDF-файли та інші документи; | |||
* підключати медіафайли до матеріалів; | |||
* керувати статусами публікації; | |||
* формувати зрозумілі URL; | |||
* заповнювати SEO-поля; | |||
* зберігати історію змін; | |||
* відновлювати попередні версії матеріалів; | |||
* керувати модульними блоками контенту. | |||
<div style="border:3px solid #2e7d32; background:#e8f5e9; padding:14px; margin:16px 0;"> | |||
'''Головний принцип.''' CMS у K2 ERP — це не просто форма для введення тексту. Це система керування життєвим циклом контенту: створення → редагування → медіа → переклади → публікація → історія змін → аналітика та підтримка. | |||
</div> | |||
== Реальний бізнес-контекст == | == Реальний бізнес-контекст == | ||
Компанія має публічний сайт або внутрішній корпоративний портал. | |||
Маркетологи, редактори, HR-спеціалісти, менеджери або адміністратори повинні мати можливість самостійно додавати й оновлювати контент: сторінки, новини, статті, оголошення, документи, банери, акційні блоки або внутрішні повідомлення. | |||
Без CMS кожна зміна на сайті перетворюється на задачу для розробника. Це сповільнює роботу, створює чергу дрібних правок і заважає бізнесу швидко публікувати інформацію. | |||
CMS-модуль має зняти цю залежність і дати користувачам контроль над контентом у межах зрозумілих прав доступу. | |||
== Основний бізнес-процес == | |||
Типовий процес роботи CMS-модуля виглядає так: | |||
# редактор створює новий матеріал; | |||
# обирає категорію та мову; | |||
# вводить заголовок, короткий опис і основний текст; | |||
# додає зображення-прев’ю або інші медіафайли; | |||
# заповнює SEO-поля; | |||
# зберігає матеріал як чернетку; | |||
# за потреби створює версію іншою мовою; | |||
# переглядає попередній вигляд матеріалу; | |||
# змінює статус на '''«Опубліковано»'''; | |||
# матеріал автоматично з’являється на сайті за налаштованим URL; | |||
# система зберігає історію змін і автора останнього редагування. | |||
== Основні об’єкти модуля == | |||
{| class="wikitable" style="width:100%;" | |||
! Об’єкт | |||
! Призначення | |||
|- | |||
| Категорії контенту | |||
| Класифікація матеріалів: новини, статті, сторінки, оголошення | |||
|- | |||
| Мови | |||
| Перелік мов, якими публікується контент | |||
|- | |||
| Матеріали | |||
| Основні одиниці контенту: сторінки, новини, статті, оголошення | |||
|- | |||
| Переклади матеріалів | |||
| Версії одного матеріалу різними мовами | |||
|- | |||
| Медіафайли | |||
| Зображення, PDF, документи та інші файли | |||
|- | |||
| Каталоги медіабібліотеки | |||
| Структура зберігання файлів | |||
|- | |||
| Теги | |||
| Додаткова класифікація матеріалів | |||
|- | |||
| SEO-налаштування | |||
| Title, description, keywords, URL-slug | |||
|- | |||
| Історія змін | |||
| Версії матеріалу та дані про редагування | |||
|- | |||
| Статуси публікації | |||
| Чернетка, опубліковано, приховано | |||
|- | |||
| Модульні блоки | |||
| Банери, слайдери, акційні блоки, інформаційні вставки | |||
|} | |||
== Довідник «Категорії контенту» == | |||
Довідник категорій контенту потрібен для структурування матеріалів сайту або порталу. | |||
Категорії можуть мати ієрархію. Наприклад, категорія '''«Новини»''' може містити підкатегорії '''«Компанія»''', '''«Продукти»''', '''«Події»'''. | |||
Мінімальний склад даних: | |||
{| class="wikitable" style="width:100%;" | |||
! Поле | |||
! Опис | |||
|- | |||
| Назва категорії | |||
| Назва, яку бачить користувач | |||
|- | |||
| Тип категорії | |||
| Новина, стаття, сторінка, оголошення | |||
|- | |||
| Батьківська категорія | |||
| Для побудови ієрархії | |||
|- | |||
| URL-код | |||
| Частина адреси категорії | |||
|- | |||
| Статус | |||
| Активна або прихована | |||
|} | |||
== Типи категорій == | |||
{| class="wikitable" style="width:100%;" | |||
! Тип | |||
! Призначення | |||
|- | |||
| Новина | |||
| Публікації про події, оновлення, зміни, анонси | |||
|- | |||
| Стаття | |||
| Аналітичні або інформаційні матеріали | |||
|- | |||
| Сторінка | |||
| Статичні сторінки сайту: про компанію, контакти, послуги | |||
|- | |||
| Оголошення | |||
| Короткі повідомлення або внутрішні публікації | |||
|} | |||
== | == Довідник «Мови» == | ||
Довідник мов містить перелік мов, якими публікується контент. | |||
Мінімальний склад даних: | |||
{| class="wikitable" style="width:100%;" | |||
! Поле | |||
! Опис | |||
|- | |||
| Назва мови | |||
| Наприклад: українська, англійська, польська | |||
|- | |||
| Код мови | |||
| Наприклад: <code>uk</code>, <code>en</code>, <code>pl</code> | |||
|- | |||
| Активність | |||
| Чи доступна мова для публікації | |||
|- | |||
| Мова за замовчуванням | |||
| Ознака основної мови сайту | |||
|} | |||
Код мови використовується у формуванні URL матеріалу. | |||
== Журнал «Матеріали» == | |||
Журнал матеріалів повинен відображати всі одиниці контенту сайту або корпоративного порталу. | Журнал матеріалів повинен відображати всі одиниці контенту сайту або корпоративного порталу. | ||
У журналі редактор має швидко бачити, які матеріали є чернетками, які опубліковані, які приховані, хто автор, якою мовою матеріал створено і до якої категорії він належить. | |||
У журналі | |||
== Колонки журналу матеріалів == | |||
{| class="wikitable" style="width:100%;" | |||
! Колонка | |||
! Опис | |||
|- | |||
| Заголовок | |||
| Назва матеріалу | |||
|- | |||
| Категорія | |||
| Розділ, до якого належить матеріал | |||
|- | |||
| Автор | |||
| Користувач, який створив матеріал | |||
|- | |||
| Дата створення | |||
| Коли матеріал створено | |||
|- | |||
| Дата останньої зміни | |||
| Коли матеріал редагували востаннє | |||
|- | |||
| Статус публікації | |||
| Чернетка, опубліковано, приховано | |||
|- | |||
| Мова | |||
| Мова матеріалу | |||
|- | |||
| URL | |||
| Адреса опублікованого матеріалу | |||
|} | |||
== Функціональність журналу матеріалів == | |||
Журнал має підтримувати: | Журнал має підтримувати: | ||
| Рядок 58: | Рядок 222: | ||
* пошук по категорії; | * пошук по категорії; | ||
* фільтрацію за статусом; | * фільтрацію за статусом; | ||
* фільтрацію за мовою. | * фільтрацію за мовою; | ||
* фільтрацію за датою створення; | |||
* швидку зміну статусу; | |||
* відкриття матеріалу на редагування; | |||
* попередній перегляд; | |||
* перехід до опублікованої сторінки; | |||
* копіювання матеріалу; | |||
* створення перекладу. | |||
== Статуси публікації == | |||
{| class="wikitable" style="width:100%;" | |||
! Статус | |||
! Значення | |||
|- | |||
| Чернетка | |||
| Матеріал збережено, але він не доступний на сайті | |||
|- | |||
| Опубліковано | |||
| Матеріал доступний на сайті | |||
|- | |||
| Приховано | |||
| Матеріал знято з публікації, але він збережений у системі | |||
|} | |||
= | <div style="border:3px solid #b71c1c; background:#ffebee; padding:14px; margin:16px 0;"> | ||
'''Критично.''' Чернетка не повинна відображатися на публічному сайті. Опублікований матеріал має бути доступний за сформованим URL. | |||
</div> | |||
== | == Форма створення та редагування матеріалу == | ||
Форма створення | |||
Форма матеріалу повинна дозволяти створювати й редагувати контент без залучення розробника. | |||
==== | == Основна інформація == | ||
У формі потрібно передбачити: | |||
* URL- | |||
{| class="wikitable" style="width:100%;" | |||
! Поле | |||
! Опис | |||
|- | |||
| Заголовок | |||
| Основна назва матеріалу | |||
|- | |||
| Короткий опис або анонс | |||
| Текст для списків, прев’ю або SEO-опису | |||
|- | |||
| Повний текст | |||
| Основний вміст матеріалу через WYSIWYG-редактор | |||
|- | |||
| Категорія | |||
| Вибір із довідника через AJAX | |||
|- | |||
| Мова | |||
| Мова поточної версії матеріалу | |||
|- | |||
| Зображення-прев’ю | |||
| Завантаження або вибір із медіабібліотеки | |||
|- | |||
| Статус | |||
| Чернетка, опубліковано, приховано | |||
|- | |||
| Автор | |||
| Користувач, який створив матеріал | |||
|} | |||
== WYSIWYG-редактор == | |||
Для редагування повного тексту матеріалу потрібно використати WYSIWYG-редактор. | |||
Можливі варіанти: | |||
* TinyMCE; | |||
* CKEditor; | |||
* інший редактор, сумісний з K2 ERP. | |||
Редактор має дозволяти: | |||
* форматувати текст; | |||
* додавати заголовки; | |||
* вставляти списки; | |||
* вставляти посилання; | |||
* додавати зображення; | |||
* працювати з таблицями; | |||
* редагувати HTML у межах дозволених прав. | |||
== SEO-поля == | |||
Додатково потрібно передбачити SEO-поля. | |||
{| class="wikitable" style="width:100%;" | |||
! Поле | |||
! Опис | |||
|- | |||
| SEO title | |||
| Заголовок сторінки для пошукових систем | |||
|- | |||
| SEO description | |||
| Опис сторінки для пошукових систем | |||
|- | |||
| SEO keywords | |||
| Ключові слова, якщо вони використовуються | |||
|- | |||
| URL-адреса / slug | |||
| Частина адреси матеріалу | |||
|- | |||
| Теги | |||
| Тематичні мітки матеріалу | |||
|} | |||
URL-адреса може генеруватися автоматично на основі заголовка або задаватися вручну. | |||
== Медіабібліотека == | |||
Модуль має містити медіабібліотеку з каталогами. | Модуль має містити медіабібліотеку з каталогами. | ||
Медіабібліотека потрібна для централізованого зберігання файлів, які використовуються в матеріалах сайту або порталу. | |||
== Функції медіабібліотеки == | |||
Потрібно реалізувати: | Потрібно реалізувати: | ||
* завантаження зображень | * створення каталогів; | ||
* завантаження зображень; | |||
* завантаження PDF-файлів; | |||
* завантаження інших документів; | |||
* завантаження файлів через AJAX; | |||
* підключення файлів до матеріалів; | * підключення файлів до матеріалів; | ||
* перегляд списку файлів; | |||
* пошук файлів; | |||
* видалення файлів за наявності прав; | |||
* можливість обрізки зображень при завантаженні; | * можливість обрізки зображень при завантаженні; | ||
* зберігання медіафайлів у структурованих каталогах. | * зберігання медіафайлів у структурованих каталогах. | ||
=== | Для завантаження файлів можна використовувати FilePond або Dropzone.js. | ||
<div style="border:2px solid #f57c00; background:#fff3e0; padding:14px; margin:16px 0;"> | |||
'''Важливо.''' Медіафайли мають бути пов’язані з матеріалами, але не повинні безконтрольно дублюватися при кожному редагуванні сторінки. | |||
</div> | |||
== Мультимовність == | |||
Кожен матеріал може мати окремі версії різними мовами. | Кожен матеріал може мати окремі версії різними мовами. | ||
| Рядок 99: | Рядок 371: | ||
* '''Про нас''' українською мовою → '''About us''' англійською мовою. | * '''Про нас''' українською мовою → '''About us''' англійською мовою. | ||
* '''Новини компанії''' українською мовою → '''Company news''' англійською мовою. | |||
Система має дозволяти: | |||
* створювати переклад із поточного матеріалу; | |||
* бачити, які мовні версії вже існують; | |||
* перемикатися між мовними версіями; | |||
* не втрачати зв’язок між перекладами; | |||
* формувати URL з урахуванням коду мови. | |||
== Публікація на сайті == | |||
Після публікації матеріал автоматично відображається на сайті за налаштованим шаблоном. | Після публікації матеріал автоматично відображається на сайті за налаштованим шаблоном. | ||
URL повинен формуватися за правилом:<pre> | URL повинен формуватися за правилом: | ||
<pre> | |||
/<код мови>/<категорія>/<url матеріалу>/ | /<код мови>/<категорія>/<url матеріалу>/ | ||
</pre>Приклад URL:<pre> | </pre> | ||
Приклад URL: | |||
<pre> | |||
/en/news/open-new-office/ | /en/news/open-new-office/ | ||
</pre> | </pre> | ||
Для української мови приклад може мати вигляд: | |||
<pre> | |||
/uk/news/vidkryttia-novoho-ofisu/ | |||
</pre> | |||
* | |||
* | == Попередній перегляд == | ||
* | |||
Перед публікацією потрібно передбачити попередній перегляд матеріалу. | |||
Попередній перегляд дозволяє редактору побачити, як матеріал виглядатиме на сайті, ще до зміни статусу на '''«Опубліковано»'''. | |||
== Автозбереження чернеток == | |||
Модуль повинен підтримувати автоматичне збереження чернеток кожні X хвилин. | |||
Автозбереження потрібно для того, щоб редактор не втрачав текст у разі закриття сторінки, збою браузера або помилки з’єднання. | |||
Автозбереження не повинно автоматично публікувати матеріал. | |||
== Історія змін == | |||
Потрібно реалізувати історію змін матеріалу. | |||
Історія змін має фіксувати: | |||
* хто редагував матеріал; | |||
* дату й час зміни; | |||
* змінений заголовок; | |||
* змінений текст; | |||
* зміну статусу; | |||
* зміну категорії; | |||
* зміну SEO-полів; | |||
* стару версію; | |||
* нову версію. | |||
== Відкат до попередньої версії == | |||
Модуль повинен дозволяти відкотити матеріал до попередньої версії. | |||
Це важливо, якщо редактор випадково видалив частину тексту, опублікував неправильну версію або зламав форматування. | |||
== Модульні блоки контенту == | |||
Рівень Advanced передбачає можливість створення окремих блоків контенту для розміщення в різних частинах сайту. | Рівень Advanced передбачає можливість створення окремих блоків контенту для розміщення в різних частинах сайту. | ||
| Рядок 126: | Рядок 447: | ||
* банер; | * банер; | ||
* акційний блок; | * акційний блок; | ||
* слайдер. | * слайдер; | ||
* інформаційна вставка; | |||
* блок переваг; | |||
* блок партнерів; | |||
* блок контактів. | |||
Потрібно передбачити конфігурування розташування блоку через панель адміністратора. | Потрібно передбачити конфігурування розташування блоку через панель адміністратора. | ||
== | == Розташування модульних блоків == | ||
{| class="wikitable" | |||
! | Для кожного блоку бажано передбачити: | ||
!Опис | |||
{| class="wikitable" style="width:100%;" | |||
! Поле | |||
! Опис | |||
|- | |||
| Назва блоку | |||
| Внутрішня назва для адміністратора | |||
|- | |||
| Тип блоку | |||
| Банер, слайдер, HTML-блок, акційний блок тощо | |||
|- | |||
| Область показу | |||
| Головна сторінка, категорія, стаття, футер, сайдбар | |||
|- | |||
| Порядок | |||
| Черговість показу | |||
|- | |- | ||
| | | Статус | ||
| | | Активний або вимкнений | ||
|- | |- | ||
| | | Мова | ||
| | | Мова блоку, якщо він має мовні версії | ||
|} | |||
== Права доступу == | |||
CMS-модуль має підтримувати розмежування прав. | |||
Можливі ролі: | |||
{| class="wikitable" style="width:100%;" | |||
! Роль | |||
! Можливості | |||
|- | |- | ||
| | | Автор | ||
| | | Створює та редагує власні чернетки | ||
|- | |- | ||
| | | Редактор | ||
| | | Редагує матеріали, працює з медіа, готує публікації | ||
|- | |- | ||
| | | Модератор | ||
| | | Перевіряє матеріали й змінює статуси | ||
|- | |- | ||
| | | Адміністратор | ||
| | | Керує категоріями, мовами, правами, шаблонами та публікацією | ||
|} | |} | ||
== | <div style="border:3px solid #1565c0; background:#e3f2fd; padding:14px; margin:16px 0;"> | ||
{| class="wikitable" | '''Практичний сенс.''' Не кожен користувач CMS має право публікувати матеріали. Частина користувачів може готувати чернетки, а публікацію виконує редактор або адміністратор. | ||
! | </div> | ||
! | |||
== AJAX-інтерактив == | |||
Модуль повинен підтримувати роботу без зайвих перезавантажень сторінки. | |||
Через AJAX мають працювати: | |||
* збереження матеріалу; | |||
* автозбереження чернетки; | |||
* завантаження медіафайлів; | |||
* вибір категорії; | |||
* зміна статусу; | |||
* створення перекладу; | |||
* додавання тегів; | |||
* оновлення SEO-полів; | |||
* відновлення попередньої версії. | |||
== Технічні вимоги == | |||
{| class="wikitable" style="width:100%;" | |||
! Параметр | |||
! Опис | |||
|- | |- | ||
| | | Бекенд | ||
| | | K2 ERP на Python або PHP | ||
|- | |- | ||
| | | База даних | ||
| | | PostgreSQL або MySQL | ||
|- | |- | ||
| | | Фронтенд | ||
| | | HTML5, JavaScript | ||
|- | |- | ||
| | | AJAX | ||
| | | Axios або Fetch API | ||
|- | |- | ||
| | | UI-компоненти | ||
| | | DataTables, Select2, WYSIWYG-редактор TinyMCE або CKEditor | ||
|- | |- | ||
| | | Медіауправління | ||
| | | FilePond або Dropzone.js | ||
|- | |- | ||
| Друк | |||
| Немає обов’язкової необхідності | |||
|} | |} | ||
== | == Рекомендовані сутності бази даних == | ||
Для реалізації задачі доцільно передбачити такі сутності: | |||
* категорії контенту; | * категорії контенту; | ||
| Рядок 201: | Рядок 569: | ||
* модульні блоки; | * модульні блоки; | ||
* розташування блоків; | * розташування блоків; | ||
* автори | * автори; | ||
* права доступу. | |||
== Практичне завдання == | |||
У межах атестації потрібно продемонструвати робочий сценарій. | |||
Мінімальний сценарій: | |||
# створити категорію контенту; | |||
# створити мову; | |||
# створити новий матеріал; | |||
# вказати заголовок, короткий опис і повний текст; | |||
# обрати категорію через AJAX; | |||
# заповнити SEO-поля; | |||
# завантажити зображення-прев’ю через медіабібліотеку; | |||
# зберегти матеріал як чернетку; | |||
# перевірити автозбереження; | |||
# створити переклад матеріалу іншою мовою; | |||
# перевірити зв’язок між мовними версіями; | |||
# виконати попередній перегляд; | |||
# змінити статус на '''«Опубліковано»'''; | |||
# перевірити сформований URL; | |||
# переконатися, що матеріал доступний на сайті; | |||
# внести зміни в матеріал; | |||
# переглянути історію змін; | |||
# відкотити матеріал до попередньої версії; | |||
# створити модульний блок, якщо виконується Advanced-рівень; | |||
# показати журнал матеріалів із фільтрами. | |||
== Критерії оцінювання == | |||
{| class="wikitable" style="width:100%;" | |||
! Критерій | |||
! Бали | |||
! Що перевіряється | |||
|- | |||
| Реалізація журналу матеріалів | |||
| 20 | |||
| Список матеріалів, пошук, фільтри, статуси, мови, автори, категорії | |||
|- | |||
| Форма створення та редагування матеріалу | |||
| 20 | |||
| Заголовок, опис, WYSIWYG-редактор, категорія, мова, SEO, статус | |||
|- | |||
| Робота медіабібліотеки | |||
| 20 | |||
| Каталоги, завантаження файлів, прив’язка до матеріалів, AJAX-завантаження | |||
|- | |||
| Підтримка багатомовності | |||
| 20 | |||
| Мовні версії, зв’язок перекладів, URL з кодом мови | |||
|- | |||
| Інтерактивність через AJAX | |||
| 10 | |||
| Збереження, автозбереження, зміна статусу, медіафайли без перезавантаження | |||
|- | |||
| Управління статусами публікації | |||
| 10 | |||
| Чернетка, опубліковано, приховано, попередній перегляд | |||
|- | |||
! Разом | |||
! 100 | |||
! Максимальна оцінка | |||
|} | |||
== Шкала оцінювання == | |||
{| class="wikitable" style="width:100%;" | |||
! Бали | |||
! Рівень | |||
! Опис | |||
|- | |||
| 90–100 | |||
| Відмінно | |||
| CMS-модуль повністю працює: матеріали, медіа, мультимовність, публікація, SEO, історія змін і AJAX реалізовані коректно | |||
|- | |||
| 75–89 | |||
| Добре | |||
| Основна логіка працює, є незначні недоліки, які не руйнують процес публікації контенту | |||
|- | |||
| 60–74 | |||
| Зараховано | |||
| Базовий сценарій працює, але частина функцій реалізована неповно або потребує доопрацювання | |||
|- | |||
| 0–59 | |||
| Не зараховано | |||
| Відсутня критична логіка: створення матеріалів, публікація, медіафайли, мультимовність або статуси | |||
|} | |||
== Критичні помилки == | |||
Критичними помилками вважаються ситуації, коли: | |||
* неможливо створити матеріал; | |||
* матеріал не має статусу публікації; | |||
* чернетка відображається на публічному сайті; | |||
* опублікований матеріал недоступний за URL; | |||
* URL формується некоректно або дублюється; | |||
* неможливо завантажити медіафайл; | |||
* медіафайл не прив’язується до матеріалу; | |||
* мультимовні версії не пов’язані між собою; | |||
* історія змін не зберігається; | |||
* неможливо відновити попередню версію; | |||
* немає розмежування прав між автором, редактором і адміністратором; | |||
* AJAX-збереження або автозбереження не працює. | |||
<div style="border:3px solid #b71c1c; background:#ffebee; padding:14px; margin:16px 0;"> | |||
'''Умова складання.''' Завдання не може бути зараховане, якщо система не дозволяє пройти базовий цикл CMS: створення матеріалу → збереження чернетки → додавання медіа → публікація → перегляд на сайті → історія змін. | |||
</div> | |||
== Очікуваний результат == | |||
У результаті виконання атестаційного завдання має бути створений CMS-модуль K2 ERP. | |||
Модуль має підтримувати довідники категорій і мов, журнал матеріалів, форму створення та редагування контенту, WYSIWYG-редактор, медіабібліотеку, багатомовність, автоматичну публікацію, SEO-поля, історію змін, AJAX-інтерактив і, за потреби, модульні блоки контенту. | |||
== Примітка == | |||
CMS-модуль потрібен практично кожній компанії, що має сайт або внутрішній портал: IT-компаніям, маркетинг-агентствам, торговим мережам, освітнім установам, банкам, сервісним компаніям і виробникам. | |||
Правильна реалізація CMS дозволяє бізнесу швидко оновлювати інформацію, не створюючи кожного разу задачу для розробника. | |||
== Коротко == | |||
{| class="wikitable" style="width:100%;" | |||
! Питання | |||
! Відповідь | |||
|- | |||
| Що потрібно створити? | |||
| CMS-модуль для керування контентом сайту або корпоративного порталу | |||
|- | |||
| Які довідники потрібні? | |||
| Категорії контенту та мови | |||
|- | |||
| Який головний журнал? | |||
| Журнал матеріалів | |||
|- | |||
| Що має бути у формі матеріалу? | |||
| Заголовок, опис, WYSIWYG-текст, категорія, мова, медіа, SEO, статус | |||
|- | |||
| Що має підтримувати медіабібліотека? | |||
| Каталоги, завантаження файлів, прив’язку до матеріалів | |||
|- | |||
| Як має працювати мультимовність? | |||
| Один матеріал може мати пов’язані версії різними мовами | |||
|- | |||
| Який URL потрібен? | |||
| <code>/код-мови/категорія/url-матеріалу/</code> | |||
|- | |||
| Що є критичною вимогою? | |||
| Повний цикл: чернетка → медіа → публікація → URL → історія змін | |||
|} | |||
== Див. також == | == Див. також == | ||
* [[K2 Cloud ERP|K2 ERP]] | * [[K2 Cloud ERP|K2 ERP]] | ||
* [[K2 ERP]] | |||
* [[Атестаційні завдання K2 ERP]] | * [[Атестаційні завдання K2 ERP]] | ||
* [[CMS]] | * [[CMS]] | ||
| Рядок 214: | Рядок 735: | ||
* [[TinyMCE]] | * [[TinyMCE]] | ||
* [[CKEditor]] | * [[CKEditor]] | ||
* [[SEO]] | |||
* [[AJAX]] | |||
[[Категорія:K2 ERP]] | |||
[[Категорія:Атестаційні завдання K2]] | |||
[[Категорія:CMS]] | |||
[[Категорія:Контент]] | |||
[[Категорія:Медіабібліотека]] | |||
[[Категорія:Багатомовність]] | |||
[[Категорія:Корпоративна Wiki]] | |||
Поточна версія на 18:26, 1 травня 2026
Атестаційне завдання K2 ERP — CMS — це практична задача для перевірки навичок розробника або впроваджувача K2 ERP у створенні модуля управління контентом сайту або корпоративного порталу.
Модуль має забезпечувати роботу зі сторінками, новинами, статтями, оголошеннями, медіафайлами, багатомовністю, SEO-полями, публікацією, історією змін і правами доступу.
Коротко. Потрібно реалізувати CMS-модуль, який дозволяє менеджерам самостійно створювати й редагувати матеріали сайту, працювати з медіафайлами, публікувати контент різними мовами, керувати статусами та бачити історію змін.
Назва завдання
Модуль CMS: управління контентом сайту і корпоративного порталу.
Мета завдання
Мета завдання — створити в K2 ERP CMS-модуль, який дозволяє керувати контентом сайту або внутрішнього корпоративного порталу без постійного залучення розробників.
Система повинна дозволяти:
- створювати сторінки;
- створювати новини, статті та оголошення;
- редагувати матеріали через WYSIWYG-редактор;
- працювати з категоріями контенту;
- публікувати матеріали різними мовами;
- завантажувати зображення, PDF-файли та інші документи;
- підключати медіафайли до матеріалів;
- керувати статусами публікації;
- формувати зрозумілі URL;
- заповнювати SEO-поля;
- зберігати історію змін;
- відновлювати попередні версії матеріалів;
- керувати модульними блоками контенту.
Головний принцип. CMS у K2 ERP — це не просто форма для введення тексту. Це система керування життєвим циклом контенту: створення → редагування → медіа → переклади → публікація → історія змін → аналітика та підтримка.
Реальний бізнес-контекст
Компанія має публічний сайт або внутрішній корпоративний портал.
Маркетологи, редактори, HR-спеціалісти, менеджери або адміністратори повинні мати можливість самостійно додавати й оновлювати контент: сторінки, новини, статті, оголошення, документи, банери, акційні блоки або внутрішні повідомлення.
Без CMS кожна зміна на сайті перетворюється на задачу для розробника. Це сповільнює роботу, створює чергу дрібних правок і заважає бізнесу швидко публікувати інформацію.
CMS-модуль має зняти цю залежність і дати користувачам контроль над контентом у межах зрозумілих прав доступу.
Основний бізнес-процес
Типовий процес роботи CMS-модуля виглядає так:
- редактор створює новий матеріал;
- обирає категорію та мову;
- вводить заголовок, короткий опис і основний текст;
- додає зображення-прев’ю або інші медіафайли;
- заповнює SEO-поля;
- зберігає матеріал як чернетку;
- за потреби створює версію іншою мовою;
- переглядає попередній вигляд матеріалу;
- змінює статус на «Опубліковано»;
- матеріал автоматично з’являється на сайті за налаштованим URL;
- система зберігає історію змін і автора останнього редагування.
Основні об’єкти модуля
| Об’єкт | Призначення |
|---|---|
| Категорії контенту | Класифікація матеріалів: новини, статті, сторінки, оголошення |
| Мови | Перелік мов, якими публікується контент |
| Матеріали | Основні одиниці контенту: сторінки, новини, статті, оголошення |
| Переклади матеріалів | Версії одного матеріалу різними мовами |
| Медіафайли | Зображення, PDF, документи та інші файли |
| Каталоги медіабібліотеки | Структура зберігання файлів |
| Теги | Додаткова класифікація матеріалів |
| SEO-налаштування | Title, description, keywords, URL-slug |
| Історія змін | Версії матеріалу та дані про редагування |
| Статуси публікації | Чернетка, опубліковано, приховано |
| Модульні блоки | Банери, слайдери, акційні блоки, інформаційні вставки |
Довідник «Категорії контенту»
Довідник категорій контенту потрібен для структурування матеріалів сайту або порталу.
Категорії можуть мати ієрархію. Наприклад, категорія «Новини» може містити підкатегорії «Компанія», «Продукти», «Події».
Мінімальний склад даних:
| Поле | Опис |
|---|---|
| Назва категорії | Назва, яку бачить користувач |
| Тип категорії | Новина, стаття, сторінка, оголошення |
| Батьківська категорія | Для побудови ієрархії |
| URL-код | Частина адреси категорії |
| Статус | Активна або прихована |
Типи категорій
| Тип | Призначення |
|---|---|
| Новина | Публікації про події, оновлення, зміни, анонси |
| Стаття | Аналітичні або інформаційні матеріали |
| Сторінка | Статичні сторінки сайту: про компанію, контакти, послуги |
| Оголошення | Короткі повідомлення або внутрішні публікації |
Довідник «Мови»
Довідник мов містить перелік мов, якими публікується контент.
Мінімальний склад даних:
| Поле | Опис |
|---|---|
| Назва мови | Наприклад: українська, англійська, польська |
| Код мови | Наприклад: uk, en, pl
|
| Активність | Чи доступна мова для публікації |
| Мова за замовчуванням | Ознака основної мови сайту |
Код мови використовується у формуванні URL матеріалу.
Журнал «Матеріали»
Журнал матеріалів повинен відображати всі одиниці контенту сайту або корпоративного порталу.
У журналі редактор має швидко бачити, які матеріали є чернетками, які опубліковані, які приховані, хто автор, якою мовою матеріал створено і до якої категорії він належить.
Колонки журналу матеріалів
| Колонка | Опис |
|---|---|
| Заголовок | Назва матеріалу |
| Категорія | Розділ, до якого належить матеріал |
| Автор | Користувач, який створив матеріал |
| Дата створення | Коли матеріал створено |
| Дата останньої зміни | Коли матеріал редагували востаннє |
| Статус публікації | Чернетка, опубліковано, приховано |
| Мова | Мова матеріалу |
| URL | Адреса опублікованого матеріалу |
Функціональність журналу матеріалів
Журнал має підтримувати:
- пошук по заголовку;
- пошук по автору;
- пошук по категорії;
- фільтрацію за статусом;
- фільтрацію за мовою;
- фільтрацію за датою створення;
- швидку зміну статусу;
- відкриття матеріалу на редагування;
- попередній перегляд;
- перехід до опублікованої сторінки;
- копіювання матеріалу;
- створення перекладу.
Статуси публікації
| Статус | Значення |
|---|---|
| Чернетка | Матеріал збережено, але він не доступний на сайті |
| Опубліковано | Матеріал доступний на сайті |
| Приховано | Матеріал знято з публікації, але він збережений у системі |
Критично. Чернетка не повинна відображатися на публічному сайті. Опублікований матеріал має бути доступний за сформованим URL.
Форма створення та редагування матеріалу
Форма матеріалу повинна дозволяти створювати й редагувати контент без залучення розробника.
Основна інформація
У формі потрібно передбачити:
| Поле | Опис |
|---|---|
| Заголовок | Основна назва матеріалу |
| Короткий опис або анонс | Текст для списків, прев’ю або SEO-опису |
| Повний текст | Основний вміст матеріалу через WYSIWYG-редактор |
| Категорія | Вибір із довідника через AJAX |
| Мова | Мова поточної версії матеріалу |
| Зображення-прев’ю | Завантаження або вибір із медіабібліотеки |
| Статус | Чернетка, опубліковано, приховано |
| Автор | Користувач, який створив матеріал |
WYSIWYG-редактор
Для редагування повного тексту матеріалу потрібно використати WYSIWYG-редактор.
Можливі варіанти:
- TinyMCE;
- CKEditor;
- інший редактор, сумісний з K2 ERP.
Редактор має дозволяти:
- форматувати текст;
- додавати заголовки;
- вставляти списки;
- вставляти посилання;
- додавати зображення;
- працювати з таблицями;
- редагувати HTML у межах дозволених прав.
SEO-поля
Додатково потрібно передбачити SEO-поля.
| Поле | Опис |
|---|---|
| SEO title | Заголовок сторінки для пошукових систем |
| SEO description | Опис сторінки для пошукових систем |
| SEO keywords | Ключові слова, якщо вони використовуються |
| URL-адреса / slug | Частина адреси матеріалу |
| Теги | Тематичні мітки матеріалу |
URL-адреса може генеруватися автоматично на основі заголовка або задаватися вручну.
Медіабібліотека
Модуль має містити медіабібліотеку з каталогами.
Медіабібліотека потрібна для централізованого зберігання файлів, які використовуються в матеріалах сайту або порталу.
Функції медіабібліотеки
Потрібно реалізувати:
- створення каталогів;
- завантаження зображень;
- завантаження PDF-файлів;
- завантаження інших документів;
- завантаження файлів через AJAX;
- підключення файлів до матеріалів;
- перегляд списку файлів;
- пошук файлів;
- видалення файлів за наявності прав;
- можливість обрізки зображень при завантаженні;
- зберігання медіафайлів у структурованих каталогах.
Для завантаження файлів можна використовувати FilePond або Dropzone.js.
Важливо. Медіафайли мають бути пов’язані з матеріалами, але не повинні безконтрольно дублюватися при кожному редагуванні сторінки.
Мультимовність
Кожен матеріал може мати окремі версії різними мовами.
Потрібно реалізувати механізм прив’язки матеріалів між мовами.
Приклад:
- Про нас українською мовою → About us англійською мовою.
- Новини компанії українською мовою → Company news англійською мовою.
Система має дозволяти:
- створювати переклад із поточного матеріалу;
- бачити, які мовні версії вже існують;
- перемикатися між мовними версіями;
- не втрачати зв’язок між перекладами;
- формувати URL з урахуванням коду мови.
Публікація на сайті
Після публікації матеріал автоматично відображається на сайті за налаштованим шаблоном.
URL повинен формуватися за правилом:
/<код мови>/<категорія>/<url матеріалу>/
Приклад URL:
/en/news/open-new-office/
Для української мови приклад може мати вигляд:
/uk/news/vidkryttia-novoho-ofisu/
Попередній перегляд
Перед публікацією потрібно передбачити попередній перегляд матеріалу.
Попередній перегляд дозволяє редактору побачити, як матеріал виглядатиме на сайті, ще до зміни статусу на «Опубліковано».
Автозбереження чернеток
Модуль повинен підтримувати автоматичне збереження чернеток кожні X хвилин.
Автозбереження потрібно для того, щоб редактор не втрачав текст у разі закриття сторінки, збою браузера або помилки з’єднання.
Автозбереження не повинно автоматично публікувати матеріал.
Історія змін
Потрібно реалізувати історію змін матеріалу.
Історія змін має фіксувати:
- хто редагував матеріал;
- дату й час зміни;
- змінений заголовок;
- змінений текст;
- зміну статусу;
- зміну категорії;
- зміну SEO-полів;
- стару версію;
- нову версію.
Відкат до попередньої версії
Модуль повинен дозволяти відкотити матеріал до попередньої версії.
Це важливо, якщо редактор випадково видалив частину тексту, опублікував неправильну версію або зламав форматування.
Модульні блоки контенту
Рівень Advanced передбачає можливість створення окремих блоків контенту для розміщення в різних частинах сайту.
Приклади блоків:
- банер;
- акційний блок;
- слайдер;
- інформаційна вставка;
- блок переваг;
- блок партнерів;
- блок контактів.
Потрібно передбачити конфігурування розташування блоку через панель адміністратора.
Розташування модульних блоків
Для кожного блоку бажано передбачити:
| Поле | Опис |
|---|---|
| Назва блоку | Внутрішня назва для адміністратора |
| Тип блоку | Банер, слайдер, HTML-блок, акційний блок тощо |
| Область показу | Головна сторінка, категорія, стаття, футер, сайдбар |
| Порядок | Черговість показу |
| Статус | Активний або вимкнений |
| Мова | Мова блоку, якщо він має мовні версії |
Права доступу
CMS-модуль має підтримувати розмежування прав.
Можливі ролі:
| Роль | Можливості |
|---|---|
| Автор | Створює та редагує власні чернетки |
| Редактор | Редагує матеріали, працює з медіа, готує публікації |
| Модератор | Перевіряє матеріали й змінює статуси |
| Адміністратор | Керує категоріями, мовами, правами, шаблонами та публікацією |
Практичний сенс. Не кожен користувач CMS має право публікувати матеріали. Частина користувачів може готувати чернетки, а публікацію виконує редактор або адміністратор.
AJAX-інтерактив
Модуль повинен підтримувати роботу без зайвих перезавантажень сторінки.
Через AJAX мають працювати:
- збереження матеріалу;
- автозбереження чернетки;
- завантаження медіафайлів;
- вибір категорії;
- зміна статусу;
- створення перекладу;
- додавання тегів;
- оновлення SEO-полів;
- відновлення попередньої версії.
Технічні вимоги
| Параметр | Опис |
|---|---|
| Бекенд | K2 ERP на Python або PHP |
| База даних | PostgreSQL або MySQL |
| Фронтенд | HTML5, JavaScript |
| AJAX | Axios або Fetch API |
| UI-компоненти | DataTables, Select2, WYSIWYG-редактор TinyMCE або CKEditor |
| Медіауправління | FilePond або Dropzone.js |
| Друк | Немає обов’язкової необхідності |
Рекомендовані сутності бази даних
Для реалізації задачі доцільно передбачити такі сутності:
- категорії контенту;
- мови;
- матеріали;
- переклади матеріалів;
- медіафайли;
- каталоги медіабібліотеки;
- теги;
- SEO-налаштування;
- історія змін;
- статуси публікації;
- модульні блоки;
- розташування блоків;
- автори;
- права доступу.
Практичне завдання
У межах атестації потрібно продемонструвати робочий сценарій.
Мінімальний сценарій:
- створити категорію контенту;
- створити мову;
- створити новий матеріал;
- вказати заголовок, короткий опис і повний текст;
- обрати категорію через AJAX;
- заповнити SEO-поля;
- завантажити зображення-прев’ю через медіабібліотеку;
- зберегти матеріал як чернетку;
- перевірити автозбереження;
- створити переклад матеріалу іншою мовою;
- перевірити зв’язок між мовними версіями;
- виконати попередній перегляд;
- змінити статус на «Опубліковано»;
- перевірити сформований URL;
- переконатися, що матеріал доступний на сайті;
- внести зміни в матеріал;
- переглянути історію змін;
- відкотити матеріал до попередньої версії;
- створити модульний блок, якщо виконується Advanced-рівень;
- показати журнал матеріалів із фільтрами.
Критерії оцінювання
| Критерій | Бали | Що перевіряється |
|---|---|---|
| Реалізація журналу матеріалів | 20 | Список матеріалів, пошук, фільтри, статуси, мови, автори, категорії |
| Форма створення та редагування матеріалу | 20 | Заголовок, опис, WYSIWYG-редактор, категорія, мова, SEO, статус |
| Робота медіабібліотеки | 20 | Каталоги, завантаження файлів, прив’язка до матеріалів, AJAX-завантаження |
| Підтримка багатомовності | 20 | Мовні версії, зв’язок перекладів, URL з кодом мови |
| Інтерактивність через AJAX | 10 | Збереження, автозбереження, зміна статусу, медіафайли без перезавантаження |
| Управління статусами публікації | 10 | Чернетка, опубліковано, приховано, попередній перегляд |
| Разом | 100 | Максимальна оцінка |
Шкала оцінювання
| Бали | Рівень | Опис |
|---|---|---|
| 90–100 | Відмінно | CMS-модуль повністю працює: матеріали, медіа, мультимовність, публікація, SEO, історія змін і AJAX реалізовані коректно |
| 75–89 | Добре | Основна логіка працює, є незначні недоліки, які не руйнують процес публікації контенту |
| 60–74 | Зараховано | Базовий сценарій працює, але частина функцій реалізована неповно або потребує доопрацювання |
| 0–59 | Не зараховано | Відсутня критична логіка: створення матеріалів, публікація, медіафайли, мультимовність або статуси |
Критичні помилки
Критичними помилками вважаються ситуації, коли:
- неможливо створити матеріал;
- матеріал не має статусу публікації;
- чернетка відображається на публічному сайті;
- опублікований матеріал недоступний за URL;
- URL формується некоректно або дублюється;
- неможливо завантажити медіафайл;
- медіафайл не прив’язується до матеріалу;
- мультимовні версії не пов’язані між собою;
- історія змін не зберігається;
- неможливо відновити попередню версію;
- немає розмежування прав між автором, редактором і адміністратором;
- AJAX-збереження або автозбереження не працює.
Умова складання. Завдання не може бути зараховане, якщо система не дозволяє пройти базовий цикл CMS: створення матеріалу → збереження чернетки → додавання медіа → публікація → перегляд на сайті → історія змін.
Очікуваний результат
У результаті виконання атестаційного завдання має бути створений CMS-модуль K2 ERP.
Модуль має підтримувати довідники категорій і мов, журнал матеріалів, форму створення та редагування контенту, WYSIWYG-редактор, медіабібліотеку, багатомовність, автоматичну публікацію, SEO-поля, історію змін, AJAX-інтерактив і, за потреби, модульні блоки контенту.
Примітка
CMS-модуль потрібен практично кожній компанії, що має сайт або внутрішній портал: IT-компаніям, маркетинг-агентствам, торговим мережам, освітнім установам, банкам, сервісним компаніям і виробникам.
Правильна реалізація CMS дозволяє бізнесу швидко оновлювати інформацію, не створюючи кожного разу задачу для розробника.
Коротко
| Питання | Відповідь |
|---|---|
| Що потрібно створити? | CMS-модуль для керування контентом сайту або корпоративного порталу |
| Які довідники потрібні? | Категорії контенту та мови |
| Який головний журнал? | Журнал матеріалів |
| Що має бути у формі матеріалу? | Заголовок, опис, WYSIWYG-текст, категорія, мова, медіа, SEO, статус |
| Що має підтримувати медіабібліотека? | Каталоги, завантаження файлів, прив’язку до матеріалів |
| Як має працювати мультимовність? | Один матеріал може мати пов’язані версії різними мовами |
| Який URL потрібен? | /код-мови/категорія/url-матеріалу/
|
| Що є критичною вимогою? | Повний цикл: чернетка → медіа → публікація → URL → історія змін |