web-dev-qa-db-ja.com

ノードにブロックのような可視性設定を追加するにはどうすればよいですか?

モジュールにhook_node_info()を使用してカスタムコンテンツタイプ「キャンペーン」を作成し、hook_field_group_info()を使用してフィールドを追加しました。このキャンペーンのコンテンツタイプは、ページ読み込み時にCToolモーダル(hook_init())を使用して、モーダル/ポップアップでサイト全体のユーザーに表示されます。

私が探しているのは、さまざまな役割またはパスに対してこのポップアップ/モーダルを制限するオプションを管理者に与えることです。ブロックセクションと同じようにしています。たとえば、node/104でブロックを表示するかどうか、または(匿名)ユーザーのみのブロックを表示するかどうか。以下のスクリーンショットのように。

enter image description here 私の目的は、「キャンペーン」ノードを作成するときに、管理者が特定のキャンペーンを表示するかどうかを示すページまたはロールを選択できるようにすることです。

Drupalここでブロックロジックを使用する方法を教えていただけますか?または、カスタムモジュールで開始できるコードの提案を行うことができますか?

4
Zafar S

ブロックの可視性ルールは、ノードが特定のノードの一意のURLのメインコンテンツブロック/領域で常に「フル」または「デフォルト」表示モードを使用して表示されるように設計されているという点で、ノードとは基本的に異なります。一方、ブロックは、どのページのどの領域にも配置できる機能と密接に関連しています。ブロックの可視性は、パスまたはURLベースのルールとともにアクセス許可(つまり、ロールベースのルール)をグループ化できますが、ノードはこれをネイティブに行うことはできません。

私は3つの可能な選択肢を考えることができます(もっとあるかもしれません):

1) これらのモジュールの1つ を使用してノードをブロックに埋め込み、ブロックの可視性ルールを使用して配置します。これには、非常に手動で2か所で物事を結ぶ必要があるという欠点があります。

2)他のノードにキャンペーンノードを表示している場合、entity_referenceフィールドを使用して別のノードからキャンペーンノードを参照し(またはその逆)、エンティティ参照フィールドの表示設定を設定するだけで、エンティティをレンダリングすることができますノード上のフィールドでした。

3)ノードのブロック表示ルールを模倣する完全にカスタムなソリューションを記述します。テキスト(長い)フィールド(field_campaign_urlsと呼びます)から始めて、node_form_alter()フックで垂直タブに表示されるように表示を変更します(または、フィールドグループモジュールを使用してUIでこれを行うことができます)。次に、すべてのページで呼び出されるフックを実装する必要があります。 hook_page_alter field_campaign_urlsデータベーステーブル内のすべての値との一致について、内部URL Drupal URL(およびオプションでpathautoエイリアス)をテストします。ここでの課題は、ワイルドカードを書き込むことです。機能、some/url/*をデータベースの条件に変換する方法を理解する必要がありますLIKE 'some/url/%'これは、内部構造の詳細を調べるためにblock.moduleコードを掘り下げ始める場合にも役立ちます。ブロックの可視性のクエリロジックのしくみについて説明します。最後に、このロジックをカスタムノードアクセスロジックと組み合わせる必要があります。実際に、ノードを追加するブロック領域を特定する必要があります。 drupal_add_region_content レンダリングされたノードを特定の領域に追加します。

1
JamesWilson

あなたはおそらくこれを考えすぎています。

キャンペーンコンテンツタイプに2つの新しいフィールドを追加するだけです。編集者がページを選択する1つの多値ノード参照フィールドと、オプションとしてロール名を含む1つの多値選択(リスト)フィールドです。モーダルの可視性を制御するために必要なのはこれだけです。

次に、表示されている現在のノードIDと現在のユーザーロールを取得するカスタムブロックを作成し、すべてのキャンペーンをチェックして(おそらくデータベースクエリを介して)、これらの値が一致するものを取得し、一致するものを読み込んで表示しますキャンペーン。

できました。

0
leymannx