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
280
DrupalCon Portland 2024 総まとめウェビナー
acquiajp
0
140
開発者必見!Acquia Cloud IDEで最高のDrupal開発を始めよう
acquiajp
0
240
触って学ぶ!デジタルアセット管理 Acquia DAM ハンズオンウェビナー
acquiajp
0
58
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
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
140
A2UI for Android: Safely Rendering AI-Generated UI with Jetpack Compose - DroidKaigi 2026
itsmedreamwalker
0
110
【高い買い物LT会】初任給で話題の国産フィジカルAIを買った話
akagami
PRO
0
150
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
220
20260828_品質と開発生産性を両立させる、AI時代のE2Eテストの考え方
magicpod
0
200
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
480
Security issues being discussed on Web Platforms
petamoriken
0
870
『寄り添うラジオ』をAIで作る 体験価値から逆算した、会話しないUXと品質設計
theoriatec2024
3
160
Intent as Code
shoppingjaws
6
970
App Intentsのビルドプロセスを支える技術
kntkymt
0
330
Foundry Localでエージェント開発
seosoft
0
190
PHPプロジェクトの結合バランスを可視化する #php_night
kajitack
0
240
Featured
See All Featured
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
560
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Crafting Experiences
bethany
1
330
Leo the Paperboy
mayatellez
9
2.3k
Prompt Engineering for Job Search
mfonobong
0
450
HDC tutorial
michielstock
2
860
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
980
Utilizing Notion as your number one productivity tool
mfonobong
4
590
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
The Cult of Friendly URLs
andyhume
79
7k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
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