ver 0.262 - pages module refactor and admin UX fixes

This commit is contained in:
2026-02-13 21:17:21 +01:00
parent a1633491d5
commit b4559a5e74
44 changed files with 2235 additions and 1803 deletions

View File

@@ -48,13 +48,13 @@ class ArticlesArchiveController
$rows[] = [
'lp' => $lp++ . '.',
'title' => '<a href="/admin/articles/article_edit/id=' . $id . '">' . htmlspecialchars($title, ENT_QUOTES, 'UTF-8') . '</a>',
'title' => '<a href="/admin/articles/edit/id=' . $id . '">' . htmlspecialchars($title, ENT_QUOTES, 'UTF-8') . '</a>',
'date_add' => !empty($item['date_add']) ? date('Y-m-d H:i', strtotime((string)$item['date_add'])) : '-',
'date_modify' => !empty($item['date_modify']) ? date('Y-m-d H:i', strtotime((string)$item['date_modify'])) : '-',
'_actions' => [
[
'label' => 'Przywroc',
'url' => '/admin/articles_archive/article_restore/id=' . $id,
'url' => '/admin/articles_archive/restore/id=' . $id,
'class' => 'btn btn-xs btn-success',
'confirm' => 'Na pewno chcesz przywrocic wybrany artykul?',
'confirm_ok' => 'Przywroc',
@@ -62,7 +62,7 @@ class ArticlesArchiveController
],
[
'label' => 'Usun',
'url' => '/admin/articles_archive/article_delete/id=' . $id,
'url' => '/admin/articles_archive/delete/id=' . $id,
'class' => 'btn btn-xs btn-danger',
'confirm' => 'Na pewno chcesz trwale usunac wybrany artykul?',
'confirm_ok' => 'Usun',
@@ -101,7 +101,7 @@ class ArticlesArchiveController
]),
$listRequest['perPageOptions'],
$sortableColumns,
'/admin/articles_archive/view_list/',
'/admin/articles_archive/list/',
'Brak danych w tabeli.'
);
@@ -121,7 +121,7 @@ class ArticlesArchiveController
\S::alert('Artykul zostal przywrocony.');
}
header('Location: /admin/articles_archive/view_list/');
header('Location: /admin/articles_archive/list/');
exit;
}
@@ -136,7 +136,7 @@ class ArticlesArchiveController
\S::alert('Artykul zostal trwale usuniety.');
}
header('Location: /admin/articles_archive/view_list/');
header('Location: /admin/articles_archive/list/');
exit;
}

View File

