web-dev-qa-db-fra.com

Comment imprimer un champ dans node.tpl.php sans étiquettes ni balisage?

Dans Drupal 7, vous pouvez rendre un champ dans un tpl.php fichier comme celui-ci:

Mais cela l'imprime avec son étiquette et son HTML. Existe-t-il un moyen d'obtenir uniquement la valeur brute du champ.

Je sais que vous pouvez faire ce qui suit:

  • Remplacez le balisage de champ dans le fichier field.tpl.php (ou champ - FIELDNAME.tpl.php)
  • Désactiver les étiquettes dans l'interface d'administration
  • Utilisez un module comme Fences pour contrôler le balisage dans l'interface d'administration.

Cependant, tout cela implique des étapes supplémentaires. Je me demandais s'il y avait un moyen de le faire directement dans le fichier node.tpl.php. De cette façon, tous les changements sont contenus dans un seul endroit. (De plus, si vous changez les thèmes en un qui nécessite les étiquettes, vous devez revenir dans l'interface d'administration et les réactiver).

4
big_smile

la réponse de wolffer-east répond aux objectifs de la question d'origine:

  • Impression d'un champ
  • Le faire dans un seul fichier (donc tout est au même endroit).

Cependant, le code est assez complexe pour un fichier node.tpl.php qui ne doit contenir que des instructions simples PHP.

Donc à la fin, je l'ai retravaillé comme suit. Dans mon modèle PHP, je mets ce qui suit:

function print_field($field_name) {

if (arg(0) == 'node' && is_numeric(arg(1))) {
  // Get the nid
  $nid = arg(1);

  // Load the node if you need to
  $node = node_load($nid);
}

$field= field_get_items('node', $node, $field_name);
print $field[0]['value'];
} 

C'est la même chose que wolffer-east, sauf qu'il charge le nœud.

Dans mon fichier de noeud, je peux ensuite utiliser ce qui suit:

<?php print_field('field_body_text') ?>

Cela rend le champ sans étiquettes ni HTML, mais toujours propre.


Une version plus avancée est la suivante:

Dans la fonction template.php print_field ($ field_name, $ format = 'safevalue') {

if (arg(0) == 'node' && is_numeric(arg(1))) {
  // Get the nid
  $nid = arg(1);

  // Load the node if you need to
  $node = node_load($nid);
}

$field= field_get_items('node', $node, $field_name);

if ($format = 'url') {
    print file_create_url($field[0]['uri']);
} else {

print $field[0][$format];
}
}

Dans node.tpl.php

Vous pouvez échanger "nom de fichier" avec l'un des éléments suivants:

  • valeur: imprime le champ sans HTML supplémentaire pour les paragraphes et les sauts de ligne
  • safe_value: imprime le champ HTML pour les paragraphes et les sauts de ligne
  • nom de fichier: imprime le nom de fichier du champ uri: imprime le chemin du champ en public: // format [*]
  • url: Imprime le chemin du champ au format URL traditionnel [*]
  • alt: imprime la valeur alt du champ [*]
  • title: imprime la valeur du titre du champ [*]
  • width: imprime la valeur de largeur du champ [*]
  • height: Imprime la valeur de hauteur du champ [*]

[*] s'applique uniquement aux champs contenant des fichiers/images

Le seul inconvénient est qu'il affiche le message d'erreur suivant:

Remarque: index non défini: safevalue dans print_field () (ligne 16 de template.php)

Je ne sais pas comment résoudre ce message d'erreur, mais je suppose que c'est une question distincte.

2
big_smile

Si vous voulez juste la valeur d'un champ donné, ce sera dans l'objet $ node dans votre fichier node.tpl.php (ou node-type.tpl.php).

Normalement, c'est sous quelque chose comme:

$node->field_name['und'][0]['value']
3
Jance

Vous êtes sur la bonne voie!

Plutôt qu'un fichier de modèle de nœud, le balisage individuel d'un champ est contrôlé par son fichier field.tpl.php. Vous pouvez contrôler l'affichage d'un champ de manière très granulaire en en créant un personnalisé - copiez l'implémentation par défaut de votre thème, nommez le champ de copie - field-name.tpl.php et supprimez tout le balisage en excès.

2
nikobelia

Vous voudrez peut-être essayer

<?php print render($content['field_your_field']); ?>

dans node.tpl.php combiné avec des modules de modes de visualisation de contexte et d'entité ou simplement modifier les paramètres d'affichage du champ dans la configuration du type de contenu

2
peterhesen

Si vous êtes dans le modèle de nœud, vous pouvez charger le champ, puis obtenir le contenu du champ chargé. Consultez la documentation field_get_items pour plus d'informations. En bref, il renvoie les valeurs souhaitées dans la langue actuelle.

$field_name = 'your_field_here';
$field= field_get_items('node', $node, $field_name);
print $field[0]['value']

devrait le faire. Il renverra un élément pour chaque élément s'il s'agit d'un champ à valeurs multiples. Ils sont accessibles via $field[$key]['value']

1
wolffer-east