ビューのフィールドの結果の書き換えでトークンとしてURL引数を使用可能にする方法は?


7

たとえば、URL引数を作成することは可能ですか?

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

ビューのフィールドの書き換え結果設定でトークンとして使用可能。たとえば、上記の場合、これらは(他の既存のトークンの中で)次のように使用できます。

[arg1] [arg2] [arg3]

バックグラウンド

OpenLayersマップを使用して、オーバーレイに配置されたフィルター済みアイテムを含むビューを開発しています。ユーザーがマップを操作してアイテムを削除するとき、ページが再読み込みされるときにマップの位置を保持したい(デフォルトのズームと位置に戻さないようにしたい)。URL引数(経度と緯度)にアクセスできるようにすることで、フィルターURLを書き換えて、これらをページに送り返すことができます。

しかし、人々が質問への答えを見つけるのに役立つマップを使用しない他のシナリオがあると確信しています。

回答:


6

実際にコンテキストフィルターを使用したくない場合は、「グローバル:Null」コンテキストフィルターを使用し、コンテキストフィルターオプションを使用して、関心のある引数の位置から値を割り当てると、%1として使用できるようになります。 /!1クエリに実際に影響を与えない置換トークン。


4

もしarg2およびarg3問題のビューである、またはすることができ、引数/コンテキストフィルタは、使用することができるはず!1!2書き換えに。

それはarg1本当に簡単に動的にすることはできないので、私は無視しています。

添加:

これは、D7がD6機能を削除していないと想定する別のケースかもしれませんが、ここで簡単な画面グラブ(私はこの秒ですぐに使えるD7テストベッドがないので、申し訳ありません)は、引数が再書き込みの一部としてこれを示しています現在:

ここに画像の説明を入力してください

これは、ノードnidとタイプの2つの引数を持つクイックビューです。このフィールド(タイトル)を書き換えるHello [title] where nid is !1 and type is !2と、入力して機能します。

2番目の追加:

この回答は当面の問題にはもはや有効ではありませんが(両方の回答に関する多くのコメントを参照)、@ Molotはこれらの置換パターンがD7で利用可能であることを確認しました。

ここに画像の説明を入力してください

おそらくこれと彼の答えは、他の誰かがそこを見るのを助けるでしょう。


たとえば、「このフィールドを書き換える」のテキストボックスに!2または[!2]を直接入力します-i44.tinypic.com/4rrgy0.pngのように -これは機能しないようです。このスクリーンショットは、次を示しています。!2または[!2]が出力されます。ちなみに私は(必要に応じて)集計を使用しているため、これが干渉しているかどうかはわかりません-スクリーンショットを参照してください:i44.tinypic.com/2vmc84m.png集計の理由:drupal.stackexchange.com/a/79064/1082(thanksこれまでの入力についてJimajamma)
therobyouknow 2013

ビューの書き換え結果のトークンとして!2または!3表記をこれまで見たことがありませんが、最後のコメントのように、それをどこで使用するのが間違っているかについてのアドバイスでうまくいくと思いますが、認めざるを得ません。
therobyouknow 2013

3
i.stack.imgur.com/e5X2y.png-D7からのスクリーンショット-機能します。NIDがフォースト、コンテキストフィルタである
Mołot

Mołot(+1)とJimajammaに感謝します。これは表示され始めたので、確認のためにさらに実験を行います。以前は表示されなかったので、セットアップで何かが少し「不安定」であると思います。問題がなければ、Jimajammaの回答を受け入れたい(Mołotに感謝-確認のために戻ってきたら、すべての投稿に
賛成票を投じる

1
ああ。それで私たちがそれで別の強打を取ることができるかどうか私たち全員に知らせてください。それはのようなものであれば、実際にアンカータグのバックエンドに送信され、それがサーバー上に存在しません(それは確かにdrupalのが見ることができる)場合には、それだけで基本的に無視されます。乾杯!www.yourhost.com/some/path#latlong#latlong
ジマジャマ2013

3

使用する引数がビュー引数でもコンテキストフィルターでもない場合、それらをトークンとして使用する場合は、基本的に、APIで説明されているように、hook_tokens()およびhook_token_info()を実装するモジュールを作成する必要があります。誰もがすでにやったとは思わない。

ここに私がそれをする方法があります:

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

もちろん、上記のコードは本番対応ではありません。適切な型の処理、セキュリティの問題などは無視されます。それはあなたを正しい軌道に乗せることを意図していますが、それを展開する前にあなた自身の正気を適用する必要があります。私は虐待の責任を負いません。元に戻す前に、削除された理由について読み、本当に必要なものだけを復元するように注意してください。

arg()$ _GETの代わりにアクセス可能なパラメーターが必要な場合は、もちろんhook_tokensで次のように繰り返します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;
  }
}

yourmodule_token_info()適宜変更してください。


+1 @Mołotありがとうございました。この機能は、過去に関係する開発者によるビューのために検討され、反対されましたか?私はおそらくあなたの答えを受け入れるでしょう、私はあなたが試したコードをあげます。
therobyouknow 2013

$ _GETからの@therobyouknowトークンはコストが高く、キャッシュを混乱させます、afaik。そして、試す前に私の最新の答えを見てください。
Mołot

1
arg2とarg3が実際に問題のビューの引数またはコンテキストフィルターである場合!2, !3、書き換えで使用するだけでよいはずです(arg1は無視できます。これは実際には簡単に動的にすることはできないためです)
Jimajamma

1
@therobyouknow i.stack.imgur.com/e5X2y.png D7もこれをサポートしています。テストしただけです。Dunnoなぜそれはあなたのために機能しません。引数がコンテキストフィルターにある場合、ジマジャンマの答えはOKです。少なくとも私にとってはうまくいきます。(受け入れられている私の答えに対するLOL「Mの戦い)
Mołot

1
@therobyouknowシリアルアップしないでください!正直なところ、この投稿への賛成票は、承認よりも2倍多くの担当者を獲得したので、心配する必要はありません。そして私は彼の方法がより簡単であることを証明するために戦っていました:Pだから私は彼の投稿が受け入れられても構わないのは明らかです。
Mołot
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.