Skip to content

Domaines Chevaliers — cartographie live -> blocs (Phase 1.4)

Source de verite : tools/seed-gen/chevaliers-bands.py -> tools/seed-gen/data/bands.json. Le tableau ci-dessous est genere depuis le DOM du live, pas transcrit a la main. Pour le regenerer : python tools/seed-gen/chevaliers-bands.py --refresh.

Etat : 1.4a a livre l'arbre activites + evenements (40 noeuds, 9dfae84). Les pages ci-dessous restent a semer (1.4b).

Correction de la v1 de ce document (2026-07-16)

La v1 se disait « mesuree a 1440 au getComputedStyle ». Les hauteurs de bande l'etaient ; la composition des bandes ne l'etait pas, et elle etait fausse sur 3 pages sur 6. Le live n'avait pas derive (HTML re-telecharge identique a l'octet pres) : c'est la lecture qui etait incomplete. Ce qui manquait :

  • /vinotheque/ : « Nos horaires » et « Degustation » ne sont pas un cardCollection — ce sont deux mediaText (chacun avec sa photo).
  • /domaines-chevaliers/ : la v1 ignorait la bande equipe — 5 person-box (photo + nom + fonction) sous « NOTRE EQUIPE PASSIONNEE ». C'est un teamGrid.
  • /logement/ : la v1 disait « liens Booking + AirBnb en texte riche, pas un widget ». La v1 avait raison. La page porte bien un moteur Seekda dans le DOM, mais le live le masque globalement -> zero pixel, non porte. Cf. « Le logement » ci-dessous et assets-substitues.md §6. (J'ai d'abord conclu l'inverse en lisant le DOM sans lire le CSS, et sans lire assets-substitues.md §6 qui l'avait deja mesure et tranche.)

Lecon : lire une bande a l'oeil dans le HTML rend une bande sur deux. Le theme ecrit la meme ligne image+texte de quatre facons (team-info-row, single-experience-row, section-left-right, welcome-boxes) : la regle fiable est structurelle — une .row qui contient une .row-img est un mediaText. C'est la regle qu'applique l'extracteur.

Pieges du theme (silencieux — ils font perdre du contenu)

  • b-lazy : <img src> est un GIF base64 de remplacement ; l'URL reelle est dans data-src. Idem pour les fonds de bande. Le premier scrape lisait src -> il n'avait trouve que 3 images sur la home.
  • Suffixes WordPress (-900x600, -300x200) : on importe l'original, pas le recadrage.
  • lxml : un element sans enfant est falsy. first(a) or first(b) saute donc un <a class="btn">Voir les vins</a> (aucun enfant) -> tous les CTA disparaissent. D'ou firstof().

Accueil — /fr/bienvenue/ (chevaliersHome) — 8 bandes

