Méthodologie et logique de travail de Drupal

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 me suis mis à Drupal il y a quelques jours suite aux nombreux mérite qu'ont lui vantent.

Avant sa je travaillait avec les frameWorks zf2 et une multitude de modules, open Source et de mon crue, j'ai donc l'habitude de travaillé avec une très grande liberté de mouvement.

J'avais besoin d'une CMS robuste et le passage de Drupal au framework Synfoni mon fait passé le cap.

Seulement voila, je doit revoir ENTIÈREMENT ma façons de travailler et je ne suis pas sur que se sois du coup judicieux !

En 15 jours, j'ai tout de même été très convaincu par tous les outils d'administration offert par le core mais aussi par les modules, je ne vais donc pas baisser les bras comme sa.

J'aimerai vraiment retrouver la logique MVC. Si je trouve génial de pouvoir gérer les cotés "model" et "controller" via les différents outils de l'administration (type de contenu, pathAuto, etc, ect), j'aimerai vraiment garder la main sur le code pour la "vue".

Car pour le moment je trouve qu'utilisé le module Vue est un véritable case tête pour générer le html que l'on souhaite, alors que taper le code sois même aurai pris que quelque minute !

Donc deux possibilité:
- Je m'y prend comme un pied
- Drupal, ou n'importe quel autre système CMS, n'est finalement pas fait pour moi.

Je vais prendre un exemple concret : Un slider. On va rester simple pour l'exemple.
Je sais, il y a sûrement des modules qui font sa très bien mais c'est pour l'exemple.

Je créer un type de contenu "slide".
j'ajoute différent champ qui vont apparaître dessus mais qui vont aussi servir à la config.

  • titre
  • description
  • chemin de l'image
  • durée d'affichage
  • animation d’apparition
  • animation de disparition

J'aimerai pouvoir écrire le template suivant :

<ul id="slider">
   {%for slide in slider%}
       <li style="background-image:url(/img/{{slide.field_path}})"
            data-duration="{{slide.field_duration}}"
            data-show-type="{{slide.field_show}}"
            data-hide-type="{{slide.field_hide}}"
        >
            {{slide.description}}
      </li>
{%end for%}
</ul>

Op, écrit en 3min top crono ! ceci marchera parfaitement avec un plugin jquery. Que j'ai développer moi ou trouver sur le web, peut import.

J'aimerai aussi pouvoir placer ce code dans des pages ciblés.
Je ne peut donc pas utiliser la Vue, car la vue propose des bloques, qui se place dans les section donc dans toute les pages, ou on peut faire des "page", mais il faut tout redéfinir si l'on veut placé d'autre chose dedans sur une autre page.

Comment procéder et quel logique suivre ? doit-je finalement développer un module si je veut ce niveau de liberté?

Pour rappel, je ne veut pas spécialement faire un slider mais bien comprendre la logique de travail avec Drupal :)

Forum : 

