Archives mensuelles: Juin 2009

Sevices de formulaire InfoPath, L'authentification basée sur les formulaires (FBA) et les noms de fichier uniques

J'ai été travailler sur certains formulaires InfoPath cette semaine dans la mousse dans un environnement de FBA et savant, Quand je suis allé à déployer les formulaires à un environnement de production avec un FBA zone que le nom d'utilisateur() fonction ne fonctionne pas. Je l'utilise pour générer des noms de fichiers uniques.

Puits, Cette fonction ne fonctionne pas dans un environnement de FBA (au moins, pas hors de la boîte). Et, à la réflexion, en utilisant le nom d'utilisateur dans la façon dont j'avais l'intention n'ont garanti un nom de fichier unique dans tous les cas.

Ma solution est d'utiliser le maintenant() fonction et une règle qui se déclenche lors du chargement du formulaire. J’attribue le nom de fichier de l’élément de données lorsqu’il est vide:

image

image

L’avantage de cette approche est que le nom de fichier est défini qu’une seule fois. (Je ne le montre dans la capture d'écran, mais mettre une condition sur la règle se déclenche uniquement lorsque « myFilename » est vide). J’ai utilisé pour définir le nom du fichier au niveau de la source de données. En général, Je ferais quelque chose (mauvaise) Comme ça:

image

Le problème est que si l'utilisateur a ouvre le formulaire lundi et l'utilisateur b il modifie le mardi, vous vous retrouver avec deux formes différentes car deux utilisateurs différents il a enregistré avec les noms d'utilisateur différents.

Si, comme ennuyeux comme FBA peut être en général et avec InfoPath en particulier, Il m'a fait repenser à une petite mais vraiment importants détails techniques et une approche que je n'aurais pas pu faire autrement!

</fin>

S'abonner à mon blog.

Me suivre sur Twitter à http://www.twitter.com/pagalvin

Tags Technorati:

Sécurisation des vues de bibliothèque de documents SharePoint liste semble (en quelque sorte) Possible avec jQuery

Il s'agit d'un autre poste dans mon série en cours Comment utiliser jQuery avec SharePoint.
Si vous souhaitez en savoir plus sur jQuery, Je recommande fortement: jQuery in Action par ours Bibeault et Yehuda Katz.

Une des premières choses que je pensais, une fois que j'ai commencé à jouer avec jQuery, était de savoir si nous pourrions utiliser pour garantir un affichage SharePoint. La réponse est « non » (ou au moins, Je ne suis pas réclamer que c'est possible). Cependant, Il est certainement possible de rendre difficile pour les gens de voir une vue particulière.

J'ai commencé avec mon environnement sandbox lorsque vous travaillez sur ce. J'ai écrit sur cet environnement ici: Facile et rapide: Créer votre propre jQuery Sandbox pour SharePoint.

