Rich Text Box d'une data connection - InfoPath Dev
in

InfoPath Dev

Rich Text Box d'une data connection

Last post 05-30-2007 11:55 AM by cyph. 8 replies.
Page 1 of 1 (9 items)
Sort Posts: Previous Next
  • 02-12-2007 07:50 AM

    Rich Text Box d'une data connection

    Bonjour tout le monde,

    Dans un de mes formulaires j'utilise une Data Connections vers une liste de formulaires Sharepoint.
    Parmi les champs de ces formulaires dont j'ai besoin il y a une "Rich Text Box".

    Le problème est que toute la mise en forme (retour à la ligne, caractères gras, etc.) dans cette "Rich Text Box" est perdue quand je l'intègre à mon nouveau formulaire.

    Est-ce qu'il y a une méthode particulière pour conserver cette mise en forme ?
  • 02-12-2007 07:56 AM In reply to

    Re: Rich Text Box d'une data connection

    Salut,

    Il faut que ton schéma accepte la richtextbox voici comment adapter ton schéma:

    http://support.microsoft.com/?scid=kb;fr;826996&spid=2515&sid=global

    ++

    Thierry
    Infopath 2007, Langage: C#2.0 (Modèle Objet 2003)
    merci de lire ceci
  • 02-12-2007 08:24 AM In reply to

    Re: Rich Text Box d'une data connection

    J'ai vu cet article, mais je sais pas si je peux adapter mon schema (voir ci-dessous), parce que mon element est le Data Source (DivDev) et la Rich Text Box est un attribut de cet élément (richTxtMouvement).

    Je suis pas encore très à l'aise avec ces schéma alors pardon si je suis un peu à la rue....



    <?xml version="1.0"?>
    <xsd:schema elementFormDefault="qualified" targetNamespace=".
    .." xmlns:xsd="..." xmlns:dfs="...">
    <xsd:element name="myFields">
    <xsd:complexType>
    <xsd:sequence>
    <xsd:element name="dataFields">
    <xsd:complexType>
    <xsd:sequence>
    <xsd:element name="DivDev" minOccurs="0" maxOccurs="unbounded">
    <xsd:complexType>
    <xsd:attribute name="ID" type="xsd:integer"></xsd:attribute>
    <xsd:attribute name="txtResp" type="xsd:string"></xsd:attribute>
    ...
    <xsd:attribute name="richTxtMouvement" type="xsd:string"></xsd:attribute>
    ...
    </xsd:complexType>
    </xsd:element>
    </xsd:sequence>
    </xsd:complexType>
    </xsd:element>
    </xsd:sequence>
    </xsd:complexType>
    </xsd:element>
    </xsd:schema>

  • 02-12-2007 11:53 PM In reply to

    Re: Rich Text Box d'une data connection

    Salut,

    Tu ne peux pas faire ca dans un attribut????

    Comment veux-tu avoir des autre balise de formatage dans un attribut c'est impensable. De plus la grandeur d'un attribut est limité en caractères 256 si je me souviens bien.

    Il faut que tu définisse ton RTB en un élément pas un attribut.

    D'ailleurs c'est toi qui a choisi ca ou ca été défini par quelqu'un d'autre?
    Infopath 2007, Langage: C#2.0 (Modèle Objet 2003)
    merci de lire ceci
  • 02-14-2007 02:31 AM In reply to

    Re: Rich Text Box d'une data connection

    Hello,

    Quand je crée ma référence vers une librairie de formulaires Sharepoint (Data Connection dans Infopath), il crée automatiquement les schemas et tout ce qui va avec. Du coup ma liste devient un élément et les champs de cette liste deviennent des attributs.
    Donc comme tout se fait automatiquement, c'est pas vraiment moi qui ai défini ca... Et le problème c'est que je vois pas trop comment le faire autrement

  • 02-14-2007 04:00 PM In reply to

    Re: Rich Text Box d'une data connection

    Désolé mais je ne connais pas les liste Sharepoint car je n'aie jamais vraiment essayé!

    Alors je te conseil de poster dans la section anglaise qui pourra peut-être mieux te renseigné
    Infopath 2007, Langage: C#2.0 (Modèle Objet 2003)
    merci de lire ceci
  • 02-15-2007 01:20 AM In reply to

    Re: Rich Text Box d'une data connection

    ok je vais regarder ça.
    Merci encore pour ton aide
  • 05-04-2007 09:09 AM In reply to

    • cyph
    • Not Ranked
    • Joined on 03-21-2007
    • Posts 4

    Re: Rich Text Box d'une data connection

    Salut

    Je ne sais pas si tu as résolu ton problème, mais comme tu n'as pas mis de réponse je vais supposer que non, je vais donc y répondre (au pire ça servira pour les autres !).

    Ma solution pour récupérer du xhtml et le mettre dans une rich text box ne nécessite aucun bidouillage dans sharepoint, mais par contre du code dans le formulaire. Par contre il faut avoir Infopath 2007 et Visual Studio pour faire ça !

    1) Les sources de données du formulaire

    J'ai trois sources de données qui sont intéressantes pour l'exemple :

    1. la source de données correspondante à ma rich text box : commentaires (de la source de données principale)
    2. la source de donnée externe (celle qui contient le xhtml que je veux insérer dans mon rich text box) : ows_commentaires (de la source de données secondaire)
    3. une source de donnée intermédiaire (de type string) : commentaires_intermediaire

    L'idée est de récupérer les données brutes de la source de données externe pour les mettres directement dans commentaires_intermediaire, puis d'ajouter un enfant à la structure xml de commentaires. Pour cela,

        1. définir la source de données secondaires (outils / connexion de données... - si vous utilisez les workflows, je donnerai plus de détails plus bas)

        2. lier cette source de données à commentaires_intermediaire (dans valeur par défaut de commentaires_intermédiaire, mettre le champ correspondant à la source de données secondaire)

        3. dans les options de formulaire :

    • Sécurité et approbation -> Autorisation totale ; Signer ce formulaire et sélectionner un certificat (vous aurez besoin d'en créer un si vous n'en avez pas déjà)
    • Programmation -> choisissez le langage de code que vous voulez utiliser (j'utilise C#)

        4. Outils / Programmation / Loading (ouvre VS), insérer le code suivant dans FormEvents_Loading :

    try
    {
        XPathNavigator racineXPath = this.MainDataSource.CreateNavigator();
        XPathNavigator champ = null;
        string chemin_XPath, commentaires;

        chemin_XPath = "my:mesChamps/my:commentaires_intermediaire";
        champ = racineXPath.SelectSingleNode(chemin_XPath, NamespaceManager);
        commentaires = champ.Value;

        chemin_XPath = "my:mesChamps/my:commentaires";
        champ = racineXPath.SelectSingleNode(chemin_XPath, NamespaceManager);
        champ.AppendChild(commentaires);
    }
    catch (Exception exception) {}


    Voilà pour le formulaire... mais comme nous lui avons rajouté du code managé, la publication du formulaire va être un peu plus compliquée...

    2) Publier le formulaire

    1. Fichier / Publier / Vers un serveur Sharepoint blablabla / adresse de votre MOSS /  Activer ce formulaire pour navigateur / emplacement du formulaire : où vous voulez, sauf si vous utilisez les workflows (dans ce cas, voir plus bas).
    2. Si vous n'utilisez pas les workflows, activer le formulaire dans la page d'administration de MOSS (http://serveurMOSS:portAdmin/_admin/ManageFormTemplates.aspx) dans la collection de site pour laquelle vous voulez que le dormulaire soit disponible.

    Voilà, je crois que c'est tout !

     

    Note : pour les workflows

    On veut transferer les commentaires du formulaire de la tâche A vers les commentaires du formulaire de la tâche B :

    1. lors de l'évenement OnTaskChanged de la tâche A, insérer : commentaires = taskA_afterProperties.ExtendedProperties["commentaires"].ToString(); (commentaires est un attribut de type string de la classe de votre workflow, Workflow1 en général)
    2. lors de la création de la tâche B, insérer : taskB_properties.ExtendedProperties["commentaires"] = commentaires;
    3. ouvrir bloc note (ou n'importe quel éditeur de texte), entrer : <z:row xmlns:z="#RowsetSchema" ows_commentaires="" /> puis enregistrer le fichier sous le nom ItemMetadata.xml (pour plus de renseignements sur cette partie, voir http://msdn2.microsoft.com/en-us/library/ms497641.aspx)
    4. dans infopath, pour le formulaire de la tâche B, ajouter une connexion de réception de données de type XML et mettez le chemin de votre ItemMetadata.xml.

    Concernant la publication, il faut mettre pour l'emplacement du formulaire là où sont les formulaires de tâches de votre workflow (généralement dans le dossier du projet, ou dans un sous-dossier "formulaires"...). De plus, il faut rajouter la DLL correspondant au formulaire. Celle-ci est située généralement dans Mes Documents\Projets InfoPath\nomDuFormulaire\\bin\Release. Copiez cette DLL dans le même répertoire que le formulaire (dans le projet du workflow). Enfin, dans le script de publication du workflow (PostBuildActions.bat par exemple), rajouter la ligne suivante : xcopy /s /Y "%FEATUREDIR%\*.dll"  "%FEATURESDIR%\NomDeLaFeature". 

  • 05-30-2007 11:55 AM In reply to

    • cyph
    • Not Ranked
    • Joined on 03-21-2007
    • Posts 4

    Re: Rich Text Box d'une data connection

    J'ai finalement réussi à acceder directement aux données de la source secondaire, plus besoin donc de commentaires_intermediaires. Voici le code qu'il faut mettre dans le point 4. :

    try
    {
        // Ma source secondaire s'appelle ItemMetaData
        XPathNavigator champ_source_secondaire =
            this.DataSources["ItemMetaData"].CreateNavigator();
        // un fichier ItemMetaData.xml resemble à ceci :
        // <z:row xmlns:z="#RowsetSchema" ows_commentaires="" />
        // on descend donc vers le seul et unique fils du fichier : row
        champ_source_secondaire.MoveToFirstChild();
        // on cherche l'attribut qui nous convient : ows_commentaires (pas besion de namespaceURI)
        string commentaires = champ_source_secondaire.GetAttribute("ows_commentaires", "");
        XPathNavigator champ = this.MainDataSource.CreateNavigator();
        champ.SelectSingleNode(
           "/my:mesChamps/my:commentaires",
           NameSpaceManager
        );
        /*
         * Si vous voulez définir totalement le champ, utilisez InnerXml
         * Si vous voulez rajouter du texte après le texte existant du champ, utilisez AppendChild(commentaires)
         *                                               avant : PrependChild(commentaires)
         */
        champ.InnerXml = commentaires;
    } catch (Exception exception) {/*ce que vous voulez*/}

    Attention pour AppendChild et PrependChild : j'ai déjà eu des problèmes. En effet le code xhtml à l'intérieur des rich text est parfois comme ceci :<html xmlns=blablabla>bliblibli</html> mais on a parfois seulement le bliblibli... Dans le premier cas j'imagine (je n'ai pas testé) qu'il faille faire un champ.MoveToFirstChild(); avant le AppendChild / PrependChild.

    Remarque : si rien ne s'affiche dans la boîte de teste riche, vérifiez que toutes vos balises à la racine contiennent l'attribut xmlns="http://www.w3.org/1999/xhtml" (je ne suis pas sûr à 100% de l'adresse). Par exemple ce message ne s'affichera pas :

    <div>toto</div>
    <div xmlns="http://www.w3.org/1999/xhtml">toto</div>

    Pour remédier à ce problème et pour éviter d'avoir à modifier toutes les balises à la racine, je vous conseille de les entourer de la balise htnl qui doit contenir le namespace :

    <html xmlns="http://www.w3.org/1999/xhtml">
      <div>toto</div>
      <div xmlns="http://www.w3.org/1999/xhtml">toto</div>
    </html>

    Vous pourrez remarquer qu'il n'y a pas besoin d'enlever le namespace pour les éléments fils (bon, c'est pas ce qu'il y a de plus propre mais ça marche...). 

Page 1 of 1 (9 items)
Copyright © 2003-2019 Qdabra Software. All rights reserved.
View our Terms of Use.