Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Drupal テーマ開発入門講座 第4回 テンプレートのカスタマイズ
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
アクイアジャパン 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
230
Drupal 10.3の新機能紹介ウェビナー
acquiajp
0
270
DrupalCon Portland 2024 総まとめウェビナー
acquiajp
0
130
開発者必見!Acquia Cloud IDEで最高のDrupal開発を始めよう
acquiajp
0
230
触って学ぶ!デジタルアセット管理 Acquia DAM ハンズオンウェビナー
acquiajp
0
56
DrupalCon Lille 2023 総まとめウェビナー
acquiajp
0
100
コンテンツ設計手法で変更に強いアプリケーションを実現する〜ローコードによるWebアプリのバックエンド実装 #CNDF2023
acquiajp
0
410
DrupalCon Pittsburgh 2023 総まとめウェビナー
acquiajp
0
110
Acquia製品概要&Site Studioデモのご紹介
acquiajp
0
140
Other Decks in Programming
See All in Programming
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
320
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
570
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
380
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
590
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
260
プロポーザルを書いてもらう
pvcresin
0
490
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
820
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
360
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.5k
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
250
自動化したのに回らないテスト運用の壁ーAI時代の品質責任と生産性
mfunaki
0
130
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
500
Featured
See All Featured
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.3k
Facilitating Awesome Meetings
lara
57
7.1k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
560
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
280
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
520
Docker and Python
trallard
47
4.1k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.8k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6.1k
Test your architecture with Archunit
thirion
1
2.3k
Leo the Paperboy
mayatellez
8
2.1k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
400
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