feat(cms): Startseiten-Datenmodell und fünf neue Blocktypen #39
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/craft-home-content-model"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Was
homeContent, exklusiv am Entry-Typestartseite.websiteContentbleibt anunterseite, reduziert aufinformationPage(per Live-Check der einzige Blocktyp, den Impressum/Datenschutz nutzen).templates/_components/core/content-home.twig:.eagerly()gegen N+1, jeder Block überonlyisoliert statt kompletten Template-Kontext zu leaken.content.twigbleibt für die Unterseiten unverändert.methodSection,proofSection,videoTestimonialSection,killerQuestionSection,offerSection) plus verschachtelter Entry-TypevideoTestimonial.columns:columnPrice,columnPriceNote,columnBtn,columnHighlight.migrations/m260813_055620_add_home_content_model.php), damitphp craft upes reproduziert statt nur lokal im CP geklickt zu sein.Kein MCP-Write verfügbar in dieser Session (nur
craft-cms-prodwar als Tool sichtbar) — alle Schema-Änderungen liefen überdocker exec philflow_php_local php craft ...und die Migration, nicht über den lokalencraft-cms-MCP.Zwei Modellierungsentscheidungen
1. Der Schwellwert im ROI-Rechner (methodSection) speichert den Paketpreis kein zweites Mal. Die Sektion braucht eine Zahl, ab der sie abrät — die soll dem Preis des kleinsten Pakets entsprechen. Statt einem eigenen Zahlenfeld auf
methodSectionwird der Preis ausschließlich im FeldcolumnPricedercolumns-Einträge gepflegt (Pflichtfeld laut Auftrag, Plain Text für "ab 3.900 EUR").content-home.twigscannt beim Rendern einmal allecolumnsSection-Blöcke, parstcolumnPriceauf die reine Zahl und reicht das Minimum alspackageStartPrice-Prop anmethodSectiondurch. Ändert ein Editor den Preis in der Paketliste, zieht der Rechner automatisch nach, ohne dass zwei Stellen synchron gehalten werden müssen.2. Video/Poster-Formate werden aus einem Feld pro Medientyp abgeleitet, nicht vervierfacht.
web/video/testimonials/liegt je Clip als MP4 + WebM und je Poster als JPG + WebP vor, jeweils unter demselben Basisnamen. Das Feldmodell hat nurvideoFile(MP4-Upload) undposterImage(JPG-Upload) — das WebM- und WebP-Pendant werden inpl_videoTestimonialSection.twigdurch Dateiendungstausch auf der Asset-URL abgeleitet. Vier Felder mit vier Uploads pro Testimonial hätten das gleiche Risiko erzeugt wie der Preis: zwei Dateien, die bei einem Reupload auseinanderlaufen.Verifikation
php craft upläuft grün und idempotent (zweimal hintereinander geprüft,project-config/diffzeigt "No pending changes")./,/blog,/impressum,/datenschutzliefern alle200.videoTestimonialundcolumnsprogrammatisch verifiziert (getFieldLayout()->getCustomFields()ohne Fehler).offerSectionhatte zunächst den Feld-Handletitle(kollidiert mit dem nativen Element-Attribut), umbenannt zuheading. DB wurde aus dem vorab gezogenen Backup restauriert und die korrigierte Migration sauber neu appliziert.|t('site')) und ROI-Datenattribute geprüft, danachhomeContentwieder geleert (keine Datenmigration, siehe unten).git statussauber, keine root-eigenen Dateien im Commit.Keine Datenmigration:
homeContentist nach diesem PR leer, die Startseite wird ohnehin neu getextet. Die altewebsiteContent-Fassung von Entry 3 bleibt als Craft-Revision und über ein lokales DB-Backup (backups/predeploy_homecontent_*.sql.gz, nicht committed) erhalten.Closes #38
🤖 Generated with Claude Code
Design-Richtung fuer die Methode-Sektion steht fest: der ROI-Rechner ist ein Satz mit drei Luecken im Fliesstext, kein Formular neben dem Text (Referenz: templates/preview/methode-b.twig). intro nutzt dafuer die Platzhalter {{runs}}, {{minutes}}, {{rate}}, {{result}}, die pl_methodSection.twig gegen die echten Eingabefelder und das Live-Ergebnis tauscht. columns bekommt ein zweites Link-Feld columnBookingLink fuer den raven.ceo-Terminlink, getrennt vom primaeren columnBtn, das in die mehrstufige Anfrage-Strecke fuehrt. Je Paket eigener Query-Parameter fuer die Klick-Messung. Refs #38 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>Wenn ein Redakteur einen der vier Platzhalter ({{runs}}, {{minutes}}, {{rate}}, {{result}}) in methodSection.intro loescht, verdoppelt oder verschreibt, ergab der Split nicht mehr exakt fuenf Fragmente und die Eingabefelder haetten an der falschen Stelle oder gar nicht gestanden. pl_methodSection.twig prueft jetzt vorab, ob alle vier Platzhalter vorhanden sind und der Split exakt fuenf Teile ergibt. Ist das nicht der Fall, faellt intro auf reinen Fliesstext ohne Eingabefelder zurueck statt halb zu rendern — lieber ein statischer, korrekt lesbarer Satz als ein kaputter Rechner. Eine falsche Reihenfolge bei sonst korrekter Anzahl kann das Template nicht erkennen, das faengt nur eine sorgfaeltige Vorschau-Pruefung ab. Die Feld-Instruktion von intro im Control Panel beschreibt das Verhalten jetzt explizit, das ist der einzige Ort, an dem ein Redakteur die Konvention liest. Verifiziert: gesunder Fall (alle vier Platzhalter, drei Inputs gerendert) und Fehlerfall (zwei Platzhalter fehlen, faellt auf statischen Text zurueck, keine 500). Refs #38 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>