drupal-paragraphs について
Drupal の Paragraphs エンティティとフィールドを扱う開発スキルです。コードでの作成、フォーム変更、レンダリング、Twig からの参照を解説します。
主な機能
- 01参照された Paragraph の取得
- 02Paragraphs のプログラム作成
- 03Paragraph フォームの変更
- 04Paragraph のレンダリングと Twig 参照
活用シーン
- 01ノードの Paragraph フィールド値の取得
- 02コードで Paragraph エンティティを作成
- 03バンドル別に Paragraph フォーム要素を変更
- 04Drupal や Twig で Paragraph コンテンツをレンダリング
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ edutrul/ drupal-ai --skill drupal-paragraphsインストール後、Claude Code で/drupal-paragraphsを入力して読み込まれたか確認します。
同梱ファイルREADME.md
詳細
Drupal Paragraphs
ノードから Paragraphs にアクセスする
use Drupal\paragraphs\Entity\Paragraph;
// Get all paragraphs from a field
$items = $node->get('field_content')->referencedEntities();
foreach ($items as $paragraph) {
/** @var \Drupal\paragraphs\Entity\Paragraph $paragraph */
$bundle = $paragraph->bundle();
$value = $paragraph->get('field_text')->value;
}
// Get first paragraph
$paragraph = $node->get('field_content')->first()?->entity;
Paragraphs をプログラムで作成する
$paragraph = Paragraph::create([
'type' => 'text_block',
'field_title' => 'My Title',
'field_body' => [
'value' => 'Body content',
'format' => 'basic_html',
],
]);
$paragraph->save();
$node->get('field_content')->appendItem([
'target_id' => $paragraph->id(),
'target_revision_id' => $paragraph->getRevisionId(),
]);
$node->save();
Paragraphs のフォームを変更する
#[Hook('field_widget_single_element_paragraphs_form_alter')]
public function fieldWidgetParagraphsFormAlter(array &$element, FormStateInterface $form_state, array $context): void {
$paragraph = $element['#paragraph'];
if ($paragraph->bundle() === 'text_block') {
// Alter the text_block paragraph form element.
$element['subform']['field_title']['#access'] = FALSE;
}
}
Paragraphs をレンダリングする
// Build render array for a paragraph
$view_builder = $this->entityTypeManager->getViewBuilder('paragraph');
$build = $view_builder->view($paragraph, 'default');
Twig での Paragraph
{# Render paragraph field #}
{{ content.field_content }}
{# Iterate paragraphs #}
{% for item in content.field_content['#items'] %}
{{ item.entity.field_text.value }}
{% endfor %}
一般的なバンドルチェックパターン
foreach ($node->get('field_content')->referencedEntities() as $paragraph) {
/** @var \Drupal\paragraphs\Entity\Paragraph $paragraph */
switch ($paragraph->bundle()) {
case 'text_block':
// Handle text block.
break;
case 'image_block':
// Handle image block.
break;
}
}
コメント
Markdown 対応