[spip-dev] Connaître l'élement courant dans traiter_raccourcis()

Bonsoir,

dans la fonction traiter_raccourcis() de 'ecrire/inc_texte.php3', je
voudrais savoir "qui" m'appelle, c'est à dire :

- le type (article, rubrique, brève, ...)
- et l'identifiant

de l'élément pour lequel on appelle cette fonction.

Je n'en ai besoin que pour lorque l'élément est affiché dans
l'interface de publication.

Par exemple, je voudrais savoir que je suis en train de visualiser
l'article 12 quand j'appelle cette fonction dans la page
'ecrire/articles.php3?id_article=12' ...

Le "contexte" n'étant dispo que dans l'interface publique, y'a t'il un
autre moyen que le parsing de l'URL pour avoir cette info ?

Merci.

-Nicolas

dans la fonction traiter_raccourcis() de 'ecrire/inc_texte.php3', je
voudrais savoir "qui" m'appelle, c'est à dire :
- le type (article, rubrique, brève, ...)

$GLOBALS['fond']

- et l'identifiant

$GLOBALS['id_article']

non?

-- Fil

dans la fonction traiter_raccourcis() de 'ecrire/inc_texte.php3', je
voudrais savoir "qui" m'appelle, c'est à dire :

- le type (article, rubrique, brève, ...)
- et l'identifiant

En fait, c'est surtout dans 'extraire_lien()' que j'en ai besoin.

J'ai trouvé cette méthode, vous semble-t'elle pertinente ?

reset($GLOBALS['clean_link']->vars);
list($objType, $objId) = each($GLOBALS['clean_link']->vars);

Du coup, j'ai $objType et $objId ...

-Nicolas

- le type (article, rubrique, brève, ...)

$GLOBALS['fond']

Euh ... non, je parle du type d'élément visualisé dans l'interface de
publie, donc $GLOBALS['fond'] n'existe pas ...

- et l'identifiant

$GLOBALS['id_article']

Je veux aussi les brèves, les rubriques, ...

Peut-être que si j'explique pourquoi je veux ça, il sera plus simple
de m'aider ... :wink:

J'ai d'abord créé une nouvelle table :

CREATE TABLE spip_liens_internes (
  id_depuis varchar(10) NOT NULL default '',
  id_vers varchar(10) NOT NULL default '',
  PRIMARY KEY (id_depuis,id_vers)
);

Dans cette table, je veux stocker les liens internes entre contenus
SPIP.

Si par exemple dans un article d'id 15 je fais un [lien->rub32], je
vais avoir dans cette table l'enregistrement suivant :

art15;rub32

De même dans tous les sens entre tous les éléments qui peuvent
contenir des liens internes.

L'idée ensuite serait de proposer dans la visu d'un élément la liste
des éléments qui pointent vers lui, ce qui faciliterait grandement la
gestion de cohérence interne d'un site. Il serait aussi ainsi possible
d'empêcher la suppression d'un élément vers lequel d'autres pointent.

L'idéal serait de mettre à jour les données adéquates lors de la
création/modification d'un élément, mais je n'ai pas encore exactement
trouvé comment faire ... :wink:

-Nicolas

Euh ... non, je parle du type d'élément visualisé dans l'interface de
publie

Ah, il faudrait se mettre d'accord sur le vocabulaire : espace privé /
espace public. Là, j'avais compris à l'envers :wink:

Si par exemple dans un article d'id 15 je fais un [lien->rub32], je
vais avoir dans cette table l'enregistrement suivant :
art15;rub32

L'idée ensuite serait de proposer dans la visu d'un élément la liste
des éléments qui pointent vers lui, ce qui faciliterait grandement la
gestion de cohérence interne d'un site. Il serait aussi ainsi possible
d'empêcher la suppression d'un élément vers lequel d'autres pointent.

OK je vois.

L'idéal serait de mettre à jour les données adéquates lors de la
création/modification d'un élément, mais je n'ai pas encore exactement
trouvé comment faire ... :wink:

Tu dois pouvoir fixer l'objet de départ dans les pages articles.php3 etc.,
sous forme d'une globale quelconque. Ensuite tu interceptes cette globale
dans la fonction qui analyse les liens spip. Fais attention à bien vérifier
que cette globale soit unset() dans inc_version.php3, sinon tu risques de te
faire hacker par le site privé ou par des rédacteurs dans l'espace public.

-- Fil

Enfin zut quoi :

$types = array('id_article' => 'art', 'id_rubrique' => 'rub' ...);

while (list($key, $val) = each($types)) {
  if ($GLOBALS[$key]) {
    $id_depuis = $val.$GLOBALS[$key];
    break;
  }
}

Mets la rubrique en dernier, elle peut être réglée dans les autres
objets.

Enfin zut quoi :
$types = array('id_article' => 'art', 'id_rubrique' => 'rub' ...);
while (list($key, $val) = each($types)) {
        if ($GLOBALS[$key]) {
                $id_depuis = $val.$GLOBALS[$key];
                break;
        }
}

T'énerve pas Antoine, c'est pas si grave ... :stuck_out_tongue:

