[spip-dev] #CHEMIN, SPIP_PATH et dossier_squelettes

Matthieu Marcillaud a écrit:

Merci pour cette belle réponse. Encore quelques doutes...

Anne Possoz a écrit :
> Voici donc des questions précises:
> - SPIP_PATH est une constante qui permet de définir une série de
> répertoires. Mais quels types de répertoires? Ceux des squelettes?
> Ceux des .css? Ceux de scripts persos?
> Quelle est sa valeur par défaut? Dans quel contexte cette variable
> est-elle utilisée?

SPIP_PATH définit l'ensemble des lieux (répertoires) où SPIP va pouvoir
chercher des fichiers. Lorsque SPIP cherche un fichier (avec la fonction
prévue pour : find_in_path("fichier.ext") = chemin("fichier.ext") ou la
balise pour les squelettes #CHEMIN{fichier.ext} ), il va chercher dans
l'ordre des dossiers contenus dans SPIP_PATH.
$GLOBALS['dossier_squelettes'] est ajouté à cette constante par défaut.

Ajouté au début ou à la fin? J'interprète "à la fin".
Donc #CHEMIN se réfère à SPIP_PATH + $GLOBALS['dossier_squelettes'],
dans cet ordre. Ca c'est clair.

Ainsi, l'ordre de lecture, de mémoire est : $dossier_squelettes (rien,
un ou plusieurs selon la globale), squelettes (si ce dossier existe),
dist, prive, ecrire, racine

Et ce que j'aurais ajouté dans SPIP_PATH n'est pas pris en compte?
Dans quelle variable sont définis la suite "dist, prive, ecrire, racine"?
Ca, c'est pas encore clair.

