Champs CCK, views et thèmes

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,
je découvre Drupal depuis quelques jours et je me penche plus particulièrement sur le système de template.

J'ai créé des types de contenus, des contenus et des requêtes avec views pour afficher ces contenus. Les requêtes m'ont généré des blocks que j'utilise à ma guise sur mon site. Les contenus s'affichent, ça marche.

A ce point, j'aimerais savoir déjà si c'est la bonne méthode d'utilisation de views.

Le problème qui se pose ensuite, c'est le code envoyé par Views. J'aimerais récupérer seulement la valeur de chaque champ CCK alors que le système en l'état m'envoie la variable "$content".

Comment faire ?

Forum : 
Version de Drupal : 

Soit tu dévclare une view en liste ou en tableau et tu choisir chaque champ dans le menu de view prévu à cet effet.

Soit tu affiche une "unformatted" view, et tu récupère la valeur de tes champs dans ton node.tpl.php.

(je te conseil le module devel et contemplate pour trouver comment récupérer la valeur d'un seul champ dans ton node.tpl.php).

Ok,
j'avais plus ou moins appréhender cette notion de "unformatted" mais je comprends encore pas très bien à quoi correspond chaque mode (Grid, Liste, Tableau, Unformatted).

Est-ce que le module contemplate est indispensable ? Car il me semble que Views offre des options de template assez complètes :

  • Display output
  • Style output
  • Row style output
  • Field Node: Titre (ID: title)
  • Field Node: Corps (ID: body)

A quoi correspondent ces templates ? Est-ce que je peux les utiliser pour obtenir la valeur des champs ?

Mon contenu est affiché par un bloc et j'ai l'impression que "contemplate" n'influe pas du tout sur le contenu de ce bloc.

De toute façon, je vois pas comment faire car le contenu disponible dans "$content" est déjà formaté avec des balises qui ne m'intéressent pas du tout...

Comment faire pour que Views n'envoie que la valeur des champs sans balises superflues ?

Contemplate ne te sera utile que si tu as une views "unformatted", c'est à dire qu'elle load tout simplement le contenu de node.tpl.php en gros.

Contemplate te permet de récupérer les variable séparément des unes des autres. Par défaut, drupal te fait déjà un mix de ces variables en te fournissant une variable $content.

Mais tu peux avoir chaque champ séparément avec un code du genre

<?php
print $node->content['field_image'][0]['value']
?>

L'exemple ci dessus te sortirai en gros l'image de ton node.

Contemplate permet de te lister toutes ces différentes variables, tu peux très bien faire aussi un

<?php
 drupal_set_message
('<pre>'.print_r($node, true).'</pre>');
?>

Ce qui te sort tout ton objet node, ca revient au même.

Après le but, c'est de virer $content dans ton node.tpl.php et de mettre chaque champ individuel que tu veux les uns apres les autrs.

Mon contenu est affiché par un bloc. Donc print $node->content['field_image'][0]['value'] ne fonctionnera pas il me semble.

Effectivement, j'aimerais avoir dans mes nodes et dans mes blocs chaque champ au lieu de $content.

Est-ce que node.tpl.php est utilisé par les bocks ? Non, à priori ?

Ok,
je viens de trouver comment envoyer le noeud à travers le bloc.
Dans la configuration de la view, il faut choisir la valeur "NODE" pour le paramètre "Row style".
On peut ensuite accéder à chaque champ.

Pas très évident comme concept dans la mesure où l'autre choix pour "Row style" est "FIELD"...

Je parle un peu tout seul mais j'espère que ça profitera à d'autres.

Bonsoir,

Cette discution m'a mise sur une piste pour éditer des templates, mais j'aurais besoin d'aide pour éclaircir quelques points :

actuellement j'essaye de faire fonctionner un site anciennement sous D5 vers D6,
et ne peux plus utiliser contemplate à cause d'un bug.
Donc je cherche à modifier la sortie de mes blocks de views directement avec les fichiers templates.

Comme vu dans les précédents posts, j'ai mis la view en "unformated", row style "node"...
et j'ai un fichier block-views-nomdemavue.tpl.php qui est totalement ignoré :
quand je fais un aperçu de la vue j'ai tout le node affiché en entier,
mais quand le block est affiché en page d'accueil, ça n'affiche que la partie "corps" du contenu...

je voudrais savoir si au final node.tpl.php à une influence sur l'apparence du block, et si possible comment le "remanier"..?

Bonjour,
si tu choisis row style "node" dans ta requête Views, ton block va envoyer le node. C'est donc node.tpl.php qui va le prendre en charge et non block.tpl.php.

J'ai mis du temps à piger ça mais je ne sais toujours pas si c'est la bonne méthode car en choisissant row style "node", tu ne peux plus sélectionner les champs dans la requête. Et le block t'envoie tout le node alors que tu n'as pas forcément besoin de tous les champs.

Le vrai problème, c'est tout le code intempestif envoyé par Views (ou généré par Drupal, je ne sais pas).

Ok, merci pour ta réponse!
donc à partir de là le moyen doit être comme avait posté plus haut zmove :
"Après le but, c'est de virer $content dans ton node.tpl.php et de mettre chaque champ individuel que tu veux les uns apres les autres."
...maintenant je comprends pourquoi!
reste à faire un node.tpl.php "propre" bon, là c'est pas gâgné, mais bon faut se lancer :)

Je ne pense pas qu'il soit possible de virer $content. En revanche, lorsque tu reçois le node, tu peux effectivement accéder à tous les champs individuellement :
- soit en listant ton objet avec print_r($node) et en appelant la bonne propriété de l'objet node
- soit en utilisant contemplate pour récupérer le print des propriétés

Une chose est sûre, il ne faut pas utiliser contemplate pour stocker tes templates. Sinon, tu vas te retrouver avec plusieurs niveaux de templates (en BDD et en .tpl.php) et la maintenance de ton site sera complexe.

Voilà ce que j'ai compris. Mais je cherche toujours comment faire en sorte que Views ne m'envoie que certains champs avec leur valeur nue, sans tout ce foutu code html.

bon, alors pour gérer l'affichage des parties "teaser" des nodes sur dupal 6x, et sans contemplate, on peut faire comme ça :

créer un node-nom_de_mon_type_de_contenu.tpl.php

en s'inspirant de ça : http://drupal.org/node/53464

et en suite pour avoir une view qui liste les nodes avec les teasers en html tout propre qu'on a mis en forme comme on veut dans notre template, il faut créer une view en row style "node", et ça suffit!

bon c'est peut être pas la meilleur méthode, vu qu'on est quand même obligé de créer un (ou plusieurs) nouveau(x) fichier(s) .tpl.php , mais en tout cas, ça marche :)

