クイックサマリー:ビューがサイトのどこかにある場合、ビューのコンテキストフィルターにURLのエイリアスを渡すにはどうすればよいですか。
私は数十の同様の記事を読みましたが、これが私に直接明らかになることは何もないので、誰かが何らかの洞察を持っている場合、私は感謝します。
私はコンテンツタイプ: "アーティスト"にパスオートエイリアスを設定しています。artists/ picassoコンテンツタイプ:アートワークに、アーティストへのエンティティ参照があります。特定のアートワークには、アートワーク/ミノタウロス(ピカソを参照する作品)などのエイリアスがある場合があります。
私がやりたいのは、ビューを作成し、ここに公開することです:(artwork/artists/picasso)ピカソによるすべてのアートワークを表示します。
私の問題は、ビューを設定できますが、URLパスにNiDがある場合にのみ正しく表示されます。例:/ artwork/artists/1(1はPicassoノードのNid)
たとえば、私が望む場所(artwork/artists /)で使用する引数として「ピカソ」を受け入れるビューを取得するにはどうすればよいですか。
ビューをアーティスト/ピカソのページにブロックとして添付しても問題ありません。そこで彼の作品をすべて見せることはできますが、別の場所で彼の作品を見せたいです。
これは当たり前のようですが、実装方法について明確な答えが見つかりません。よろしくお願いいたします。」
一意のノードタイトルを確保する必要がないようにするより堅牢なソリューションは、コンテキストフィルターをノード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を返す必要があります。正常に変換されました。
これは、hook_views_query_alter()で実行できます。コンテキストフィルターは、条件(技術的にはMySql Slang)に他なりません。したがって、上記のフックを実装してwhere条件を変更できます。
しかし、エイリアスからnidを取得する方法は?
Hook_views_query_alter内でnode_get_object()を使用すると、nidが取得されます。これはwhere条件として設定できます。
これがお役に立てば幸いです。