2
votes

Comment utiliser BizForms dans Kentico 12 sans générateur de page

Kentico 12 ne prend en charge que les formulaires utilisant le widget de création de page "Form" prêt à l'emploi.

Quelqu'un peut-il donner des exemples d'utilisation de BizForms sur un MVC _Layout.cshtml ou dans des pages qui n'utilisent pas le générateur de page?

Critères d'acceptation:

  • Doit autoriser les utilisateurs du CMS à modifier le formulaire et à faire refléter les modifications sur le site
  • Doit permettre au développeur de manipuler / transformer les données soumises avant de les enregistrer dans Kentico et avant d'envoyer des notifications / des répondeurs automatiques
  • Doit afficher correctement les FormSections personnalisées et les FormComponents personnalisés utilisés dans le générateur de formulaires

0 commentaires

4 Réponses :


0
votes

Hadès, Vous pouvez utiliser l'API Forms ( https://docs.kentico.com/api12/ content-management / form-data ) pour enregistrer / accéder aux données du formulaire et mettre en œuvre une mise en page entièrement personnalisée. J'espère que cela aide!


5 commentaires

Merci pour la réponse Roman mais cela ne répond pas aux critères d'acceptation.


Veuillez consulter la liste des événements que vous pourriez connecter pour l'élément 2 à partir des critères d'acceptation: docs.kentico.com/k12/custom-development/handling-global-even‌ ts /…


Salut Roman. Les événements globaux ne sont utiles que dans le contexte du CMS. Dans mon cas d'utilisation, je dois définir la valeur d'un champ en fonction de la section du site dans laquelle se trouve le visiteur. La valeur de ce champ sera utilisée comme adresse e-mail «À» pour l'e-mail de notification.


Avez-vous envisagé une macro personnalisée pour le champ d'adresse e-mail "À"? Je ne suis pas sûr à 100%, mais je pense que le document actuel est disponible dans le contexte de la méthode macro


Salut Roman - Comment appliquer les données de l'application MVC à la macro?



0
votes

Vous pouvez jeter un œil à l'espace de noms Kentico.Forms.Web.Mvc.Widgets dans votre projet MVC (il doit être inclus par défaut).

Il y a une classe de contrôleur KenticoFormWidgetController qui rend les formulaires partiels et accepte les soumissions de formulaires. Vous pouvez éventuellement utiliser la route Index de ce contrôleur pour afficher une partie de votre formulaire, mais je ne sais pas à quoi ressemble exactement la route.

Si vous avez accès au code source à Kentico, vous pouvez vérifier vous-même les éléments internes de celui-ci.


2 commentaires

Salut Alen, merci pour la réponse. J'ai jeté un coup d'œil au code source relatif à ce contrôleur et au widget de formulaire intégré - la plupart des classes qu'il utilise sont marquées comme internal empêchant leur utilisation dans mon propre code personnalisé.


Oui vous avez raison à ce sujet, je suppose qu'il est préférable de contacter le support Kentico dans ce cas, peut-être qu'ils ont des idées mais il me semble que ce n'est pas encore possible



1
votes

Le widget Form est rendu en utilisant une combinaison de la structure de vue suivante et du modèle de vue FormWidgetViewModel:

JsonConvert.DeserializeObject<FormBuilderConfiguration>(formInfo.FormBuilderLayout, new JsonSerializerSettings
    {
        ContractResolver = new CamelCasePropertyNamesContractResolver(),
        TypeNameHandling = TypeNameHandling.Auto,
        SerializationBinder = // Set to the internal FormBuilderTypesBinder, which validates only known form builder types
        StringEscapeHandling = StringEscapeHandling.EscapeHtml
    });

Si vous avez l'objet BizFormInfo pour le formulaire, il est nécessaire pour les propriétés suivantes:

new FormWidgetViewModel
{
    FormName = formInfo.FormName,
    FormConfiguration = IFormBuilderConfigurationRetriever.Retrieve(formInfo),
    FormComponents = IFormProvider.GetFormComponents(formInfo).GetDisplayedComponents( ... ),
    FormPrefix = // This may be optional outside of the Page Builder context,
    SubmitButtonText = formInfo.FormSubmitButtonText,
    SubmitButtonImage = formInfo.FormSubmitButtonImage
}

