From 6c21b835da15b243929867383d6c5d37c24d2ff5 Mon Sep 17 00:00:00 2001 From: Jacek Pyziak Date: Fri, 6 Feb 2026 08:57:22 +0100 Subject: [PATCH] feat: Implement cleanup methods for nonassigned article files and images in ArticleRepository --- .phpunit.result.cache | 2 +- DATABASE_STRUCTURE.md | 4 +- PROJECT_STRUCTURE.md | 10 ++++- REFACTORING_PLAN.md | 6 +-- UPDATE_INSTRUCTIONS.md | 1 + autoload/Domain/Article/ArticleRepository.php | 34 ++++++++++++++ .../admin/Controllers/ArticlesController.php | 4 +- autoload/admin/factory/class.Articles.php | 22 ++------- .../Domain/Article/ArticleRepositoryTest.php | 42 ++++++++++++++++++ updates/0.20/ver_0.243.zip | Bin 0 -> 4322 bytes updates/changelog.php | 17 ++++--- updates/versions.php | 3 +- 12 files changed, 110 insertions(+), 35 deletions(-) create mode 100644 updates/0.20/ver_0.243.zip diff --git a/.phpunit.result.cache b/.phpunit.result.cache index 32f3e1b..7917679 100644 --- a/.phpunit.result.cache +++ b/.phpunit.result.cache @@ -1 +1 @@ -{"version":1,"defects":[],"times":{"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testGetQuantityReturnsCorrectValue":0.001,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testGetQuantityReturnsNullWhenProductNotFound":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testFindReturnsProductData":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testUpdateQuantitySuccess":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testGetPriceReturnsRegularPrice":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testGetPriceReturnsPromoPrice":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testGetPriceReturnsRegularWhenPromoIsHigher":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testGetPriceReturnsNullWhenNotFound":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testGetNameReturnsProductName":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testGetNameReturnsNullWhenNotFound":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testGetQuantityReturnsInteger":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testUnarchiveUpdatesProductAndChildren":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testArchiveUpdatesProductAndChildren":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testUnarchiveReturnsBool":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testArchiveReturnsBool":0,"Tests\\Unit\\admin\\Controllers\\ProductArchiveControllerTest::testConstructorAcceptsRepository":0.001,"Tests\\Unit\\admin\\Controllers\\ProductArchiveControllerTest::testHasListMethod":0,"Tests\\Unit\\admin\\Controllers\\ProductArchiveControllerTest::testHasUnarchiveMethod":0,"Tests\\Unit\\admin\\Controllers\\ProductArchiveControllerTest::testListMethodReturnType":0,"Tests\\Unit\\admin\\Controllers\\ProductArchiveControllerTest::testUnarchiveMethodReturnType":0,"Tests\\Unit\\admin\\Controllers\\ProductArchiveControllerTest::testConstructorRequiresProductRepository":0,"Tests\\Unit\\Domain\\Banner\\BannerRepositoryTest::testFindReturnsBannerWithTranslations":0.001,"Tests\\Unit\\Domain\\Banner\\BannerRepositoryTest::testFindReturnsNullWhenNotFound":0,"Tests\\Unit\\Domain\\Banner\\BannerRepositoryTest::testDeleteReturnsTrue":0.002,"Tests\\Unit\\Domain\\Banner\\BannerRepositoryTest::testSaveInsertsNewBanner":0,"Tests\\Unit\\Domain\\Cache\\CacheRepositoryTest::testClearCacheWithRedis":0.001,"Tests\\Unit\\Domain\\Cache\\CacheRepositoryTest::testClearCacheRedisUnavailable":0,"Tests\\Unit\\Domain\\Cache\\CacheRepositoryTest::testClearCacheWithoutRedis":0,"Tests\\Unit\\Domain\\Cache\\CacheRepositoryTest::testClearCacheReturnStructure":0,"Tests\\Unit\\Domain\\Settings\\SettingsRepositoryTest::testCanBeInstantiated":0.001,"Tests\\Unit\\Domain\\Settings\\SettingsRepositoryTest::testHasSaveSettingsMethod":0,"Tests\\Unit\\Domain\\Settings\\SettingsRepositoryTest::testHasGetSettingsMethod":0,"Tests\\Unit\\admin\\Controllers\\SettingsControllerTest::testConstructorAcceptsRepository":0.001,"Tests\\Unit\\admin\\Controllers\\SettingsControllerTest::testHasClearCacheMethod":0,"Tests\\Unit\\admin\\Controllers\\SettingsControllerTest::testHasClearCacheAjaxMethod":0,"Tests\\Unit\\admin\\Controllers\\SettingsControllerTest::testHasSaveMethod":0,"Tests\\Unit\\admin\\Controllers\\SettingsControllerTest::testHasViewMethod":0,"Tests\\Unit\\admin\\Controllers\\SettingsControllerTest::testIsNotAbstract":0,"Tests\\Unit\\admin\\Controllers\\SettingsControllerTest::testActionMethodReturnTypes":0,"Tests\\Unit\\admin\\Controllers\\ArticlesControllerTest::testCanCreateController":0.001,"Tests\\Unit\\admin\\Controllers\\ArticlesControllerTest::testHasListMethod":0,"Tests\\Unit\\admin\\Controllers\\ArticlesControllerTest::testListMethodReturnType":0,"Tests\\Unit\\admin\\Controllers\\ArticlesControllerTest::testHasEditMethod":0,"Tests\\Unit\\admin\\Controllers\\ArticlesControllerTest::testEditMethodReturnType":0,"Tests\\Unit\\admin\\Controllers\\ArticlesControllerTest::testConstructorAcceptsRepository":0,"Tests\\Unit\\admin\\Controllers\\ArticlesControllerTest::testConstructorRequiresArticleRepository":0,"Tests\\Unit\\Domain\\Article\\ArticleRepositoryTest::testFindReturnsArticleWithRelations":0.003,"Tests\\Unit\\Domain\\Article\\ArticleRepositoryTest::testFindReturnsNullWhenArticleDoesNotExist":0}} \ No newline at end of file +{"version":1,"defects":[],"times":{"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testGetQuantityReturnsCorrectValue":0.001,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testGetQuantityReturnsNullWhenProductNotFound":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testFindReturnsProductData":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testUpdateQuantitySuccess":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testGetPriceReturnsRegularPrice":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testGetPriceReturnsPromoPrice":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testGetPriceReturnsRegularWhenPromoIsHigher":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testGetPriceReturnsNullWhenNotFound":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testGetNameReturnsProductName":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testGetNameReturnsNullWhenNotFound":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testGetQuantityReturnsInteger":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testUnarchiveUpdatesProductAndChildren":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testArchiveUpdatesProductAndChildren":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testUnarchiveReturnsBool":0,"Tests\\Unit\\Domain\\Product\\ProductRepositoryTest::testArchiveReturnsBool":0,"Tests\\Unit\\admin\\Controllers\\ProductArchiveControllerTest::testConstructorAcceptsRepository":0.001,"Tests\\Unit\\admin\\Controllers\\ProductArchiveControllerTest::testHasListMethod":0,"Tests\\Unit\\admin\\Controllers\\ProductArchiveControllerTest::testHasUnarchiveMethod":0,"Tests\\Unit\\admin\\Controllers\\ProductArchiveControllerTest::testListMethodReturnType":0,"Tests\\Unit\\admin\\Controllers\\ProductArchiveControllerTest::testUnarchiveMethodReturnType":0,"Tests\\Unit\\admin\\Controllers\\ProductArchiveControllerTest::testConstructorRequiresProductRepository":0,"Tests\\Unit\\Domain\\Banner\\BannerRepositoryTest::testFindReturnsBannerWithTranslations":0.001,"Tests\\Unit\\Domain\\Banner\\BannerRepositoryTest::testFindReturnsNullWhenNotFound":0,"Tests\\Unit\\Domain\\Banner\\BannerRepositoryTest::testDeleteReturnsTrue":0.002,"Tests\\Unit\\Domain\\Banner\\BannerRepositoryTest::testSaveInsertsNewBanner":0,"Tests\\Unit\\Domain\\Cache\\CacheRepositoryTest::testClearCacheWithRedis":0.001,"Tests\\Unit\\Domain\\Cache\\CacheRepositoryTest::testClearCacheRedisUnavailable":0,"Tests\\Unit\\Domain\\Cache\\CacheRepositoryTest::testClearCacheWithoutRedis":0,"Tests\\Unit\\Domain\\Cache\\CacheRepositoryTest::testClearCacheReturnStructure":0,"Tests\\Unit\\Domain\\Settings\\SettingsRepositoryTest::testCanBeInstantiated":0.001,"Tests\\Unit\\Domain\\Settings\\SettingsRepositoryTest::testHasSaveSettingsMethod":0,"Tests\\Unit\\Domain\\Settings\\SettingsRepositoryTest::testHasGetSettingsMethod":0,"Tests\\Unit\\admin\\Controllers\\SettingsControllerTest::testConstructorAcceptsRepository":0.001,"Tests\\Unit\\admin\\Controllers\\SettingsControllerTest::testHasClearCacheMethod":0,"Tests\\Unit\\admin\\Controllers\\SettingsControllerTest::testHasClearCacheAjaxMethod":0,"Tests\\Unit\\admin\\Controllers\\SettingsControllerTest::testHasSaveMethod":0,"Tests\\Unit\\admin\\Controllers\\SettingsControllerTest::testHasViewMethod":0,"Tests\\Unit\\admin\\Controllers\\SettingsControllerTest::testIsNotAbstract":0,"Tests\\Unit\\admin\\Controllers\\SettingsControllerTest::testActionMethodReturnTypes":0,"Tests\\Unit\\admin\\Controllers\\ArticlesControllerTest::testCanCreateController":0.001,"Tests\\Unit\\admin\\Controllers\\ArticlesControllerTest::testHasListMethod":0,"Tests\\Unit\\admin\\Controllers\\ArticlesControllerTest::testListMethodReturnType":0,"Tests\\Unit\\admin\\Controllers\\ArticlesControllerTest::testHasEditMethod":0,"Tests\\Unit\\admin\\Controllers\\ArticlesControllerTest::testEditMethodReturnType":0,"Tests\\Unit\\admin\\Controllers\\ArticlesControllerTest::testConstructorAcceptsRepository":0,"Tests\\Unit\\admin\\Controllers\\ArticlesControllerTest::testConstructorRequiresArticleRepository":0,"Tests\\Unit\\Domain\\Article\\ArticleRepositoryTest::testFindReturnsArticleWithRelations":0.003,"Tests\\Unit\\Domain\\Article\\ArticleRepositoryTest::testFindReturnsNullWhenArticleDoesNotExist":0,"Tests\\Unit\\Domain\\Article\\ArticleRepositoryTest::testDeleteNonassignedFilesDeletesDbRows":0,"Tests\\Unit\\Domain\\Article\\ArticleRepositoryTest::testDeleteNonassignedImagesDeletesDbRows":0}} \ No newline at end of file diff --git a/DATABASE_STRUCTURE.md b/DATABASE_STRUCTURE.md index dbfeded..462452c 100644 --- a/DATABASE_STRUCTURE.md +++ b/DATABASE_STRUCTURE.md @@ -103,7 +103,7 @@ Strony artykułów. | page_id | FK do strony (pp_pages) | | o | Kolejność | -**Używane w:** `Domain\Article\ArticleRepository::find()` +**Używane w:** `Domain\Article\ArticleRepository::find()`, `Domain\Article\ArticleRepository::deleteNonassignedImages()` ## pp_articles_langs Tłumaczenia artykułów. @@ -115,7 +115,7 @@ Tłumaczenia artykułów. | title | Tytuł artykułu | | seo_link | Link SEO artykułu | -**Używane w:** `Domain\Article\ArticleRepository::find()` +**Używane w:** `Domain\Article\ArticleRepository::find()`, `Domain\Article\ArticleRepository::deleteNonassignedFiles()` ## pp_articles_images Zdjęcia artykułów. diff --git a/PROJECT_STRUCTURE.md b/PROJECT_STRUCTURE.md index 5d36a51..b0132ee 100644 --- a/PROJECT_STRUCTURE.md +++ b/PROJECT_STRUCTURE.md @@ -246,10 +246,16 @@ tests/ │ └── ProductArchiveControllerTest.php # 6 testów └── Integration/ ``` -**Łącznie: 48 testw, 91 asercji** +**Łącznie: 50 tests, 95 assertions** ## Ostatnie modyfikacje +### 2026-02-06: Articles cleanup moved to repository (ver. 0.243) +- **UPDATE:** `Domain\Article\ArticleRepository` - added `deleteNonassignedImages()` and `deleteNonassignedFiles()` +- **UPDATE:** `admin\Controllers\ArticlesController::edit()` uses repository cleanup methods +- **UPDATE:** `admin\factory\Articles::delete_nonassigned_images()` and `delete_nonassigned_files()` delegate to repository (backward compatibility) +- Testy: 50 tests, 95 assertions + ### 2026-02-06: Migracja Articles::article_edit do DI (ver. 0.242) - **NOWE:** `Domain\Article\ArticleRepository` - repozytorium artykułów (`find()`) - **UPDATE:** `admin\Controllers\ArticlesController` - konstruktor DI + `edit()` używa repozytorium @@ -266,7 +272,7 @@ tests/ - **FIX:** Brakujący `archive = 1` w branchu bez wyszukiwania - **CLEANUP:** Usunięto zbędny JS z szablonu archiwum (apilo, baselinker, duplikowanie, edycja cen) - Stary kontroler `admin\controls\Archive` zachowany jako fallback -- Testy: 48 testw, 91 asercji (+10 nowych) +- Testy: 50 tests, 95 assertions (+10 nowych) ### 2026-02-05: Migracja Settings + Cache (ver. 0.240) - **NOWE:** `Domain\Settings\SettingsRepository` - repozytorium ustawień (fasada → factory) diff --git a/REFACTORING_PLAN.md b/REFACTORING_PLAN.md index d177f31..80fdf23 100644 --- a/REFACTORING_PLAN.md +++ b/REFACTORING_PLAN.md @@ -181,8 +181,8 @@ grep -r "Product::getQuantity" . - Zmigrowana akcja: `article_edit` -> `edit` (mapowanie w `admin\Site::$actionMap`) - Kompatybilność: `admin\factory\Articles::article_details()` deleguje do nowego repozytorium - Legacy cleanup: metody przejęte przez nowe kontrolery oznaczone `@deprecated` w `admin\controls\Articles|Banners|Settings` - - Testy: `tests/Unit/Domain/Article/ArticleRepositoryTest.php`, `tests/Unit/admin/Controllers/ArticlesControllerTest.php` - - Aktualizacja: ver. 0.242 + - Testy repozytorium rozszerzone o czyszczenie nieprzypisanych plikw/zdj + - Aktualizacja: ver. 0.243 - **Settings** (migracja kontrolera - krok pośredni) - ✅ SettingsRepository - **ZMIGROWANE** (2026-02-05) 🎉 @@ -315,4 +315,4 @@ vendor/bin/phpstan analyse autoload/Domain --- *Rozpoczęto: 2025-02-05* -*Ostatnia aktualizacja: 2026-02-06* +*Ostatnia aktualizacja: 2026-02-06* \ No newline at end of file diff --git a/UPDATE_INSTRUCTIONS.md b/UPDATE_INSTRUCTIONS.md index cfff524..790d973 100644 --- a/UPDATE_INSTRUCTIONS.md +++ b/UPDATE_INSTRUCTIONS.md @@ -13,6 +13,7 @@ Aktualizacje znajdują się w folderze `updates/0.XX/` gdzie XX oznacza dziesią ### Zasada pakowania plików - Do paczek aktualizacji **nie dodajemy plików `*.md`** (dokumentacja jest tylko wewnętrzna/deweloperska). +- Do paczek aktualizacji **nie dodajemy `updates/changelog.php`** (to plik serwisowy po stronie repozytorium aktualizacji, nie runtime klienta). ## Procedura tworzenia nowej aktualizacji diff --git a/autoload/Domain/Article/ArticleRepository.php b/autoload/Domain/Article/ArticleRepository.php index 9a986d5..de36849 100644 --- a/autoload/Domain/Article/ArticleRepository.php +++ b/autoload/Domain/Article/ArticleRepository.php @@ -40,4 +40,38 @@ class ArticleRepository return $article; } + + /** + * Usuwa nieprzypisane pliki artykulow (article_id = null) wraz z plikami z dysku. + */ + public function deleteNonassignedFiles(): void + { + $results = $this->db->select('pp_articles_files', '*', ['article_id' => null]); + if (is_array($results)) { + foreach ($results as $row) { + if (file_exists('../' . $row['src'])) { + unlink('../' . $row['src']); + } + } + } + + $this->db->delete('pp_articles_files', ['article_id' => null]); + } + + /** + * Usuwa nieprzypisane zdjecia artykulow (article_id = null) wraz z plikami z dysku. + */ + public function deleteNonassignedImages(): void + { + $results = $this->db->select('pp_articles_images', '*', ['article_id' => null]); + if (is_array($results)) { + foreach ($results as $row) { + if (file_exists('../' . $row['src'])) { + unlink('../' . $row['src']); + } + } + } + + $this->db->delete('pp_articles_images', ['article_id' => null]); + } } diff --git a/autoload/admin/Controllers/ArticlesController.php b/autoload/admin/Controllers/ArticlesController.php index 8bf6eb5..affee8a 100644 --- a/autoload/admin/Controllers/ArticlesController.php +++ b/autoload/admin/Controllers/ArticlesController.php @@ -32,8 +32,8 @@ class ArticlesController exit; } - \admin\factory\Articles::delete_nonassigned_images(); - \admin\factory\Articles::delete_nonassigned_files(); + $this->repository->deleteNonassignedImages(); + $this->repository->deleteNonassignedFiles(); return \Tpl::view('articles/article-edit', [ 'article' => $this->repository->find((int)\S::get('id')), diff --git a/autoload/admin/factory/class.Articles.php b/autoload/admin/factory/class.Articles.php index ee82309..605c53b 100644 --- a/autoload/admin/factory/class.Articles.php +++ b/autoload/admin/factory/class.Articles.php @@ -433,29 +433,15 @@ class Articles public static function delete_nonassigned_files() { global $mdb; - - $results = $mdb -> select( 'pp_articles_files', '*', [ 'article_id' => null ] ); - if ( is_array( $results ) ) foreach ( $results as $row ) - { - if ( file_exists( '../' . $row['src'] ) ) - unlink( '../' . $row['src'] ); - } - - $mdb -> delete( 'pp_articles_files', [ 'article_id' => null ] ); + $repository = new \Domain\Article\ArticleRepository( $mdb ); + $repository->deleteNonassignedFiles(); } public static function delete_nonassigned_images() { global $mdb; - - $results = $mdb -> select( 'pp_articles_images', '*', [ 'article_id' => null ] ); - if ( is_array( $results ) ) foreach ( $results as $row ) - { - if ( file_exists( '../' . $row['src'] ) ) - unlink( '../' . $row['src'] ); - } - - $mdb -> delete( 'pp_articles_images', [ 'article_id' => null ] ); + $repository = new \Domain\Article\ArticleRepository( $mdb ); + $repository->deleteNonassignedImages(); } } ?> diff --git a/tests/Unit/Domain/Article/ArticleRepositoryTest.php b/tests/Unit/Domain/Article/ArticleRepositoryTest.php index 749f09a..b040292 100644 --- a/tests/Unit/Domain/Article/ArticleRepositoryTest.php +++ b/tests/Unit/Domain/Article/ArticleRepositoryTest.php @@ -57,4 +57,46 @@ class ArticleRepositoryTest extends TestCase $this->assertNull($article); } + + public function testDeleteNonassignedFilesDeletesDbRows(): void + { + $mockDb = $this->createMock(\medoo::class); + + $mockDb->expects($this->once()) + ->method('select') + ->with('pp_articles_files', '*', ['article_id' => null]) + ->willReturn([ + ['id' => 1, 'src' => '/this/path/does/not/exist-file.tmp'] + ]); + + $mockDb->expects($this->once()) + ->method('delete') + ->with('pp_articles_files', ['article_id' => null]); + + $repository = new ArticleRepository($mockDb); + $repository->deleteNonassignedFiles(); + + $this->assertTrue(true); + } + + public function testDeleteNonassignedImagesDeletesDbRows(): void + { + $mockDb = $this->createMock(\medoo::class); + + $mockDb->expects($this->once()) + ->method('select') + ->with('pp_articles_images', '*', ['article_id' => null]) + ->willReturn([ + ['id' => 1, 'src' => '/this/path/does/not/exist-image.tmp'] + ]); + + $mockDb->expects($this->once()) + ->method('delete') + ->with('pp_articles_images', ['article_id' => null]); + + $repository = new ArticleRepository($mockDb); + $repository->deleteNonassignedImages(); + + $this->assertTrue(true); + } } diff --git a/updates/0.20/ver_0.243.zip b/updates/0.20/ver_0.243.zip new file mode 100644 index 0000000000000000000000000000000000000000..6557f5669849d4e0fea66244f0df78ba21996c06 GIT binary patch literal 4322 zcma)=cTiK?7REuEfb`x%sG;{Jz4zXc1c=mNXaNzBUZe-5i3kXYln8?K4q|~Iy+~D1 zdKUS?k+>ti5Kw-!?VC!>7ghcW7&a|6Kg}rug}R-VN}9 z`#@d5P!}(lH`w$alPP~s*7Wg${+4|m2d1SBmK%dopm1?;l<{$J#DCBJQ(D8vI{@JW zhr1&D!D@&Am^0kf|JOeeUk~3@^EpozaoW&@YSV6DRpQJ&9zXsL)i;^x7-4elQ9!lH z%Pe|Gdd|0qw0Z`|^tO+xiAPdx-culu!iJW?-E9IT1kTNmFGFz76_G`mrvNRGNJ0f8v zW+Q7sSpA`l?y&Omns5h8j^{Vob+<#j$oV{^K_Nu8KF3($OQz6Buv+ZVT$kFDweS|k zqf*Z7l|0S+Z4fP<@SM(`0Up3>C zNIZs}7g~JHtw|0PSGiU;8_D-ZqE*bCJJ>i03nbVXBqtDErx0x04!x`kCMHq5kdp7D zuawGE@idEa)=9s5dxk`Db$mR#_gv1zOj4d3j2RSK(GW%dNIb{Yc8-u_f7+=Hk$5n> z_EBL-@O#Q_y~B$G%Q8YXR;vXN3E zkgD1Awb#5hGNQC-u8Qf_9+lq>+k(sVVo}U^jDz%cmZ0DV z-oCl%2&Pq6!~U8c$399jF&(mupjbjUKAS0X3Z=R%EIidhDyMgs0N zYC6>;#R+~!OngbE+a)AS)O{*6IUA6@{KgpVCC8)Ko;^ORzbG0FXgHp{+WYpz_! z;fi95Ez}QrWUF_2Y6_ydDJH&PsB~toW*x zcAvtrcue!OnxJ`wQt2w_^5f~8NjYb54)2URX8gTR7bm2hpO3Qr2bX}ad@&apP^;@I zG~5r#7hCH`SSTJEbIO_8CW&E99Th`w;^l9MM{XE4U@nR+=etn|<6oL2|Z#F}}C9 z#ty{6A3!j(jlyhjCBwr~P$_Acnc9PlaC=jDhr-o~%=!WE&P65`nqNpZEvLbgQ&8+0 z4(g!bFRKtK17cp)7}A3L+$j65l6@g`cA7TE`ia-E{QLzHGMP$GDQ|cLFM0Ae^@;I6aZ|9LRnL#lQ(T&Q86*7q z*?`XjEFD}4`_x`d^l~zN%ez~tJ;0=J&Nq+)&)|^_aq6?h4W@9>D2#9%gkHDqJJPi_6BRH=;oSmP zZAb1_Byck=PI_;9H&ZaT5K(Ju+{SZ5>l6^IOUtd}=cmA3Dq^}dt%JQpLtnk<{;;+v zLcO|~PC#|R^Txn!&?QCrAG)lNgZE_g>q8Mz6gA?UdkwyAm3~uo!jEME`MS+C=X!uXmm|$FqiZn$2DlrjOx_@ z`LRin7q#GzN&0wCOYISY+!e!c9mgf+RLHJ&zw;JIw@Qn&(esf@wox)B&}NVl=DhBW zb00Iq9;O@TCRH9Z5C^2hn|W|bfW{T)>hq{n)SzaW^yjdQ(Wr0|j3VXzXvd*!W?RzM zg-X^Mjb>N%#ya<#n zWp4}Y-lDQjjKqT#7I)2ZWx{*DA5>%u6>DG)EFH0re60hrwo?l~QBA&s+ku@-JZ0j} z*4EDW%U0`B1Ntp5OOC*P_}8J~T;EWQf}&NCOY|nH+)j(aHbaX9T}^iJEJs{-o?!cJ zyZTG2#J?*zNys_S!jMbOXdGulrPoPb)N>@UZT8dPeYLH-OzO;;-x7H5ho>L47eWke z1G)8Gt(fdwB^pe$^X5TTWK$oV6x~ACbNR*5lxm zn+=nlX6C#+Te14ND+`~5m;kvCsygh8@WC0ueyp|tAZfPH1mm@UR!oP($tnFu`!@N> zE3N$g`u1$&oG#R4m&}Ve@$ktCgFGw#(uSy!^3=}{8*kCAq~2@`$*(&6EZw9ZXKN{@ z;q30@`7(W{-?8mr>ea>3PIebK?eUQJgDPxD++{l82fUhb;Vf`hL|~_QOhll_M^*ra ztKBx#O~}zS2#jgf1bKKi(M^d?lJ;z~8OW4d@1blJY_q-)(3w4Sd_9{q1|cq>!L!0W zLqrJB4K0f|DAc5c+YTr9CP6kKG{u?RnikP(YeZ7*hT+xuLhcV)yd~hrT5kEJHA=43aTyWvH8yC zC<|2>sxvo%b|9l?MD1Fh*64{sV~o}BuzyW#y)LX2>lHvb&%hH%j^Df-0ZLG>G3j!%u7QW=lQa3K%O|4y(*(Un$>P2vD?GfPR z9mjV}RbwxSez`^WpKj5Zk;BdZ8V(N8Psb?yyIcGZRQ$&v{>2F9uD(A0us;msza68c zQQE8+WyhM0Ax{bZyPl2!yQ+TcZ)4V$N@lcArn_mK?HlW)Do*wq4%H%EqfnkEM;v}1 z4)<4G3l@~hvq4GLnXq=H>L2Rj?tMw#`o4$Zk6R6<%8o)w%v(=J^AT2%VLpOPAbhU1q zkt8f>k~rVZo$d>6AT5)auFi%OwXlrcoPVs>?q^dfFmgT_HH<(SW-znx5ie1}rO_Nj zAIHh`5WElJHKd5$f%nFK;5IVgNol^B%kIahM@Y#^#PM*CLt!Bm38}DoqjKp^(|6T+ z-WeEaR{UP!?y7gQiwsFt(n}4RK#uL^UMWrHo*&T4~Q5P~JFP8Rxbd{#GX0cdVEXgXLPu@QF zoUHs*R?UC@Qm+XgU*g4~VG&0(UF-W*Ky-PZrvPtoKz;{8D}9&k7Iw5^ zfe}oitrA4f1=@B`#8`fky|Z!9_1*WXHYrq}g40c9#Fi$m!$Bn$kSQ-APwXyAG9gIE z`u+^wx2V;LDawE??&O*)_+gfzpCwjF8^!mUu^wPy#2fU-*Mb8 wdCQ;k`d{+@Om)A@{@uX;l8wIco9zEH{-y>5gnyJ1{CrY=UNxxxafN~NFP49Z5dZ)H literal 0 HcmV?d00001 diff --git a/updates/changelog.php b/updates/changelog.php index 3b46194..c752bac 100644 --- a/updates/changelog.php +++ b/updates/changelog.php @@ -1,7 +1,10 @@ -ver. 0.242
+ver. 0.243
+- UPDATE - refaktoryzacja: cleanup nieprzypisanych plików/zdjęć artykułów przeniesiony do Domain\Article\ArticleRepository +- UPDATE - ArticlesController::edit() używa repozytorium do cleanupu, a admin\factory\Articles zachowuje delegowanie (kompatybilność) +
ver. 0.242
- NEW - refaktoryzacja: Domain\Article\ArticleRepository + migracja article_edit do admin\Controllers\ArticlesController (DI) -- UPDATE - admin\factory\Articles::article_details() deleguje do nowego repozytorium (kompatybilno zachowana) -- UPDATE - metody przejte przez nowe kontrolery oznaczone jako @deprecated w legacy kontrolerach admin\controls +- UPDATE - admin\factory\Articles::article_details() deleguje do nowego repozytorium (kompatybilność zachowana) +- UPDATE - metody przejęte przez nowe kontrolery oznaczone jako @deprecated w legacy kontrolerach admin\controls
ver. 0.241
- NEW - refaktoryzacja: admin\Controllers\ProductArchiveController - archiwum produktów z DI - NEW - ProductRepository::archive(), unarchive() - operacje archiwizacji w repozytorium @@ -14,8 +17,7 @@ - NEW - refaktoryzacja: Domain\Cache\CacheRepository - czyszczenie cache z obsługą Redis - FIX - komunikat potwierdzenia zapisu ustawień w panelu administratora - FIX - naprawiono element #content w layoucie admina (powiadomienia grid.js) -
-ver. 0.239
+
ver. 0.239
- NEW - refaktoryzacja: Domain\Banner\BannerRepository + admin\Controllers\BannerController (pełna migracja kontrolera) - NEW - refaktoryzacja: Domain\Product\ProductRepository::getPrice(), getName() - migracja kolejnych metod - NEW - router admin z obsługą nowych kontrolerów (fallback na stare) @@ -229,7 +231,7 @@ - NEW - archiwum produktów
ver. 0.167
-- NEW - dodanie obługi cen i stanów magazynowych kombinacji produktów +- NEW - dodanie obsługi cen i stanów magazynowych kombinacji produktów
ver. 0.166
- NEW - współpraca z GTM @@ -303,3 +305,6 @@
ver. 0.142
- FIX - poprawa adresu strony głównej + + + diff --git a/updates/versions.php b/updates/versions.php index 7ed534d..a94dc14 100644 --- a/updates/versions.php +++ b/updates/versions.php @@ -1,5 +1,5 @@