Drupal: ネストされたフィールドを検索する一例

概要 以下の記事で、Strapiを用いたネストされたフィールドに対する検索方法を調査しました。 今回は同様のことをDrupalで行う方法を調査します。この調査にあたり、以下の記事で、BookとAuthorのコンテンツを登録済みです。 フィルタリングの方法については、以下の記事が参考になりました。 https://www.drupal.org/docs/core-modules-and-themes/core-modules/jsonapi-module/filtering 検索例 以下に対する検索を行います。 /jsonapi/node/book? hobby=danceであるauthorを含むbookの検索 SHORT filter[field_authors.field_hobby]=dance または filter[field_authors.field_hobby][value]=dance NORMAL filter[ex1][condition][path]=field_authors.field_hobby&filter[ex1][condition][value]=dance hobbyにdanを含むauthorを含むbookの検索 SHORT filter[field_authors.field_hobby][operator]=CONTAINS&filter[field_authors.field_hobby][value]=dan NORMAL filter[ex1][condition][path]=field_authors.field_hobby&filter[ex1][condition][operator]=CONTAINS&filter[ex1][condition][value]=dan (参考)hobbyがplayまたはsingであるauthorを含むbookの検索 filter[ex1][condition][path]=field_authors.field_hobby&filter[ex1][condition][operator]=IN&filter[ex1][condition][value][1]=sing&filter[ex1][condition][value][2]=play (参考)Search APIを使う 以下のモジュールを使用することで、複数のコンテンツタイプに対する検索や、フィールド名の指定、ファセットの追加、などができそうです。 https://www.drupal.org/project/jsonapi_search_api 以下の記事で使い方を紹介していますので、参考にしてください。 </ja/posts/8d7aa7c33abffc/#search-api> indexの作成 例えば、Search APIのindexとして、以下のように設定します。 これにより、以下のURLからもbookの情報が得られます。 /jsonapi/index/book 通常のjsonapi(/jsonapi/node/bookなど)と比較して、metaという項目にcountが含まれることで、検索結果の全数が確認できます。(通常のjsonapiでも追加する方法があるかもしれませんが、調査不足により不明です。) { } " } " " } " } j , d m , l s " " } a e " i " } o v m t t c n s n e e " } a a o k e " a r t l " " u s l h p s a i " } : : n " f r i i " n s t : " e " o : k e " [ { " : f : n s l h . : { " " { " f r . { : { : : " e . 4 : f ] " " { " , h 1 { : t . t 0 " p " h s , t : t / p / : x / x / x j / s j o s n o a n p a i p . i o / r i g n / d f e o x r / m b a o t o / k 1 " . 0 / " フィルタリング また、「hobby=danceであるauthorを含むbookの検索」については、先のindex作成において、Property path「field_authors:entity:field_hobby」をMachine name「field_hobby」に割り当てましたので、以下のシンプルなクエリで実行できました。 ...

2023年4月24日 · 6 分 · Nakamura

Drupal: Feedsを用いた一括登録と更新の例

概要 以下の記事で、Strapiを用いたネストされたフィールドに対する検索方法を調査しました。 今回は同様のことをDrupalで行うにあたり、その準備である、コンテンツの一括登録及び更新方法に関する備忘録です。上記の記事と類似の構造を設定するために、BookとAuthorという2つのコンテンツタイプを対象にします。 content typeの作成 BookとAuthorのcontent typeを作成します。 Author 以下、Authorの例です。 id, name, hobbyというフィールドを作成します。feedsは後から追加されるものなので無視してください。 Book Bookのフィールドとして、authorsを作成し、Cotentをフィールドとして選択します。 Reference typeのcontent typeとしてAuthorを選択しました。 feedsの設定 一括登録のための設定を行います。 Author 以下にアクセス /admin/structure/feeds csvをアップロードして登録するため、以下のように設定します。 フィールドNAMEとHOBBYを以下のように設定します。titleは必須項目としていたため、設定しています。またifをUniqueな項目としています。 Book Bookに関する注意点として、authorsは他のコンテンツタイプのidを指定するようにしています。具体的には、以下の図のように、Reference byに「node.field_id」を指定しています。 feedsによる一括登録 /admin/content/feed Author 先に作成したcsvファイルアップロードすることで、以下のように登録が完了します。 Book authorsに正しくcontent typeがauthorのコンテンツが紐付けられています。 (参考)Feedsを用いた更新 authorのfeeds設定を設定するために、以下にアクセス /admin/structure/feeds/manage/author?destination=/admin/structure/feeds 以下のように、「Update existing content items」で「Update existing content items」とすることで、更新を行うことができました。「field_id」をUniqueとしたため、この値に基づいて、新規・更新が判定されます。 ! 「Replace existing content items」や「Update existing content items」などの挙動の違いを十分に理解できていないため、使用される際は検証の上、ご利用ください。 まとめ Feedsを用いた一括登録と更新、および異なるコンテンツタイプとの関連付けを行いました。参考になりましたら幸いです。

