Views Add Button
Viewsのヘッダー、フッター、またはフィールドに、任意のエンティティタイプの「追加」ボタンを配置できるようにするモジュール。
views_add_button
インストール
composer require 'drupal/views_add_button:^2.0'
概要
Views Add Buttonは、Viewsモジュールを拡張し、エンティティを追加するためのカスタマイズ可能なボタンをビューに配置できるようにするモジュールです。
例えば、記事一覧ビューのヘッダーに「新しい記事を追加」ボタンを設置したり、カテゴリー一覧の各行に関連するコンテンツの追加ボタンを配置したりすることが可能です。ボタンは、現在のユーザーがそのエンティティを作成する権限を持っている場合にのみ表示されます。
このモジュールの大きな特徴は、コンテキストフィルターからのトークンをサポートしていることです。これにより、ビューのコンテキストに応じた動的なクエリパラメータを追加ボタンのURLに含めることができます。例えば、特定のタクソノミータームでフィルターされたノードリストで、そのタームを事前に選択した状態の新規ノード作成フォームへのリンクを生成できます。
また、拡張可能なプラグインシステムを採用しており、Node、Taxonomy Term、Userなどの標準エンティティには専用のプラグインが用意されています。他のエンティティタイプやカスタムエンティティに対しても、プラグインを作成することで対応が可能です。Group モジュールなどのコントリビュートモジュール用のプラグインも、別途提供されています。
Features
- Viewsのヘッダー・フッター領域(Area)に任意のエンティティタイプの「追加」ボタンを配置
- Viewsのフィールドとして各行に「追加」ボタンを配置(同じビュー内に複数のボタンを設置可能)
- エンティティの作成権限(create access)を自動的にチェックし、権限がない場合はボタンを非表示またはカスタムメッセージを表示
- コンテキストフィルターやビューのフィールドからのトークンをボタンのテキスト、クエリ文字列、属性などに使用可能
- ボタンのCSSクラス、カスタム属性、プレフィックス/サフィックスHTMLを自由にカスタマイズ
- destination パラメータのサポートにより、エンティティ追加後に元のビューページに戻ることが可能
- 拡張可能なプラグインシステムにより、カスタムエンティティやサードパーティモジュールのエンティティに対応可能
- Node、Taxonomy Term、User、ECKエンティティ用の組み込みプラグインを提供
Use Cases
記事一覧に「新規記事作成」ボタンを追加
記事(Article)を表示するビューのヘッダーに「新しい記事を追加」ボタンを配置します。Views の編集画面で「HEADER」セクションの「Add」をクリックし、「Global: Entity Add Button」を選択します。Entity Type で「Node > Article」を選択し、Button Text に「新しい記事を追加」と入力、Button classes に「button button--primary」を設定してスタイリングします。記事作成権限を持つユーザーにのみボタンが表示されます。
カテゴリーに紐づくコンテンツを追加するボタン
タクソノミータームの一覧で、各カテゴリーの横に「このカテゴリーの記事を追加」ボタンを配置します。Views Field として Entity Add Button を追加し、Entity Type で「Node > Article」を選択します。「Use tokens」を有効にし、Query string に「field_category={{ tid }}」を設定することで、そのカテゴリーが事前選択された状態の記事追加フォームへのリンクが生成されます。
空のビューに「最初のアイテムを追加」メッセージを表示
ビューの結果が空の場合のフッター領域に Entity Add Button を配置し、Prefix HTML に「<p>表示するアイテムがありません。</p>」を設定、Button Text に「最初のアイテムを追加」を設定します。これにより、空の一覧でもユーザーを適切な追加フォームに誘導できます。
ユーザー管理画面にユーザー追加ボタンを配置
ユーザー一覧ビューのヘッダーに「新規ユーザーを作成」ボタンを追加します。Entity Type で「User」を選択すると、管理者向けのユーザー作成フォーム(/admin/people/create)へのリンクが生成されます。「administer users」権限を持つユーザーにのみボタンが表示されます。
モーダルダイアログでの追加フォーム表示
追加ボタンをクリックした際にモーダルダイアログで追加フォームを表示するには、Additional Button Attributes に「data-dialog-type=modal」と「class=use-ajax」を追加します。Drupal のダイアログシステムと連携して、ページ遷移なしでフォームを表示できます。
Groupモジュールとの連携
Group モジュールを使用している場合、グループ内のコンテンツ一覧に「グループコンテンツを追加」ボタンを配置できます。Views Add Button: Group サブモジュールを有効にし、Entity Context にグループ ID のトークンを設定することで、特定のグループにコンテンツを追加するリンクが生成されます。
カスタムエンティティ用プラグインの作成
カスタムエンティティやコントリビュートモジュールで提供されるエンティティに対応するには、ViewsAddButton プラグインを作成します。src/Plugin/views_add_button ディレクトリにクラスファイルを作成し、@ViewsAddButton アノテーションで id、label、target_entity を定義します。description() メソッドと generateUrl() メソッドを実装し、必要に応じて checkAccess() メソッドでカスタムアクセスチェックを追加します。
Tips
- ボタンをスタイリングするには、Button classes フィールドを使用します。Drupal の標準的な「button」クラスや、使用しているテーマのボタンクラス(Bootstrap なら「btn btn-primary」など)を指定できます。
- 複数の追加ボタンが必要な場合は、同じビューに複数の Entity Add Button フィールド/エリアを追加できます。異なるエンティティタイプやバンドルに対応したボタンを1つのビューに配置可能です。
- destination パラメータを有効にすると、エンティティの追加完了後に自動的にビューのページに戻ります。無効にすると、エンティティの追加完了後のデフォルトの遷移先(通常はエンティティの表示ページ)に移動します。
- トークンを使用する際、HTML タグが含まれる可能性がある場合は Preserve Tags 設定で保持するタグを指定できます。
- カスタムアクセスチェックが必要な場合は、専用の ViewsAddButton プラグインを作成し、checkAccess() メソッドを実装することで、Drupal 標準のアクセスチェックとは異なるロジックを使用できます。
Technical Details
Hooks 1
hook_views_add_button_info_alter
ViewsAddButton プラグインの定義を変更するための alter フック。既存のプラグインの設定を変更したり、プログラム的にプラグインを追加・削除したりできます。
Troubleshooting 5
現在のユーザーが対象のエンティティを作成する権限を持っているか確認してください。権限がない場合、ボタンは自動的に非表示になります。また、Entity Type が正しく選択されているか確認してください。
「Use tokens」または「Should replacement tokens be used from the first row」チェックボックスが有効になっているか確認してください。また、ビューに結果が存在することを確認してください。トークンは最初の行のデータから取得されます。
カスタムエンティティの場合、デフォルトプラグインが生成するURLパターンが実際のルートと異なる可能性があります。Custom Rendering Plugin を設定するか、専用の ViewsAddButton プラグインを作成してください。
ECK エンティティには Custom Rendering Plugin で「ViewsAddButtonECKEntity」を手動で選択する必要があります。このプラグインは target_entity が空のため、自動選択されません。
クエリ文字列には先頭の「?」を含めないでください。また、複数のパラメータは「&」で区切ります。トークンを使用する場合は、トークンの展開結果に特殊文字が含まれていないか確認してください。
Security Notes 3
- このモジュールはエンティティの作成権限(create access)を自動的にチェックします。権限のないユーザーにはボタンが表示されないか、設定された「Access Denied HTML」が表示されます。
- クエリ文字列やトークンの値はセキュリティのため、特定の特殊文字([ ] { } &)のみがエスケープ解除されます。XSS などの攻撃を防ぐため、他の特殊文字は処理されません。
- Prefix/Suffix HTML や Access Denied HTML はテキストフォーマットを通じてサニタイズされます。適切なテキストフォーマット(信頼できる管理者のみがアクセスできるもの)を使用してください。