À l'intérieur de Ajax.Kentico (). BeginForm code> vous pouvez passer le contrôleur et l'action gérant le formulaire.

Utilisez les méthodes de IFormProvider pour mettre à jour ou ajouter la soumission du formulaire et pour envoyer des e-mails.

Mettre à jour (voir les commentaires) :

IFormBuilderConfigurationRetriever est marqué internal , il n'est donc pas directement accessible. Son implémentation utilise à son tour IFormBuilderConfigurationSerializer pour désérialiser formInfo.FormBuilderLayout . Cette interface est également marquée internal . De plus, l'implémentation de cette interface utilise le internal FormBuilderTypesBinder.

Cela signifie qu'il n'y a pas d'API disponible pour récupérer Model.FormConfiguration . À partir de Kentico 12.0.16, vous devrez recréer la fonctionnalité interne. La mise en œuvre de base est comme ceci:

using (Ajax.Kentico().BeginForm( ... ))
{
    @Html.AntiForgeryToken()

    @Html.Kentico().FormFields(Model.FormComponents, Model.FormConfiguration, FormFieldRenderingConfiguration.Widget)

    // Render Model.SubmitButtonImage using @Html.Kentico().ImageInput( ... )
    // Or render a plain <input> using Model.SubmitButtonText
}


3 commentaires

Salut Yuyiy. Je ne semble pas avoir accès à IFormBuilderConfigurationRetriever car il est marqué comme internal . En regardant l'implémentation interne de cela, il utilise IFormBuilderConfigurationSerializer pour désérialiser la mise en page du générateur de formulaires, mais IFormBuilderConfigurationSerializer est également marqué comme internal . Les paramètres de sérialisation utilisent également la classe interne FormBuilderTypesBinder ... Y a-t-il un moyen de faire tout cela sans les utiliser et sans avoir à extraire tout le code interne de dotPeek?


Bonne prise! Il semble qu'il n'y ait pas d'autre moyen de le faire que de recréer ce code interne , ou au moins la partie de désérialisation. Heureusement, FormBuilderTypesBinder valide principalement que les types sont appropriés, vous pouvez donc ignorer cette partie tant que vous ne créez pas la mise en page du formulaire en dehors du générateur de formulaires de l'administrateur. C'est un bon cas d'utilisation, je vous recommande donc d'en envoyer une description à l'équipe produit Kentico à: productmanagement@kentico.com ou si vous le souhaitez, vous pouvez envoyer l'e-mail à support@kentico.com qui pourra le transmettre à l'équipe produit.


Nous avons déjà été en contact avec le support et l'équipe de conseil de Kentico. Les deux ont essentiellement dit que ce n'était pas un cas d'utilisation pris en charge dans la version actuelle et qu'ils pourraient l'envisager pour une version future - ce qui ne nous aide pas avec le projet actuel. Merci pour votre contribution - si vous mettez à jour votre réponse pour inclure les informations sur le code interne et la désérialisation manuelle, je l'accepterai comme réponse (puisque c'est ce que nous avons fait maintenant et cela semble fonctionner)



1
votes

Le PO a publié un blog expliquant comment faire fonctionner cela .

La solution nécessite d'utiliser certaines des API internes de Kentico pour le rendu de Form Builder avec des widgets de formulaire et de placer ce code dans une action Controller.

<!-- ~/Views/Form/Form.cshtml -->

@using Kentico.Forms.Web.Mvc;
@using Kentico.Forms.Web.Mvc.Widgets;
@using Kentico.Forms.Web.Mvc.Widgets.Internal

@model FormWidgetViewModel

@{
    var config = FormWidgetRenderingConfiguration.Default;

    // @Html.Kentico().FormSubmitButton(Model) requires 
    // this ViewData value to be populated. Normally it
    // executes as part of the Widget rendering, but since
    // we aren't rendering a Widget, we have to do it manually

    ViewData.AddFormWidgetRenderingConfiguration(config);
}

@using (Html.Kentico().BeginForm(Model))
{
    @Html.Kentico().FormFields(Model)

    @Html.Kentico().FormSubmitButton(Model)
}


0 commentaires