web-dev-qa-db-ja.com

動的メニュー項目

Drupal 8メニューシステムは以前のバージョンよりもはるかに論理的であり、hook_menu()の多くの関数を複数のYAMLファイルに分割することは完全に意味があり、ほとんどのDrupalの作成と管理を簡素化します_メニュー項目。

ただし、YAMLファイルは静的要素であるため、モジュールに動的パスとメニュー項目を作成する方法がわかりません。これはhook_menu()でかなり簡単で、通常のメニュー項目と同じように処理されました。

私のモジュールでは、管理者がフォームのパス、メニュータイトル、親メニューアイテムを設定できるようにしたいと思います(フォームには複数のインスタンスがあり、それぞれに独自のパスとメニューアイテムがあり、サイトによって定義されます)管理者)。

誰かが私に例を指摘できるか、これを行う方法の簡単な概要を教えていただければ本当に感謝します。

5
James Shields

あなたは2つの例に従うことができます:

Providing dynamic route では、簡単なコードを簡単に使用できます。

<?php
/**
 * @file
 * Contains \Drupal\example\Routing\ExampleRoutes.
 */

namespace Drupal\example\Routing;

use Symfony\Component\Routing\Route;

/**
 * Defines dynamic routes.
 */
class ExampleRoutes {

  /**
   * {@inheritdoc}
   */
  public function routes() {
    $routes = array();
    // Declares a single route under the name 'example.content'.
    // Returns an array of Route objects. 
    $routes['example.content'] = new Route(
      // Path to attach this route to:
      '/example',
      // Route defaults:
      array(
        '_controller' => '\Drupal\example\Controller\ExampleController::content',
        '_title' => 'Hello'
      ),
      // Route requirements:
      array(
        '_permission'  => 'access content',
      )
    );
    return $routes;
  }

}

配列ストアデータとforeach関数routesが必要です。動的ルーターができます。

動的ルーターの後、派生プラグインで動的メニューを作成できます。クラスの例 MenuLinkContentDeriver 。関数getDerivativeDefinitionsでは、次のようなデータを持つ戻り配列が必要です。

 $links = array(
      'route_name' => $router_name,//like example.content in define route
      'id' => $menu_link_id,
    );
 $links['title'] = $title;
 $links['description'] = $description;
 $links['parent'] = 'main:';
 $links['enabled'] = 1;
7
MrD

D8はsymfonyルーティングシステムを使用し、@ MrDで説明されているようにymlファイルと動的ルートコールバックでこれを構成しますが、メニューは別のシステムになりました。

メニューシステムは、メニューリンクを定義する2つの方法を提供します。静的なmymodule.links.menu.ymlおよびコンテンツとして動的。

後者を行うには、MenuLinkContentエンティティを作成してメニューにアイテムを追加します。

$item = \Drupal\menu_link_content\Entity\MenuLinkContent::create([
  'link' => ['uri' => 'internal:/<front>'],
  'title' => 'Front Page',
  'menu_name' => 'admin',
]);
$item->save();

より複雑な例は、ノードを保存するときにdrupalがメニューリンクを生成する方法です。

https://api.drupal.org/api/drupal/core!modules!menu_ui!menu_ui.module/function/_menu_ui_node_save/8.2.x

5
4k4

別の方法を提供するには、すべてのノードが/ node/IDにシステムパスを持っているのと同じように、引数を使用して単一のルートを操作し、URLエイリアスを作成するだけですが、ユーザーが望む任意の表示パス/エイリアスを持つことができます。

このようにして連絡フォームが機能します。たとえば、/ fooのエイリアスを作成して/ contact/fooを指すようにしたくない場合は、すべての連絡フォームを連絡先/ {contact_form_id}で使用できます。 Coreは実際には連絡フォームに統合された方法でそれを提供しませんが、contact_storageは最新バージョンでその機能を正確に追加します。

主な利点は、単一の静的ルートを使用することで、$ thingを変更/作成/削除しても、ルーターを再構築する必要がないことです。これは、比較的低速でロックされます(その間、他の要求は処理できません)。 。

また、コメントで既に述べたように、メニューリンクは、メニューリンクコンテンツエンティティとして作成することもできます。

要約すると、基本的にはpath.moduleとmenu_ui.moduleがノードに対して行うことを行います。

5
Berdir