web-dev-qa-db-ja.com

JSON:APIを介して完全なメインナビゲーションメニューを取得するにはどうすればよいですか?

Jsonapiを介して完全なメインナビゲーションメニューを取得するにはどうすればよいですか?

私はもう試した:

curl --header 'Accept: application/vnd.api+json' https://cms.example.com/jsonapi/menu/menu/

そして

 curl --header 'Accept: application/vnd.api+json' https://cms.example.com/jsonapi/menu/menu/232fc942-51f3-4478-8535-e5dc482a166e

どこ 232fc942-51f3-4478-8535-e5dc482a166eはメインナビゲーションメニューのidですが、最初のレベルのノードのみが返されます。

{
  "data": {
    "type": "menu--menu",
    "id": "232fc942-51f3-4478-8535-e5dc482a166e",
    "attributes": {
      "label": "Main navigation"
    },
    "links": {
      "self": {
    "href": "https://cms.garanteasy.com/jsonapi/menu/menu/232fc942-51f3-4478-8535-e5dc482a166e"
      }
    }
  },
  "jsonapi": {
    "version": "1.0",
    "meta": {
      "links": {
    "self": {
      "href": "http://jsonapi.org/format/1.0/"
    }
      }
    }
  },
  "links": {
    "self": {
      "href": "https://cms.garanteasy.com/jsonapi/menu/menu/232fc942-51f3-4478-8535-e5dc482a166e"
    }
  }
}
2
lrkwz

JSON:APIで実行できませんでした。長年の問題がいくつかあります...

ただし、RESTメニューツリー モジュールを追加でインストールすると、実行できます。

これにはいくつかの直接的および間接的な依存関係があることに注意してください。

メニューノーマライザ に直接依存しており、 この問題 に従って、たとえば REST UI モジュールを使用して、そのエンドポイントをアクティブにする必要があります。次に core REST module をアクティブにします。

次に、サイトで/admin/config/services/restのRest UIを介してエンドポイントをアクティブにします。

その後、/admin/people/permissions#module-restを使用して、すべてのユーザーがこのエンドポイントを取得できるようにすることもできます。

そして最後に、/entity/menu/main/treeにJSON配列を取得します。または、/entity/menu/{internal_menu_name}/treeを使用して別のメニューをクエリします。

2
Jannis Hell

JSON:APIのみを使用してすべてのメニュー項目をプルすることが可能です。主な「長期にわたる問題」は、管理者以外のユーザーがリンクを使用できないことであり、これはおそらくほとんどのユーザーの目的を無効にします。ただし、これを可能にするパッチがいくつかあります。

https://www.drupal.org/project/drupal/issues/2915792

そして、urlプロパティを追加するには:

https://www.drupal.org/project/drupal/issues/3066751

これにより、このエンドポイントにアクセスできます。

/jsonapi/menu_link_content/your-menu-machine-name

そして、標準のJSON:API結果を取得します。

重要なポイント:Drupalのヘッドレスメニューフェッチの状態はひどいです。 ????

0
jpschroeder

rest_menu_items モジュールもあります。これには依存関係はなく、必要なのはエンドポイントを有効にすることだけです。これにより、必要な値を指定したり、ツリーの深さを指定したりすることもできます。

0
Fabian de Rijk