モジュールにhook_node_info()
を使用してカスタムコンテンツタイプ「キャンペーン」を作成し、hook_field_group_info()
を使用してフィールドを追加しました。このキャンペーンのコンテンツタイプは、ページ読み込み時にCToolモーダル(hook_init()
)を使用して、モーダル/ポップアップでサイト全体のユーザーに表示されます。
私が探しているのは、さまざまな役割またはパスに対してこのポップアップ/モーダルを制限するオプションを管理者に与えることです。ブロックセクションと同じようにしています。たとえば、node/104
でブロックを表示するかどうか、または(匿名)ユーザーのみのブロックを表示するかどうか。以下のスクリーンショットのように。
私の目的は、「キャンペーン」ノードを作成するときに、管理者が特定のキャンペーンを表示するかどうかを示すページまたはロールを選択できるようにすることです。
Drupalここでブロックロジックを使用する方法を教えていただけますか?または、カスタムモジュールで開始できるコードの提案を行うことができますか?
ブロックの可視性ルールは、ノードが特定のノードの一意の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 レンダリングされたノードを特定の領域に追加します。
あなたはおそらくこれを考えすぎています。
キャンペーンコンテンツタイプに2つの新しいフィールドを追加するだけです。編集者がページを選択する1つの多値ノード参照フィールドと、オプションとしてロール名を含む1つの多値選択(リスト)フィールドです。モーダルの可視性を制御するために必要なのはこれだけです。
次に、表示されている現在のノードIDと現在のユーザーロールを取得するカスタムブロックを作成し、すべてのキャンペーンをチェックして(おそらくデータベースクエリを介して)、これらの値が一致するものを取得し、一致するものを読み込んで表示しますキャンペーン。
できました。