#Bande livepx @1440BlocNotes
1section.rev-slider-wrap533heroSlider (layout=banner)Promo Smart Slider « NOS SHERPA / 20% / GAMME SHERPA ». Meme campagne que gilliard.ch — chevaliers est un clone du theme. Meme derive attendue : quand la campagne finit, re-semer (assets-substitues.md §4).
2.hero-boxes435cardCollection (3 card)« Decouvrez nos activites », « Chevaliers on tour », « Notre appartement au coeur du vignoble ». 0 image -> cartes texte.
3section.section-wine-selection-21041cardCollection display=products-5 + CTATitre « NOS GAMMES » (dans .section-main-info h2), 3 .col-wine-bottle : Vins Chevaliers · Vins Sherpa · Vins LUX VINA (titre = .wine-name). CTA « Decouvrez nos gammes » -> /gammes.
4.experiences-2265richIntroTitre seul : « Nos activites ».
5.row.hero-boxes455childListing source=Activites, layout=cards-activity, max=3Rend les 3 memes activites que /fr/activites/ (Wine & Visits / Wine & Events / Wine & Walk). Le live reutilise la classe hero-boxes (la v1 la decrivait comme « section sans classe »). C'est l'interet de source : une vue, pas du contenu duplique.
6.newsletter.b-lazy559newsletterSignup« Restez informe et inscrivez-vous a notre newsletter ». Fond wine_news.jpg (sur data-src).
7-8.welcome-boxes-2.page-team1524mediaText x2Histoire (Front.jpg, CTA « En savoir plus » -> /domaines-chevaliers/) et « Notre Vinotheque » (Kuche.01-1.jpg, CTA « Decouvrir l'espace » -> /vinotheque/).

Pages de contenu (chevaliersContentPage)

PageBandes mesureesBlocs
/fr/gammes/3mediaText x3 — Vins des Chevaliers · Sherpa Wine · Lux Vina, chacun texte + image + CTA « Voir les vins » (-> boutique du live, hors perimetre). Pas de banniere de titre. Attention : ici les lignes portent justify-content-center, ce qui fait passer la 1re ligne pour un intro si on ne filtre pas.
/fr/vinotheque/4richIntro (« NOTRE VINOTHEQUE ») + mediaText x2 (« Nos horaires » visite_cave2.jpg ; « Degustation » A23T7282.jpg) + ctaBanner (« Nos vins » -> /vins).
/fr/domaines-chevaliers/10La plus longue. pageHero (vinotheque.jpg) + richIntro « NOTRE HISTOIRE » + mediaText (Oswald Mathier-Kuchler, 1936) + richIntro « LE DOMAINE VITICOLE » + mediaText x2 (80 ans de developpement ; Une viticulture durable) + richIntro « NOTRE EQUIPE PASSIONNEE » + teamGrid (5 personnes) + richIntro + childListing (offres d'emploi, cf. ci-dessous) + ctaBanner (« NOS VINS »).
/fr/logement/6pageHero + richIntro (« Logement ») + mediaText x3 (« Appartement au coeur du vignoble » ; « Reservez » — liens Booking + AirBnb en texte riche ; « GRAPE ESCAPES ») + embed (Seekda, cf. ci-dessous).
/fr/contact/6pageHero + cardCollection display=list de 2 card avec icon (Bureaux · Vinotheque) + map (lat 46.3122853) + formBlock (CF7) + ctaBanner (« NOTRE HISTOIRE » -> /domaines-chevaliers).

hero-custom-banner.left (720 px) revient sur vinotheque / domaines / contact -> un seul bloc ctaBanner, pas trois variantes.

L'equipe (/fr/domaines-chevaliers/)

.row.team-row > 5 x .person-box = <img> + .name + .position. Cela tombe exactement sur l'element person existant (nom / role / photo) dans teamGrid > teamGroup > person : un seul groupe, sans titre de groupe (le titre est le richIntro au-dessus). Aucun nouveau bloc. teamGrid (Key …-000000000012) a ete ajoute au jeu Chevaliers - Content Blocks — il n'y etait pas, la v1 n'ayant pas vu la bande.

Roster live : Damian Indermitte (Directeur) · Sebastien Meizoz (Caviste) · Luis Almeida (Logisticien) · Michaela Rouvinet (Service commercial) · Salome Roten (Service commercial).

Le logement et le moteur Seekda — ⚠️ NON PORTE (mesure)

/fr/logement/ charge bien cloud.seekda.com/w/w-dynamic-shop/hotel:CH_VS_1400/42.js et rend deux div[data-skd-widget] (check-availability, offer-list). Mais le live le masque globalement, par une regle non qualifiee presente dans le CSS inline de la page :

css
.page-id-7969 .page-id-7223 .section-form.tkw-seekda-container,
.section-form.tkw-seekda-container { display: none; }

(commentaire du live : « cacher la reservation sur logements »). Conteneur et les deux .skd-widget mesurent 0x0 : le widget rend zero pixel. -> Non porte. Le porter ajouterait un bloc que le live n'affiche pas et ferait echouer le diff de fidelite ; ne pas le porter supprime en prime ~10 hotes tiers que le live charge pour rien sur chaque page. Cf. assets-substitues.md §6, qui l'avait deja mesure et tranche.

Chevaliers n'utilise donc AUCUN bloc embed. Le plan prevoyait un widget Airbnb : il n'existe pas (le live n'a que des liens Booking/Airbnb en texte riche dans les mediaText). Ni airbnb ni seekda ne figurent dans Core - Embed Provider : embarquer un fournisseur qu'on ne rend jamais, c'est exactement le piege du bloc speculatif.

Lecon (2e du meme genre) : lire le DOM ne suffit pas — il faut lire le CSS, et lire assets-substitues.md AVANT de proposer. Une bande peut etre presente dans le DOM et invisible a l'ecran.

« Emploi » n'est pas une page — mais les offres restent ajoutables

/fr/domaines-chevaliers/ porte une .section-vacancies :

html
<div class="section-vacancies">
  <div class="section-title-underline">NOS OFFRES D'EMPLOIS</div>
  <div class="text">Notre equipe est actuellement complete. Suivez-nous sur les reseaux
       sociaux pour voir les offres d'emplois disponibles ou contactez-nous.</div>
  <div class="positions-box"></div>   <!-- la boucle WP, rendue vide -->
</div>

Deux lectures a ne pas confondre :

  • Le texte est editorial et permanent, pas un etat vide : le live l'affiche qu'il y ait ou non des postes. -> richIntro (titre + prose). (La v1 disait « c'est un richIntro » — vrai pour la prose, mais elle en concluait qu'il n'y avait rien a lister.)
  • .positions-box est bien la boucle d'offres, simplement a zero ligne aujourd'hui. -> on pose aussi un childListing layout=links dessous : il ne rend rien tant qu'il n'y a pas d'enfant — exactement ce que fait la .positions-box vide du live — et il liste les offres des qu'on en ajoute.

Il n'y a donc pas de doctype chevaliersVacancyList ni de page /emploi/ (le plan en prevoyait une : elle n'existe pas sur le live ; la liste vit dans la page). Le seul type ajoute est chevaliersVacancy (Key f1b22001-…-000000000020), coquille pure : compositions pageHero + pageSettings + vacancyFacts, zero propriete, template Vacancy — deja agnostique de la marque (@inherits UmbracoViewPage + cast vers IVacancyFacts). Autorise sous chevaliersContentPage.

Ajouter une offre = travail d'editeur, sans dev : creer une « Offre d'emploi — Domaines Chevaliers » sous la page Domaines Chevaliers, la publier. Elle apparait dans la liste.

Autres pieges verifies

  • L'adresse de contact est celle de Gilliard (« Rue de Loeche 70, 1950 Sion », reception@gilliard.ch) : les deux marques partagent les bureaux. Ce n'est pas une erreur de scraping — reproduire tel quel.
  • Le menu « Vins » est entierement e-commerce (/fr/vins/ + 3 product-category/) -> hors perimetre, liens absolus vers le live.
  • /gammes (sans locale) 301 -> /fr/gammes/ : lien relatif du live, pas un bug a reproduire.

Ce qui reste (1.4b)

Accueil (8 bandes) · 5 pages de contenu · 2 textPage (CGV, politique de confidentialite) · notFoundPage.

Contributors

No contributors

Changelog

No recent changes