Wie können URL-Argumente als Token in Rewrite-Ergebnissen eines Felds in einer Ansicht verfügbar gemacht werden?

7

Ist es möglich, URL-Argumente zu machen, z

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

verfügbar als Token in den Einstellungen zum Umschreiben der Ergebnisse für ein Feld in Ansichten, z. B. für die oben genannten, stehen diese zur Verwendung (neben anderen vorhandenen Token) zur Verfügung als:

[arg1] [arg2] [arg3]

Hintergrund

Ich entwickle Ansichten mithilfe von OpenLayers-Karten mit gefilterten Elementen, die in einer Überlagerung darauf platziert sind. Wenn der Benutzer mit der Karte interagiert, um Elemente zu entfernen, möchte ich die Position der Karte beibehalten (und nicht auf einen Standardzoom und eine Standardposition zurücksetzen), wenn die Seite neu geladen wird. Durch den Zugriff auf die URL-Argumente, dh Längen- und Breitengrad, kann ich die Filter-URL neu schreiben, sodass diese an die Seite zurückgesendet werden.

Aber ich bin mir sicher, dass es andere Szenarien gibt, in denen keine Karten verwendet werden, für die die Leute Antworten auf die Frage finden würden.

Therobyouknow
quelle

Antworten:

6

Wenn Sie keinen Kontextfilter verwenden möchten, können Sie einen Kontextfilter "Global: Null" verwenden. Verwenden Sie die Optionen für Kontextfilter, um den Wert aus der Argumentposition zuzuweisen, an der Sie interessiert sind. Dieser Wert wird dann als% 1 verfügbar /! 1 Ersatz-Token, ohne die Abfrage tatsächlich zu beeinflussen.

Jason Fisher
quelle
4

Wenn arg2und arg3sind oder können Argumente / Kontextfilter in der betreffenden Ansicht sein, sollten Sie in der Lage sein, !1und !2beim Umschreiben.

Ich ignoriere das, arg1da das wirklich nicht einfach dynamisch sein kann.

ZUSATZ:

Dies könnte ein weiterer Fall sein, in dem ich davon ausgehe, dass D7 die D6-Funktionen nicht entfernt hat, aber ein kurzer Screenshot hier (ich habe in dieser Sekunde kein D7-Testbed zur Hand, sorry) zeigt dies als Teil des Umschreibens, wenn Argumente vorliegen vorhanden:

Geben Sie hier die Bildbeschreibung ein

Dies ist eine Schnellansicht mit zwei Argumenten, einer Knoten-ID und einem Typ. Wenn ich dieses Feld (den Titel) neu schreibe, kann ich es eingeben Hello [title] where nid is !1 and type is !2und es funktioniert.

2. ZUSATZ:

Obwohl diese Antwort für das vorliegende Problem nicht mehr gültig ist (siehe zahlreiche Kommentare zu beiden Antworten), hat @Molot bestätigt, dass diese Ersatzmuster in D7 verfügbar sind:

Geben Sie hier die Bildbeschreibung ein

Vielleicht hilft dies und seine Antwort jemand anderem, der nach draußen schaut.

