Patterns - comment ajouter / modifier
Ajouter un widget
Un widget = 4 elements (le JS et le SCSS sont optionnels selon l'interactivite). Voir l'anatomie detaillee dans ../modules/widgets.md.
- ViewComponent : creer
Widget<Nom>ViewComponent.csdansApp.Core/ViewComponents/, heriter deViewComponent, implementerInvokeAsync(BlockGridItem item), injecter ce qu'il faut (IDomainServicepour le skin,Ii18nService, ...), retournerView("Default", model). - Vue :
src/Nanoxi/.../App.Core/Views/Components/Widget<Nom>/Default.cshtml. Si interactif, emettre l'init JS :window.Widget<Nom>.addNewInstance("@Model.ContentKey"). - View model : dans
App.Model/ViewModel/Component/. - Document type : ajouter le
widget<Nom>(+widget<Nom>Settings) dans uSync (src/Umbraco/uSync/v9/ContentTypes/), et l'autoriser dans le BlockGrid. - SCSS (si style) :
src/Nanoxi/Design/{skin}/css/component/widget<nom>/(trio_roots/_foundation/_customer) + bundlebundles/bundle-widget<nom>.scss, puis declarer le bundle dansvite.config.ts. - TypeScript (si interactif) :
src/Nanoxi/TypeScript/ts/component/widget<nom>/Widget<Nom>.ts(+...Item.ts) + entreebundles/bundle-widget<nom>.ts, puis declarer dansvite.config.ts.
Ajouter un service
- Definir l'interface dans
App.Interface(IXxxService). - Implementer dans le projet adequat (
Services/XxxService.cs). - Enregistrer dans
src/Umbraco/Program.cs(services.AddScoped<IXxxService, XxxService>()). - Injecter par constructeur la ou c'est utilise.
Ajouter un repository (donnees custom NPoco)
- Modele/mapping dans
App.Repository/Mapping/avec[TableName("nanoxi_...")]+[PrimaryKey("Id")]. - Interface dans
App.Interface, implementation dansApp.Repository/Repositories/injectantIScopeProvider. - Toujours encapsuler dans
using (var scope = _scopeProvider.CreateScope()) { ... scope.Complete(); }. - Enregistrer dans
Program.cs. - La table doit exister : ajouter le script de creation dans
data/01.Scratch/(prefixe ordonne) ou via migration.
Ajouter une validation de formulaire
- Creer
AbstractValidator<TViewModel>dansApp.Validation. - Enregistrer
services.AddTransient<IValidator<TViewModel>, TValidator>()dansProgram.cs. - Cote vue, FormHelper traduit en validation client (jQuery Validation).
Ajouter un document type / une composition
Editer via le backoffice Umbraco puis exporter avec uSync (les .config apparaissent sous src/Umbraco/uSync/v9/ContentTypes/), OU ecrire directement le .config. Attention aux alias reserves (voir business-rules.md). Utiliser les compositions existantes (compositionSeo, compositionSitemap, compositionWidget).
Ajouter un workflow Umbraco Forms
- Creer la classe dans
App.UmbracoForms/Workflows/, heriter deUmbraco.Forms.Core.WorkflowType(ouBaseEmailWorkflowTypepour un mail). DefinirId/Name/Alias/Description/Icon/Groupdans le constructeur. - Exposer les reglages avec
[Setting(...)](View = "TextField","Checkbox","richtext", ...). Valider dansValidateSettings(). - Implementer
ExecuteAsync(WorkflowExecutionContext context):context.Record(champs,UniqueId,UmbracoPageId),context.Form(nom). Pour un service scoped (repository), resoudre viaIServiceScopeFactory.CreateScope()(cf.RequestPaymentWorkflow/SendRazorEmailNanoxi). - Enregistrer dans
App.UmbracoForms/SiteComposer.cs:builder.WithCollectionBuilder<WorkflowCollectionBuilder>().Add<MonWorkflow>().
Ajouter un dashboard back-office
- Creer
src/Nanoxi/Custom/Umbraco/App_Plugins/<Nom>/avecpackage.manifest(declaredashboards+javascript),<nom>.controller.js(angular.module("umbraco").controller),<nom>.resource.js(factory$httpvers l'API),<nom>.html, etLang/fr-CH.xml(libelle de l'onglet viadashboardTabs/<alias>). - Backend :
XxxApiController : UmbracoApiControllerdansApp.Api/Controllers/(routes/Umbraco/Api/XxxApi/{action}). - Modele de la section visee dans
package.manifest("sections": ["content"]).
Ajouter une route custom
Dans src/Umbraco/Program.cs, apres le mapping des endpoints Umbraco (les routes Sitemap/Robots/RSS y sont declarees comme exemples).
Email
IEmailService rend un template Razor via IViewRender puis envoie en SMTP (IOptions<SmtpOptions>, Mailgun). Les templates vivent dans App.Mail/Templates/ (copies au build vers Views/Partials/Templates).