Effectivement, on peut utiliser node-nom_de_mon_type_de_contenu.tpl.php pour créer des templates spécifiques et c'est d'ailleurs le principe de PHPtemplate donc il ne faut pas s'en priver et je pense que c'est la bonne méthode.

En revanche, je cherche comment différencier 2 templates pour un même contenu dans l'organisation suivante :
- page d'accueil : le résumé du node avec une sélection de champ et le lien vers le node complet
- page du node : le node complet

Dans ces 2 cas, node-nom_de_mon_type_de_contenu.tpl.php s'applique.
Comment dois-je nommer le template du contenu résumé en page d'accueil ?

si j'ai bien compris, tu n'utilise ta vue qui affiche la partie résumé de tes nodes qu'en page d'accueil?
donc à ce moment là un seul template de type node-nom_du_type_de_contenu.php devrait suffire, donc il ressemblerait à ça :

<?php
 
if($teaser) {
//ici ton affichage "résumé"
//print $node->le champ qu'il te faut
}
else {
// ici l'affichage par défaut, donc aussi du node entier
}
?>

après, comme tes vues sont en mode block, tu peux aussi jouer avec l'affichage de templates de blocks : http://drupal.org/node/190815
pour ma part, j'ai utilisé un template du type block-nom_de_ma_region.tpl.php, ça fonctionne bien, et du coup le html est minimisé uniquement à ce qu'il me faut :)
j'èspère t'avoir donné une piste...
boon courage

Finalement,
j'ai utilisé le template fournit par la vue pour le bloc en page d'accueil (node-view-last_decouvrir.tpl.php) et j'utilise ensuite le node-nom_du_type_de_contenu.php pour la page de suite.

Je ne suis pas certain que les templates block fonctionnent lorsqu'on choisit row style : node.

Peux-tu me confirmer cette info ?

ça fonctionne aussi avec row style node, à priori l'important est que la view soit disponible en mode block, et du coup les templates pour blocks s'y appliquent aussi... (j'ai utilisé le thème zen comme base pour créer mon thème)

ça je ne sais pas si on peut récupérer les variables comme ça. J'ai mis en forme la sortie des données dans le template du node, et dan sle template de block, j'ai juste mis en forme le titre (donc variable habituelle pour les templates block - $block->subject ) et apres : print $block->content pour ressortir le contenu du teaser du node.