Jimajamma
quelle
Jimajamma, also würde ich zum Beispiel! 2 oder [! 2] direkt in das Textfeld einfügen , um dieses Feld neu zu schreiben - wie in: i44.tinypic.com/4rrgy0.png - dies scheint nicht zu funktionieren Dieser Screenshot zeigt -! 2 oder [! 2] wird ausgegeben. Übrigens verwende ich (notwendigerweise) die Aggregation, weiß also nicht, ob dies stört - siehe Screenshot: i44.tinypic.com/2vmc84m.png Grund für die Aggregation hier: drupal.stackexchange.com/a/79064/1082 (danke für Ihre Eingabe bisher Jimajamma)
therobyouknow
Ich habe die! 2- oder! 3-Notation noch nie als Token in den Umschreibergebnissen für eine Ansicht gesehen. Ich muss zugeben, obwohl ich hoffe, dass sie mit einigen Ratschlägen funktioniert, wo ich mit der Verwendung gemäß dem letzten Kommentar falsch liege.
Therobyouknow
3
i.stack.imgur.com/e5X2y.png - Screenshot von D7 - funktioniert. NID ist dort der erste Kontextfilter
Mołot
Vielen Dank an Mołot (+1) und Jimajamma - dies wurde nun angezeigt und ich werde weiter experimentieren, um dies zu bestätigen. Ich denke, dass etwas mit meinem Setup ein bisschen "flockig" ist, da diese zuvor nicht angezeigt wurden. Wenn alles in Ordnung ist, würde ich gerne Jimajammas Antwort akzeptieren (danke Mołot - ich werde alle Ihre Beiträge positiv bewerten, wenn ich zurückkomme, um zu bestätigen ...)
therobyouknow
1
Ah. Lassen Sie uns alle wissen, ob wir es noch einmal versuchen können. Wenn es so etwas wie www.yourhost.com/some/path#latlongdas #latlongist, das tatsächlich an das Backend gesendet wird, das ein Ankertag ist, wird es einfach ignoriert, wenn es nicht auf dem Server vorhanden ist (aber es kann sicherlich von Drupal gesehen werden). Prost!
Jimajamma
3

Angenommen, die Argumente, die Sie verwenden möchten, sind keine Ansichtsargumente oder Kontextfilter. Wenn Sie sie als Token verwenden möchten, müssen Sie grundsätzlich ein Modul erstellen, das hook_tokens () und hook_token_info () implementiert , wie in der API beschrieben . Ich glaube nicht, dass es schon jemand getan hat.

So würde ich es machen:

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;
  }
}

Natürlich ist der obige Code nicht produktionsbereit , er ignoriert die ordnungsgemäße Typhandhabung, Sicherheitsprobleme und so weiter. Es soll Sie auf den richtigen Weg bringen, aber Sie müssen Ihre eigene Vernunft anwenden, bevor Sie es bereitstellen. Ich übernehme keine Verantwortung für Missbrauch. Lesen Sie die Gründe, aus denen es zuerst entfernt wurde, bevor Sie es wieder hinzufügen, und stellen Sie sicher, dass Sie nur das wiederherstellen, was Sie wirklich benötigen.

Wenn Sie möchten, dass Parameter arg()anstelle von $ _GET zugänglich sind, durchlaufen Sie diese natürlich in hook_tokens mit 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;
  }
}

Ändern Sie yourmodule_token_info()entsprechend.

Mołot
quelle
+1 Vielen Dank @ Mołot Wurde diese Funktion in der Vergangenheit von den beteiligten Entwicklern für Ansichten in Betracht gezogen und dagegen entschieden? Es ist wahrscheinlich, dass ich Ihre Antwort akzeptieren werde. Ich werde den Code geben, den Sie ausprobiert haben.
Therobyouknow
@therobyouknow Token von $ _GET sind teuer und verwirren den Cache, afaik. Und sehen Sie sich meine aktualisierte Antwort an, bevor Sie es versuchen.
Mołot
1
Wenn arg2 und arg3 tatsächlich Argumente oder Kontextfilter für die betreffende Ansicht sind, sollten Sie sie nur !2, !3beim Umschreiben verwenden können (ich ignoriere arg1, da dies nicht einfach dynamisch sein kann)
Jimajamma
1
@therobyouknow i.stack.imgur.com/e5X2y.png D7 unterstützt dies ebenfalls, hat es gerade getestet. Keine Ahnung, warum es bei Ihnen nicht funktioniert. Jimajammas Antwort ist OK, wenn sich Argumente in Kontextfiltern befinden. Arbeitet zumindest für mich. (LOL kämpft gegen die Annahme meiner Antwort)
Mołot
1
@therobyouknow NICHT SERIAL UPVOTE ME! Und ehrlich gesagt, Upvotes zu diesem Beitrag haben mir 2x mehr Wiederholungen eingebracht als die Akzeptanz, also kein Grund zur Sorge;) Schließlich habe ich Jimajamma gebeten, seinen Kommentar als Antwort zu posten, oder? Und ich habe gekämpft, um zu beweisen, dass sein Weg einfacher ist: P Es sollte also offensichtlich sein, dass es mir nichts ausmacht, dass sein Posten angenommen wird.
Mołot