Concernant les blocs de vue, tu peux très bien les configurer afin qu'ils ne s'affichent que sur certaines pages / types de contenus / rôles via la partie "paramètres de visibilités" (et c'est dans le core de Drupal). Le screen ci dessous :
http://img15.hostingpics.net/pics/197035drupalblockvisibility.jpg

Pour les régions (ce que tu appelles section), tu peux toi-même en créer via ton thème.

N'hésites pas si tu as d'autres questions.

Merci pour ton aide.

Je sais que l'on peut géré les section en créant son thème et j'ai vue comment faire, mais elle sont au niveau du layout.
Peut on créer une page au quel on défini des section qui lui seront propre ?
C'est a dire avoir plusieurs layout, et choisir le layout de chaque page?

EDIT :
Je m'auto répond :

On peut créer des section dans la configuration du thème, puis surcharger le template de la page voulu avec le hook approprier, pour afficher les section comme on veut spécifiquement pour cette page...j'ai bon ?

Et pour l'exemple de code ci dessus? comment faire?

Avec la gestions des champs de la vue, tout se que j'arrive a faire pour le moment c'est un truc qui ressemble a sa:

<li>
<div class="descrition">hello world</div>
<div class="duration" data-value="foo"></div>
</li>

ce qui ne fue pas vraiment plus rapide que d'écrire le code...et ce n'est pas ce que je veut...je vais devoir adapter le plugin jquery a ce code ci.
Surcharger le template views-view-fields--NOM_DE_LA_VUE.html ne le permet pas.
voir : https://www.drupal.org/node/2657514

En d'autre terme, ce que je veut faire, c'est :
- définir des type de contenu, avec des champs de divers type
- définir des pages via l'admin, avec différente zones, qui choisira des template et y injectera les valeur créer précédemment (couche controller)
- codé les templates à ma guise, comme dans mon 1er exemple (couche View).

Est-ce une façons de procéder possible avec drupal ?
Sinon, comment produire le code cité dans mon 1er exemple en exploitant le type de contenu prévu pour?

EDIT:

Je reformule la questions plus simplement:

Il faudrait que je puisse accéder au donnée brut dans mon template. or que ce sois en drupal 7 ou 8, je n'ai pas trouver comment faire, se qui rend le compte de mon 1er exemple impossible a produire avec la vue.

UP.

Je re -re formule tout car que je vois bien que je suis pas clair du tout xD

Imaginons le code de mon exemple précédent. C'est un slider classique, avec des options propre à chaque slide. les options sont passer de php à javascript grâce au paramêtre "data-x". rien d'extraordinaire la dedans.

<ul id="slider">
   {%for slide in slider%}
       <li style="background-image:url(/img/{{slide.field_path}})"
            data-duration="{{slide.field_duration}}"
            data-show-type="{{slide.field_show}}"
            data-hide-type="{{slide.field_hide}}"
        >
            {{slide.description}}
      </li>
{%end for%}
</ul>


Comment arriver à ce résultat?

Voici mon approche pour le moment:
- je créer un type de contenu "slide" avec tout les champs requis (duration, name, background-image, etc).
- je créer une vue que j'appel "slider" dans le module View.
- je surcharge le hook views-view-field--slider.twig.html (ou views-view-field--slider.tpl pour drupal 7 il me semble).

Problème:
1): je n'arrive pas a accéder au donnée brute.

Je cite la doc du template "views-view-field ":

- fields: A list of fields, each one contains:
* - raw: The raw data for the field, if it exists. This is NOT output safe.

Mais que ce sois drupal 8 ou 7 (la doc est la même), field.raw (ou field->raw) vaut exactement "null".

2): Impossible de faire sa avec ce qu'offre les options du module View. Ou si c'est possible, cela me parait très long et complexe a paramétrer.

Conclusion:
Je me doute bien que se n'est pas impossible, j'en déduit donc que c'est pas comme sa que je doit m'y prendre.

Donc, dans un 1er temps, comment produire le html de mon exemple?

Dans un 2eme temps, est-ce possible de géré la vue "a la main", c'est a dire géré le contenu et les url grâce au outils de gestion de drupal (type de contenu, taxonomie, etc etc) mais écrire sois même les tpl sans passé par la vue ?
Pour le moment, je ne vois pas du tout comment faire sa, je ne vois pas comment accéder simplement au donné brute dans les templates, que se sois sous drupal 7 ou sous drupal 8.

j'espère avoir été plus clair ! :)

PS: merci de ne pas me répondre "il existe un très bon module pour les slider", mon bute est de comprendre comment drupal fonctionne pour bien maitriser le rendu html, pas spécialement de faire un slider ^^.

Salut Snyf,

Désolé de ne pas avoir répondu plus tôt, je n'ai pas vraiment le temps en cemoment. Cependant je prends ces quelques minutes pour répondre à tes questions :

Concernant ton problème n°1, voici comment on accède au contenu de ton champ dans un vue sur D7 dans un tpl :

<?php
 
print $fields["le_nom_de_ton_champ"]->content;
?>

Pour D8 je n'en ai encore aucune idée, surtout qu'à mon avis il te faut utiliser TWIG que je ne connais pas.

Concernant ton problème 2, je cite : "long et complexe à paramétrer".
View te permet de faire en effet ce que tu veux, c'est parfois certes un peu long à paramétrer. Mais un fois que tu as créé ta vue de base, te peux dupliquer autant d'instances de celle-ci que tu veux (et affiner les paramètres si tu le souhaites).
View est long et à apprendre, mais en vaut vraiment la peine. Le temps que tu perdras parfois pour des trucs simples, tu le gagneras sûrement sur des choses bien plus complexes. Je te conseilles de chercher de la doc approfondie pour ce module.

