web-dev-qa-db-fra.com

Comment rendre les arguments d'URL disponibles en tant que jetons dans les résultats de réécriture d'un champ dans une vue?

Est-il possible de faire des arguments URL, par exemple.

http://mysite.com/arg1/arg2/arg3

disponibles en tant que jetons dans les paramètres de résultats de réécriture pour un champ dans les vues, par exemple pour ce qui précède, ceux-ci pourraient être utilisés (parmi d'autres jetons existants) comme:

[arg1] [arg2] [arg3]

Contexte

Je développe des vues à l'aide de cartes OpenLayers avec des éléments filtrés placés en superposition sur eux. Lorsque l'utilisateur interagit avec la carte pour supprimer des éléments, je souhaite conserver la position de la carte (et ne pas la faire revenir à un zoom et à une position par défaut) lors du rechargement de la page. En étant en mesure d'accéder aux arguments d'URL, c'est-à-dire la longitude et la latitude, je peux ensuite réécrire l'URL du filtre afin qu'ils soient renvoyés à la page.

Mais je suis sûr qu'il existe d'autres scénarios qui n'utilisent pas de cartes pour lesquelles les gens trouveraient les réponses à la question utiles.

7
therobyouknow

Si vous ne souhaitez pas réellement utiliser un filtre contextuel, vous pouvez utiliser un filtre contextuel "Global: Null", utilisez les options des filtres contextuels pour attribuer la valeur à partir de la position de l'argument qui vous intéresse et qui devient disponible en tant que% 1 /! 1 jeton de remplacement sans affecter réellement la requête.

6
Jason Fisher

Si arg2 et arg3 sont, ou peuvent être, des arguments/filtres contextuels dans la vue en question, vous devriez pouvoir utiliser !1 et !2 dans la réécriture.

J'ignore arg1 car cela ne peut vraiment pas être dynamique.

UNE ADDITION:

Cela pourrait être un autre cas de supposer que D7 ne s'est pas débarrassé des fonctionnalités de D6, mais une capture d'écran rapide ici (je n'ai pas de banc d'essai D7 à portée de main à ce stade, désolé) montre cela dans le cadre de la réécriture lorsque les arguments sont présent:

enter image description here

Ceci est une vue rapide avec deux arguments, un nid de nœud et un type, et quand je réécris ce champ (le titre), je peux mettre Hello [title] where nid is !1 and type is !2 et il fonctionne.

2ÈME AJOUT:

Même si cette réponse n'est plus valable pour le problème en question (voir les commentaires abondants sur les deux réponses), @Molot a confirmé que ces modèles de remplacement sont disponibles dans D7:

enter image description here

alors peut-être que cela et sa réponse aideront quelqu'un d'autre à regarder dehors.

4
Jimajamma

En supposant que les arguments que vous souhaitez utiliser ne sont pas des arguments de vue ou des filtres contextuels, si vous les voulez en tant que jetons, vous devez essentiellement créer un module qui implémente hook_tokens () et hook_token_info () , comme décrit dans l'API . Je pense que personne ne l'a déjà fait.

Voici comment je le ferais:

function yourmodule_token_info() {
  $type = array(
    'name' => t('GET'),
    'description' => t('Tokens related to $_GET superglobal.'),
  );
  $tokens = array();
  foreach($_GET as $key => $val) { //discard $val now
    $tokens[$key] = array(
      'name' => $key,
      'description' => "\$_GET['$key']",
    );
  }
  return array(
    'types' => array('get' => $type),
    'tokens' => array('get' => $tokens),
  );
}

function yourmodule_tokens($type, $tokens, array $data = array(), array $options = array()) {
  if($type == 'get') {
    $replacements = array();
    foreach ($tokens as $name => $original) {
        $replacements[$original] = (string)$_GET[$name];
    }
    return $replacements;
  }
}

Bien sûr, le code ci-dessus n'est pas prêt pour la production , il ignore la gestion appropriée des types, les problèmes de sécurité, etc. Il est destiné à vous mettre sur la bonne voie, mais vous devez appliquer votre propre raison avant de le déployer. Je ne prends aucune responsabilité pour les abus. Lisez les raisons pour lesquelles il a été supprimé avant de décider de l'ajouter à nouveau, et veillez à ne restaurer que ce dont vous avez vraiment besoin.

Si vous voulez que les paramètres soient accessibles par arg() au lieu de $ _GET, bien sûr dans hook_tokens, parcourez-les avec while:

function yourmodule_tokens($type, $tokens, array $data = array(), array $options = array()) {
  if($type == 'arg') {
    $replacements = array();
    $i = 0;
    while ( NULL !== ($arg = arg($i))) {
        $replacements["arg:$i"] = (string)$arg;
    }
    return $replacements;
  }
}

Modifiez yourmodule_token_info() en conséquence.

3
Mołot