Je peux définir SPIP_PATH et pas $GLOBALS['dossier_squelettes']?
Ou de toute façon $GLOBALS['dossier_squelettes'] contiendra
"dist, prive, ecrire, racine"?
Ou si j'ai des squelettes (.html et .css) en dehors du standard spip
je dois absolument ajouter les répertoires dans $GLOBALS['dossier_squelettes']
.
Ou je dois mettre les répertoires des .html dans $GLOBALS['dossier_squelettes'
]
mais je peux mettre les répertoires des css dans SPIP_PATH car
ils seront appelés par #CHEMIN?
[On le voit, je n'ai pas idée de l'usine et ne souhaite pas lire
le code mais l'utiliser au mieux.]

> - $GLOBALS['dossier_squelettes'] est-il uniquement pour les
> squelettes ou aussi pour les .css? Qui prime si je donne une liste?
> Le premier? Le dernier?

Cette globale définit les squelettes, mais chaque dossier squelettes
peut se composer de différents sous-répertoires, dont, imaginons, un
répertoire 'css' qu'il sera possible d'appeler par #CHEMIN{css/fichier.css}

On sous-entends qu'un .css est comme un .html de squelette parce qu'ils
interviennent dans le même contexte de mise en page. C'est moi qui
fait une confusion en pensant "squelette = .html" et "css = .css"?

Je ne suis pas certaine car
- les .css sont appelés explicitement dans la partie <head>...</head>
   du html (par la balise CHEMIN qui scanne SPIP_PATH +
   $GLOBALS['dossier_squelettes']
- tandis que les .html sont appelés par l'usine spip qui scanne, non
   pas SPIP_PATH mais $GLOBALS['dossier_squelettes'] (c'est mon interprétation
   mais je n'ai pas lu cette information quelque part).

Sont prioritaires les dossiers, de gauche à droite.
$GLOBALS['dossier_squelettes'] = 'premier:second:troisieme';

J'ai bien compris. Il en est de même pour SPIP_PATH, selon supra.

En fait, je n'ai toujours pas compris la différence entre
SPIP_PATH et $GLOBALS['dossier_squelettes']. Tous deux sont des
paths qui contiennent des répertoires.
Pourquoi ne s'appelent-ils pas _PATH tous les deux? Pourquoi en
avoir 2? Pourquoi l'un une constante et l'autre une variable?

> - #CHEMIN est une balise mais quelle variable ou constante
> est utilisée pour calculer le résultat? SPIP_PATH?
> $GLOBALS['dossier_squelettes']?

J'ai répondu plus haut.

>
> J'aurais tendance à penser:
> - que SPIP_PATH et $GLOBALS['dossier_squelettes'] sont redondants
> (mais je dois certainement me tromper)
Donc, en partie oui, sauf que SPIP_PATH inclu directement les dossiers
nécessaires à SPIP (+squelettes si présent), alors que
$GLOBALS['dossier_squelettes'] ajoute uniquement des répertoires pour
une utilisation précise (SPIP n'en a pas besoin pour fonctionner)

> - qu'il manque une variable $GLOBALS['dossier_css'] (on devrait d'ailleurs
> mettre des "s" à ces dossiers_xxx)
Sauf que ces dossiers sont souvent uniques...
Pour le $GLOBALS['dossier_css'], ça se rapprocherait d'une idée de
thèmes graphiques pour des squelettes donnés. Quelques idées ont parfois
été abordées, mais rien de concret n'est encore sorti.

Merci pour ces bons éclaircissements. Pour vérifier ce que j'ai compris,
j'explicite.

Solution 1

- les .css sont appelés explicitement dans la partie <head>...</head>
  du html (par la balise CHEMIN qui scanne SPIP_PATH +
  $GLOBALS['dossier_squelettes']
- tandis que les .html sont appelés par l'usine spip qui scanne, non
  pas SPIP_PATH mais $GLOBALS['dossier_squelettes']

non

En fait, je n'ai toujours pas compris la différence entre
SPIP_PATH et $GLOBALS['dossier_squelettes']. Tous deux sont des
paths qui contiennent des répertoires.
Pourquoi ne s'appelent-ils pas _PATH tous les deux? Pourquoi en
avoir 2? Pourquoi l'un une constante et l'autre une variable?

$GLOBALS['dossier_squelettes'] est encore là pour des raisons de compatibilité,
mais il doit être considéré comme obsolète.
C'est SPIP_PATH qui est le référent pour chercher tous les types de fichiers.
C'est une constante pour bien marquer que ça n'évolue au cours de l'éxécution d'un script.

Committo,Ergo:Sum

Anne Possoz a écrit :

Donc #CHEMIN se réfère à SPIP_PATH + $GLOBALS['dossier_squelettes'],
dans cet ordre. Ca c'est clair.

Dans une distribution standart, #CHEMIN cherche d'abord dans les $GLOBALS['dossiers_squelettes'] puis dans les SPIP_PATH.

Ainsi, l'ordre de lecture, de mémoire est : $dossier_squelettes (rien, un ou plusieurs selon la globale), squelettes (si ce dossier existe), dist, prive, ecrire, racine

Et ce que j'aurais ajouté dans SPIP_PATH n'est pas pris en compte?
Dans quelle variable sont définis la suite "dist, prive, ecrire, racine"?
Ca, c'est pas encore clair.

Si vous modifiez SPIP_PATH, ce que vous ajoutez ou modifiez sera bien sur pris en compte. C'est cette constante qui définit la suite "dist, prive, ecrire, racine" . En règle générale, pour la plupart des utilisations, cette constante n'est pas modifiée. Seule est modifiée, par les webmestres de sites, la globale $GLOBALS['dossiers_squelettes'], dans le fichier config/mes_options.php

Disons que SPIP_PATH sert à SPIP pour SPIP, $GLOBALS['dossiers_squelettes'] sert pour le webmestre à ranger ses squelettes.

Un des rares besoins de modifier SPIP_PATH est lorsque l'on fait de la "mutualisation" avec SPIP, c'est à dire, avoir plusieurs sites en utilisant une seule fois les fichiers du core de SPIP.

Je peux définir SPIP_PATH et pas $GLOBALS['dossier_squelettes']?

Oui, mais l'inverse est préférable. Vous n'avez besoin de déclarer $GLOBALS['dossier_squelettes']
que si votre dossier squelette est différent de "squelettes/" ou si vous en avez plusieurs.

On sous-entends qu'un .css est comme un .html de squelette parce qu'ils
interviennent dans le même contexte de mise en page. C'est moi qui
fait une confusion en pensant "squelette = .html" et "css = .css"?

Ce qu'on appelle communément "squelettes" ou "noisette" (un bout de squelette) est une partie de code qui va être analysée et compilée par SPIP (et contient donc généralement des balises et des boucles SPIP). Ces fichiers ont pour extension ".html"

Vos fichiers css n'ont en règle générale pas besoin d'être compilés par SPIP, ce pour quoi #CHEMIN{adresse/fichier.css} va rechercher ce fichier dans un des paths définis plus haut ($GLOBALS['dossier_squelettes'], sinon squelettes, sinon plugins, sinon le reste de SPIP_PATH ....)

Si vous avez besoin de mettre des boucles ou balises dans un fichier CSS, il faut le faire compiler par spip en lui donnant une extension .html (ou .css.html) et l'appeler par #URL_PAGE{adresse/fichier.css} (si le fichier se nomme fichier.css.html) et lui affecter certains entetes pour être percu effectivement comme un fichier css par les navigateurs.

Pourquoi ne s'appelent-ils pas _PATH tous les deux? Pourquoi en
avoir 2? Pourquoi l'un une constante et l'autre une variable?

Ca c'est l'histoire... SPIP a encore beaucoup de mélange de genre de ce type. Mais en règle générale, c'est une volonté de mettre des constantes sur les choses non modifiables par des scripts, et une globale ou une entrée dans la table spip_meta pour les choses modifiables par des srcipts php.

Derniers doutes à éclairer: - tous et uniquement les fichiers css explicitement mentionnés
   dans le html (inc-head dans la version actuelle) seront pris
   en compte

oui

- si deux fichiers .css contiennent une même définitions, c'est la première qui prime ou la dernière (je sais que c'est une question
   w3c et non spip)? Je pense que c'est la première.

non, c'est la dernière lue (si elles ont même priorité). Essayez par exemple (le fond sera rouge) :

body{background:white;}
body{background:red;}

Pour les priorités, lire par exemple http://openweb.eu.org/articles/cascade_css

Matthieu Marcillaud a écrit :

Oui, mais l'inverse est préférable. Vous n'avez besoin de déclarer $GLOBALS['dossier_squelettes']
que si votre dossier squelette est différent de "squelettes/" ou si vous en avez plusieurs.

Bon, Emmanuel me contredit en même temps, et il a certainement raison.
Cependant, je trouve bien inutile de faire déclarer tout un SPIP_PATH par des webmestres alors que leur principale utilisation est de définir un ou des dossiers squelettes supplémentaires à ceux de SPIP.

Oui c'est pas faux. Moi j'ai plutot tendance à réduire au minimum le nombre de symboles, mais on n'est pas obligé.

Committo,Ergo:Sum