web-dev-qa-db-ja.com

パネルのURLからビューペインまたはブロックに引数を渡す

分類用語ごとにグループ化されたコースのすべてのリソースを表示するページがあります。コースは有機的なグループであり、リソースはそれらのグループに属する資料です。パネルを使用してコンテンツを表示し、view_nodeをオーバーライドしています。さまざまなリソースカテゴリをすべて一覧表示するビューペインを既に作成しましたが、現在、カテゴリのすべてのリソースを一覧表示しようとしています。

パネルは次のURL構造を使用しています。

コース/コース名/ resources/resource-taxonomy-term

たとえば、私はURLを持っています

/ course/test-course/resources/transport

次に、分類用語「transport」に属するすべてのリソースを表示します。だから私が渡したいURL引数は%4だと思います。

私は1日以上試してみましたが、さまざまなメソッドを使用して、URL引数をビューに渡しても成功しませんでした。ビューペインを使用して結果とビューブロックを表示しようとしましたが、成功せずに引数を渡すさまざまな方法を調査しました。ビュー自体では問題なく機能しますが、パネルに配置すると機能しません。誰でも私にそれを行う方法を教えてもらえますか?

D7.18、ctools 7.x-1.0-rc1、panels 7.x-3.0、views 7.x-3.7を使用しています。

5
Ben

私はこの問題をなんとか解決しました。解決策は私が望んでいたものとは正確には異なりますが、機能します。

まず、パネルの用語名ではなく、用語IDを使用するようにURL引数を変更しました。次に、ビューペインで、コンテキスト設定の[デフォルトの引数を提供する]セクションで[URLから分類用語のID]を使用する代わりに、[URLからの生の値]を使用して、パスコンポーネントを指定しました。また、用語idを使用するための基本的な検証を設定する必要がありました。

IDの代わりにURLで用語名を使用することができる、これを行うよりきちんとした方法があるかどうか私はまだ興味があります。

2
Ben

シナリオ例:

コンテンツ表示ペインを含むパネルがあります。

パネルURL:/ panel_url

引数の例:/ panel_url/term_name

[〜#〜] bef [〜#〜] の場合:/ panel_url?category = 123

設定方法(既存のパネルと追加されたコンテンツペインがある):

  1. コンテキストフィルターをビューに追加します。例: ビューのコンテキストフィルター分類名
  2. 「表示->ペイン設定->引数入力」の設定を変更して、「パネル引数から」という引数をロードします(例:最初)。

できました。


さらに、 Better Exposed Filters を使用している場合は、次の改善を行うことができます。

引数に基づいて現在アクティブなリンクを設定するには(select_as_linksを使用している場合):

/**
 * Implements hook_preprocess_[themeFunctionName]().
 */
function foo_preprocess_select_as_links(&$variables) {
  $options = isset($variables['element']['#options']) ? array_change_key_case(array_flip($variables['element']['#options']), CASE_LOWER) : array();
  $selected = end((arg()));
  if (array_key_exists($selected, $options)) {
    $variables['element']['#value'] = $options[$selected];
  }
}

引数に基づいて現在アクティブなリンクを設定するには(selectを使用している場合):

/**
 * Implements hook_preprocess_[themeFunctionName]().
 */
function foo_preprocess_select(&$variables) {
  switch (arg(0)) {
    case 'panel_url':
      if (@$variables['element']['#name'] == 'category') {
        $options = isset($variables['element']['#options']) ? array_change_key_case(array_flip($variables['element']['#options']), CASE_LOWER) : array();
        $selected = end((arg()));
        if (array_key_exists($selected, $options)) {
          if ($variables['element']['#value'] <> $options[$selected]) {
            $variables['element']['#value'] = $options[$selected];
          } else {
            // drupal_goto('panel_url');
          }
        }
      }
    break;
  }
}

リンクをSEO対応にするために、次のようなことを試すことができます。

/**
 * Implements hook_url_inbound_alter().
 */
function foo_url_outbound_alter(&$path, &$options, $original_path){
  if (arg(0) == 'panel_url') {
    // Convert URL like: /panel_url?category=29 into /panel_url/term_name (SEO friendly)
    $path_info = parse_url($path);
    switch (@$path_info['path']) {
      case 'panel_url/term_name':
      case 'panel_url/term_name2':
        $path = 'panel_url/all'; // Convert loopy urls into base url
    }
    if (strpos($path, '?category=') !== FALSE) { // Convert term id into human name
      list(, $tid) = explode('=', current(explode('&', $path_info['query']))); // get tid from URL
      $term_name = strtolower(taxonomy_term_load((int)$tid)->name);
      $path = '/panel_url' . '/' . $term_name; // See also: $path_info['path']
    }
  }
}
3
kenorb

引数を渡す際の問題は、パネルやページを十分に理解していないためです。私はwronglyノードを作成し(基本的なページコンテンツタイプから)、パネルで編集して引数を送信できることを期待しています。 URLパスに引数を追加すると、常にページが見つかりませんでした。

後で気付いたのは、構造>ページ>カスタムページの追加に移動し、コンテンツペインビューを追加して引数を効果的に渡す必要があることです。また、カスタムページからコンテンツウィンドウを見つける前に、コンテンツペインビューに引数入力が正しく設定されていることを確認する必要があります。

このチュートリアルを読んで、どこが間違っているのかを見つけました: http://www.metaltoad.com/blog/passing-page-arguments-view-panes

0
vrwired

ビューペインで、分類用語との関係を作成します。完了したら、その関係に基づいてコンテキストフィルターを作成し、用語名を渡します。生のURL引数を受け入れるようにフィルターを設定し、パスに項目番号を設定すると、それが行われます。

0
user140