From 827b903e1e838726bb71d0165d1d12bee76c498f Mon Sep 17 00:00:00 2001 From: Jacek Pyziak Date: Tue, 17 Feb 2026 20:32:07 +0100 Subject: [PATCH] ver. 0.291: ShopProducer frontend migration to Domain + Controllers Co-Authored-By: Claude Opus 4.6 --- .../Domain/Producer/ProducerRepository.php | 28 +++++++ .../Controllers/ShopProducerController.php | 62 +++++++++++++++ .../front/controls/class.ShopProducer.php | 48 ----------- autoload/front/controls/class.Site.php | 6 ++ autoload/front/view/class.Site.php | 5 +- autoload/shop/class.Producer.php | 54 ------------- docs/CHANGELOG.md | 16 +++- docs/DATABASE_STRUCTURE.md | 6 +- docs/FRONTEND_REFACTORING_PLAN.md | 4 +- docs/PROJECT_STRUCTURE.md | 12 ++- docs/REFACTORING_PLAN.md | 1 + docs/TESTING.md | 9 ++- docs/UPDATE_INSTRUCTIONS.md | 12 +-- .../Producer/ProducerRepositoryTest.php | 75 ++++++++++++++++++ .../ShopProducerControllerTest.php | 40 ++++++++++ updates/0.20/ver_0.291.zip | Bin 0 -> 9105 bytes updates/0.20/ver_0.291_files.txt | 2 + updates/changelog.php | 4 + updates/versions.php | 2 +- 19 files changed, 267 insertions(+), 119 deletions(-) create mode 100644 autoload/front/Controllers/ShopProducerController.php delete mode 100644 autoload/front/controls/class.ShopProducer.php delete mode 100644 autoload/shop/class.Producer.php create mode 100644 tests/Unit/front/Controllers/ShopProducerControllerTest.php create mode 100644 updates/0.20/ver_0.291.zip create mode 100644 updates/0.20/ver_0.291_files.txt diff --git a/autoload/Domain/Producer/ProducerRepository.php b/autoload/Domain/Producer/ProducerRepository.php index 1e3cf09..9bee873 100644 --- a/autoload/Domain/Producer/ProducerRepository.php +++ b/autoload/Domain/Producer/ProducerRepository.php @@ -301,6 +301,34 @@ class ProducerRepository return is_array($rows) ? array_map('intval', $rows) : []; } + /** + * Aktywni producenci z pelnym danymi (frontend lista). + * + * @return array + */ + public function allActiveProducers(): array + { + $rows = $this->db->select('pp_shop_producer', ['id', 'name', 'img'], [ + 'status' => 1, + 'ORDER' => ['name' => 'ASC'], + ]); + + if (!is_array($rows)) { + return []; + } + + $producers = []; + foreach ($rows as $row) { + $producers[] = [ + 'id' => (int)($row['id'] ?? 0), + 'name' => (string)($row['name'] ?? ''), + 'img' => $row['img'] ?? null, + ]; + } + + return $producers; + } + private function defaultProducer(): array { return [ diff --git a/autoload/front/Controllers/ShopProducerController.php b/autoload/front/Controllers/ShopProducerController.php new file mode 100644 index 0000000..4edf703 --- /dev/null +++ b/autoload/front/Controllers/ShopProducerController.php @@ -0,0 +1,62 @@ +repository = $repository; + } + + public function products() + { + global $page, $lang_id; + + $producerId = (int)\Shared\Helpers\Helpers::get( 'producer_id' ); + $producer = $this->repository->findForFrontend( $producerId, $lang_id ); + + if ( !$producer ) + return ''; + + $page['show_title'] = true; + $page['language']['title'] = $producer['name']; + + $bs = (int)\Shared\Helpers\Helpers::get( 'bs' ); + $results = $this->repository->producerProducts( $producer['id'], 12, $bs ?: 1 ); + + $pager = ''; + if ( $results['ls'] > 1 ) + { + $pager = \Shared\Tpl\Tpl::view( 'site/pager', [ + 'ls' => $results['ls'], + 'bs' => $bs ?: 1, + 'page' => $page, + 'link' => 'producent/' . \Shared\Helpers\Helpers::seo( $producer['name'] ) + ] ); + } + + return \Shared\Tpl\Tpl::view( 'shop-producer/products', [ + 'producer' => $producer, + 'products' => $results['products'], + 'pager' => $pager + ] ); + } + + public function list() + { + global $page; + + $page['show_title'] = true; + $page['language']['title'] = 'Producenci'; + + $producers = $this->repository->allActiveProducers(); + + return \Shared\Tpl\Tpl::view( 'shop-producer/list', [ + 'producers' => $producers + ] ); + } +} diff --git a/autoload/front/controls/class.ShopProducer.php b/autoload/front/controls/class.ShopProducer.php deleted file mode 100644 index 210f357..0000000 --- a/autoload/front/controls/class.ShopProducer.php +++ /dev/null @@ -1,48 +0,0 @@ - 1 ) - { - $pager = \Shared\Tpl\Tpl::view( 'site/pager', [ - 'ls' => $results['ls'], - 'bs' => (int) \Shared\Helpers\Helpers::get( 'bs' ) ? (int) \Shared\Helpers\Helpers::get( 'bs' ) : 1, - 'page' => $page, - 'link' => 'producent/' . \Shared\Helpers\Helpers::seo( $producer['name'] ) - ] ); - } - - return \Shared\Tpl\Tpl::view( 'shop-producer/products', [ - 'producer' => $producer, - 'products' => $results['products'], - 'pager' => $pager - ] ); - } - - static public function list() - { - global $mdb, $page; - - $page['show_title'] = true; - $page['language']['title'] = 'Producenci'; - - $rows = $mdb -> select( 'pp_shop_producer', 'id', [ 'status' => 1, 'ORDER' => [ 'name' => 'ASC' ] ] ); - if ( \Shared\Helpers\Helpers::is_array_fix( $rows ) ) foreach ( $rows as $row ) - $producers[] = new \shop\Producer( $row ); - - return \Shared\Tpl\Tpl::view( 'shop-producer/list', [ - 'producers' => $producers - ] ); - } -} \ No newline at end of file diff --git a/autoload/front/controls/class.Site.php b/autoload/front/controls/class.Site.php index 4b6d290..94af989 100644 --- a/autoload/front/controls/class.Site.php +++ b/autoload/front/controls/class.Site.php @@ -191,6 +191,12 @@ class Site new \Domain\Order\OrderRepository( $mdb ) ); }, + 'ShopProducer' => function() { + global $mdb; + return new \front\Controllers\ShopProducerController( + new \Domain\Producer\ProducerRepository( $mdb ) + ); + }, ]; } } diff --git a/autoload/front/view/class.Site.php b/autoload/front/view/class.Site.php index a58fad2..09e24d5 100644 --- a/autoload/front/view/class.Site.php +++ b/autoload/front/view/class.Site.php @@ -28,6 +28,7 @@ class Site $pagesRepo = new \Domain\Pages\PagesRepository( $GLOBALS['mdb'] ); $scontainersRepo = new \Domain\Scontainers\ScontainersRepository( $GLOBALS['mdb'] ); $categoryRepo = new \Domain\Category\CategoryRepository( $GLOBALS['mdb'] ); + $producerRepo = new \Domain\Producer\ProducerRepository( $GLOBALS['mdb'] ); if ( (int) \Shared\Helpers\Helpers::get( 'layout_id' ) ) $layout = $layoutsRepo->find( (int) \Shared\Helpers\Helpers::get( 'layout_id' ) ); @@ -216,9 +217,9 @@ class Site // if ( \Shared\Helpers\Helpers::get( 'producer_id' ) ) { - $producer = new \shop\Producer( \Shared\Helpers\Helpers::get( 'producer_id' ) ); + $producer = $producerRepo->findForFrontend( (int)\Shared\Helpers\Helpers::get( 'producer_id' ), $lang_id ); - if ( $producer['languages'][$lang_id]['meta_title'] ) + if ( $producer && !empty( $producer['languages'][$lang_id]['meta_title'] ) ) $page['language']['meta_title'] = $producer['languages'][$lang_id]['meta_title']; } diff --git a/autoload/shop/class.Producer.php b/autoload/shop/class.Producer.php deleted file mode 100644 index 430ff82..0000000 --- a/autoload/shop/class.Producer.php +++ /dev/null @@ -1,54 +0,0 @@ -find( $producer_id ); - - foreach ( $data as $key => $val ) - $this->$key = $val; - } - - static public function producer_products( $producer_id, $lang_id, $bs ) - { - global $mdb; - - $repo = new \Domain\Producer\ProducerRepository( $mdb ); - return $repo->producerProducts( (int) $producer_id, 12, (int) $bs ); - } - - public function __get( $variable ) - { - if ( array_key_exists( $variable, $this -> data ) ) - return $this -> $variable; - } - - public function __set( $variable, $value ) - { - $this -> $variable = $value; - } - - public function offsetExists( $offset ) - { - return isset( $this -> $offset ); - } - - public function offsetGet( $offset ) - { - return $this -> $offset; - } - - public function offsetSet( $offset, $value ) - { - $this -> $offset = $value; - } - - public function offsetUnset( $offset ) - { - unset( $this -> $offset ); - } -} \ No newline at end of file diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 6a97cc2..264dc9f 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -4,6 +4,20 @@ Logi zmian z migracji na Domain-Driven Architecture. Najnowsze na gorze. --- +## ver. 0.291 (2026-02-17) - ShopProducer frontend migration + +- **ShopProducer (frontend)** — migracja controls + shop facade na Domain + Controllers + - NOWA METODA w `ProducerRepository`: `allActiveProducers()` — pełne dane aktywnych producentów (id, name, img) + - NOWY: `front\Controllers\ShopProducerController` — instancyjny kontroler z DI (`products()`, `list()`) + - USUNIETA: `front\controls\class.ShopProducer.php` — logika przeniesiona do kontrolera + repozytorium + - USUNIETA: `autoload\shop\class.Producer.php` — fasada niepotrzebna, callery przepięte na repo + - UPDATE: `front\view\Site::show()` — `new \shop\Producer(...)` zamienione na `$producerRepo->findForFrontend()` + - UPDATE: `front\controls\Site::getControllerFactories()` — zarejestrowany `'ShopProducer'` + - FIX: bug `shop\Producer::__get()` referował nieistniejące `$this->data` (usunięty z kodem klasy) +- Testy: 573 OK, 1738 asercji (+8: 5 ProducerRepository frontend, 3 ShopProducerController) + +--- + ## ver. 0.290 (2026-02-17) - ShopCoupon + ShopOrder frontend migration - **ShopCoupon (frontend)** — migracja controls + factory na Domain + Controllers @@ -761,4 +775,4 @@ Logi zmian z migracji na Domain-Driven Architecture. Najnowsze na gorze. - Metoda `clear_product_cache()` w klasie S --- -*Dokument aktualizowany: 2026-02-17 (ver. 0.289)* +*Dokument aktualizowany: 2026-02-17 (ver. 0.291)* diff --git a/docs/DATABASE_STRUCTURE.md b/docs/DATABASE_STRUCTURE.md index d253737..841edc5 100644 --- a/docs/DATABASE_STRUCTURE.md +++ b/docs/DATABASE_STRUCTURE.md @@ -619,7 +619,7 @@ Producenci produktow (modul `/admin/shop_producer`). | status | Status: 1 = aktywny, 0 = nieaktywny | | img | Sciezka do logo producenta (NULL gdy brak) | -**Uzywane w:** `Domain\Producer\ProducerRepository`, `admin\Controllers\ShopProducerController`, `shop\Producer`, `shop\Product`, `front\controls\ShopProducer` +**Uzywane w:** `Domain\Producer\ProducerRepository`, `admin\Controllers\ShopProducerController`, `front\Controllers\ShopProducerController`, `shop\Product` ## pp_shop_producer_lang Tlumaczenia producentow (per jezyk). FK kaskadowe ON DELETE CASCADE. @@ -633,6 +633,8 @@ Tlumaczenia producentow (per jezyk). FK kaskadowe ON DELETE CASCADE. | data | Dane producenta (TEXT, HTML) | | meta_title | Meta title SEO (VARCHAR 255) | -**Uzywane w:** `Domain\Producer\ProducerRepository`, `shop\Producer`, `shop\Product` +**Uzywane w:** `Domain\Producer\ProducerRepository`, `shop\Product` **Aktualizacja 2026-02-15 (ver. 0.273):** modul `/admin/shop_producer` korzysta z `Domain\Producer\ProducerRepository` przez `admin\Controllers\ShopProducerController`. Usunieto legacy `admin\controls\ShopProducer` i `admin\factory\ShopProducer`. `shop\Producer` dziala jako fasada do repozytorium. + +**Aktualizacja 2026-02-17 (ver. 0.291):** frontend `/shop_producer/*` korzysta z `Domain\Producer\ProducerRepository` przez `front\Controllers\ShopProducerController`; usunięto legacy `front\controls\ShopProducer` i `shop\Producer`. diff --git a/docs/FRONTEND_REFACTORING_PLAN.md b/docs/FRONTEND_REFACTORING_PLAN.md index ac39ecd..6c9041b 100644 --- a/docs/FRONTEND_REFACTORING_PLAN.md +++ b/docs/FRONTEND_REFACTORING_PLAN.md @@ -18,7 +18,7 @@ Panel administratora (33 moduły) został w pełni zmigrowany na architekturę D | ShopClient | ZMIGROWANY do `front\Controllers\ShopClientController` | Logowanie, rejestracja, odzyskiwanie hasla, adresy, zamowienia | | ShopOrder | ZMIGROWANY do `front\Controllers\ShopOrderController` | Webhooki płatności + order details | | ShopProduct | Fasada | lazy_loading, warehouse_message, draw_product_attributes | -| ShopProducer | Fasada | list(), products() | +| ShopProducer | ZMIGROWANY do `front\Controllers\ShopProducerController` | list(), products() | | ShopCoupon | ZMIGROWANY do `front\Controllers\ShopCouponController` | use_coupon(), delete_coupon() | | Newsletter | ZMIGROWANY do `front\Controllers\NewsletterController` | signin(), confirm(), unsubscribe() | @@ -73,7 +73,7 @@ Panel administratora (33 moduły) został w pełni zmigrowany na architekturę D | Coupon | ~60 | NISKI — niekompletne metody | NISKI | | Transport | ~30 | NISKI — transport_list() | NISKI | | PaymentMethod | — | ZMIGROWANA (fasada do Domain) | — | -| Producer | — | ZMIGROWANA (fasada do Domain) | — | +| Producer | — | USUNIETA (callery na ProducerRepository) | — | | ProductSet | — | ZMIGROWANA (fasada do Domain) | — | | ProductAttribute | ~100 | OK — dobry caching | — | | ProductCustomField | ~50 | OK — Redis caching | — | diff --git a/docs/PROJECT_STRUCTURE.md b/docs/PROJECT_STRUCTURE.md index d4fe94a..02f7f07 100644 --- a/docs/PROJECT_STRUCTURE.md +++ b/docs/PROJECT_STRUCTURE.md @@ -108,7 +108,7 @@ shopPRO/ │ │ ├── Helpers/ # Helpers (ex class.S.php) │ │ └── Tpl/ # Tpl (silnik szablonow) │ ├── front/ # Klasy frontendu -│ │ ├── Controllers/ # Nowe kontrolery DI (Newsletter, ShopBasket, ShopClient) +│ │ ├── Controllers/ # Nowe kontrolery DI (Newsletter, ShopBasket, ShopClient, ShopCoupon, ShopOrder, ShopProducer) │ │ ├── Views/ # Nowe widoki (Newsletter, Articles, Languages, Banners, Menu, Scontainers, ShopCategory, ShopClient) │ │ ├── controls/ # Kontrolery legacy (Site, ...) │ │ ├── view/ # Widoki legacy (Site, ...) @@ -473,5 +473,13 @@ Pelna dokumentacja testow: `TESTING.md` - UPDATE: `ClientRepository::clientOrders()`, `shop\Order::order_resend_confirmation_email()`, `cron-turstmate.php` — przepiete na `OrderRepository` - USUNIETA: `front\controls\class.ShopOrder.php`, `front\factory\class.ShopOrder.php`, `front\view\class.ShopOrder.php` +## Aktualizacja 2026-02-17 (ver. 0.291) - ShopProducer frontend migration +- NOWA METODA w `ProducerRepository`: `allActiveProducers()` — pełne dane aktywnych producentów +- NOWY: `front\Controllers\ShopProducerController` — instancyjny kontroler z DI (products, list) +- USUNIETA: `front\controls\class.ShopProducer.php` — logika przeniesiona do kontrolera + repo +- USUNIETA: `autoload\shop\class.Producer.php` — fasada niepotrzebna +- UPDATE: `front\view\Site::show()` — przepiecie na `$producerRepo->findForFrontend()` +- UPDATE: `front\controls\Site::getControllerFactories()` — zarejestrowany `ShopProducer` + --- -*Dokument aktualizowany: 2026-02-17 (ver. 0.290)* +*Dokument aktualizowany: 2026-02-17 (ver. 0.291)* diff --git a/docs/REFACTORING_PLAN.md b/docs/REFACTORING_PLAN.md index 15bff67..c1c9968 100644 --- a/docs/REFACTORING_PLAN.md +++ b/docs/REFACTORING_PLAN.md @@ -189,6 +189,7 @@ grep -r "Product::getQuantity" . 1-33: ✅ Cache, Product, Banner, Settings, Dictionaries, ProductArchive, Filemanager, Users, Pages, Integrations, ShopPromotion, ShopCoupon, ShopStatuses, ShopPaymentMethod, ShopTransport, ShopAttribute, ShopProductSets, ShopProducer, ShopProduct (mass_edit), ShopClients, ShopCategory, ShopOrder, ShopProduct (factory), Dashboard, Update, Legacy cleanup, admin\App 34: ✅ Shared\Cache namespace (ver. 0.282) — CacheHandler + RedisConnection → Shared\Cache\, eliminacja class.Cache.php, przepiecie 6 plikow na CacheHandler 35: ✅ Shared\Tpl namespace (ver. 0.285) — Tpl → Shared\Tpl\Tpl, eliminacja class.Tpl.php + curl.class.php, fix thumb.php +36: ✅ ShopProducer frontend (ver. 0.291) — front\controls\ShopProducer + shop\Producer usunięte, front\Controllers\ShopProducerController z DI, allActiveProducers() w ProducerRepository ## Form Edit System diff --git a/docs/TESTING.md b/docs/TESTING.md index 003916b..8eb871d 100644 --- a/docs/TESTING.md +++ b/docs/TESTING.md @@ -36,7 +36,14 @@ Alternatywnie (Git Bash): Ostatnio zweryfikowano: 2026-02-17 ```text -OK (565 tests, 1716 assertions) +OK (573 tests, 1738 assertions) +``` + +Aktualizacja po migracji ShopProducer frontend (2026-02-17, ver. 0.291): +```text +Pelny suite: OK (573 tests, 1738 assertions) +Nowe testy: ProducerRepositoryTest (+5: allActiveProducers full/null, findForFrontend invalid/notFound/withLanguage) +Nowe testy: ShopProducerControllerTest (+3: constructorAcceptsRepository, hasMainActionMethods, constructorRequiresProducerRepository) ``` Aktualizacja po migracji ShopCoupon + ShopOrder frontend (2026-02-17, ver. 0.290): diff --git a/docs/UPDATE_INSTRUCTIONS.md b/docs/UPDATE_INSTRUCTIONS.md index dfae480..2764114 100644 --- a/docs/UPDATE_INSTRUCTIONS.md +++ b/docs/UPDATE_INSTRUCTIONS.md @@ -18,16 +18,16 @@ Aktualizacje znajdują się w folderze `updates/0.XX/` gdzie XX oznacza dziesią ## Procedura tworzenia nowej aktualizacji -## Status biezacej aktualizacji (ver. 0.290) +## Status biezacej aktualizacji (ver. 0.291) -- Wersja udostepniona: `0.290` (data: 2026-02-17). +- Wersja udostepniona: `0.291` (data: 2026-02-17). - Pliki publikacyjne: - - `updates/0.20/ver_0.290.zip`, `ver_0.290_files.txt` + - `updates/0.20/ver_0.291.zip`, `ver_0.291_files.txt` - Pliki metadanych aktualizacji: - - `updates/changelog.php` (dodany wpis `ver. 0.290`) - - `updates/versions.php` (`$current_ver = 290`) + - `updates/changelog.php` (dodany wpis `ver. 0.291`) + - `updates/versions.php` (`$current_ver = 291`) - Weryfikacja testow przed publikacja: - - `OK (565 tests, 1716 assertions)` + - `OK (573 tests, 1738 assertions)` ### 1. Określ numer wersji Sprawdź ostatnią wersję w `updates/` i zwiększ o 1. diff --git a/tests/Unit/Domain/Producer/ProducerRepositoryTest.php b/tests/Unit/Domain/Producer/ProducerRepositoryTest.php index d5f1b8e..124e0c6 100644 --- a/tests/Unit/Domain/Producer/ProducerRepositoryTest.php +++ b/tests/Unit/Domain/Producer/ProducerRepositoryTest.php @@ -237,4 +237,79 @@ class ProducerRepositoryTest extends TestCase $this->assertArrayHasKey('ls', $result); $this->assertSame(3, $result['ls']); } + + public function testAllActiveProducersReturnsFullData(): void + { + $mockDb = $this->createMock(\medoo::class); + $mockDb->expects($this->once()) + ->method('select') + ->with('pp_shop_producer', ['id', 'name', 'img'], [ + 'status' => 1, + 'ORDER' => ['name' => 'ASC'], + ]) + ->willReturn([ + ['id' => '3', 'name' => 'Apple', 'img' => '/apple.png'], + ['id' => '7', 'name' => 'Samsung', 'img' => null], + ]); + + $repository = new ProducerRepository($mockDb); + $result = $repository->allActiveProducers(); + + $this->assertCount(2, $result); + $this->assertSame(3, $result[0]['id']); + $this->assertSame('Apple', $result[0]['name']); + $this->assertSame('/apple.png', $result[0]['img']); + $this->assertSame(7, $result[1]['id']); + $this->assertSame('Samsung', $result[1]['name']); + $this->assertNull($result[1]['img']); + } + + public function testAllActiveProducersReturnsEmptyOnNull(): void + { + $mockDb = $this->createMock(\medoo::class); + $mockDb->method('select')->willReturn(null); + + $repository = new ProducerRepository($mockDb); + $result = $repository->allActiveProducers(); + + $this->assertSame([], $result); + } + + public function testFindForFrontendReturnsNullForInvalidId(): void + { + $mockDb = $this->createMock(\medoo::class); + $mockDb->expects($this->never())->method('get'); + + $repository = new ProducerRepository($mockDb); + $this->assertNull($repository->findForFrontend(0, 'pl')); + } + + public function testFindForFrontendReturnsNullWhenNotFound(): void + { + $mockDb = $this->createMock(\medoo::class); + $mockDb->method('get')->willReturn(null); + + $repository = new ProducerRepository($mockDb); + $this->assertNull($repository->findForFrontend(99, 'pl')); + } + + public function testFindForFrontendReturnsProducerWithLanguage(): void + { + $mockDb = $this->createMock(\medoo::class); + + $mockDb->expects($this->exactly(2)) + ->method('get') + ->willReturnOnConsecutiveCalls( + ['id' => '5', 'name' => 'Sony', 'status' => '1', 'img' => '/sony.png'], + ['lang_id' => 'pl', 'description' => 'Opis', 'data' => null, 'meta_title' => 'Sony PL'] + ); + + $repository = new ProducerRepository($mockDb); + $result = $repository->findForFrontend(5, 'pl'); + + $this->assertSame(5, $result['id']); + $this->assertSame('Sony', $result['name']); + $this->assertArrayHasKey('pl', $result['languages']); + $this->assertSame('Sony PL', $result['languages']['pl']['meta_title']); + } } diff --git a/tests/Unit/front/Controllers/ShopProducerControllerTest.php b/tests/Unit/front/Controllers/ShopProducerControllerTest.php new file mode 100644 index 0000000..820a01c --- /dev/null +++ b/tests/Unit/front/Controllers/ShopProducerControllerTest.php @@ -0,0 +1,40 @@ +repository = $this->createMock(ProducerRepository::class); + $this->controller = new ShopProducerController($this->repository); + } + + public function testConstructorAcceptsRepository(): void + { + $controller = new ShopProducerController($this->repository); + $this->assertInstanceOf(ShopProducerController::class, $controller); + } + + public function testHasMainActionMethods(): void + { + $this->assertTrue(method_exists($this->controller, 'products')); + $this->assertTrue(method_exists($this->controller, 'list')); + } + + public function testConstructorRequiresProducerRepository(): void + { + $reflection = new \ReflectionClass(ShopProducerController::class); + $constructor = $reflection->getConstructor(); + $params = $constructor->getParameters(); + + $this->assertCount(1, $params); + $this->assertEquals('Domain\Producer\ProducerRepository', $params[0]->getType()->getName()); + } +} diff --git a/updates/0.20/ver_0.291.zip b/updates/0.20/ver_0.291.zip new file mode 100644 index 0000000000000000000000000000000000000000..ca67eaa5788ee65178ac3bf0c8173a93d63148c7 GIT binary patch literal 9105 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 literal 0 HcmV?d00001 diff --git a/updates/0.20/ver_0.291_files.txt b/updates/0.20/ver_0.291_files.txt new file mode 100644 index 0000000..715550b --- /dev/null +++ b/updates/0.20/ver_0.291_files.txt @@ -0,0 +1,2 @@ +F: ../autoload/front/controls/class.ShopProducer.php +F: ../autoload/shop/class.Producer.php diff --git a/updates/changelog.php b/updates/changelog.php index 7152c47..10bfe18 100644 --- a/updates/changelog.php +++ b/updates/changelog.php @@ -1,3 +1,7 @@ +ver. 0.291 - 17.02.2026
+- UPDATE - migracja front\controls\ShopProducer + shop\Producer do Domain\Producer\ProducerRepository + front\Controllers\ShopProducerController +- FIX - bug shop\Producer::__get() referowal nieistniejace $this->data +
ver. 0.290 - 17.02.2026
- UPDATE - migracja front\factory\ShopCoupon + front\controls\ShopCoupon do Domain\Coupon\CouponRepository + front\Controllers\ShopCouponController - UPDATE - migracja front\factory\ShopOrder + front\controls\ShopOrder + front\view\ShopOrder do Domain\Order\OrderRepository + front\Controllers\ShopOrderController diff --git a/updates/versions.php b/updates/versions.php index 39c910d..ec85d38 100644 --- a/updates/versions.php +++ b/updates/versions.php @@ -1,5 +1,5 @@