Pour finir, tu trouveras les suggestion d'override de tous les templates utilisés par ta vues par type / block / instances / etc... via la partie "Thème" de l'onglet "Avancé" de ta vue.
Si avec tout ça tu n'arrives pas à maîtriser le rendu HTML de tes vues, je ne vois pas comment t'aider plus.

Salut,

merci pour ton temps :) !

EDIT: les balise de sitation marche pas sur ce forum :s et celle de "code" marche quand elle veut, sans rend mon post dure a lire, dsl...^^

probleme 2:

-> sitation
[Mais un fois que tu as créé ta vue de base, te peux dupliquer autant d'instances de celle-ci que tu veux (et affiner les paramètres si tu le souhaites)]

Tien oui c'est vrai sa !

probleme 1

<?php
 
print $fields["le_nom_de_ton_champ"]->content;
?>

C'est casi pareille pour D8 :
fields.le_nom_du_champ.content

mais dans les deux cas, "->content" est la valeur formater par le module view. C'est a dire "parsé" et éventuelement "wrapper".
Ce qui ne va pas pour une valeur d'attribue de div comme dans mon exemple.

En D7, je sais qu'il suffit d'enlever tout wrapp et tout formatage. C'est vrai aussi en D8, mais seulement en mode "production", (j'y reviendrai).

Autant en D7 qu'en D8, il exist la variable "raw".
https://api.drupal.org/api/views/theme!views-view-fields.tpl.php/7
C'est exactement la même documentation pour D8 et twig:)

api de d7:

$field->raw: The raw data for the field, if it exists. This is NOT output safe.

api de d8

raw: The raw data for the field, if it exists. This is NOT output safe.

raw data: donnée brute.

Dans les deux cas, il dise "if it exists".
En d8, si je fait {{dump(fields.mon_champ.raw)}}, qui est équivalant à var_dump($fields['mon_champ']->raw), la valeur NULL s'affiche, et ceci pour tout les champs !

Comme D8 en est maintenant a sa phase de production, j'ai émis comme hypothèse que la valeur NULL n'est pas un bug mais bien le comportement normal.

Maintenant pourquoi en D8 je ne peut pas utiliser l'équivalent {{fields.mon_champ.content}} en phase de dev?

Car en phase de dev, on peut activé une options qui fait que twig rajoute tout un tas de commentaire dans le code html, super ultra mega pratique : c'est l'équivalent des suggestion d'override dont tu parle, dans l'onglet avancé de la vue.
https://www.drupal.org/files/twig-debug.png

si je fait {{fields.mon_champ.content}} , il me met plein de commentaire autour, et je te laisse imaginer le résultat dans un
<div data-duration={{fields.mon_champ.content}} /> xD

Tous ceci m'amenant au considérations suivantes, et donc a la création de ce post:

1 La variable "fields[mon_champ]->content" n'est pas fait pour être utilisé comme valeur de paramètre d'une div.
2 mais fields[mon_champ]->raw ne vaut rien la plupart du temps, et je ne trouve pas comment "l'activé".
3 les champs des types de contenu sont uniquement fait pour être afficher a l'utilisateur. On ne peut pas s'en servir comme "champs d'options".

D'après ce que tu me dit, mon approche était la bonne. C'est donc un probleme de D8, même si je pense que utiliser fields[mon_champ]->content en valeur d'attribue de div dans D7 n'est pas une bonne pratique...

Je n'est plus qu'a trouver comment activé la varibale raw !

À priori tout ça se gère via ton template.php avec les fonctions de preprocess. Malheureusement je ne pourrais pas vraiment t'aider étant que mes compétences en php ne sont pas très développées contrairement à toi il semblerait ;) (je suis dev front-end)

Néanmoins je peux te rediriger vers ce lien où la problématique est sensiblement la même que la tienne :
http://stackoverflow.com/questions/15237488/drupal-7-views-template-over...

Tu verras à la fin du post un autre lien pour t'aiguiller d'avantage (qui conduit probablement vers d'autre docs)
http://stackoverflow.com/questions/2383865/how-do-i-use-theme-preprocess...

Si jamais tu trouves les réponses aux questions que tu te poses, n'oublies de venir les poster ici afin que tout le monde en profite (moi inclut :p).