Champs à auto-complètement affichage non voulu de [nid:xxx]

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

j'ai créé un "Champs à auto-complètement" pour un type de contenu A.

Ce champ relie un contenu A à un B. Etant donné le grand nombre de contenus B existant, j'ai souhaité passer par un champs à auto-complètement plutôt qu'un select (plusieurs centaines de valeurs possibles).

Mon Problème : Lorsque je renseigne le champs à autocomplétion et que je selectionne dans la liste des choix proposés un élément, il m'affiche dans le champ (input) non pas "Titre de mon contenu B", mais "Titre de mon contenu B [nid:23]". Ce problème ne se pose pas si l'utilisateur ne se sert pas de "l'aide apportée par l'autocomplétion". Etant donné que ce type de contenu A va être amené à être édité par n'importe quel visiteur du site cela pose problème.

Est-ce que vous savez comment régler ce problème ? Ou si c'est le cas, ce que j'ai mal configuré...

(Config du champs : Node reference, Champs à auto-complètement (Commence par, lié à un seul type de contenu, Nb valeur (1), Non obligatoire))

Merci.

Version de Drupal : 
Tags : 

En fait l utilisateur n est pas censé pouvoir consulter les type de contenu qu il lie grace a ce champ?

Pourquoi ne pas simplement exiger un certain role pour ces contenu?Un role que l utilisateur n a pas bien sure.

Non mon problème n'est pas là, mon problème est dans l'affichage de "[nid:93]" qui n'a rien à faire là.

Ex : l'utilisateur tape

L'art

Proposition :

  • L'art moderne
  • L'art Baroque

Il clique sur "L'art moderne"
et au lieu d'avoir écrit "L'art moderne" (dans le champs) il y a "L'art moderne [nid:93]"

C'est le [nid:93] qui me dérange (93 étant le nid du contenu), c'est un id système qui n'a rien à faire dans un affichage en production... En gros je ne sais pas pourquoi ce nid vient s'afficher en plus et je ne sais pas comment le retirer, ni si c'est normal qu'il s'affiche...

L'explication de mon problème est peut-être plus claire comme ça ? ^^

C'est un comportement normal du champ node reference, cela permet d'éviter toute ambiguïté sur le contenu visé puisque le titre peut ne pas être unique. C'est une sécurité, donc il parait hasardeux de chercher à le supprimer. Si vraiment cela te gêne, tu peux toujours indiquer dans le texte d'aide du champ, à l'adresse des visiteurs, de ne pas s'occuper de ce numéro.

Par ailleurs je te suggère d'utiliser peut-être le Node Reference URL widget qui permet, depuis un contenu B, d'en créer un A qui référence le B. Cela n'empêche pas de créer un contenu A "ex-nihilo" (tu as alors le champ autocomplete à remplir).

Merci pour l'explication. Je m'en doutais un peu, mais bon j'éspérais le contraire (dans mon cas il ne pas y avoir de doublon).
Merci également pour le module il me sera utile dans des développements futurs !!

Quoi qu'il en soit je ne trouve pas que ce soit très "userfriendly" (on va dire ça comme ça ^^). J'ai donc regardé le module (/modules/cck/modules/nodereference/nodereference.module).

J'ai hacké la fonction nodereference_autocomplete(), puisque le cas où l'id est absent de la chaine soumise est traité dans la fonction nodereference_autocomplete_validate(). Mais ce n'est pas "assez propre" à mon goût (il faudrait aussi hacker la fonction qui gère l'affichage "modification du contenu"), donc je reviendrai plus tard pour partager la solution qui m'a paru la plus "judicieuse".

(J'ai juste fait en sorte que s'il existe plusieurs éléments avec le même title dans la liste proposée, alors ces doublons seront suivis du [nid:xxx] pour leur valeur (seul fonctionnement proposé dans la fonction de base). Si ce n'est pas le cas alors la sortie sera sans ce [nid:xxx] (puisque inutile, le cas "No explicit nid" étant traité par la fonction validate))

Merci.

Si on peut très bien via un hack du module (mais bon ce n'est pas "très propre", une solution de dernier recours).
Sinon le select est impossible... une liste de plus de 500 contenus en select serait une horreur :)

(Edit : désolé ton commentaire a été publié avant le #comment-34208 mais je préférais répondre séparément à vos deux commentaires)

Le probleme des hack comme ceux la c est que le jour ou il y a une mise a jour, tu va devoir te rappeler ou est ce que tu a fait ton hack.Si dans ton projet tu n a qu un hack et que tu te rapele ou tu l a fait ca va par contre il ne faudrais pas en mettre partout ca devient ingerable et le jour d un upgrade ca devient l enfer.Je dit ca par experience:)

Drupal 6.19

Méthodologie Hack du module "nodereference"

Ma solution :

  1. Commenter la ligne :

    $value .= ' [nid:'. $nid .']';

    de la fonction "nodereference_autocomplete_value".

  2. Initialiser :

    $match='equals';

    au début de la fonction "nodereference_autocomplete_validate"

  3. Commenter la ligne :

    $matches[$row['title'] ." [nid:$id]"] = '<div class="reference-autocomplete">'. $row['rendered'] . '</div>';

    dans la fonction "nodereference_autocomplete"

  4. Ajouter le code :

        foreach($references as $nid => $content) {  // hack
          if(in_array($row['title'],$content) && $nid != $id) {  // hack
            $is_single = false; // hack
            break; // hack
          } // hack
        } // hack

    En dessous de la ligne commentée précédemment (dans le "foreach ($references as $id => $row) {").

  5. Toujours dans le foreach de la fonction "nodereference_autocomplete"
    Ajouter :

    if($is_single === false) { // hack
    $matches[$row['title']  ." [nid:$nid]"] = '<div class="reference-autocomplete">'. $row['rendered'] . '</div>';
    } else {
      $matches[$row['title']] = '<div class="reference-autocomplete">'. $row['rendered'] . '</div>';
    }

    Si le résultat n'a pas un titre qui est unique dans la base, alors on affiche le nid (dernier recours). Sinon on affiche juste le titre.

Cette solution fonctionne très bien, vous pouvez selon votre niveau en code ajouter après le titre et en fonction de choix (ne pas oublier que ce module est utilisé pour tous les types de contenus), n'importe quelle string (un code postal suffixé à un nom de ville par exemple, évitera tout doublon).

J'ai juste oublié de précisé que le fichier à modifier est le suivant :
"modules/cck/modules/nodereference/nodereference.module"

N'oubliez pas de garder une sauvegarde de l'original et de commenter la version hackée du fichier (un simple //hack sur la ligne en question peut suffire, ou de /* DEBUT HACK / ... / FIN HACK */ pour les passages plus longs).