@@ -4,6 +4,7 @@ namespace admin\Controllers;
use Domain\Article\ArticleRepository;
use Domain\Languages\LanguagesRepository;
use Domain\Layouts\LayoutsRepository;
use Domain\Pages\PagesRepository;
use admin\ViewModels\Forms\FormAction;
use admin\ViewModels\Forms\FormEditViewModel;
use admin\ViewModels\Forms\FormField;
@@ -14,16 +15,19 @@ class ArticlesController
private ArticleRepository $repository;
private LanguagesRepository $languagesRepository;
private LayoutsRepository $layoutsRepository;
private PagesRepository $pagesRepository;
public function __construct(
ArticleRepository $repository,
LanguagesRepository $languagesRepository,
LayoutsRepository $layoutsRepository
LayoutsRepository $layoutsRepository,
PagesRepository $pagesRepository
)
{
$this->repository = $repository;
$this->languagesRepository = $languagesRepository;
$this->layoutsRepository = $layoutsRepository;
$this->pagesRepository = $pagesRepository;
}
/**
@@ -83,7 +87,7 @@ class ArticlesController
$rows[] = [
'lp' => $lp++ . '.',
'title' => '<a href="/admin/articles/article_edit/id=' . $id . '">' . htmlspecialchars($title, ENT_QUOTES, 'UTF-8') . '</a>'
'title' => '<a href="/admin/articles/edit/id=' . $id . '">' . htmlspecialchars($title, ENT_QUOTES, 'UTF-8') . '</a>'
. '<small class="text-muted">' . htmlspecialchars($pages, ENT_QUOTES, 'UTF-8') . '</small>',
'status' => ((int)$item['status'] === 1) ? 'tak' : '<span style="color: #FF0000;">nie</span>',
'date_add' => !empty($item['date_add']) ? date('Y-m-d H:i', strtotime((string)$item['date_add'])) : '-',
@@ -92,12 +96,12 @@ class ArticlesController
'_actions' => [
[
'label' => 'Edytuj',
'url' => '/admin/articles/article_edit/id=' . $id,
'url' => '/admin/articles/edit/id=' . $id,
'class' => 'btn btn-xs btn-primary',
],
[
'label' => 'Usun',
'url' => '/admin/articles/article_delete/id=' . $id,
'url' => '/admin/articles/delete/id=' . $id,
'class' => 'btn btn-xs btn-danger',
'confirm' => 'Na pewno chcesz usunac wybrany element?',
],
@@ -136,9 +140,9 @@ class ArticlesController
]),
$listRequest['perPageOptions'],
$sortableColumns,
'/admin/articles/view_list/',
'/admin/articles/list/',
'Brak danych w tabeli.',
'/admin/articles/article_edit/',
'/admin/articles/edit/',
'Dodaj artykul'
);
@@ -259,7 +263,7 @@ class ArticlesController
\S::alert('Artykul zostal przeniesiony do archiwum.');
}
header('Location: /admin/articles/view_list/');
header('Location: /admin/articles/list/');
exit;
}
@@ -280,7 +284,7 @@ class ArticlesController
$article = $this->repository->find((int)\S::get('id')) ?: ['id' => 0, 'languages' => [], 'images' => [], 'files' => [], 'pages' => []];
$languages = $this->languagesRepository->languagesList();
$menus = \admin\factory\Pages::menus_list();
$menus = $this->pagesRepository->menusList();
$layouts = $this->layoutsRepository->listAll();
$viewModel = $this->buildFormViewModel($article, $languages, $menus, $layouts);
@@ -400,8 +404,8 @@ class ArticlesController
];
$actions = [
FormAction::save('/admin/articles/article_save/' . ($articleId > 0 ? 'id=' . $articleId : ''), '/admin/articles/view_list/'),
FormAction::cancel('/admin/articles/view_list/'),
FormAction::save('/admin/articles/save/' . ($articleId > 0 ? 'id=' . $articleId : ''), '/admin/articles/list/'),
FormAction::cancel('/admin/articles/list/'),
];
return new FormEditViewModel(
@@ -412,8 +416,8 @@ class ArticlesController
$tabs,
$actions,
'POST',
'/admin/articles/article_save/' . ($articleId > 0 ? 'id=' . $articleId : ''),
'/admin/articles/view_list/',
'/admin/articles/save/' . ($articleId > 0 ? 'id=' . $articleId : ''),
'/admin/articles/list/',
true,
['id' => $articleId],
$languages
@@ -430,7 +434,7 @@ class ArticlesController
$menuId = (int)($menu['id'] ?? 0);
$menuName = $this->escapeHtml((string)($menu['name'] ?? ''));
$menuStatus = (int)($menu['status'] ?? 0);
$menuPages = \admin\factory\Pages::menu_pages($menuId);
$menuPages = $this->pagesRepository->menuPages($menuId);
$html .= '<div class="menu_sortable">';
$html .= '<ol class="sortable" id="sortable_' . $menuId . '">';

View File

@@ -92,7 +92,7 @@ class BannerController
$rows[] = [
'lp' => $lp++ . '.',
'thumbnail' => $thumbnail,
'name' => '<a href="/admin/banners/banner_edit/id=' . $id . '">' . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . '</a>',
'name' => '<a href="/admin/banners/edit/id=' . $id . '">' . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . '</a>',
'status' => $isActive ? 'tak' : '<span style="color: #FF0000;">nie</span>',
'home_page' => $homePage === 1 ? '<span class="text-system">tak</span>' : 'nie',
'slider' => $homePage === 1 ? 'nie' : '<span class="text-system">tak</span>',
@@ -101,12 +101,12 @@ class BannerController
'_actions' => [
[
'label' => 'Edytuj',
'url' => '/admin/banners/banner_edit/id=' . $id,
'url' => '/admin/banners/edit/id=' . $id,
'class' => 'btn btn-xs btn-primary',
],
[
'label' => 'Usun',
'url' => '/admin/banners/banner_delete/id=' . $id,
'url' => '/admin/banners/delete/id=' . $id,
'class' => 'btn btn-xs btn-danger',
'confirm' => 'Na pewno chcesz usunac wybrany element?',
],
@@ -147,9 +147,9 @@ class BannerController
]),
$listRequest['perPageOptions'],
$sortableColumns,
'/admin/banners/view_list/',
'/admin/banners/list/',
'Brak danych w tabeli.',
'/admin/banners/banner_edit/',
'/admin/banners/edit/',
'Dodaj baner',
'banners/banners-list-custom-script'
);
@@ -235,7 +235,7 @@ class BannerController
\S::alert('Baner zostal usuniety.');
}
header('Location: /admin/banners/view_list/');
header('Location: /admin/banners/list/');
exit;
}
@@ -307,10 +307,10 @@ class BannerController
$actions = [
FormAction::save(
'/admin/banners/banner_save/' . ($isNew ? '' : 'id=' . $bannerId),
'/admin/banners/view_list/'
'/admin/banners/save/' . ($isNew ? '' : 'id=' . $bannerId),
'/admin/banners/list/'
),
FormAction::cancel('/admin/banners/view_list/'),
FormAction::cancel('/admin/banners/list/'),
];
return new FormEditViewModel(
@@ -321,8 +321,8 @@ class BannerController
$tabs,
$actions,
'POST',
'/admin/banners/banner_save/' . ($isNew ? '' : 'id=' . $bannerId),
'/admin/banners/view_list/',
'/admin/banners/save/' . ($isNew ? '' : 'id=' . $bannerId),
'/admin/banners/list/',
true,
['id' => $bannerId],
$languages,

View File

@@ -61,16 +61,16 @@ class DictionariesController
$rows[] = [
'lp' => $lp++ . '.',
'text' => '<a href="/admin/dictionaries/unit_edit/id=' . $id . '">' . htmlspecialchars($text, ENT_QUOTES, 'UTF-8') . '</a>',
'text' => '<a href="/admin/dictionaries/edit/id=' . $id . '">' . htmlspecialchars($text, ENT_QUOTES, 'UTF-8') . '</a>',
'_actions' => [
[
'label' => 'Edytuj',
'url' => '/admin/dictionaries/unit_edit/id=' . $id,
'url' => '/admin/dictionaries/edit/id=' . $id,
'class' => 'btn btn-xs btn-primary',
],
[
'label' => 'Usun',
'url' => '/admin/dictionaries/unit_delete/id=' . $id,
'url' => '/admin/dictionaries/delete/id=' . $id,
'class' => 'btn btn-xs btn-danger',
'confirm' => 'Na pewno chcesz usunac wybrana jednostke miary?',
],
@@ -105,9 +105,9 @@ class DictionariesController
]),
$listRequest['perPageOptions'],
$sortableColumns,
'/admin/dictionaries/view_list/',
'/admin/dictionaries/list/',
'Brak danych w tabeli.',
'/admin/dictionaries/unit_edit/',
'/admin/dictionaries/edit/',
'Dodaj jednostke miary'
);
@@ -192,7 +192,7 @@ class DictionariesController
\S::alert('Jednostka miary zostala usunieta.');
}
header('Location: /admin/dictionaries/view_list/');
header('Location: /admin/dictionaries/list/');
exit;
}
@@ -226,10 +226,10 @@ class DictionariesController
]),
];
$actionUrl = '/admin/dictionaries/unit_save/' . ($isNew ? '' : ('id=' . $unitId));
$actionUrl = '/admin/dictionaries/save/' . ($isNew ? '' : ('id=' . $unitId));
$actions = [
FormAction::save($actionUrl, '/admin/dictionaries/view_list/'),
FormAction::cancel('/admin/dictionaries/view_list/'),
FormAction::save($actionUrl, '/admin/dictionaries/list/'),
FormAction::cancel('/admin/dictionaries/list/'),
];
return new FormEditViewModel(
@@ -241,7 +241,7 @@ class DictionariesController
$actions,
'POST',
$actionUrl,
'/admin/dictionaries/view_list/',
'/admin/dictionaries/list/',
true,
['id' => $unitId],
$languages,

View File

@@ -74,18 +74,18 @@ class LayoutsController
$rows[] = [
'lp' => $lp++ . '.',
'name' => '<a href="/admin/layouts/layout_edit/id=' . $id . '">' . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . '</a>',
'name' => '<a href="/admin/layouts/edit/id=' . $id . '">' . htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . '</a>',
'status' => ((int)($item['status'] ?? 0) === 1) ? '<span class="text-system">tak</span>' : 'nie',
'categories_default' => ((int)($item['categories_default'] ?? 0) === 1) ? '<span class="text-system">tak</span>' : 'nie',
'_actions' => [
[
'label' => 'Edytuj',
'url' => '/admin/layouts/layout_edit/id=' . $id,
'url' => '/admin/layouts/edit/id=' . $id,
'class' => 'btn btn-xs btn-primary',
],
[
'label' => 'Usun',
'url' => '/admin/layouts/layout_delete/id=' . $id,
'url' => '/admin/layouts/delete/id=' . $id,
'class' => 'btn btn-xs btn-danger',
'confirm' => 'Na pewno chcesz usunac wybrany szablon?',
],
@@ -122,9 +122,9 @@ class LayoutsController
]),
$listRequest['perPageOptions'],
$sortableColumns,
'/admin/layouts/view_list/',
'/admin/layouts/list/',
'Brak danych w tabeli.',
'/admin/layouts/layout_edit/',
'/admin/layouts/edit/',
'Dodaj szablon'
);
@@ -165,7 +165,7 @@ class LayoutsController
\S::alert('Szablon zostal usuniety.');
}
header('Location: /admin/layouts/view_list/');
header('Location: /admin/layouts/list/');
exit;
}

View File

@@ -0,0 +1,660 @@
<?php
namespace admin\Controllers;
use Domain\Pages\PagesRepository;
use Domain\Languages\LanguagesRepository;
use Domain\Layouts\LayoutsRepository;
use admin\ViewModels\Forms\FormAction;
use admin\ViewModels\Forms\FormEditViewModel;
use admin\ViewModels\Forms\FormField;
use admin\ViewModels\Forms\FormTab;
class PagesController
{
private PagesRepository $repository;
private LanguagesRepository $languagesRepository;
private LayoutsRepository $layoutsRepository;
public function __construct(
PagesRepository $repository,
LanguagesRepository $languagesRepository,
LayoutsRepository $layoutsRepository
) {
$this->repository = $repository;
$this->languagesRepository = $languagesRepository;
$this->layoutsRepository = $layoutsRepository;
}
public function list(): string
{
return \Tpl::view('pages/pages-list', [
'menus' => $this->repository->menusWithPages(),
'cookie_pages' => $this->cookieState('cookie_pages'),
'cookie_menus' => $this->cookieState('cookie_menus'),
]);
}
public function browseList(): string
{
$menus = $this->repository->menusWithPages();
$defaultLanguage = $this->languagesRepository->defaultLanguageId();
foreach ($menus as $index => $menu) {
$menus[$index]['pages'] = $this->withPreviewUrls($menu['pages'] ?? [], $defaultLanguage);
}
return \Tpl::view('pages/pages-browse-list', [
'menus' => $menus,
'modal' => \S::get('modal'),
'cookie_pages' => $this->cookieState('cookie_pages'),
'cookie_menus' => $this->cookieState('cookie_menus'),
]);
}
public function pagesUrlBrowser(): string
{
return $this->browseList();
}
public function menuEdit(): string
{
$menu = $this->repository->menuDetails((int)\S::get('id'));
return \Tpl::view('pages/menu-edit', [
'form' => $this->buildMenuFormViewModel($menu),
]);
}
public function menuSave(): void
{
$legacyValues = \S::get('values');
if ($legacyValues) {
$response = ['status' => 'error', 'msg' => 'Podczas zapisywania menu wystapil blad. Prosze sprobowac ponownie.'];
$values = json_decode((string)$legacyValues, true);
if (is_array($values) && $this->repository->menuSave(
(int)($values['id'] ?? 0),
(string)($values['name'] ?? ''),
$values['status'] ?? 0
)) {
$response = ['status' => 'ok', 'msg' => 'Menu zostalo zapisane.'];
}
echo json_encode($response);
exit;
}
$menuId = (int)\S::get('id');
$name = trim((string)\S::get('name'));
$status = \S::get('status');
if ($name === '') {
echo json_encode([
'success' => false,
'errors' => ['name' => 'Pole "Nazwa" jest wymagane.'],
]);
exit;
}
if ($this->repository->menuSave($menuId, $name, $status)) {
echo json_encode([
'success' => true,
'message' => 'Menu zostalo zapisane.',
]);
exit;
}
echo json_encode([
'success' => false,
'errors' => ['general' => 'Podczas zapisywania menu wystapil blad. Prosze sprobowac ponownie.'],
]);
exit;
}
/**
* @param array<string, mixed> $menu
*/
private function buildMenuFormViewModel(array $menu): FormEditViewModel
{
$menuId = (int)($menu['id'] ?? 0);
$actionUrl = '/admin/pages/menuSave/' . ($menuId > 0 ? ('id=' . $menuId) : '');
$fields = [
FormField::hidden('id', $menuId),
FormField::text('name', [
'label' => 'Nazwa',
'required' => true,
'attributes' => ['class' => 'require'],
'value' => (string)($menu['name'] ?? ''),
]),
FormField::switch('status', [
'label' => 'Aktywne',
'value' => (int)($menu['status'] ?? 0) === 1,
]),
];
$actions = [
FormAction::save($actionUrl, '/admin/pages/list/'),
FormAction::cancel('/admin/pages/list/'),
];
return new FormEditViewModel(
'pages-menu-edit',
'Zapisz menu',
$menu,
$fields,
[],
$actions,
'POST',
$actionUrl,
'/admin/pages/list/',
true,
['id' => $menuId]
);
}
public function menuDelete(): void
{
if ($this->repository->menuDelete((int)\S::get('id'))) {
\S::set_message('Menu zostało usunięte.');
} else {
\S::alert('Podczas usuwania menu wystąpił błąd. Aby usunąć menu, nie może ono posiadać przypiętych stron.');
}
header('Location: /admin/pages/list/');
exit;
}
public function edit(): string
{
$page = $this->repository->pageDetails((int)\S::get('id'));
$parentId = (int)\S::get('pid');
$menuId = (int)\S::get('menu_id');
$menus = $this->repository->menusList();
$layouts = $this->layoutsRepository->listAll();
$languages = $this->languagesRepository->languagesList();
return \Tpl::view('pages/page-edit', [
'form' => $this->buildPageFormViewModel(
$page,
$parentId,
$menuId,
$menus,
$layouts,
$languages
),
]);
}
public function save(): void
{
$legacyValues = \S::get('values');
if ($legacyValues) {
$response = ['status' => 'error', 'msg' => 'Podczas zapisywania strony wystapil blad. Prosze sprobowac ponownie.'];
$values = json_decode((string)$legacyValues, true);
if (is_array($values)) {
$id = $this->repository->pageSave($values);
if (!empty($id)) {
$response = [
'status' => 'ok',
'msg' => 'Strona zostala zapisana.',
'id' => (int)$id,
];
}
}
echo json_encode($response);
exit;
}
$data = $_POST;
if (!isset($data['id']) || $data['id'] === '') {
$data['id'] = (int)\S::get('id');
}
if (!isset($data['parent_id']) || $data['parent_id'] === '') {
$data['parent_id'] = (int)\S::get('pid');
}
if ((!isset($data['menu_id']) || $data['menu_id'] === '') && (int)\S::get('menu_id') > 0) {
$data['menu_id'] = (int)\S::get('menu_id');
}
$savedId = $this->repository->pageSave($data);
if (!empty($savedId)) {
echo json_encode([
'success' => true,
'message' => 'Strona zostala zapisana.',
'id' => (int)$savedId,
]);
exit;
}
echo json_encode([
'success' => false,
'errors' => ['general' => 'Podczas zapisywania strony wystapil blad. Prosze sprobowac ponownie.'],
]);
exit;
}
/**
* @param array<string, mixed> $page
* @param array<int, array<string, mixed>> $menus
* @param array<int, array<string, mixed>> $layouts
* @param array<int, array<string, mixed>> $languages
*/
private function buildPageFormViewModel(
array $page,
int $parentId,
int $menuId,
array $menus,
array $layouts,
array $languages
): FormEditViewModel {
$pageId = (int)($page['id'] ?? 0);
$isNew = $pageId <= 0;
$resolvedParentId = $pageId > 0 ? (int)($page['parent_id'] ?? 0) : $parentId;
$resolvedMenuId = $pageId > 0 ? (int)($page['menu_id'] ?? 0) : $menuId;
$menuOptions = [];
foreach ($menus as $menu) {
$id = (int)($menu['id'] ?? 0);
if ($id <= 0) {
continue;
}
$menuOptions[$id] = (string)($menu['name'] ?? '');
}
$layoutOptions = ['' => '---- szablon ----'];
foreach ($layouts as $layout) {
$id = (int)($layout['id'] ?? 0);
if ($id <= 0) {
continue;
}
$layoutOptions[$id] = (string)($layout['name'] ?? '');
}
$data = [
'id' => $pageId,
'parent_id' => $resolvedParentId > 0 ? $resolvedParentId : '',
'menu_id' => $resolvedMenuId > 0 ? $resolvedMenuId : '',
'page_type' => (int)($page['page_type'] ?? 0),
'sort_type' => (int)($page['sort_type'] ?? 0),
'layout_id' => (int)($page['layout_id'] ?? 0),
'articles_limit' => (int)($page['articles_limit'] ?? 2),
'show_title' => (int)($page['show_title'] ?? 1),
'status' => (int)($page['status'] ?? 1),
'start' => (int)($page['start'] ?? 0),
'category_id' => (int)($page['category_id'] ?? 0),
'languages' => [],
];
foreach ($languages as $language) {
$langId = (string)($language['id'] ?? '');
if ($langId === '') {
continue;
}
$translation = is_array($page['languages'][$langId] ?? null) ? $page['languages'][$langId] : [];
$data['languages'][$langId] = [
'title' => (string)($translation['title'] ?? ''),
'link' => (string)($translation['link'] ?? ''),
'seo_link' => (string)($translation['seo_link'] ?? ''),
'page_title' => (string)($translation['page_title'] ?? ''),
'meta_title' => (string)($translation['meta_title'] ?? ''),
'meta_description' => (string)($translation['meta_description'] ?? ''),
'meta_keywords' => (string)($translation['meta_keywords'] ?? ''),
'noindex' => (int)($translation['noindex'] ?? 0),
'canonical' => (string)($translation['canonical'] ?? ''),
];
}
$tabs = [
new FormTab('content', 'Tresc', 'fa-file'),
new FormTab('settings', 'Ustawienia', 'fa-wrench'),
new FormTab('seo', 'SEO', 'fa-globe'),
];
$fields = [
FormField::hidden('id', $pageId),
FormField::hidden('parent_id', $resolvedParentId > 0 ? $resolvedParentId : ''),
FormField::langSection('page_content', 'content', [
FormField::text('title', [
'label' => 'Nazwa strony',
'required' => true,
]),
]),
FormField::select('menu_id', [
'label' => 'Menu',
'tab' => 'settings',
'options' => $menuOptions,
'value' => $resolvedMenuId > 0 ? $resolvedMenuId : '',
]),
FormField::select('page_type', [
'label' => 'Typ strony',
'tab' => 'settings',
'options' => $this->repository->pageTypes(),
'attributes' => ['id' => 'page_type'],
'value' => (int)($page['page_type'] ?? 0),
]),
FormField::langSection('page_links', 'settings', [
FormField::text('link', [
'label' => 'Link',
]),
]),
FormField::text('category_id', [
'label' => 'ID kategorii',
'tab' => 'settings',
'attributes' => ['id' => 'category_id'],
'value' => (int)($page['category_id'] ?? 0),
]),
FormField::select('sort_type', [
'label' => 'Sortowanie artykulow',
'tab' => 'settings',
'attributes' => ['id' => 'sort_type'],
'options' => $this->repository->sortTypes(),
'value' => (int)($page['sort_type'] ?? 0),
]),
FormField::select('layout_id', [
'label' => 'Szablon',
'tab' => 'settings',
'attributes' => ['id' => 'layout_id'],
'options' => $layoutOptions,
'value' => (int)($page['layout_id'] ?? 0),
]),
FormField::text('articles_limit', [
'label' => 'Liczba artykulow na stronie',
'tab' => 'settings',
'attributes' => ['id' => 'articles_limit'],
'value' => (int)($page['articles_limit'] ?? 2),
]),
FormField::switch('show_title', [
'label' => 'Pokaz tytul',
'tab' => 'settings',
'value' => (int)($page['show_title'] ?? 0) === 1 || $isNew,
]),
FormField::switch('status', [
'label' => 'Aktywna',
'tab' => 'settings',
'value' => (int)($page['status'] ?? 0) === 1 || $isNew,
]),
FormField::switch('start', [
'label' => 'Strona startowa',
'tab' => 'settings',
'value' => (int)($page['start'] ?? 0) === 1,
]),
FormField::langSection('page_seo', 'seo', [
FormField::text('seo_link', [
'label' => 'Link SEO',
'attributes' => [
'icon_content' => 'generuj',
'icon_js' => 'generateSeoLinkForButton(\'{lang}\')',
],
]),
FormField::text('page_title', [
'label' => 'Tytul strony (h1)',
]),
FormField::text('meta_title', [
'label' => 'Meta title',
]),
FormField::textarea('meta_description', [
'label' => 'Meta description',
]),
FormField::textarea('meta_keywords', [
'label' => 'Meta keywords',
]),
FormField::select('noindex', [
'label' => 'Blokuj indeksacje',
'options' => [0 => 'nie', 1 => 'tak'],
]),
FormField::text('canonical', [
'label' => 'Rel canonical',
]),
]),
FormField::custom('page_edit_script', '
<script type="text/javascript">
(function () {
function toggleByType() {
var pageType = String($(\'#page_type\').val() || \'\');
var $links = $(\'#languages-page_links\');
var $category = $(\'#category_id\').closest(\'.form-group\');
var $articlesLimit = $(\'#articles_limit\').closest(\'.form-group\');
var $sortType = $(\'#sort_type\').closest(\'.form-group\');
if (pageType === \'0\' || pageType === \'1\' || pageType === \'2\') {
$articlesLimit.show();
$sortType.show();
$links.addClass(\'hide\');
$category.hide();
} else if (pageType === \'3\') {
$links.removeClass(\'hide\');
$articlesLimit.hide();
$sortType.hide();
$category.hide();
} else if (pageType === \'5\') {
$category.show();
$links.addClass(\'hide\');
$articlesLimit.hide();
$sortType.hide();
} else {
$links.addClass(\'hide\');
$category.hide();
$articlesLimit.hide();
$sortType.hide();
}
}
function generateSeoLink(langId, title) {
if (!title) {
return;
}
$.ajax({
type: \'POST\',
cache: false,
url: \'/admin/pages/generateSeoLink/\',
data: {
title: title,
page_id: ' . $pageId . '
},
success: function (data) {
var response = data;
if (typeof data === \'string\') {
try { response = JSON.parse(data); } catch (e) { response = null; }
}
if (response && response.status === \'ok\') {
$(\'#seo_link_\' + langId).val(response.seo_link || \'\');
}
}
});
}
window.generateSeoLinkForButton = function (langId) {
var title = $(\'#title_\' + langId).val() || \'\';
generateSeoLink(langId, title);
};
$(function () {
$(\'#page_type\').on(\'change\', toggleByType);
toggleByType();
$(\'[id^=title_]\').on(\'blur\', function () {
var fieldId = $(this).attr(\'id\') || \'\';
var langId = fieldId.replace(/^title_/, \'\');
if (!langId) {
return;
}
var $seo = $(\'#seo_link_\' + langId);
if ($seo.length && !$seo.val()) {
generateSeoLink(langId, $(this).val());
}
});
});
})();
</script>', [
'tab' => 'settings',
]),
];
$actionUrl = '/admin/pages/save/' . ($pageId > 0 ? ('id=' . $pageId) : '');
$actions = [
FormAction::save($actionUrl, '/admin/pages/list/'),
FormAction::cancel('/admin/pages/list/'),
];
return new FormEditViewModel(
'pages-page-edit',
'Edycja strony',
$data,
$fields,
$tabs,
$actions,
'POST',
$actionUrl,
'/admin/pages/list/',
true,
[
'id' => $pageId,
'parent_id' => $resolvedParentId > 0 ? $resolvedParentId : '',
],
$languages
);
}
public function delete(): void
{
if ($this->repository->pageDelete((int)\S::get('id'))) {
\S::set_message('Strona zostala usunieta.');
} else {
\S::alert('Podczas usuwania strony wystapil blad. Aby usunac strone nie moze ona posiadac przypietych podstron.');
}
header('Location: /admin/pages/list/');
exit;
}
public function pageArticles(): string
{
$pageId = (int)\S::get('id');
return \Tpl::view('pages/page-articles', [
'page_id' => $pageId,
'articles' => $this->repository->pageArticles($pageId),
]);
}
public function savePagesOrder(): void
{
$response = ['status' => 'error', 'msg' => 'Podczas zapisywania kolejnosci stron wystapil blad. Prosze sprobowac ponownie.'];
if ($this->repository->savePagesOrder((int)\S::get('menu_id'), \S::get('pages'))) {
$response = ['status' => 'ok'];
}
echo json_encode($response);
exit;
}
public function saveArticlesOrder(): void
{
$response = ['status' => 'error', 'msg' => 'Podczas zapisywania kolejnosci wyswietlania artykulow wystapil blad. Prosze sprobowac ponownie.'];
if ($this->repository->saveArticlesOrder((int)\S::get('page_id'), \S::get('articles'))) {
$response = ['status' => 'ok'];
}
echo json_encode($response);
exit;
}
public function generateSeoLink(): void
{
$response = ['status' => 'error', 'msg' => 'Podczas generowania pola "seo link" wystapil blad. Prosze sprobowac ponownie.'];
$seoLink = $this->repository->generateSeoLink(
(string)\S::get('title'),
(int)\S::get('page_id'),
(int)\S::get('article_id'),
(int)\S::get('category_id')
);
if ($seoLink !== '') {
$response = [
'status' => 'ok',
'seo_link' => $seoLink,
];
}
echo json_encode($response);
exit;
}
public function cookieMenus(): void
{
$this->repository->toggleCookieValue('cookie_menus', (int)\S::get('menu_id'));
exit;
}
public function cookiePages(): void
{
$this->repository->toggleCookieValue('cookie_pages', (int)\S::get('page_id'));
exit;
}
/**
* @param array<int, array<string, mixed>> $pages
* @return array<int, array<string, mixed>>
*/
private function withPreviewUrls(array $pages, string $defaultLanguage): array
{
foreach ($pages as $index => $page) {
$pageId = (int)($page['id'] ?? 0);
$languages = is_array($page['languages'] ?? null) ? $page['languages'] : [];
$previewUrls = [];
foreach ($languages as $languageRow) {
$langId = (string)($languageRow['lang_id'] ?? '');
if ($langId === '') {
continue;
}
$previewUrls[$langId] = $this->repository->pageUrlPreview(
$pageId,
$langId,
(string)($languageRow['title'] ?? ''),
(string)($languageRow['seo_link'] ?? ''),
$defaultLanguage
);
}
$page['preview_urls'] = $previewUrls;
$page['subpages'] = $this->withPreviewUrls($page['subpages'] ?? [], $defaultLanguage);
$pages[$index] = $page;
}
return $pages;
}
/**
* @return array<int, int>
*/
private function cookieState(string $cookieName): array
{
if (empty($_COOKIE[$cookieName])) {
return [];
}
$decoded = @unserialize((string)$_COOKIE[$cookieName], ['allowed_classes' => false]);
if (!is_array($decoded)) {
return [];
}
$state = [];
foreach ($decoded as $key => $value) {
$state[(int)$key] = (int)$value;
}
return $state;
}
}

View File

@@ -140,7 +140,7 @@ class ProductArchiveController
]),
$listRequest['perPageOptions'],
$sortableColumns,
'/admin/product_archive/products_list/',
'/admin/product_archive/list/',
'Brak danych w tabeli.',
null,
null,
@@ -159,7 +159,7 @@ class ProductArchiveController
else
\S::alert( 'Podczas przywracania produktu z archiwum wystąpił błąd. Proszę spróbować ponownie' );
header( 'Location: /admin/product_archive/products_list/' );
header( 'Location: /admin/product_archive/list/' );
exit;
}
}

View File

@@ -71,18 +71,18 @@ class ScontainersController
$rows[] = [
'lp' => $lp++ . '.',
'title' => '<a href="/admin/scontainers/container_edit/id=' . $id . '">' . htmlspecialchars($title, ENT_QUOTES, 'UTF-8') . '</a>',
'title' => '<a href="/admin/scontainers/edit/id=' . $id . '">' . htmlspecialchars($title, ENT_QUOTES, 'UTF-8') . '</a>',
'code' => '[KONTENER:' . $id . ']',
'status' => ((int)($item['status'] ?? 0) === 1) ? 'tak' : '<span style="color: #FF0000;">nie</span>',
'_actions' => [
[
'label' => 'Edytuj',
'url' => '/admin/scontainers/container_edit/id=' . $id,
'url' => '/admin/scontainers/edit/id=' . $id,
'class' => 'btn btn-xs btn-primary',
],
[
'label' => 'Usun',
'url' => '/admin/scontainers/container_delete/id=' . $id,
'url' => '/admin/scontainers/delete/id=' . $id,
'class' => 'btn btn-xs btn-danger',
'confirm' => 'Na pewno chcesz usunac wybrany kontener?',
],
@@ -119,9 +119,9 @@ class ScontainersController
]),
$listRequest['perPageOptions'],
$sortableColumns,
'/admin/scontainers/view_list/',
'/admin/scontainers/list/',
'Brak danych w tabeli.',
'/admin/scontainers/container_edit/',
'/admin/scontainers/edit/',
'Dodaj kontener'
);
@@ -218,7 +218,7 @@ class ScontainersController
\S::alert('Kontener zostal usuniety.');
}
header('Location: /admin/scontainers/view_list/');
header('Location: /admin/scontainers/list/');
exit;
}
@@ -266,10 +266,10 @@ class ScontainersController
new FormTab('settings', 'Ustawienia', 'fa-wrench'),
];
$actionUrl = '/admin/scontainers/container_save/' . ($isNew ? '' : ('id=' . $id));
$actionUrl = '/admin/scontainers/save/' . ($isNew ? '' : ('id=' . $id));
$actions = [
FormAction::save($actionUrl, '/admin/scontainers/view_list/'),
FormAction::cancel('/admin/scontainers/view_list/'),
FormAction::save($actionUrl, '/admin/scontainers/list/'),
FormAction::cancel('/admin/scontainers/list/'),
];
return new FormEditViewModel(
@@ -281,7 +281,7 @@ class ScontainersController
$actions,
'POST',
$actionUrl,
'/admin/scontainers/view_list/',
'/admin/scontainers/list/',
true,
[],
$languages,

View File

@@ -309,7 +309,7 @@ class SettingsController
];
$actions = [
FormAction::save('/admin/settings/settings_save/', ''),
FormAction::save('/admin/settings/save/', ''),
];
return new FormEditViewModel(
@@ -320,7 +320,7 @@ class SettingsController
$tabs,
$actions,
'POST',
'/admin/settings/settings_save/',
'/admin/settings/save/',
null,
false,
[],