Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Drupal テーマ開発入門講座 第4回 テンプレートのカスタマイズ
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
アクイアジャパン Acquia Japan
May 18, 2022
Programming
360
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Drupal テーマ開発入門講座 第4回 テンプレートのカスタマイズ
https://www.acquia.com/jp/events/webinars/drupal-theming-development-vol4
アクイアジャパン Acquia Japan
May 18, 2022
More Decks by アクイアジャパン Acquia Japan
See All by アクイアジャパン Acquia Japan
Auth0 by OktaとDrupalで実践!認証付きアプリケーションの新しいアプローチ
acquiajp
0
240
Drupal 10.3の新機能紹介ウェビナー
acquiajp
0
280
DrupalCon Portland 2024 総まとめウェビナー
acquiajp
0
140
開発者必見!Acquia Cloud IDEで最高のDrupal開発を始めよう
acquiajp
0
240
触って学ぶ!デジタルアセット管理 Acquia DAM ハンズオンウェビナー
acquiajp
0
57
DrupalCon Lille 2023 総まとめウェビナー
acquiajp
0
120
コンテンツ設計手法で変更に強いアプリケーションを実現する〜ローコードによるWebアプリのバックエンド実装 #CNDF2023
acquiajp
0
410
DrupalCon Pittsburgh 2023 総まとめウェビナー
acquiajp
0
110
Acquia製品概要&Site Studioデモのご紹介
acquiajp
0
150
Other Decks in Programming
See All in Programming
業務時間外もAIに働いてもらう話
colorful12
3
10k
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
3
1.5k
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
140
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
640
From 6 People Classroom Meetup to 100 People Regional Conference / FOSS4G Hiroshima 2026
furukawayasuto
0
130
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
2
290
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
150
マイコン向けの軽量Ruby「PicoRuby」で各種デバイスを制御するネイティブアプリの実現手法
bash0c7
0
330
Snowflakeで業務アプリを作ろう。 Snowflakeのアプリ機能解説&実践ガイド
ayumu_yamaguchi
1
220
MIZARU@SPAJAM2026 第二回予選
1901drama
0
110
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
280
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
6k
Featured
See All Featured
Automating Front-end Workflow
addyosmani
1369
210k
The Invisible Side of Design
smashingmag
301
52k
The Curious Case for Waylosing
cassininazir
1
500
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
350
Chasing Engaging Ingredients in Design
codingconduct
0
310
Faster Mobile Websites
deanohume
310
32k
sira's awesome portfolio website redesign presentation
elsirapls
0
410
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
450
The Cost Of JavaScript in 2023
addyosmani
55
10k
Optimizing for Happiness
mojombo
378
71k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
450
Transcript
ୈ4ճ ςϯϓϨʔτͷΧελϚΠζ Drupal ςʔϚ ։ൃೖߨ࠲
Drupal ςʔϚ։ൃೖߨ࠲γϦʔζ – Drupalʹ͓͚ΔʮςʔϚʯͱɺWebαΠτͷݟͨΛ୲͏ػೳͰ͢ɻຊΣϏφʔγ ϦʔζͰɺDrupalͷςʔϚ։ൃʹؔ͢ΔجૅࣝΛղઆ͠·͢ɻ – DrupalͷϑϩϯτΤϯυपΓʹ͍ͭͯମܥతʹֶͼ͍ͨํɺࣗͰΧελϜςʔϚΛ࡞ ΕΔΑ͏ʹͳΓ͍ͨํɺΞΫΠΞೝఆσϕϩούʔࢼݧΛࢦ͢ํʹ͓͢͢ΊͰ͢ɻ – DrupalΛҰ௨Γૢ࡞ͨ͜͠ͱ͕͋ΔํΛରͱ͍ͯ͠·͢ɻ·ͩDrupalΛ৮ͬͨ͜ͱ͕
ແ͍ํɺॳ৺ऀ͚DrupalνϡʔτϦΞϧಈըʢຊޠʣΛઌʹݟ͓ͯ͘ͱΑΓཧղ ͕ਂ·Γ·͢ɻ
1. Twigͷ֓ཁ 2. جຊతͳTwigߏจ 3. ؔ 4. ϑΟϧλ 5. ςϯϓϨʔτͷσόοά
6. ϓϦϓϩηεؔΛ༻ͨ͠มͷՃ 7. ςϯϓϨʔτͷܧঝ 8. ࿅श ΞδΣϯμ
Twigͷ֓ཁ
– ΦʔϓϯιʔεɾPHP༻ͷςϯϓϨʔτΤϯδϯͰ͢ɻ – ެࣜαΠτɿhttps://twig.symfony.com – SymfonyϑϨʔϜϫʔΫͷσϑΥϧτͷςϯϓϨʔτΤϯδ ϯͰ͢ɻ – DrupalͰɺόʔδϣϯ8ͰσϑΥϧτͷςϯϓϨʔτΤϯ δϯʹTwig͕࠾༻͞Ε·ͨ͠ɻ
– Twigͷݱࡏͷ࠷৽όʔδϣϯ 3.4.1 Ͱ͢ɻ – Drupal 9Ͱ Twig 2.x ͕࠾༻͞Ε͍ͯ·͢ɻ Twigͱ
ࢀߟ) ςϯϓϨʔτΤϯδϯͱ – ςϯϓϨʔτͱݺΕΔܗͱɺ͋ΔσʔλϞσϧͰදݱ͞ΕΔೖྗσʔλΛ߹͠ɺՌυΩϡϝϯτΛ ग़ྗ͢ΔιϑτΣΞ - wikipedia – PHPք۾ͰΑ͘ར༻͞ΕΔςϯϓϨʔτΤϯδϯ –
Twig (Symfonyඪ४ ) – Blade (Laravelඪ४ ) – Smarty – ͳͥςϯϓϨʔτΤϯδϯΛ༻͢Δͷʁ – ViewͱϩδοΫͷ – XSS߈ܸͷճආʢࣗಈΤεέʔϓॲཧʣ - શͯͷHTMLΛTwigςϯϓϨʔτͰग़ྗ͢Δ͜ͱ͕·͍͠ Ͱ͢ɻWriting secure code for Drupal ࢀর – Drupal 8Ҏલ(ver 4.7 ~ 7.x)ͰʮPHPTemplateʯ͕ςϯϓϨʔτΤϯδϯͱͯ͠࠾༻͞Ε͍ͯ·ͨ͠ɻ
جຊతͳTwigߏจ
Twigͷ2ͭͷߏจ {{ ɹ}} …ʮԿ͔Λݴ͏ʯߏจ {% %} …ʮԿ͔Λ͢Δʯߏจ Say Something Do
Something https://symfonycasts.com/screencast/twig/basics#the-2-syntaxes-of-twig- code-code-and-code-code
มͷग़ྗ ྫɿϔομʔྖҬͷग़ྗ ྫɿλΠτϧมͷग़ྗ {{ page.header }} <h2>{{ title }}</h2>
ྫɿϥΠϒϥϦͷΞλον ྫɿΫϥεͷՃ ؔͷ࣮ߦ {{ attach_library('mytheme/global-styling') }} <div{{ create_attribute({'class': ['apple', 'orange']})
}}>
ྫɿfooมΛఆٛ͢Δ ྫɿྻΛఆٛ͢Δ มͷఆٛ {% set foo = 'foo' %} {%
set classes = [ 'js-form-managed-file', 'form-managed-file', ] %}
੍ޚߏ ྫɿifจ ྫɿforจ {% if page.footer %} <footer role="contentinfo"> {{
page.footer }} </footer> {% endif %} <span{{ attributes }}> {%- for item in items -%} {{ item.content }} {%- endfor -%} </span>
ίϝϯτΞτ ྫɿ1ߦͷίϝϯτΞτ ྫɿෳߦͷίϝϯτΞτ {# ͜ΕίϝϯτͰ͢ #} {# /** * ෳߦͷ
* ίϝϯτจ * Ͱ͢ɻ */ #}
ؔ
TwigͷΈࠐΈؔͷྫ Twigຊମʹศརͳ͕ؔ༻ҙ͞Ε͍ͯ·͢ɻ ྫɿrandomؔ ྫɿdumpؔ {{ random('ABC') }} {# AɺBɺCͷ͍ͣΕ͔͕ग़ྗ #}
{{ dump(user) }} {# userมʹؔ͢ΔใΛμϯϓ #} https://twig.symfony.com/doc/2.x/functions/index.html
Drupalݻ༗ͷؔͷྫ DrupalίΞͰ༻ҙ͞Ε͍ͯΔศརͳؔͷҰྫͰ͢ɻ ྫɿattach_library($library ) ྫɿcreate_attribute($attributes ) ྫɿpath($name, $parameters, $options) {{
attach_library('classy/node') }} <div{{ create_attribute({'class': ['apple', 'orange']}) }}>Fruit</div> {# <div class="apple orange">Fruit</div> ͱग़ྗ͞ΕΔ #} <a href="{{ path('user.register') }}">Register</a> {# <a href="/user/register">Register</a> ͱग़ྗ͞ΕΔ #} https://www.drupal.org/docs/theming-drupal/twig-in-drupal/functions-in-twig-templates
ϑΟϧλ
– ϑΟϧλػೳΛ͏͜ͱͰɺΛςϯϓϨʔτ্Ͱల։ʢදࣔʣ͢Δ ࡍʹදࣔํ๏ΛมߋͰ͖·͢ɻ – ϑΟϧλΛ͔͚͍ͨͷޙΖʹύΠϓจࣈ | Ͱ۠ͬͯϑΟϧλ໊Λ ࢦఆ͠·͢ɻ {{ title|capitalize
}} – ෳͷϑΟϧλΛ࿈Ͱ͖·͢ɻ {{ user.name|lower|escape }} TwigͷϑΟϧλͱ
TwigຊମʹศརͳϑΟϧλ͕༻ҙ͞Ε͍ͯ·͢ɻ ྫɿupperϑΟϧλ ྫɿlastϑΟϧλ ྫɿdefaultϑΟϧλ TwigͷΈࠐΈϑΟϧλͷྫ {{ 'welcome'|upper }} {# WELCOME
ͱେจࣈͰग़ྗ͞Ε·͢ #} {{ [1, 2, 3, 4]|last }} {# 4 ͱग़ྗ͞Ε·͢ #} {{ var|default('varະఆٛͰ͢') }} {# var͕ະఆٛ·ۭͨനͷ߹ɺׅހͷจࣈྻ͕ग़ྗ #} https://twig.symfony.com/doc/2.x/filters/index.html
Drupalݻ༗ͷϑΟϧλͷྫ DrupalίΞͰ༻ҙ͞Ε͍ͯΔศརͳϑΟϧλͷҰྫͰ͢ɻ ྫɿtransϑΟϧλʢtϑΟϧλͱݺΕΔʣ tϑΟϧλ͕༻͞Εͨจࣈྻ ཧը໘ͷʮϢʔβʔΠϯλʔ ϑΣʔεͷ༁ʯϖʔδ͔Β ༁͕ՄೳʹͳΓ·͢ɻ <a href="{{ url('<front>')
}}" title="{{ 'Home'|t }}"></a>
Drupalݻ༗ͷϑΟϧλͷྫ ྫɿsafe_joinϑΟϧλ ྫɿformat_dateϑΟϧλ <p>{{ items|safe_join(", ") }}</p> {# ෳͷจࣈྻΛ҆શʹ݁߹ #}
{{ created|format_date('short') }}{# DrupalͷϑΥʔϚοτܗࣜͰग़ྗ #}
ςϯϓϨʔτͷσόοά
TwigͷσόοάΦϓγϣϯΛ༗ޮʹ͢Δ services.ymlϑΝΠϧͰ࣍ͷΦϓγϣϯ͕ར༻ՄೳͰ͢ɻ ※ຊ൪ڥͰ༻͠ͳ͍Ͱ͍ͩ͘͞ɻ – debugɿtrueʹઃఆ͢ΔͱɺTwigΤϯδϯͰ༷ʑͳσόοάػೳ͕༗ޮԽ͞ΕΔ – auto_reloadɿtrueʹઃఆ͢Δͱɺιʔείʔυ͕มߋ͞ΕͨࡍʹશͯͷςϯϓϨʔτ͕ࣗಈతʹ࠶ίϯ ύΠϧ͞ΕΔ – cacheɿfalseʹઃఆ͢ΔͱɺςϯϓϨʔτ͕༻͞ΕΔʹιʔε͔ΒςϯϓϨʔτ͕࠶ίϯύΠϧ͞Ε
Δ parameters: twig.config: debug: true # σϑΥϧτfalse auto_reload: true # σϑΥϧτnull cache: false # σϑΥϧτtrue
ςϯϓϨʔτͰ༻Մೳͳมͷදࣔ ᶃdumpؔΛ༻͢Δ {{ dump(url) }} {# in
node.html.twig #} dumpؔͰࢦఆ͠ ͨมͷ͕ग़ྗ͞ ΕΔ
ςϯϓϨʔτͰ༻Մೳͳมͷදࣔ ᶄPHPͷσόοάπʔϧʮKintʯΛ༻͢Δ ಋೖํ๏ – composerͰDevelϞδϡʔϧͱ kint(kint-php/kint)ΛΠϯετʔϧ – ༗ޮԽͨ͠DevelϞδϡʔϧͷઃఆ ը໘Ͱ ʮVariables
DumperʯʹKintΛࢦఆ – ରͷςϯϓϨʔτϑΝΠϧʹ {{ kint() }} ͱೖྗͯ͠༻͢Δ
ςϯϓϨʔτͰ༻Մೳͳมͷදࣔ ᶅXdebugͷPHPσόοΨΛ༻͢Δ ಋೖํ๏ɿDocker+LandoͰ؆୯ɺDrupalϩʔΧϧڥͷߏஙํ๏ʢΞΫΠΞϒϩάʣ
ϓϦϓϩηεؔΛ༻ͨ͠ มͷՃ
– ϓϦϓϩηεؔ(Preprocess functions)ͱɺςʔϚͱϞδϡʔϧ͕ TwigςϯϓϨʔτϑΝΠϧʹ͞ΕΔมΛมߋͰ͖ΔΑ͏ʹ͢ΔPHP ؔͰ͢ɻ – *.themeϑΝΠϧʹ࣍ͷؔΛهड़͍͖ͯ͠·͢ɻ – THEME_preprocess(&$variables, $hook)
ςϯϓϨʔτͱ࣮ͯ͠͞ΕͨશͯͷςʔϚϑοΫͰݺͼग़͞ΕΔ – THEME_preprocess_HOOK(&$variables) HOOKͰࢦఆͨ͠ςʔϚϑοΫͰݺͼग़͞ΕΔ ϓϦϓϩηεؔͱ
ϑοΫ໊ͷ໋໊نଇ – HOOKʹ͚Δ໊લTwigςϯϓϨʔτͷsuggestionsʹै͍·͢ɻϋΠϑϯ -- ΛΞϯμʔείΞ __ ʹஔ͖͑·͢ɻ
– ྫɿnode--article.html.twig ͷมΛॲཧ͢Δ߹ – THEME_preprocess_node__42() ࠷۩ମతͳόʔδϣϯɻϊʔυID͕42ͷϊʔυʹରͯ͠ͷΈݺͼग़͞ΕΔɻ – THEME_preprocess_node__article() શͯͷهࣄίϯςϯπλΠϓʹରͯ͠ݺͼग़͞ΕΔɻ – THEME_preprocess_node() શͯͷϊʔυʹରͯ͠ݺͼग़͞ΕΔɻ
ϓϦϓϩηεؔΛ༻ͯ͠ςϯϓϨʔτʹมΛՃ͠Α͏ – *.themeϑΝΠϧͷ࡞ – ϑοΫ໊ͷܾఆ – *.themeϑΝΠϧʹؔΛՃ – ϓϦϓϩηεؔͰఆٛͨ͠มΛɺςϯϓϨʔτͰ༻͢Δ ԋश
ԋशͰ༻͢ΔιʔείʔυGithubʹ͋Γ·͢ɻ https://github.com/hmaruyama/my-drupal9-theming/tree/vol4
Twig Tewak Ϟδϡʔϧ – ศརͳTwigؔϑΟϧλΛఏڙ͢ΔίϯτϦϏϡʔ τϞδϡʔϧ – https://www.drupal.org/project/twig_tweak ࢀߟ) TwigपΓͰΑ͘ར༻͞ΕΔϞδϡʔϧ
ςϯϓϨʔτͷܧঝ
ςϯϓϨʔτΛ֦ு͢Δ – TwigͷextendsλάΛ༻ͯ͠ɺςϯϓϨʔτؒʹࢠؔΛ࣋ͨͤͯɺςϯϓϨʔτͷίʔυͷ ॏෳΛݮΒ͢͜ͱ͕Ͱ͖·͢ɻ – ςϯϓϨʔτͰ block λάΛ༻ͯ͠ࢠςϯϓϨʔτͰ্ॻ͖Ͱ͖ΔྖҬΛఆٛ͠·͢ɻ – ࢠςϯϓϨʔτͰ
extends λάͰςϯϓϨʔτΛࢦఆ͠ɺςϯϓϨʔτͰ༻ҙ͞Εͨϒϩο ΫྖҬΛ༻্ͯ͠ॻ͖͠·͢ɻ {# node.html.twig #} {# ςϯϓϨʔτ #} <div{{ attributes }}> {% block content %} <p>Hello</p> {% endblock %} </div> {# node--article.html.twig #} {# ࢠςϯϓϨʔτ #} {% extends "node.html.twig" %} {% block content %} <p>Overide!</p> {% endblock %} blockλάͰ ্ॻ͖Ͱ͖Δ ྖҬΛఆٛ extendsλάͰͱͳΔ ςϯϓϨʔτΛࢦఆ ςϯϓϨʔτͰ༻ҙ ͞ΕͨྖҬΛblockλά Ͱࢦఆ্ͯ͠ॻ͖͢Δ https://twig.symfony.com/doc/2.x/tags/extends.html https://www.drupal.org/docs/theming-drupal/twig-in-drupal/extending-templates
ଞͷςϯϓϨʔτΛؚΊΔ – TwigͷincludeλάΛ༻ͯ͠ɺςϯϓϨʔτʹଞͷςϯϓϨʔτΛؚΊ Δ͜ͱ͕Ͱ͖·͢ɻ {# field-ui-table.html.twig #} <div id="field-display-overview-wrapper"> {%
include 'table.html.twig' %} </div> includeλάͰૠೖ͍ͨ͠ςϯ ϓϨʔτϑΝΠϧ໊Λࢦఆ https://twig.symfony.com/doc/2.x/tags/include.html https://www.drupal.org/docs/8/theming-drupal-8/including-part-template
࿅श
Twigʹ͍ͭͯͷਖ਼͍͠هड़Λબ͍ͯͩ͘͠͞ɻ 1. LaravelϑϨʔϜϫʔΫͷඪ४ςϯϓϨʔτΤϯδϯɻ 2. Drupal 9ͰTwig 2ܥόʔδϣϯʹґଘ͍ͯ͠Δɻ 3. Drupal 7͔ΒDrupalͷඪ४ςϯϓϨʔτΤϯδϯͱͯ͠࠾༻͞Ε͍ͯΔɻ
࿅श1
Twigʹ͍ͭͯͷਖ਼͍͠هड़Λબ͍ͯͩ͘͠͞ɻ 1. LaravelϑϨʔϜϫʔΫͷඪ४ςϯϓϨʔτΤϯδϯɻ 2. Drupal 9ͰTwig 2ܥόʔδϣϯʹґଘ͍ͯ͠Δɻ 3. Drupal 7͔ΒDrupalͷඪ४ςϯϓϨʔτΤϯδϯͱͯ͠࠾༻͞Ε͍ͯΔɻ
࿅श1 2
࿅श2 શͯͷهࣄ(article)ίϯςϯπλΠϓͷϊʔυʹରͯ͠ɺςϯϓϨʔτͰ ༻Ͱ͖ΔมΛՃ͍ͨ͠Ͱ͢ɻͲͷؔͰ࣮͢Δͷ͕ྑ͍Ͱ͠ΐ͏͔ɻ 1. THEME_preprocess_node() Λ࣮͢Δɻ 2. THEME_preprocess_page__node() Λ࣮͢Δɻ 3.
THEME_preprocess_article() Λ࣮͢Δɻ 4. THEME_preprocess_node__article() Λ࣮͢Δɻ
࿅श2 શͯͷهࣄ(article)ίϯςϯπλΠϓͷϊʔυʹରͯ͠ɺςϯϓϨʔτͰ ༻Ͱ͖ΔมΛՃ͍ͨ͠Ͱ͢ɻͲͷؔͰ࣮͢Δͷ͕ྑ͍Ͱ͠ΐ͏͔ɻ 1. THEME_preprocess_node() Λ࣮͢Δɻ 2. THEME_preprocess_page__node() Λ࣮͢Δɻ 3.
THEME_preprocess_article() Λ࣮͢Δɻ 4. THEME_preprocess_node__article() Λ࣮͢Δɻ 4
ຊͷΞδΣϯμऴྃ
1. Twigͷ֓ཁ 2. جຊతͳTwigߏจ 3. ؔ 4. ϑΟϧλ 5. ςϯϓϨʔτͷσόοά
6. ϓϦϓϩηεؔΛ༻ͨ͠มͷՃ 7. ςϯϓϨʔτͷܧঝ 8. ࿅श ΞδΣϯμ
None