Patterns - comment ajouter / modifier
Ajouter un formulaire (surface controller)
Le pattern standard repose sur le base generique FormSurfaceController<TModel> (Controllers/FormSurfaceController.cs).
- View model : creer une classe dans
ViewModels/qui implementeIFormViewModel(au minimum la propriete honeypotMiddleName+CurrentLanguage). VoirContactFormViewModel,ContactCraftsmanFormViewModel. - Controller : creer
XxxFormSurfaceController : FormSurfaceController<XxxViewModel>dansControllers/, injecterIEmailService(etILogger<EmailService>pour le base), overrideHandleValidSubmit(model, emailSettings). - Le base gere automatiquement : validation
ModelState, detection anti-spam (siMiddleNamerempli -> log + redirect sans envoi),TempData["FormSuccess"] = true, redirectRedirectToCurrentUmbracoPage(). - Dans
HandleValidSubmit, appeler la methodeEmailServiceadequate, puis envoyer aux destinataires deemailSettings.EmailTosi presents. - Cote vue, le formulaire poste vers l'action
Submitdu controller ; les libelles passent par le dictionnaire (Forms.Generic.*).
emailSettings provient de la page courante castee en IEmailSettings (composition emailSettings sur le document type).
Ajouter un service
- Definir l'interface dans
Interfaces/(IXxxService) si une abstraction est utile (sinon enregistrer la classe concrete, commeJemaReminderService/ImagePreloadService). - Implementer dans
Services/. - Enregistrer dans
Program.cs(AddScoped/AddSingletonselon le cas). - Injecter par constructeur.
Ajouter une option de configuration
- Creer la classe dans
Options/avec une constante de section (ex.public const string Smtp = "Smtp";). builder.Services.Configure<TOptions>(builder.Configuration.GetSection(TOptions.Section))dansProgram.cs.- Ajouter la section correspondante dans
appsettings.json(valeurs sensibles laissees vides, injectees par environnement). - Injecter
IOptions<TOptions>la ou c'est utilise.
Ajouter un handler de notification Umbraco
- Creer une classe
INotificationHandler<ContentSavingNotification>(ou autre notification) dansNotifications/. - Enregistrer via
.AddNotificationHandler<TNotification, THandler>()dans la chaineCreateUmbracoBuilder()deProgram.cs. - Pour valider un nom de noeud : utiliser
notification.CancelOperation(new EventMessage(...))pour bloquer la sauvegarde (modele :JemaScheduleChangeNotificationHandler). - Pour deriver une valeur dans une propriete :
node.SetValue("alias", valeur)dans le handler. Si tu changes un alias de doctype/propriete lie, mets a jour le handler.
Ajouter un type d'email
- Modele d'email dans
Mailing/Models/(souvent derive deEmailTemplateBaseModel). - Template Razor dans
Mailing/Templates/Xxx.cshtml. Les templates sont embarques (<EmbeddedResource Include="Mailing\Templates\**" />dansWeb.csproj) ; certains sont aussi<Content Remove=...>pour ne pas etre publies a la volee. - Methode dans
EmailServicequi construit le modele et appelleEmail.From(null)...UsingTemplateFromEmbedded("Web.Mailing.Templates.Xxx.cshtml", model, assembly, true), puisSendEmailAsync(...). - Choisir l'expediteur :
isJema: trueutilise le SMTP JEMA (JemaSmtpOptions), sinon le SMTP principal (SmtpOptions). Les sujets sont prefixes[DEV]/[STAGING]hors prod automatiquement.
Ajouter un document type / une composition
Editer via le backoffice Umbraco puis exporter avec uSync (.config sous src/Web/uSync/v17/ContentTypes/), ou ecrire le .config a la main avec prudence. Reutiliser les compositions existantes (emailSettings, headerSettings, footerSettings, pageSettings, cookiesSettings, marketingSettings, homeNewsCardsSection). Les document types sont Culture-variants (multilingue).
Ajouter un bloc BlockGrid / une section
- Bloc : vue dans
Views/Partials/blockgrid/Components/<nom>Block.cshtml+ document type element (<nom>block.config). - Section : vue dans
Views/Partials/sections/<nom>Section.cshtml+ document type section/composition correspondant.
Ajouter / modifier une cle de traduction
Ajouter la cle dans le dictionnaire Umbraco (export uSync sous uSync/v17/Dictionary/), nommee en point.notation (ex. Forms.Jema.Date). Consommer via _umbracoHelper.GetDictionaryValue(key, culture) ou IDictionaryItemService.TranslateAsync(key, culture).