2023年4月23日 · 1 分 · Nakamura

Drupal: カスタムモジュールを用いて、コンテンツタイプとフィールドを追加する

概要 Drupalのカスタムモジュールを用いて、コンテンツタイプとフィールドを追加する方法の備忘録です。 以下の2つの記事が参考になりました。 https://www.drupal.org/docs/drupal-apis/entity-api/creating-a-custom-content-type-in-drupal-8 https://www.digitalnadeem.com/drupal/how-to-create-content-type-fields-and-view-while-installing-custom-module-in-drupal-9-using-configuration-manager/ Car Brandの例 先に紹介した一つ目の記事の通り進めると、コンテンツタイプ「Car Brand」、フィールド「body」を追加することができました。 なお、上記の記事ではカスタムモジュールの作成の部分がスキップされています。まずはじめに以下のようなフォルダ、およびファイルを作成します。 n d p t v c a e a y e o m s c p r r e c k e s e : r a : i _ i g o v f p e m n e o t : o : r o i d s b o C u 1 i a n u l . o r : s e 0 n t _ サ o r ン m e プ q ル u モ i ジ r ュ e ー m ル e n t : ^ 8 ^ 9 独自のフィールドの追加 上記を参考に、コンテンツタイプを追加することができましたが、独自のフィールドを追加するには、Fieldに加えて、Field storageというものも追加する必要がありました。 ...

2023年4月21日 · 9 分 · Nakamura

Drupal: 異なるコンテンツタイプのコンテンツを相互にリンクさせる

概要 異なるコンテンツタイプのコンテンツを相互にリンクさせる方法を調べたので、その備忘録です。 具体的には、以下のitem 1がimage 1というコンテンツをiiif_image2というフィールドを介してつながっています。 上記に対して、image 1というページに、item 1へのリンクを設けることが目的です。 この実現にあたり、以下の記事を参考にしました。 https://drupal.stackexchange.com/questions/255447/view-for-entity-reference-reverse-backwards-forwards 方法 ビューの追加 /admin/structure/views に移動し、 +ビューを追加 「Create a block」オプションをチェックします ビューの設定 次のページで、Advancedの設定を行います。 リレーションシップ field_iiif_image2のリレーションシップを追加します。これは、2つのコンテンツタイプを関連付けるために重要です。 Require this relationshipにチェックを入れる必要があります。このフィールドを持たない場合には表示しない、という挙動になるものと理解しました。 コンテキストフィルター 次に、現在のコンテンツタイプのランディングページにコンテキストフィルターを追加します。このようにして、ビューで使用される実際のノードIDを取得します。これで、field_iiif_image2で同じノードIDを持つページのみを見つけることができます。 IDで探す(コンテンツ) デフォルト値を提供-> URL からのコンテンツ IDにチェックを入れます 次のような結果になります。 Update previewの箇所で、メディアのノードID(ここでは、62602)を入力してみます。本メディアが参照されているアイテムへのリンクが表示されます。 ブロックの追加 以下にアクセスします。 /admin/structure/block 例えば、「Content」の横の「Place block」ボタンを押します。 /node/*に配置してみます。 結果、冒頭のように、当該imageが属するitemを表示することができます。 まとめ 使用している用語に統一性がなく、わかりにくい点が多く恐縮ですが、参考になりましたら幸いです。

2023年4月20日 · 1 分 · Nakamura

Drupal: カスタムRESTリソースを作成する

概要 以下を参考に、カスタムRESTリソースを作成しました。 https://www.drupal.org/docs/drupal-apis/restful-web-services-api/custom-rest-resources 上記の記事の通り進めることで、以下のURLから、JSONの結果を得ることができました。 /demo_rest_api/demo_resource { } " m e s s a g e " : " H e l l o , t h i s i s a r e s t s e r v i c e " REST UIモジュール 上記の記事において、以下の記載がありました。 If you are using the REST UI contrib module, you should now be able to see it in the list of available endpoints and you should be able to configure the GET method. ...

2023年4月20日 · 6 分 · Nakamura