J'ai trouvé aussi cette méthode, en fait, mais ça ne me satisfaisait
pas, va comprendre ... je sais plus pourquoi ... :wink:

Quoi qu'il en soit, il y a un bug dans ton code, puisque c'est "coll"
et non "id_rubrique" ! :stuck_out_tongue:

Et puis il faudrait se mettre à coder un peu plus proprement, parce
que expérimenter SPIP avec la remontée des warnings, c'est épique.

Ici, par exemple, il faudrait

if (isset($GLOBALS[$key])) {

Plutôt que

if ($GLOBALS[$key]) {

Mets la rubrique en dernier, elle peut être réglée dans les autres
objets.

Oui, j'avais vu ça aussi.

Bon, bin je code un peu, et je vous soumets ça cette nuit sans
doute... :wink:

-Nicolas

Bon, bin je code un peu, et je vous soumets ça cette nuit sans
doute... :wink:

Voilà donc un début ...

Je crée donc une table :

CREATE TABLE spip_liens_internes (
  id_depuis varchar(10) NOT NULL default '',
  id_vers varchar(10) NOT NULL default '',
  PRIMARY KEY (id_depuis,id_vers)
);

Et pour l'instant on va commencer par traiter les articles.

Dans 'ecrire/articles.php3', ligne 204, insérer ça :

$query = "DELETE FROM spip_liens_internes WHERE id_depuis='art-$id_article'";
$result = spip_query($query);
define('_UPDATE_LIENS_INTERNES', 'art-'.$id_article);

Et dans 'ecrire/inc_texte.php3', ligne 399, insérer ça :

if (defined('_UPDATE_LIENS_INTERNES')) {
  $linkTypes = array('ru' => 'rub', 'br' => 'bre', 'au' => 'aut', 'mo' => 'mot', 'si' => 'sit', 'ar' => 'art');
  $linkType = $linkTypes[substr($type_lien.'ar', 0, 2)];
  $query = "INSERT INTO spip_liens_internes (id_depuis, id_vers) VALUES ('"._UPDATE_LIENS_INTERNES."', '".$linkType."-".$id_lien."')";
  $result = spip_query($query);
}

Juste avant la ligne suivante :

        } else { // lien non automatique

Avec ça, on a déjà tous les liens présents dans les articles qui sont
gérés ...
        
-Nicolas

Et pour l'instant on va commencer par traiter les articles.

Allez, je continue ... :wink:

Pour les rubriques, dans 'ecrire/naviguer.php3' ajouter ligne 155 les
2 lignes suivantes :

spip_query("DELETE FROM spip_liens_internes WHERE id_depuis='rub-$coll'");
define('_UPDATE_LIENS_INTERNES', 'rub-'.$coll);

Pour les brèves, dans 'ecrire/breves_voir.php3' ajouter ligne 75 les 2
lignes suivantes :

spip_query("DELETE FROM spip_liens_internes WHERE id_depuis='bre-$id_breve'");
define('_UPDATE_LIENS_INTERNES', 'bre-'.$id_breve);

Pour les mots clefs, ça ne peut pas marcher pareil, le fonctionnel
n'est pas le même, on ne revient pas en visualisation après ajout ou
modification, c'est pas très gentil !!! :wink:

Il "suffirait" de supprimer la redirection suivante ligne 62 :

if ($redirect_ok == 'oui' && $redirect) {
  @header("Location: ".rawurldecode($redirect));
  exit;
}

Et on pourrait mettre ligne 48 les 2 lignes suivantes :

spip_query("DELETE FROM spip_liens_internes WHERE id_depuis='mot-$id_mot'");
define('_UPDATE_LIENS_INTERNES', 'mot-'.$id_mot);

-Nicolas

Pour les mots clefs, ça ne peut pas marcher pareil, le fonctionnel
n'est pas le même, on ne revient pas en visualisation après ajout ou
modification, c'est pas très gentil !!! :wink:

Il "suffirait" de supprimer la redirection suivante ligne 62 :

if ($redirect_ok == 'oui' && $redirect) {
  @header("Location: ".rawurldecode($redirect));
  exit;
}

Non, il ne "suffirait" pas de faire ça, il faut plutôt ôter le
redirect du formulaire de saisie ...

Bon, est-ce que je continue à vous donner tout ça pour que vous
l'ajoutiez au fur et à mesure dans le CVS, ou ça n'intéresse
personne ???

Je dois le faire pour un projet, et je trouve cette fonctionnalité
super intéressante, donc je vais de toute façon le faire, mais ma
tâche serait simplifiée si je savais ce qu'il en sera fait ...

-Nicolas

Bon, est-ce que je continue à vous donner tout ça pour que vous l'ajoutiez
au fur et à mesure dans le CVS, ou ça n'intéresse personne ??? Je dois le
faire pour un projet, et je trouve cette fonctionnalité super
intéressante, donc je vais de toute façon le faire, mais ma tâche serait
simplifiée si je savais ce qu'il en sera fait ...

Ca a l'air utile, oui, mais on ne va pas l'intégrer morceau par morceau
avant que ça soit un minimum fonctionnel :wink:

-- Fil