From 5e9b998043f5ba32e429768d867c2e93e9bf7c0c Mon Sep 17 00:00:00 2001 From: Jacek Pyziak Date: Thu, 12 Feb 2026 22:28:57 +0100 Subject: [PATCH] Release 0.255: migrate remaining Languages usages to repository DI --- PROJECT_STRUCTURE.md | 7 +++++++ REFACTORING_PLAN.md | 7 +++++++ TESTING.md | 7 +++++++ .../admin/Controllers/ArticlesController.php | 7 +++++-- autoload/admin/Controllers/BannerController.php | 9 ++++++--- .../Controllers/DictionariesController.php | 9 ++++++--- .../admin/Controllers/SettingsController.php | 9 ++++++--- autoload/admin/class.Site.php | 12 ++++++++---- autoload/admin/controls/class.Pages.php | 2 +- autoload/admin/controls/class.Scontainers.php | 2 +- autoload/admin/controls/class.ShopAttribute.php | 4 ++-- autoload/admin/controls/class.ShopCategory.php | 4 ++-- autoload/admin/controls/class.ShopProducer.php | 4 ++-- autoload/admin/controls/class.ShopProduct.php | 2 +- autoload/admin/factory/class.Languages.php | 4 +--- autoload/admin/factory/class.ShopAttribute.php | 4 ++-- autoload/admin/factory/class.ShopProducer.php | 6 +++--- autoload/admin/factory/class.ShopProduct.php | 4 ++-- .../Controllers/ArticlesControllerTest.php | 10 +++++++--- .../Controllers/DictionariesControllerTest.php | 10 +++++++--- .../Controllers/SettingsControllerTest.php | 7 +++++-- updates/0.20/ver_0.255.zip | Bin 0 -> 35183 bytes updates/0.20/ver_0.255_files.txt | 0 updates/changelog.php | 7 ++++++- updates/versions.php | 2 +- 25 files changed, 95 insertions(+), 44 deletions(-) create mode 100644 updates/0.20/ver_0.255.zip create mode 100644 updates/0.20/ver_0.255_files.txt diff --git a/PROJECT_STRUCTURE.md b/PROJECT_STRUCTURE.md index aa1961c..75d5034 100644 --- a/PROJECT_STRUCTURE.md +++ b/PROJECT_STRUCTURE.md @@ -402,3 +402,10 @@ Aktualnie w suite są też testy modułów `Dictionaries`, `Articles` i `Users` - Modul `/admin/languages/` (jezyki + tlumaczenia) dziala na nowym routingu DI. - Widoki jezykow przepiete na `components/table-list` i `components/form-edit`. - Usunieto legacy: `autoload/admin/controls/class.Languages.php`, `autoload/admin/view/class.Languages.php`. + +## Aktualizacja 2026-02-12 (ver. 0.255) +- UPDATE: admin/Controllers/SettingsController, BannerController, DictionariesController, ArticlesController pobieraja listy jezykow przez Domain/Languages/LanguagesRepository (DI), bez zaleznosci od admin/factory/Languages. +- UPDATE: w admin/Site fabryki DI dla Articles, Banners, Settings, Dictionaries przekazuja rowniez LanguagesRepository. +- UPDATE: legacy admin/controls/* oraz admin/factory/Shop* przepiete z admin/factory/Languages::languages_list() na bezposrednie wywolania LanguagesRepository. +- FIX: autoload/admin/factory/class.Languages.php uzywa pelnego znacznika repository = $repository; + $this->languagesRepository = $languagesRepository; } /** @@ -185,7 +188,7 @@ class ArticlesController return \Tpl::view('articles/article-edit', [ 'article' => $this->repository->find((int)\S::get('id')), 'menus' => \admin\factory\Pages::menus_list(), - 'languages' => \admin\factory\Languages::languages_list(), + 'languages' => $this->languagesRepository->languagesList(), 'layouts' => \admin\factory\Layouts::layouts_list(), 'user' => $user ]); diff --git a/autoload/admin/Controllers/BannerController.php b/autoload/admin/Controllers/BannerController.php index 666a64c..846a068 100644 --- a/autoload/admin/Controllers/BannerController.php +++ b/autoload/admin/Controllers/BannerController.php @@ -2,6 +2,7 @@ namespace admin\Controllers; use Domain\Banner\BannerRepository; +use Domain\Languages\LanguagesRepository; use admin\ViewModels\Forms\FormEditViewModel; use admin\ViewModels\Forms\FormField; use admin\ViewModels\Forms\FormTab; @@ -11,11 +12,13 @@ use admin\Support\Forms\FormRequestHandler; class BannerController { private BannerRepository $repository; + private LanguagesRepository $languagesRepository; private FormRequestHandler $formHandler; - public function __construct(BannerRepository $repository) + public function __construct(BannerRepository $repository, LanguagesRepository $languagesRepository) { $this->repository = $repository; + $this->languagesRepository = $languagesRepository; $this->formHandler = new FormRequestHandler(); } @@ -163,7 +166,7 @@ class BannerController { $bannerId = (int)\S::get('id'); $banner = $this->repository->find($bannerId); - $languages = \admin\factory\Languages::languages_list(); + $languages = $this->languagesRepository->languagesList(); // Sprawdź czy są błędy walidacji z poprzedniego requestu $validationErrors = $_SESSION['form_errors'][$this->getFormId()] ?? null; @@ -185,7 +188,7 @@ class BannerController $bannerId = (int)\S::get('id'); $banner = $this->repository->find($bannerId); - $languages = \admin\factory\Languages::languages_list(); + $languages = $this->languagesRepository->languagesList(); $viewModel = $this->buildFormViewModel($banner, $languages); diff --git a/autoload/admin/Controllers/DictionariesController.php b/autoload/admin/Controllers/DictionariesController.php index e11e8a8..259d61c 100644 --- a/autoload/admin/Controllers/DictionariesController.php +++ b/autoload/admin/Controllers/DictionariesController.php @@ -2,6 +2,7 @@ namespace admin\Controllers; use Domain\Dictionaries\DictionariesRepository; +use Domain\Languages\LanguagesRepository; use admin\ViewModels\Forms\FormAction; use admin\ViewModels\Forms\FormEditViewModel; use admin\ViewModels\Forms\FormField; @@ -11,11 +12,13 @@ use admin\Support\Forms\FormRequestHandler; class DictionariesController { private DictionariesRepository $repository; + private LanguagesRepository $languagesRepository; private FormRequestHandler $formHandler; - public function __construct(DictionariesRepository $repository) + public function __construct(DictionariesRepository $repository, LanguagesRepository $languagesRepository) { $this->repository = $repository; + $this->languagesRepository = $languagesRepository; $this->formHandler = new FormRequestHandler(); } @@ -117,7 +120,7 @@ class DictionariesController { $unitId = (int)\S::get('id'); $unit = $this->repository->find($unitId) ?? ['id' => 0, 'languages' => []]; - $languages = \admin\factory\Languages::languages_list(); + $languages = $this->languagesRepository->languagesList(); $validationErrors = $_SESSION['form_errors'][$this->getFormId()] ?? null; if ($validationErrors) { @@ -152,7 +155,7 @@ class DictionariesController $unitId = (int)\S::get('id'); $unit = $this->repository->find($unitId) ?? ['id' => 0, 'languages' => []]; - $languages = \admin\factory\Languages::languages_list(); + $languages = $this->languagesRepository->languagesList(); $viewModel = $this->buildFormViewModel($unit, $languages); $result = $this->formHandler->handleSubmit($viewModel, $_POST); diff --git a/autoload/admin/Controllers/SettingsController.php b/autoload/admin/Controllers/SettingsController.php index 68dfaf1..b0318fa 100644 --- a/autoload/admin/Controllers/SettingsController.php +++ b/autoload/admin/Controllers/SettingsController.php @@ -1,6 +1,7 @@ settingsRepository = $settingsRepository; + $this->languagesRepository = $languagesRepository; $this->formHandler = new FormRequestHandler(); } @@ -83,7 +86,7 @@ class SettingsController exit; } - $languages = \admin\factory\Languages::languages_list(); + $languages = $this->languagesRepository->languagesList(); $settings = $this->settingsRepository->getSettings(); $viewModel = $this->buildFormViewModel($settings, $languages); @@ -113,7 +116,7 @@ class SettingsController */ public function view(): string { - $languages = \admin\factory\Languages::languages_list(); + $languages = $this->languagesRepository->languagesList(); $settings = $this->settingsRepository->getSettings(); $validationErrors = $_SESSION['form_errors'][$this->getFormId()] ?? null; diff --git a/autoload/admin/class.Site.php b/autoload/admin/class.Site.php index 015134a..5e14bd6 100644 --- a/autoload/admin/class.Site.php +++ b/autoload/admin/class.Site.php @@ -206,21 +206,24 @@ class Site global $mdb; return new \admin\Controllers\ArticlesController( - new \Domain\Article\ArticleRepository( $mdb ) + new \Domain\Article\ArticleRepository( $mdb ), + new \Domain\Languages\LanguagesRepository( $mdb ) ); }, 'Banners' => function() { global $mdb; return new \admin\Controllers\BannerController( - new \Domain\Banner\BannerRepository( $mdb ) + new \Domain\Banner\BannerRepository( $mdb ), + new \Domain\Languages\LanguagesRepository( $mdb ) ); }, 'Settings' => function() { global $mdb; return new \admin\Controllers\SettingsController( - new \Domain\Settings\SettingsRepository( $mdb ) + new \Domain\Settings\SettingsRepository( $mdb ), + new \Domain\Languages\LanguagesRepository( $mdb ) ); }, 'ProductArchive' => function() { @@ -242,7 +245,8 @@ class Site global $mdb; return new \admin\Controllers\DictionariesController( - new \Domain\Dictionaries\DictionariesRepository( $mdb ) + new \Domain\Dictionaries\DictionariesRepository( $mdb ), + new \Domain\Languages\LanguagesRepository( $mdb ) ); }, 'Filemanager' => function() { diff --git a/autoload/admin/controls/class.Pages.php b/autoload/admin/controls/class.Pages.php index 4ec7b89..afd9d64 100644 --- a/autoload/admin/controls/class.Pages.php +++ b/autoload/admin/controls/class.Pages.php @@ -67,7 +67,7 @@ class Pages 'menu_id' => \S::get( 'menu_id' ), 'menus' => \admin\factory\Pages::menu_lists(), 'layouts' => \admin\factory\Layouts::layouts_list(), - 'languages' => \admin\factory\Languages::languages_list() + 'languages' => ( new \Domain\Languages\LanguagesRepository( $GLOBALS['mdb'] ) )->languagesList() ] ); } diff --git a/autoload/admin/controls/class.Scontainers.php b/autoload/admin/controls/class.Scontainers.php index 3fa2279..d06e63e 100644 --- a/autoload/admin/controls/class.Scontainers.php +++ b/autoload/admin/controls/class.Scontainers.php @@ -29,7 +29,7 @@ class Scontainers \admin\factory\Scontainers::container_details( \S::get( 'id' ) ), - \admin\factory\Languages::languages_list() + ( new \Domain\Languages\LanguagesRepository( $GLOBALS['mdb'] ) )->languagesList() ); } diff --git a/autoload/admin/controls/class.ShopAttribute.php b/autoload/admin/controls/class.ShopAttribute.php index ec7e043..6148546 100644 --- a/autoload/admin/controls/class.ShopAttribute.php +++ b/autoload/admin/controls/class.ShopAttribute.php @@ -31,7 +31,7 @@ class ShopAttribute return \Tpl::view( 'shop-attribute/values-edit', [ 'attribute' => \admin\factory\ShopAttribute::attribute_details( (int) \S::get( 'attribute-id' ) ), 'values' => \admin\factory\ShopAttribute::get_attribute_values( (int) \S::get( 'attribute-id' ) ), - 'languages' => \admin\factory\Languages::languages_list() + 'languages' => ( new \Domain\Languages\LanguagesRepository( $GLOBALS['mdb'] ) )->languagesList() ] ); } @@ -60,7 +60,7 @@ class ShopAttribute { return \Tpl::view( 'shop-attribute/attribute-edit', [ 'attribute' => \admin\factory\ShopAttribute::attribute_details( (int) \S::get( 'id' ) ), - 'languages' => \admin\factory\Languages::languages_list() + 'languages' => ( new \Domain\Languages\LanguagesRepository( $GLOBALS['mdb'] ) )->languagesList() ] ); } diff --git a/autoload/admin/controls/class.ShopCategory.php b/autoload/admin/controls/class.ShopCategory.php index f3dd42f..9966704 100644 --- a/autoload/admin/controls/class.ShopCategory.php +++ b/autoload/admin/controls/class.ShopCategory.php @@ -51,7 +51,7 @@ class ShopCategory \S::get( 'id' ) ), \S::get( 'pid' ), - \admin\factory\Languages::languages_list() + ( new \Domain\Languages\LanguagesRepository( $GLOBALS['mdb'] ) )->languagesList() ); } @@ -63,4 +63,4 @@ class ShopCategory 'dlang' => \front\factory\Languages::default_language() ] ); } -} \ No newline at end of file +} diff --git a/autoload/admin/controls/class.ShopProducer.php b/autoload/admin/controls/class.ShopProducer.php index 03fe750..815e695 100644 --- a/autoload/admin/controls/class.ShopProducer.php +++ b/autoload/admin/controls/class.ShopProducer.php @@ -26,7 +26,7 @@ class ShopProducer { return \Tpl::view( 'shop-producer/edit', [ 'producer' => \S::get( 'id' ) ? new \shop\Producer( \S::get( 'id' ) ) : null, - 'languages' => \admin\factory\Languages::languages_list() + 'languages' => ( new \Domain\Languages\LanguagesRepository( $GLOBALS['mdb'] ) )->languagesList() ] ); } @@ -34,4 +34,4 @@ class ShopProducer { return \Tpl::view( 'shop-producer/list' ); } -} \ No newline at end of file +} diff --git a/autoload/admin/controls/class.ShopProduct.php b/autoload/admin/controls/class.ShopProduct.php index e076736..d0181bc 100644 --- a/autoload/admin/controls/class.ShopProduct.php +++ b/autoload/admin/controls/class.ShopProduct.php @@ -242,7 +242,7 @@ class ShopProduct return \Tpl::view( 'shop-product/product-edit', [ 'product' => \admin\factory\ShopProduct::product_details( (int) \S::get( 'id' ) ), - 'languages' => \admin\factory\Languages::languages_list(), + 'languages' => ( new \Domain\Languages\LanguagesRepository( $GLOBALS['mdb'] ) )->languagesList(), 'categories' => \admin\factory\ShopCategory::subcategories( null ), 'layouts' => \admin\factory\Layouts::layouts_list(), 'products' => \admin\factory\ShopProduct::products_list(), diff --git a/autoload/admin/factory/class.Languages.php b/autoload/admin/factory/class.Languages.php index f77d6bf..3e46b4f 100644 --- a/autoload/admin/factory/class.Languages.php +++ b/autoload/admin/factory/class.Languages.php @@ -1,4 +1,4 @@ -languagesList((bool)$only_active); } } -?> - diff --git a/autoload/admin/factory/class.ShopAttribute.php b/autoload/admin/factory/class.ShopAttribute.php index 338f447..0eddec2 100644 --- a/autoload/admin/factory/class.ShopAttribute.php +++ b/autoload/admin/factory/class.ShopAttribute.php @@ -62,7 +62,7 @@ class ShopAttribute \admin\factory\ShopProduct::update_product_price_by_attribute_value_impact( $ids[$main_language][$i], $impact_on_the_price[$i] ); - $langs = \admin\factory\Languages::languages_list(); + $langs = ( new \Domain\Languages\LanguagesRepository( $mdb ) )->languagesList(); foreach ( $langs as $lang ) { @@ -108,7 +108,7 @@ class ShopAttribute if ( $impact_on_the_price[$i] ) \admin\factory\ShopProduct::update_product_price_by_attribute_value_impact( $value_id, \S::normalize_decimal( $impact_on_the_price[$i] ) ); - $langs = \admin\factory\Languages::languages_list(); + $langs = ( new \Domain\Languages\LanguagesRepository( $mdb ) )->languagesList(); if ( \S::is_array_fix( $langs ) ) foreach ( $langs as $lang ) { if ( $names[$lang['id']][$i] ) diff --git a/autoload/admin/factory/class.ShopProducer.php b/autoload/admin/factory/class.ShopProducer.php index 969d104..6c3aae5 100644 --- a/autoload/admin/factory/class.ShopProducer.php +++ b/autoload/admin/factory/class.ShopProducer.php @@ -28,7 +28,7 @@ class ShopProducer $id = $mdb -> id(); - $langs = \admin\factory\Languages::languages_list( true ); + $langs = ( new \Domain\Languages\LanguagesRepository( $mdb ) )->languagesList( true ); foreach ( $langs as $lg ) { $mdb -> insert( 'pp_shop_producer_lang', [ @@ -55,7 +55,7 @@ class ShopProducer 'id' => (int) $producer_id ] ); - $langs = \admin\factory\Languages::languages_list( true ); + $langs = ( new \Domain\Languages\LanguagesRepository( $mdb ) )->languagesList( true ); foreach ( $langs as $lg ) { if ( $translation_id = $mdb -> get( 'pp_shop_producer_lang', 'id', [ 'AND' => [ 'producer_id' => $producer_id, 'lang_id' => $lg['id'] ] ] ) ) @@ -86,4 +86,4 @@ class ShopProducer } return false; } -} \ No newline at end of file +} diff --git a/autoload/admin/factory/class.ShopProduct.php b/autoload/admin/factory/class.ShopProduct.php index 0cdbb96..abd34b8 100644 --- a/autoload/admin/factory/class.ShopProduct.php +++ b/autoload/admin/factory/class.ShopProduct.php @@ -802,7 +802,7 @@ class ShopProduct if ( $id ) { - $langs = \admin\factory\Languages::languages_list( true ); + $langs = ( new \Domain\Languages\LanguagesRepository( $mdb ) )->languagesList( true ); foreach ( $langs as $lg ) { $mdb -> insert( 'pp_shop_products_langs', [ @@ -1009,7 +1009,7 @@ class ShopProduct \admin\factory\ShopProduct::update_product_combinations_prices( $product_id, $price_brutto, $vat, $price_brutto_promo ); - $langs = \admin\factory\Languages::languages_list( true ); + $langs = ( new \Domain\Languages\LanguagesRepository( $mdb ) )->languagesList( true ); foreach ( $langs as $lg ) { if ( $translation_id = $mdb -> get( 'pp_shop_products_langs', 'id', [ 'AND' => [ 'product_id' => $product_id, 'lang_id' => $lg['id'] ] ] ) ) diff --git a/tests/Unit/admin/Controllers/ArticlesControllerTest.php b/tests/Unit/admin/Controllers/ArticlesControllerTest.php index a5da2d3..6b1ad26 100644 --- a/tests/Unit/admin/Controllers/ArticlesControllerTest.php +++ b/tests/Unit/admin/Controllers/ArticlesControllerTest.php @@ -4,16 +4,19 @@ namespace Tests\Unit\admin\Controllers; use PHPUnit\Framework\TestCase; use admin\Controllers\ArticlesController; use Domain\Article\ArticleRepository; +use Domain\Languages\LanguagesRepository; class ArticlesControllerTest extends TestCase { private $mockRepository; + private $mockLanguagesRepository; private $controller; protected function setUp(): void { $this->mockRepository = $this->createMock(ArticleRepository::class); - $this->controller = new ArticlesController($this->mockRepository); + $this->mockLanguagesRepository = $this->createMock(LanguagesRepository::class); + $this->controller = new ArticlesController($this->mockRepository, $this->mockLanguagesRepository); } public function testCanCreateController(): void @@ -23,7 +26,7 @@ class ArticlesControllerTest extends TestCase public function testConstructorAcceptsRepository(): void { - $controller = new ArticlesController($this->mockRepository); + $controller = new ArticlesController($this->mockRepository, $this->mockLanguagesRepository); $this->assertInstanceOf(ArticlesController::class, $controller); } @@ -66,7 +69,8 @@ class ArticlesControllerTest extends TestCase $constructor = $reflection->getConstructor(); $params = $constructor->getParameters(); - $this->assertCount(1, $params); + $this->assertCount(2, $params); $this->assertEquals('Domain\Article\ArticleRepository', $params[0]->getType()->getName()); + $this->assertEquals('Domain\Languages\LanguagesRepository', $params[1]->getType()->getName()); } } diff --git a/tests/Unit/admin/Controllers/DictionariesControllerTest.php b/tests/Unit/admin/Controllers/DictionariesControllerTest.php index 5a357e0..8d936bb 100644 --- a/tests/Unit/admin/Controllers/DictionariesControllerTest.php +++ b/tests/Unit/admin/Controllers/DictionariesControllerTest.php @@ -4,21 +4,24 @@ namespace Tests\Unit\admin\Controllers; use PHPUnit\Framework\TestCase; use admin\Controllers\DictionariesController; use Domain\Dictionaries\DictionariesRepository; +use Domain\Languages\LanguagesRepository; class DictionariesControllerTest extends TestCase { private $mockRepository; + private $mockLanguagesRepository; private $controller; protected function setUp(): void { $this->mockRepository = $this->createMock(DictionariesRepository::class); - $this->controller = new DictionariesController($this->mockRepository); + $this->mockLanguagesRepository = $this->createMock(LanguagesRepository::class); + $this->controller = new DictionariesController($this->mockRepository, $this->mockLanguagesRepository); } public function testConstructorAcceptsRepository(): void { - $controller = new DictionariesController($this->mockRepository); + $controller = new DictionariesController($this->mockRepository, $this->mockLanguagesRepository); $this->assertInstanceOf(DictionariesController::class, $controller); } @@ -58,7 +61,8 @@ class DictionariesControllerTest extends TestCase $constructor = $reflection->getConstructor(); $params = $constructor->getParameters(); - $this->assertCount(1, $params); + $this->assertCount(2, $params); $this->assertEquals('Domain\Dictionaries\DictionariesRepository', $params[0]->getType()->getName()); + $this->assertEquals('Domain\Languages\LanguagesRepository', $params[1]->getType()->getName()); } } diff --git a/tests/Unit/admin/Controllers/SettingsControllerTest.php b/tests/Unit/admin/Controllers/SettingsControllerTest.php index 5b0d8f0..b93e4cc 100644 --- a/tests/Unit/admin/Controllers/SettingsControllerTest.php +++ b/tests/Unit/admin/Controllers/SettingsControllerTest.php @@ -3,6 +3,7 @@ namespace Tests\Unit\admin\Controllers; use PHPUnit\Framework\TestCase; use admin\Controllers\SettingsController; +use Domain\Languages\LanguagesRepository; use Domain\Settings\SettingsRepository; /** @@ -14,17 +15,19 @@ use Domain\Settings\SettingsRepository; class SettingsControllerTest extends TestCase { private $mockSettingsRepository; + private $mockLanguagesRepository; private $controller; protected function setUp(): void { $this->mockSettingsRepository = $this->createMock(SettingsRepository::class); - $this->controller = new SettingsController($this->mockSettingsRepository); + $this->mockLanguagesRepository = $this->createMock(LanguagesRepository::class); + $this->controller = new SettingsController($this->mockSettingsRepository, $this->mockLanguagesRepository); } public function testConstructorAcceptsRepository(): void { - $controller = new SettingsController($this->mockSettingsRepository); + $controller = new SettingsController($this->mockSettingsRepository, $this->mockLanguagesRepository); $this->assertInstanceOf(SettingsController::class, $controller); } diff --git a/updates/0.20/ver_0.255.zip b/updates/0.20/ver_0.255.zip new file mode 100644 index 0000000000000000000000000000000000000000..e24ea94fbc6c553a4dbd7b59c86d9bfc76825fc0 GIT binary patch literal 35183 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. 0.254 - 12.02.2026
+ver. 0.255 - 12.02.2026
+- UPDATE - kontrolery admin `Settings`, `Banners`, `Dictionaries`, `Articles` pobieraja liste jezykow przez `Domain\\Languages\\LanguagesRepository` (DI) +- UPDATE - routing DI (`admin\\Site`) przekazuje `LanguagesRepository` do kontrolerow `Articles`, `Banners`, `Settings`, `Dictionaries` +- UPDATE - aktywne legacy odwolania (`admin\\controls`, `admin\\factory\\Shop*`) przepiete z `admin\\factory\\Languages` na `LanguagesRepository` +- FIX - `autoload/admin/factory/class.Languages.php` uzywa `ver. 0.254 - 12.02.2026
- UPDATE - modul `Languages` w panelu admin przepiety na `Domain\\Languages\\LanguagesRepository` + `admin\\Controllers\\LanguagesController` - UPDATE - migracja widokow languages (`languages-list`, `language-edit`, `translations-list`, `translation-edit`) na `components/table-list` i `components/form-edit` - UPDATE - routing DI dla `Languages` w `admin\\Site` oraz kompatybilna fasada `admin\\factory\\Languages` delegujaca do repozytorium diff --git a/updates/versions.php b/updates/versions.php index 8f173d6..f6ef0de 100644 --- a/updates/versions.php +++ b/updates/versions.php @@ -1,5 +1,5 @@