DrupalのRESTful Viewsを使ってカスタムAPIを作成する

概要 以下の記事を参考に、DrupalのRESTful Viewsを使ってカスタムAPIを作成したので、その備忘録です。 https://acret.jp/drupal/node/434 上記の記事の内容に加えて、ページネーションに関する設定方法も記載しています。 Viewsの作成 上記のサイトの通りに進めました。 ページネーションを許可する 以下の記事を参考にしました。 https://www.drupal.org/forum/support/post-installation/2015-12-04/rest-export-pagination ViewsのPagerを選択します。以下の通り、Fullとしました。Miniでも大丈夫そうでした。 「Allow user to control the number of items displayed in this view」と「Allow user to specify number of items skipped from beginning of this view.」にチェックを入れます。 結果、以下のようなパラメータが使えるようになりました。 /my_custom_api?items_per_page=10 /my_custom_api?items_per_page=10&offset=1 /my_custom_api?items_per_page=50 まとめ カスタムAPIを作成する際の参考になりましたら幸いです。

2023年4月20日 · 1 分 · Nakamura

Drupalのビューで結果の合計数を表示する

概要 Drupalのビューで結果の合計数を表示する方法を調べたので、その備忘録です。以下のように、検索結果の合計数などが表示されます。 方法 以下の記事を参考にしました。 https://ostraining.com/blog/drupal/count-views/ 以下のページにアクセス /admin/structure/views/view/content Header横のAddボタンを押す Result summaryを選択 Applyを押して、Saveを押します。 まとめ 参考になりましたら幸いです。

2023年4月20日 · 1 分 · Nakamura

Next.js for DrupalにおけるDrupal Search APIを用いた検索(ファセット検索など)

概要 Next.js for Drupalを試してみました。 https://next-drupal.org/ 以下の「Get Started」の通りにすすめることで、Next.jsとDrupalを連携させることができました。 https://next-drupal.org/learn/quick-start また、以下の記事で、ファセット検索の実装例が紹介されています。 https://next-drupal.org/guides/search-api 本記事では、特に後者のファセット検索の実現に関する備忘録です。 Search API 以下、Serverとindexを作成します。 公式サイトでは以下が参考になります。 https://www.drupal.org/docs/contributed-modules/search-api 日本語サイトでは以下が参考になります。 https://www.acquia.com/jp/blog/introduction-to-search-api-1 Serverの作成 indexの作成 今回、test_index_20230417というインデックスを作成します。 さらに、タイトルをフィールドとして追加しました。 その後、インデクシングを行います。 JSON:API 上記を行ったところで、キャッシュをクリアします。 /admin/config/development/performance その後、以下のURLからエンドポイントにアクセスできるようになります。 /jsonapi/index/test_index_20230417 以下のようなクエリパラメータによって、検索結果の絞り込みができます。 /jsonapi/index/test_index_20230417?filter[title]=更新したタイトル { . " } " . j , d . s " " } a { o v m t n e e " } a " " " } " a r t l " t i l , a p s a i " } : y d i " } t " " " " " " " " " " " " " i i " n s p " n s t d d l r r s t c c p s d r " o : k e " [ e : k e " r r r a e e t i r h r t e e : n s l h " s l h i u u n v v a t e a o i f v " { " f r : " " f r b p p g i i t l a n m c a i { : : " e 8 : " e u a a c s s u e t g o k u s : f " 2 : f t l l o i i s " e e t y l i " { " n a { " e _ _ d o o " : d d e " t o 1 { : o 3 { : s i i e n n : " " " : _ n . d 4 " n n " _ _ " : : : l _ 0 " e c " : t t : t l t 更 f a t " h - 3 h e e i o r 新 " " f a n r , t - 5 t { r r " m g u し 2 2 a l g a t s - t n n e e " e た 0 0 l s c n p e f p a a n s : , タ 2 2 s e o s : r 1 s l l " t イ 3 3 e , d l / v b : _ _ , a n ト - - , e a / i 7 / _ _ m u ル 0 0 " t j c - / n v p l " 4 4 : i s e 4 x i i " l , - - o o " 9 x d d : , 1 1 t n n , e x " " 1 2 r _ a b / : : " T T u a p - j 2 0 0 e f i 8 s 4 5 0 2 8 , f . 1 o , 0 2 : : e o a n 7 3 0 1 c r c a 5 - 9 9 t g - p , 0 : : e / f i 4 3 0 d f 1 / - 5 0 " o 5 n 1 + + : r d o 2 0 0 m 0 d T 0 0 t a d e 0 : : r t e / 8 0 0 u / a s : 0 0 e 1 c e 1 " " , . 2 r 9 , , 0 2 v : / c i 0 " " c 0 , e + / 0 8 0 2 : a 0 3 0 4 " c , 3 5 - f 1 b 7 - 4 9 e b - 8 1 a c - f 1 5 d 0 d e a c 2 2 c ? r e s o u r c e V e r s i o n = i d % 3 A 5 0 7 5 " Facets 以下にアクセスします。 ...