Pour « obtenir » un point de vue, Suivez ces étapes:

  1. Créer une vue que vous souhaitez sécuriser. J'ai fait cela et l'a appelé « Vue sécurisé ».

    C'est à quoi il ressemble quand ce n'est pas « garanti »:

    image

  2. Ajouter un composant WebPart éditeur de contenu à la page de la vue en utilisant l'astuce décrite dans l'article de la sablière (i.e. ajouter « PageView = Shared&ToolPaneView = 2 » à l'URL).
  3. Comprendre votre _spUserId de SharePoint en suivant ces étapes fous, croire ou pas:
    1. Ouvrez une session dans votre environnement SharePoint.
    2. Dans le champ d'adresse du navigateur web, type: « javascript:alerte(_spUserId »).
    3. Noter le résultat (C'est le « 13 » dans mon cas).

      image

  4. Ajoutez le code javascript suivant pour votre CEWP en mode code:

    <script type ="text/javascript"
        SRC =".. /.. /jQuery Library/jQuery-1.3.2.min.js">
    </script>
    
    <script type ="text/javascript">
      $(fonction() {
    
        alerte(_spUserId);
    
        var theSecuredView = $(« iframe[FilterLink * = 20View % garanti]');
    
        Si ((theSecuredView.length > 0) && (_spUserId == 13))
          $(« iframe[FilterLink * = 20View % garanti]').parent().parent().parent().html("<TR bgcolor = rouge><TD>Pas de vue pour vous!</TD></TR>");
      });
    
    </script>
    

J'ai inclus cette alerte(_spUserId) ligne là-dedans pour démontrer comment ce n'est pas vraiment une « sécurisation » une vue, mais simplement rend plus difficile à voir. Plus sur cela dans un instant.

Essentiellement, jQuery est à la recherche d'un iFrame sur la page qui possède un attribut qui contient « Secured % 20View » de sa valeur. Une fois qu'il la trouve, nous vérifions pour voir si l'utilisateur actuel est « 13 ». S'il est, Nous marchons vers le haut le DOM pour un <TR> Tag (qui a découvert par affichage source et traçage il) puis en remplaçant cette balise TR avec mon message. Je ne sais vraiment pas comment robuste c'est (Je suis très suspecte, En fait), mais cela a fonctionné dans mon bac à sable. Si j'ai trouver une meilleure façon, Je vais de blog à ce sujet. C'est le résultat:

image

Je clique sur le bouton OK et les données sont remplacées par un grand message rouge:

image

Comme vous pouvez le dire, la façon dont j'ai implémenter cette solution de « sécurité » est de permettre le composant WebPart restituer elle-même. Une fois terminé, J'écrase son contenu avec « sans moi pour vous!« message.

Malgré le fait qu'il n'est pas vraiment un « garanti » « avis, Il est potentiellement utile et avec un travail intelligent, Il peut éventuellement être sécurisable dans un sens plus formel. La question fondamentale est que le client obtient toutes les données, puis, seulement après qu'il obtient les données, Il anéantit. Si le client ne reçoit pas les données, un utilisateur habile peut empêcher l'exécution du tout de la jQuery et voir ce qu'il souhaite voir.

Il y a autres inconvénients. Cette approche de « sécurité » est basée sur un _spUserId. Nous souhaitons à vraiment sécurisé basé sur le modèle complet de sécurité SharePoint, ou au moins de nom d'utilisateur. Cela devient de plus en plus difficile, mais je vois des trucs bien écrit sur ce sujet, Si j'ai bon espoir, qu'il y a une bonne réponse à ce problème.

La liste des points de vue se devrait être réduite., Si possible. Je n'ai pas essayé de comprendre cela. Je suppose que c'est possible, mais n'est pas vraiment résoudre le problème de sécurité fondamentales, parce que quelqu'un pourrait encore juste tapez l'URL de la vue qu'ils veulent (s'ils savaient il). Cependant, parage logique. C'est une caractéristique de la facilité d'utilisation et il contribue à obscurcir les choses. Si un utilisateur final ne sait pas que l'évènement existe, ils ne sera pas probablement essayer de l'utiliser. Parfois, C'est assez bon.

Avec de la chance, J'aurai plus d'écrire sur ce sujet au fil du temps.

</fin>

S'abonner à mon blog.

Me suivre sur Twitter à http://www.twitter.com/pagalvin

Facile et rapide: Le meilleur moyen d'utiliser jQuery pour masquer un champ de texte sur un formulaire SharePoint

Il s'agit d'un autre poste dans mon série en cours Comment utiliser jQuery avec SharePoint.
Si vous souhaitez en savoir plus sur jQuery, Je recommande fortement: jQuery in Action par ours Bibeault et Yehuda Katz.

Précédemment, J'ai écrit sur l'utilisation de jQuery pour localiser et masquer un champ de texte sur un formulaire. Je n'aimais pas l'approche spécifique (J'ai le chaînage de parents – c'est tout simplement n'est pas fait ces jours, au moins dans les familles de qualité).

Quand j'ai commencé à penser à elle, Je savais que j'avais besoin de trouver un <TR> à qui je pourrais invoquer la peau() méthode. Mon effort au début pour trouver le bon <TR> a quelque chose comme ça:

$(' tr:a(entrée[titre = Me cacher!])');

Le problème est qu'il trouverait tous <TR> tag qui m'avait une relation de parent à la peau! champ, même si cacher Me! est imbriqué dans plusieurs niveaux <TR>s. Il s'avère que sur mon formulaire de bac à sable, estime que l'expression 9 différents TR qui ont cache Me! comme un enfant quelque part dans son arborescence DOM. J'ai réalisé que je pouvais marcher vers le haut l'arbre de la zone de saisie elle-même, Voilà comment j'ai fini par les parents de maltraiter, mais il n'a pas très bien avec moi.

J'ai donné une pensée à cela et une des choses que j'ai lu enfin fait sens: Je pourrais pas() méthode pour couper des <TR>s que je ne veux pas dans mon jeu de fractionnement. Cela m'a conduit à cette:

$(' tr:a(entrée[titre = Me cacher!])').pas(' tr:a(TR)').cacher();

Le premier bit détecte tous les <TR> balises qui ont la peau Me! champ dans leur propre hiérarchie. Ensuite, elle supprime toute <TR> qui ont aussi un enfant <TR>. Cela nous laisse avec une seule <TR> qui:

1) N'a pas <TR> enregistrements enfants

2) Il a le champ de saisie comme enfant.

Nous pouvons ensuite appliquer la peau() méthode de la valeur et nous aurons fini.

Je suis toujours un peu nerveux à ce sujet, mais pas aussi nerveux que les parents de chaînage.

Je ne sais pas si c'est conseillé ou pas. Il peut y avoir un moyen plus approprié d'identifier simplement le <TR> que nous nous soucions sous une forme de SharePoint. Si vous savez, Veuillez poster un commentaire.

</fin>

S'abonner à mon blog.

Me suivre sur Twitter à http://www.twitter.com/pagalvin

Facile et rapide: Utiliser jQuery pour masquer un champ de texte sur un formulaire SharePoint

Il s'agit d'un autre poste dans mon série en cours Comment utiliser jQuery avec SharePoint.
Si vous souhaitez en savoir plus sur jQuery, Je recommande fortement: jQuery in Action par ours Bibeault et Yehuda Katz.

MISE À JOUR (déjà!): Je pense une meilleure façon de localiser les <TR> balise je veux cacher et a écrit à ce sujet ici. Vous pouvez toujours trouver cet article intéressant en tout cas donc je suis leavnig vers le haut.

Je veux masquer un champ texte, « Me cacher!« comme le montre:

image

Le jQuery suivant fait le truc pour moi:

<script type ="text/javascript">

  $(fonction() {


    $(« d'entrée[titre = Me cacher!]').parent().parent().parent().cacher();

  });

</script>

Le code dit, « find me entrée tous les champs dont le titre = Me cacher!. Puis, sa mère et puis sur suivant parent et la * prochaine * parent (ouf!) et invoquer la peau() méthode sur cette chose, quel qu'il arrive à être.

J'ai pensé que cette structure parent en visualisant le code HTML du formulaire que SharePoint créé comme indiqué:

<TR>
    <TD NoWrap= « true" valign= « top" Largeur= « 190px" classe= « ms-formlabel »>
        <H3 classe= « ms-standardheader »>
            <nobr>Me cacher!</nobr>
        </H3>
    </TD>

    <TD valign= « top" classe= « ms-formbody" Largeur= « 400px »>
        <!-- FieldName = « Me cacher!"
                 FieldInternalName = Hide_x0020_Me_x0021_ »"
                 FieldType = « SPFieldText"
        -->
        <travée dir= « aucun »>
            <entrée
                nom= « ctl00$ m$ g_bdb23c2c_fde7_495f_8676_69714a308d8e$ ctl00$ ctl04$ ctl02$ ctl00$ ctl00$ ctl04 ctl00$ ctl00$ $TextField"
                type= "texte"
                MaxLength= "255"
                ID= ctl00_m_g_bdb23c2c_fde7_495f_8676_69714a308d8e_ctl00_ctl04_ctl02_ctl00_ctl00_ctl04_ctl00_ctl00_TextField""
                titre= « Me cacher!"
                classe= « ms-long" />
                <br>
        </travée>


    </TD>
</TR>

Cette photo montre le même, mais marqué avec les parents:

image

Le premier parent (1) est une balise span. Parent de travée (2) est une balise TD et puis finalement nous arrivons à la véritable mère je veux cacher (3) qui est la balise TR elle-même.

Il s'agit d'une approche assez terrible, je pense que parce qu'il est extrêmement dépendant de la structure très particulière de ce formulaire. Lorsque SharePoint 2010 sort, Cette structure entière pourrait changer et rompre cette approche. Ce que je veux vraiment faire, c'est métier un sélecteur jQuery qui va dans le sens de « trouvez-moi tous les TR (et seuls les balises TR) qui ont quelque part dans les éléments de leurs enfant un champ d'entrée dont le titre = Me cacher!”. J'ai à partir du bas et remonter. En supposant que j'ai trouver ceci, Je posterai une mise à jour « rapide et facile ' post.

</fin>

S'abonner à mon blog.

Me suivre sur Twitter à http://www.twitter.com/pagalvin

Facile et rapide: Créer votre propre jQuery Sandbox pour SharePoint

Il s'agit d'un autre poste dans mon série en cours Comment utiliser jQuery avec SharePoint.
Si vous souhaitez en savoir plus sur jQuery, Je recommande fortement: jQuery in Action par ours Bibeault et Yehuda Katz.

Pour commencer avec jQuery dans SharePoint est étonnamment facile (Pour moi). (J'ai de sérieuses questions sur une approche de « pratiques exemplaires » pour déployer ces choses à la production, mais c'est pour un autre jour). J'ai juste commencé à jouer avec cette technologie et à cette fin, J'ai créé un environnement sandbox à utiliser. Si vous cherchez à démarrer avec jQuery, Vous trouverez cette approche utile.

1. Créer un Site vierge

Créer un site vide quelque part dans votre site et appelez-la savants comme « jQuery Sandbox ».

2. Télécharger jQuery

Vous pouvez télécharger ici la bibliothèque javascript jQuery: http://docs.jquery.com/Downloading_jQuery

Pour enregistrer sur votre bureau.

J'ai utilisé la version « minified ».

3. Créer une bibliothèque de documents SharePoint

Dans votre site de la sablière, créer une bibliothèque de documents.

4. Télécharger la bibliothèque de jQuery dans SharePoint

Accéder à la doc library, que vous venez de créer et de charger la bibliothèque jQuery.

5. Créer une liste de SharePoint personnalisée

J'ai commencé avec une liste personnalisée, parce que je veux muck sur avec les formulaires SharePoint standard. Vous pouvez également créer une page dans une bibliothèque de pages ou des pages de composants WebPart et probablement beaucoup d'autres endroits.

Ajouter des colonnes à la liste personnalisée afin que vous ayez quelque chose à exécuter jQuery contre. Mes objectifs initiaux étaient à:

  1. Masquer un champ.
  2. Assignez une valeur à un champ.

Avec cet objectif à l'esprit, J'ai ajouté deux champs texte. Au fil du temps, Je vais jouer avec des liens, images, recherches, etc..

6. Modifier la Page WebPart NewForm.aspx et ajouter un composant WebPart éditeur de contenu

C'est un peu noir magic-ish , car il s'agit d'un nouveau concept pour moi. J'ai appris sur ce à partir de Paul Grenier, SharePoint jQuery Superstar, sur son site CodePlex du projet: http://spff.codeplex.com/.

Procédez comme suit pour ajouter un CEWP à la même page qui montre NewForm.aspx pour n'importe quelle liste personnalisée:

  1. Accéder à la liste personnalisée, puis cliquez sur nouveau.
  2. Ajouter ce qui suit à l'URL: Page vue = partagée&ToolPaneView = 2

Qui va transformer votre forme d'entrée de données vanille ennuyeux de quelque chose comme ça:

image

Pour cela:

image

Ajoutez le composant WebPart éditeur de contenu à la page.

7. Écrire votre premier jQuery Code

Ouvrir cette CEWP en mode code et ajoutez ce qui suit:

image

Voici le code réel si vous voulez copier/coller:

<script type ="text/javascript"
    SRC =".. /.. /jQuery Library/jQuery-1.3.2.min.js">
</script>

<script type ="text/javascript">
  $(fonction() {

    $(« #resultsID »).html(« Il existe » + $(« a »).taille() + « un tags tags sur cette page. »);

  });
</script>

Résultat:
<div id =« resultsID »></Div>
/résultat

Notez que la première <script> balise fait référence à la bibliothèque jQuery réelles. Sans doute, ces choses changent avec le temps, donc vous voudrez vous assurer que vous un) Utilisez le nom correct et b) pointer vers la bibliothèque de documents SharePoint correcte.

Se prélasser dans la gloire

Si vous l'avez fait correctement, vous verrez un résultat semblable à la suivante:

image

Récapitulation

Ce n'est pas le seul moyen pour commencer, mais c'est rapide, simple et isolé de votre environnement SharePoint existant.

</fin>

S'abonner à mon blog.

Me suivre sur Twitter à http://www.twitter.com/pagalvin

Facile et rapide: Utiliser jQuery pour valeur de définir un champ de texte sur une forme de SharePoint

J'ai commencé à jouer avec jQuery hier. J'ai eu envie de le faire pendant une longue période, depuis Paul Grenier commence à écrire sa série sur jQuery pour les utilisateurs finaux à la vénérable www.endusersharepoint.com site Web. Que je l'utilise, Je souhaite ajouter qu'une série de « Rapide et facile » messages comme celui-ci. Ce billet décrit comment définir la valeur d'un champ texte connu pour tout ce que vous voulez.

Dans ce scénario, J'ai créé une liste personnalisée « nouveau » dont la forme ressemble comme illustré:

image

C'est le nouveau formulaire pour obtenir une liste personnalisée avec la colonne de titre par défaut et deux colonnes de la liste (pas de colonnes de site; Je ne pense pas qu'elle doit rendre toute différence).

L'objectif est d'attribuer une valeur arbitraire au champ, « DefaultMeFieldNoSpaces » (vous pouvez dire que je suis un peu lâche avec la chose « sans espaces », mais je le spice up à la fin de cet article).

Ce bit de jQuery a fonctionné pour moi:

<script type ="text/javascript">

  $(fonction() {

    $(« d'entrée[titre = DefaultMeFieldNoSpaces]').attr(
        {valeur: « Vous êtes dans un labyrinthe de passages en twisty, tous semblables. »});

  });

</script>

Comme je comprends ce bit de jQuery est dit, "Trouvez-moi une entrée tag dont le titre = DefaultMeFieldNoSpaces. Puis, Set toutes leurs valeurs à une phrase célèbre d'un vieux jeu. »

Puisqu'il ne sera un champ du formulaire avec un titre égal à « DefaultMeFieldNoSpaces » nous sommes assuré d'assigner une valeur à ce champ et aucun autre.

Qu'en est-il un champ dont le nom comporte des espaces qu'il? C'est presque pareil:

<script type ="text/javascript">

  $(fonction() {
     $(« d'entrée[titre = attribuer le domaine avec espace]').attr(
        {valeur: « Vous êtes dans un labyrinthe de passages en twisty, tous semblables. »});

  });

</script>

Je pense que c'est une approche assez sûre, ce qui signifie que nous devrions être capables de trouver le domaine que nous voulons et seul le champ nous voulons. Si vous regardez le HTML SharePoint nous donne, C'est le genre de désordre:

<entrée
nom= « ctl00$ m$ g_bdb23c2c_fde7_495f_8676_69714a308d8e$ ctl00$ ctl04$ ctl02$ ctl00$ ctl00$ ctl04 ctl00$ ctl00$ $TextField"
type= "texte"
MaxLength= "255"
ID= ctl00_m_g_bdb23c2c_fde7_495f_8676_69714a308d8e_ctl00_ctl04_ctl02_ctl00_ctl00_ctl04_ctl00_ctl00_TextField""
titre= DefaultMeFieldNoSpaces""
classe= « ms-long"
/>

« titre » se démarque comme un attribut reconnaissable et unique j'espère que pour nous aider à identifier la colonne spécifique à laquelle nous voulons affecter notre valeur arbitraire.

Il s'agit d'un concept fondamental. Définissant un champ d'une manière arbitraire comme ça ne va pas gagner à tout prix. Cependant, Si nous voulons faire plus intéressant stuff de niveau formulaire (que chacun d'entre nous veulent toujours faire, Bien sûr, juste après que nous terminer la vaisselle), comme modifier la valeur de « champ b » automatiquement basé sur la valeur de "champ un », Nous avons (JE) besoin d'apprendre ces choses.

Je pense que la meilleure chance d'obtenir une valeur réelle utile ici est via le titre, au moins pour les champs texte. Il peut y avoir une meilleure, approche plus fiable. Si je le trouve, Je vais mettre à jour ce post. Si vous connaissez une meilleure façon, Veuillez laisser un commentaire.</fin>

</fin>

S'abonner à mon blog.

Me suivre sur Twitter à http://www.twitter.com/pagalvin