Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

Rekord „z widoku” w czterech słownikach: odwrotne flagi `is_custom`/`is_locked`, 10 traitów i zdublowane kontrakty

Open
#289 1 comment 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
5/5
Estimated time
Over a week
Newbie friendliness
35/100
Issue type
Refactor
Clarity
Clearly specified
Activity status
Active
Tech stack
php
Domain
backend

Research direction

Start with the cited models/Template.php, models/Layout.php, classes/SyncTemplates.php, and the traits under traits/; compare the duplicated fetch and synchronization paths, then trace the trait contracts and the two column definitions in models/template/columns.yaml and models/layout/columns.yaml. Use the acceptance criteria to define done: one implementation for fetch, refresh, and create; no duplicate abstract-method declarations or internally used-only traits; matching view-status UI; PHPStan level 7 and tests passing without assertion changes.

Written by the indexing model from the issue text.

Description

code-review low-priority refactor

Problem

  1. Odwrotna polaryzacja flag. Szablon zapisuje odłączenie od widoku jako is_custom = true, layout jako is_locked = false. Od #261 oba śledzą widok tak samo, ale wspólna logika wymaga par metod z odwróconym warunkiem: isCustomised(), markAsFollowingView(), prepareDuplicate(), formBeforeSave(). Pary już się rozjechały: Template::isCustomised() nie ma strażnika jak Layout (zob. #268).
  2. Duplikacja po #261. Layout::afterFetch() ≈ Template::afterFetch(), SyncTemplates::refreshLayouts() ≈ refreshTemplates(), createLayouts() ≈ createTemplates().
  3. Nazwy. followsView() zwraca true także dla szablonu odłączonego, czyli znaczy „ma zarejestrowany widok”. Tymczasem markAsFollowingView() i komunikat view_follows używają „follows” w znaczeniu „nieodłączony”. Layout::followsViewUpdates() to z kolei globalna flaga migracji.
  4. UI. Lista szablonów ma kolumnę Customized (włączone = odłączony), a sąsiednia zakładka layoutów From view (włączone = śledzi). To ta sama informacja z odwrotnym znaczeniem przełącznika.
  5. 10 traitów (backupmanager i maillog mają 1, seomanager i formbuilder 2, reszta 0).
    • Sześć traitów modeli zawsze występuje razem w obu modelach.
    • Ten sam kontrakt jest zadeklarowany kilka razy: getView() w TranslatesContent i DescribesViewStatus, fillFromView() w TranslatesContent i FollowsView, isCustomised() w TranslatesContent i DescribesViewStatus.
    • FollowsView::resetToView() woła inDefaultLocale() z TranslatesContent, nie deklarując tej zależności.
    • ChecksFormPermissions i RendersPreviewErrors (po jednej metodzie) są używane wyłącznie wewnątrz ManagesViewRecords.
    • PDFManager ma 9 metod publicznych: rejestr oraz niezwiązane z nim findLocalizedView().

Dowód

  • models/Template.php:107-135, 251-254, models/Layout.php:86-89, 159-201, controllers/Templates.php:72-83, controllers/Layouts.php:36-41.
  • classes/SyncTemplates.php:55-91 vs :115-152. diff par afterFetch() daje 2 różnice (warunek flagi i unsetRelation('layout')).
  • traits/FollowsView.php:43, 63-71, traits/TranslatesContent.php:12-16, traits/DescribesViewStatus.php:7-11, traits/ManagesViewRecords.php:24-25, classes/PDFManager.php:107-133.
  • models/template/columns.yaml:21-23, models/layout/columns.yaml:11-13.
  • Liczba plików w plugins/renatio/*/traits.

Skutek

Każda zmiana logiki śledzenia widoku wymaga dwóch edycji z odwróconym warunkiem, a rozjazd już dał błąd. Kontrakt jest rozproszony po trzech plikach, a zależności między traitami wychodzą dopiero w runtime. Użytkownik widzi tę samą informację z odwrotnym znaczeniem w dwóch zakładkach.

Proponowane rozwiązanie

  • Jedno API w FollowsView, neutralne co do polaryzacji (isCustomised(), markAsCustomised()/markAsFollowingView(), scope followingView()). Na nim jedna implementacja afterFetch() i jedna para refresh()/create() w SyncTemplates.
  • followsView() zmienić na np. hasView(). Metoda jest nowa w 8.1.0 i nieopisana w README, więc zmiana nic nie łamie.
  • Ok. 4 traity zamiast 10:
    • widok + opis statusu + zlokalizowany widok;
    • walidacja (kod + Twig);
    • Duplicates;
    • ManagesViewRecords z wchłoniętymi jednometodowymi traitami.
  • PDFManager zostaje samym rejestrem.
  • Opcjonalnie ta sama kolumna na obu listach (np. From view także dla szablonów) albo migracja odwracająca is_locked.

Kryteria akceptacji

  • afterFetch(), odświeżanie i tworzenie w synchronizacji mają po jednej implementacji.
  • Żadna metoda abstrakcyjna nie jest deklarowana w więcej niż jednym traicie, żaden trait nie jest używany wyłącznie wewnątrz innego.
  • Obie listy pokazują status widoku w ten sam sposób.
  • PHPStan level 7 bez nowych wyciszeń, testy bez zmian asercji.

Powiązane issues

#214/#258 (duplikacja modeli i kontrolerów przed #261), #216 (zasada klas usługowych), #261 (źródło nowej duplikacji).

Dominant language
PHP
Stars
30
Forks
22
Avg merge
2h 23m
Merged PRs (30d)
77

Getting set up

This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from mplodowski/dynamicpdf-plugin

All issues in mplodowski/dynamicpdf-plugin

Similar issues

More PHP issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.