web-dev-qa-db-ja.com

URLにパスエイリアスを含むコンテキストフィルター

クイックサマリー:ビューがサイトのどこかにある場合、ビューのコンテキストフィルターにURLのエイリアスを渡すにはどうすればよいですか。

私は数十の同様の記事を読みましたが、これが私に直接明らかになることは何もないので、誰かが何らかの洞察を持っている場合、私は感謝します。

私はコンテンツタイプ: "アーティスト"にパスオートエイリアスを設定しています。artists/ picassoコンテンツタイプ:アートワークに、アーティストへのエンティティ参照があります。特定のアートワークには、アートワーク/ミノタウロス(ピカソを参照する作品)などのエイリアスがある場合があります。

私がやりたいのは、ビューを作成し、ここに公開することです:(artwork/artists/picasso)ピカソによるすべてのアートワークを表示します。

私の問題は、ビューを設定できますが、URLパスにNiDがある場合にのみ正しく表示されます。例:/ artwork/artists/1(1はPicassoノードのNid)

たとえば、私が望む場所(artwork/artists /)で使用する引数として「ピカソ」を受け入れるビューを取得するにはどうすればよいですか。

ビューをアーティスト/ピカソのページにブロックとして添付しても問題ありません。そこで彼の作品をすべて見せることはできますが、別の場所で彼の作品を見せたいです。

これは当たり前のようですが、実装方法について明確な答えが見つかりません。よろしくお願いいたします。」

6
Scott Edmonds

一意のノードタイトルを確保する必要がないようにするより堅牢なソリューションは、コンテキストフィルターをノードIDに変換するカスタムビュープラグイン引数バリデーターを作成することです。

ノードパスエイリアスを検証する場合は、views/modules/node/views_plugin_argument_validate_node.incのクラス_views_plugin_argument_validate_node_を拡張してoptions_form()を上書きし、独自のオプションを提供する必要があります。あなたはおそらく次のようなものを望みます:

_function options_form(&$form, &$form_state) {
  parent::options_form(&$form, &$form_state);
  $form['type'] = array(
    '#type' => 'select',
    '#title' => t('Filter value type'),
    '#options' => array(
      'convert_path_alias' => t('Node path alias converted to Node ID'),
    ),
    '#default_value' => $this->options['type'],
  );
}
_

また、validate_argument()を上書きして、関数に渡された引数(パスエイリアス)をノードnidに変換し、_$this->argument->argument_を変換されたノードnidに設定し、パスエイリアスがTRUEの場合はTRUEを返す必要があります。正常に変換されました。

1
rocket

これは、hook_views_query_alter()で実行できます。コンテキストフィルターは、条件(技術的にはMySql Slang)に他なりません。したがって、上記のフックを実装してwhere条件を変更できます。

しかし、エイリアスからnidを取得する方法は?

Hook_views_query_alter内でnode_get_object()を使用すると、nidが取得されます。これはwhere条件として設定できます。

これがお役に立てば幸いです。

1
Gladiator