2023年4月17日 · 8 分 · Nakamura

Drupalのコンテンツの一括削除の方法

概要 Drupalのコンテンツの一括削除の方法を調べたので、その備忘録です。以下の記事が参考になりました。 https://www.webwash.net/how-to-bulk-delete-content-in-drupal/ 以下の3つの方法が紹介されていました。 Drupal コア UI の使用 (Using Drupal Core UI) Drush の使用 (Using Drush) ビューの一括操作 (VBO) の使用 (Using Drupal Views Bulk Operations (VBO)) Drupal コア UI の使用 以下、日本語訳です。 小さな Drupal サイトがあり、削除するノードが約 300 未満の場合は、この方法を使用する必要があります。これは、Drupal コアの UI を使用すると、デフォルトで一度に 50 ノードしか削除できないためです。サイトが大きくなると、これは面倒になります。 Drush の使用 以下、日本語訳です。 コマンド ラインを使用すると、Drush を使用できます。これが推奨される方法です。 例えば以下では、記事コンテンツ タイプのすべてのノードを削除します。 d r u s h e n t i t y : d e l e t e n o d e - b u n d l e = a r t i c l e ただ、上記のサイトにも記載がありましたが、PHP メモリ制限にひっかかることがあるようです。Amazon Lightsail上に立てた512MBメモリの環境において、5,000件のコンテンツの一括削除を試みたところ、以下のように制限に引っかかってしまいました。ただし、再度同じコマンドを実行することで、無事に一括削除ができました。 ...

2023年4月14日 · 3 分 · Nakamura

DrupalとAmazon OpenSearch Serviceを接続する

概要 DrupalとAmazon OpenSearch Serviceを接続する機会がありましたので、その備忘録です。以下の記事が参考になりました。 https://www.acquia.com/jp/blog/intergration-with-drupal-and-elasticsearch モジュールのインストール drupal/search_apiとdrupal/elasticsearch_connectorに加えて、nodespark/des-connectorをインストールする必要がありました。 (バージョンの指定方法など、改善の余地があるかもしれません。) c c c o o o m m m p p p o o o s s s e e e r r r r r r e e e q q q u u u i i i r r r e e e " ' " n d d o r r d u u e p p s a a p l l a / / r s e k e l / a a d r s e c t s h i - _ c c a s o p e n i a n : r e ^ c c 1 h t . _ o 2 c r 9 o : ' n ^ n 7 e . c x t - o d r e v ^ " 7 . 0 @ a l p h a " 続けて、以下で有効化します。 ...

2023年4月13日 · 4 分 · Nakamura

DrupalでGraphQLを試す

概要 DrupalでGraphQLを試してみましたので、その備忘録です。以下の文書が参考になりました。 https://drupal-graphql.gitbook.io/graphql/ Amazon LightsailにインストールされたDrupalを前提とします。 モジュールのインストール 以下のモジュールをインストールします。 https://www.drupal.org/project/graphql ただし、以下のモジュールを事前にインストールする必要がありました。 https://www.drupal.org/project/typed_data 結果、以下により、インストールができました。 c c c d o o m m / p p h o o o s s m e e e r r / b r r i e e t q q n u u a i i m r r i e e / s ' ' t d d a r r c u u k p p / a a d l l r / / u t g p y r a p a l e p d h _ q d l a : t ^ a 4 : . ^ 4 1 ' . 0 @ b e t a ' GUIからのモジュールインストール 関連する以下の3つのモジュール全てにチェックを入れて、インストールしました。 ...

2023年4月12日 · 1 分 · Nakamura

Pythonを使ってDrupalのタクソノミーの登録とコンテンツへの追加

