Dodano hidden marker custom_field_name_present w formularzu edycji produktu.
Zmieniono warunek w ProductRepository z array_key_exists('custom_field_name')
na array_key_exists('custom_field_name_present') — jQuery .serialize() pomijał
klucz pustej tablicy gdy wszystkie pola usunięte. Test jednostkowy dodany.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
5.1 KiB
5.1 KiB
phase, plan, type, wave, depends_on, files_modified, autonomous, delegation
| phase | plan | type | wave | depends_on | files_modified | autonomous | delegation | ||
|---|---|---|---|---|---|---|---|---|---|
| 14-custom-fields-delete-bug | 01 | execute | 1 |
|
true | off |
Purpose
Właściciel sklepu musi mieć możliwość usunięcia wszystkich custom fields z produktu. Obecny bug blokuje tę operację.
Output
- Poprawiony JS w szablonie — hidden field gwarantujący obecność klucza
custom_field_namew POST - Defensive check w repozytorium (opcjonalnie)
- Test jednostkowy potwierdzający poprawkę
Source Files
@admin/templates/shop-product/product-edit-custom-script.php @autoload/Domain/Product/ProductRepository.php
<acceptance_criteria>
AC-1: Usunięcie wszystkich custom fields zapisuje pusty stan
Given produkt ma 2 dodatkowe pola (np. "Grawerunek", "Kolor")
When admin usuwa oba pola i klika "Zatwierdź"
Then po zapisie produkt nie ma żadnych dodatkowych pól
And tabela pp_shop_products_custom_fields nie zawiera rekordów dla tego produktu
AC-2: Częściowe usunięcie nadal działa
Given produkt ma 3 dodatkowe pola
When admin usuwa 1 pole i klika "Zatwierdź"
Then po zapisie produkt ma 2 dodatkowe pola
And usunięte pole nie istnieje w bazie
AC-3: Dodawanie pól nadal działa
Given produkt nie ma dodatkowych pól
When admin dodaje 2 nowe pola i klika "Zatwierdź"
Then po zapisie produkt ma 2 dodatkowe pola
</acceptance_criteria>
Task 1: Dodać hidden field gwarantujący klucz custom_field_name w POST admin/templates/shop-product/product-edit-custom-script.php W szablonie product-edit-custom-script.php dodać ukryte pole w sekcji custom fields: ```html ``` To pole musi być ZAWSZE obecne w formularzu (nie wewnątrz dynamicznych wierszy pól), tak aby serwer wiedział, że sekcja custom fields była obecna w formularzu.ALTERNATYWNIE (lepsze rozwiązanie): zamiast hidden field, zmienić warunek w ProductRepository
z `array_key_exists('custom_field_name', $d)` na sprawdzanie obecności markera
`custom_field_name_present`.
Podejście: dodać hidden field `custom_field_name_present` w szablonie
+ zmienić warunek w ProductRepository na:
```php
if ( array_key_exists( 'custom_field_name_present', $d ) ) {
```
Dzięki temu:
- Gdy formularz jest renderowany → marker ZAWSZE w POST → saveCustomFields() ZAWSZE wywoływany
- Gdy API partial update bez custom fields → marker BRAK → skip (backward compat)
1. Otworzyć edycję produktu z custom fields w przeglądarce
2. Usunąć wszystkie pola → Zatwierdź → sprawdzić że pola zniknęły
3. Otworzyć ponownie → potwierdzić brak pól
AC-1 satisfied: usunięcie wszystkich pól działa poprawnie
Task 2: Test jednostkowy — saveCustomFields z pustą listą
tests/Unit/Domain/Product/ProductRepositoryTest.php
Dodać test weryfikujący że saveCustomFields() z pustymi tablicami
wywołuje delete na pp_shop_products_custom_fields dla danego produktu.
Test powinien mockować Medoo i sprawdzić:
- Że `delete('pp_shop_products_custom_fields', ['id_product' => $productId])` jest wywoływany
- Że żaden insert/update nie jest wywoływany
saveCustomFields() jest private — użyć Reflection do wywołania
lub testować przez publiczną metodę saveProduct() z odpowiednim payloadem
zawierającym `custom_field_name_present` i puste tablice.
./test.ps1 --filter testSaveCustomFieldsDeletesAllWhenEmpty
AC-1 potwierdzone testem jednostkowym
DO NOT CHANGE
- Logika saveCustomFields() dla niepustych list pól (insert/update) — działa poprawnie
- API partial update — brak markera = skip custom fields (backward compat)
- Inne sekcje formularza edycji produktu
SCOPE LIMITS
- Tylko naprawa buga usuwania pól — żadne refactoring ani nowe feature
- Nie zmieniać struktury tabeli pp_shop_products_custom_fields
<success_criteria>
- Wszystkie 3 AC spełnione
- Test jednostkowy przechodzi
- Zero regresji w istniejącym test suite (820+ testów) </success_criteria>