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
アクイアジャパン 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
290
DrupalCon Portland 2024 総まとめウェビナー
acquiajp
0
140
開発者必見!Acquia Cloud IDEで最高のDrupal開発を始めよう
acquiajp
0
250
触って学ぶ!デジタルアセット管理 Acquia DAM ハンズオンウェビナー
acquiajp
0
61
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
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.1k
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2.8k
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
Jetpack Compose Mechanisms
skydoves
2
370
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
620
20260914 AIエージェント時代のPlatform Engineering LLM基盤とプロダクトの責務境界線
kanfab1
7
2.4k
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
230
AI が書く Go コードの品質を劇的に向上させる Linter: “declscope”
mpyw
0
480
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
180
Java 27新機能 / Java 27 new features
kishida
2
200
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
120
JRuby: Past, Present, and Future
headius
0
220
Featured
See All Featured
Paper Plane (Part 1)
katiecoart
PRO
2
11k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
480
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Bash Introduction
62gerente
615
220k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Un-Boring Meetings
codingconduct
0
440
Skip the Path - Find Your Career Trail
mkilby
1
240
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.5k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
530
Optimizing for Happiness
mojombo
378
71k
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