概要 以下のシリーズの続きです。 今回は、タクソノミーの登録とコンテンツへの追加を行います。 タクソノミーの登録 事前に、ne_classというタクソノミーをGUIを通じて作成しました。以下のようなURLで一覧できます。 /jsonapi/taxonomy_term/ne_class 以下、新しいタクソノミーを登録するプログラムです。host, username, passwordは適宜設定してください。 p } _ u r r a t r . y y l = j l p s o " } e = r o a d e n d a = f q ( t " u ) = a " " } " { e " t a n h s { : y t e o t p t _ s s { e r " c t . " i n l } p : b a a / o u m s j s " t e s s t t e " " o ( a s : n u x " a r o : " p l n 干 i , o { 瀬 / m " t h y , a e _ x a t o d e n e r o r m m s - y = - _ h n t e e e a _ r d c m e l / r a { s s _ , s t " y a , p u e t } h " = ( u s e r n a m e , p a s s w o r d ) , j s o n = p a y l o a d ) 以下のような結果が得られます。 ...

2023年4月11日 · 4 分 · Nakamura

Pythonを使ってDrupalのコンテンツを更新・削除する

概要 以下の記事で、コンテンツの新規登録の方法を記載しました。 今回は、既存のコンテンツの更新・削除を試みます。 アイテムの絞り込み 以下のようなプログラムにより、登録済みのコンテンツを取得することができます。今回は、titleが「更新前のタイトル」のコンテンツを取得しました。res["data"]は配列になります。 u p h q } i f f f e r r l s a o u t i o i n e e e s s e e l r l d = s n r s t r m t t p ( n w y " _ e k f e o r = r a o = t t r e i r i e e m r = i y s y l _ n q r s e d " t p , t s t u . [ x { l e = e t e j ' = = x e v r r = s s d x " = [ a s t o a " " " : ] l . = f s n t x x " u a ' . ( a x x " a e p ' { g ) ' x x 更 r p & h e ] " " 新 t i e ' o t ) 前 i n n . s ( の c d j t e タ l q ( o } n イ e u f i / d ト " e ' n j p ル r f ( s o " y i f o i . l i n n i t l a t t e t p , e r e i m [ r / h s { s n e ( k ) o a ) e d d : y e e } / r ] { s = i = { t h v e e a m a l _ d u t e e y r } p s ' e , ) } ? a { u f t i h l = t ( e u r s _ e s r t n r a } m ' e , p a s s w o r d ) ) 更新対象のコンテンツのID取得 730f844d-b476-4485-8957-c33fccb7f8acのようなIDが得られます。 ...

2023年4月11日 · 4 分 · Nakamura

Pythonを使ってDrupalにコンテンツを追加する

概要 Pythonを使ってDrupalにコンテンツを追加する機会がありましたので、その備忘録です。以下の記事を参考にしました。 https://weimingchenzero.medium.com/use-python-to-call-drupal-9-core-restful-api-to-create-new-content-9f3fa8628ab4 Drupalの準備 Amazon Lightsailに作成しました。以下の記事などが参考になります。 https://annai.co.jp/article/use-aws-lightsail モジュール 以下をインストールします。 HTTP Basic Auth JSON:API RESTful Web Services Serialization JSON:APIの設定変更 以下にアクセスして、設定を変更します。 </admin/config/services/jsonapi> Python {ipアドレス or ドメイン名}、{パスワード}を適宜設定してください。 Amazon Lightsailの場合、初期ユーザ名はuserです。またパスワードは以下のコマンドで確認します。 c a t ~ / b i t n a m i _ a p p l i c a t i o n _ p a s s w o r d i f e u p h } p } r r m r n e a . p o d = = a y = t o m p d l e r o ' ' e ' ' o " } r x t r i u { r A C a d e t e n s パ s c o d a q r q t e ス c n t u e u r ワ = e t = a " " } e q e = ' ー p e " t a s u s ド { t n { : y t t e t ' } ' t p t s s s h ' : - { e r " " } . t . t T " i t b p s a t ' y : b i o o u p a p u t d s t : p e " t l y " " t h / p ' n e e " v f ( / l : o s " : a o e i { i d " : l r n m i c ' e : { u m d p p a a - " e a p o ア t p - { W " t o r ド i p a h : " i t レ o l r a : n ス n i t t " t H / c i ' B " , T o v a c s e p T r n t l l h P d i e u w a e B ド . o " p a i a a メ a n , t n d s イ p / f e _ e i ン i v r r t r c 名 + n o . e s A } j d m x = u / s . M t h t j o a P y " e h s n p y a o ' i t f d n , + h r e a j o i r p s n e s i o " n , / n , d n ' s a o . u d " t e , h / = a ( r u t , i c p l ) e , ' j s o n = p a y l o a d ) その他 以下のようにnote_typeの登録も試みました。 ...

2023年4月11日 · 5 分 · Nakamura