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
アクイアジャパン Acquia Japan
September 21, 2022
Programming
160
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-module-development-vol4
アクイアジャパン Acquia Japan
September 21, 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
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
140
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
4
400
GDG Korea Android: 2026 I/O Extended ~ What's new in Android development tools
pluu
0
220
いまどきの Codex で開発する visionOS アプリの開発スタイルについて
karad
0
140
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
280
Go 1.27 における memory allocation の高速化
andpad
0
170
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
220
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
250
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.5k
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
550
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
460
メールのエイリアス機能を履き違えない
isshinfunada
0
230
Featured
See All Featured
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
Visualization
eitanlees
152
17k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
380
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
520
Git: the NoSQL Database
bkeepers
PRO
432
67k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
380
Statistics for Hackers
jakevdp
799
230k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
240
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
3
430
Transcript
ୈ4ճ ϑΥʔϜ Drupal Ϟδϡʔϧ ։ൃೖߨ࠲
Drupal Ϟδϡʔϧ։ൃೖߨ࠲γϦʔζ – DrupalͰʮϞδϡʔϧʯͱݺΕΔɺখ͞ͳιϑτΣΞΛ࣮͢Δ͜ͱͰػೳ֦ுΛ ߦ͍·͢ɻຊΣϏφʔγϦʔζͰɺDrupalͷϞδϡʔϧ։ൃʹؔ͢ΔجૅࣝΛղઆ ͠·͢ɻ – DrupalͷόοΫΤϯυपΓʹ͍ͭͯମܥతʹֶͼ͍ͨํɺࣗͰΧελϜϞδϡʔϧΛ࡞ ΕΔΑ͏ʹͳΓ͍ͨํɺΞΫΠΞೝఆσϕϩούʔࢼݧΛࢦ͢ํʹ͓͢͢ΊͰ͢ɻ –
DrupalΛҰ௨Γૢ࡞ͨ͜͠ͱ͕͋ΔํΛରͱ͍ͯ͠·͢ɻ·ͩDrupalΛ৮ͬͨ͜ͱ͕ແ ͍ํɺॳ৺ऀ͚DrupalνϡʔτϦΞϧಈըʢຊޠʣΛઌʹݟ͓ͯ͘ͱΑΓཧղ͕ਂ ·Γ·͢ɻ
ΞδΣϯμ 1. DrupalͷForm APIͱ 2. ϑΥʔϜͷछྨ 3. ϑΥʔϜΫϥεͷϝιου 4. ϑΥʔϜͷϨϯμϦϯά
5. ϑΥʔϜͷऔಘͱදࣔ 6. ϑΥʔϜͷมߋ 7. ࿅श
DrupalͷForm APIͱ
DrupalαΠτͰ࣮͞Ε͍ͯΔ༷ʑͳϑΥʔϜ ͜ΕΒͷϑΥʔϜ ͲͷΑ͏ʹ࣮ ͞Ε͍ͯΔͩΖ ͏ʁ هࣄ࡞ϑΥʔϜ ίϝϯτϑΥʔϜ ઃఆϑΥʔϜ ݕࡧϑΥʔϜ ϩάΠϯϑΥʔϜ
DrupalͷForm API – DrupalͷForm APIɺHTMLϑΥʔϜΛૢ࡞͢ΔͨΊͷநԽϨΠϠͰ͢ɻ – ϑΥʔϜͷఆٛɺදࣔɺݕূɺૹ৴ɺͱ͍͏ϥΠϑαΠΫϧΛ੍ޚ͠·͢ɻ – \Drupal\Core\Form\FormInterfaceΛ࣮ͯ͠ϑΥʔϜΫϥεΛ࡞͢Δ͜ͱͰɺΧελ ϜϞδϡʔϧͰϑΥʔϜΛ੍ޚͰ͖·͢ɻ
– ϑΥʔϜ͕ཁٻ͞ΕΔͱɺϑΥʔϜϨϯμϦϯάՄೳͳ$formྻͱͯ͠ఆٛ͞Ε· ͢ɻ – $formྻϨϯμϦϯάͷաఔͰHTMLʹม͞ΕɺΤϯυϢʔβʔʹදࣔ͞Ε·͢ɻ https://www.drupal.org/docs/drupal-apis/form- api/introduction-to-form-api
Form APIΛར༻͢ΔϝϦοτ ϑΥʔϜͷ࡞ʹForm APIΛར༻͢Δ͜ͱͰɺ࣍ͷར͕͋Γ·͢ɻ – શͯͷϑΥʔϜͰҰ؏ͨ͠HTMLग़ྗ͕ՄೳʹͳΓ·͢ɻ – ผϞδϡʔϧͰఏڙ͞ΕΔϑΥʔϜɺෳࡶͳݕࡧஔϩδοΫΛ༻͢ Δ͜ͱͳ͘؆୯ʹมߋͰ͖·͢ɻ –
ϑΝΠϧΞοϓϩʔυථΟδΣοτͳͲͷෳࡶͳϑΥʔϜཁૉɺද ࣔ/ॲཧϩδοΫͷ྆ํΛؚΉ࠶ར༻ՄೳͳόϯυϧʹΧϓηϧԽͰ͖·͢ɻ
ϑΥʔϜ࣮ͷओͳྲྀΕ 1. ϑΥʔϜΫϥεͷ࡞ \Drupal\Core\Form\FormInterface Λ࣮ͨ͠FormBaseɺConfigFormBaseɺConfirmFormBaseͱ ͍͏جఈΫϥε͕༻ҙ͞Ε͍ͯ·͢ɻϑΥʔϜͷ༻్ʹ߹Θͤͯ͜ΕΒͷجఈΫϥε͕ར༻Ͱ͖ ·͢ɻ 1. ඞཁͳϝιουͷ࣮ FormBaseΛ֦ுͨ͠ϑΥʔϜΫϥεʹgetFormID()ɺbuildForm()ɺsubmitForm()ͷ3ͭͷϝιο
υ͕ඞཁͰ͢ɻ 1. ϑΥʔϜͷදࣔ ࡞ͨ͠ϑΥʔϜϧʔςΟϯάʹొͯ͠ϖʔδͱͯ͠දࣔͨ͠ΓɺFormBuilderαʔϏεΛར ༻ͯ͠ϒϩοΫͰදࣔͨ͠ΓͰ͖·͢ɻ
ԋश ϑΥʔϜΛ࡞ͯ͠ΈΑ͏ʂ 1. ϞδϡʔϧͷσΟϨΫτϦԼʹsrc/Form/MaruchaForm.php ϑΝΠϧΛ ࡞ͯ͠ɺϑΥʔϜΫϥεΛ࡞͢Δ 2. ඞཁͳϝιουΛ࣮͢Δ 3. marucha.routing.ymlϑΝΠϧʹϧʔςΟϯάΛઃఆ͢Δ
ίʔυͪ͜Βˠ https://github.com/hmaruyama/my-drupal9-module/compare/vol4
ϑΥʔϜͷछྨ
ϑΥʔϜͷछྨ ϑΥʔϜΛ࡞͢Δʹ \Drupal\Core\Form\FormInterface Λ࣮ͨ͠ ϑΥʔϜΫϥε͕ඞཁͰ͢ɻFormInterfaceΛ࣮͢Δ͜ͱͰ͖ ·͕͢ɺForm APIͰศརͳجఈΫϥε͕3ͭ༻ҙ͞Ε͍ͯ·͢ɻ – FormBas e
– ConfigFormBas e – ConfirmFormBase ࡞͢ΔϑΥʔϜͷ༻్ʹ Ԡͯ͡ɺ͜ΕΒͷجఈΫϥ εΛ֦ுͯ͠ϑΥʔϜΫϥ εΛ࡞Ͱ͖·͢ɻ
֤Ϋϥεͷؔੑ FormBase ConfigFormBase ConfirmFormBase <<interface>> FormInterface • ConfigFormBas e •
ConfirmFormBas e ͜ͷೋͭͷΫϥε FormBaseΫϥεΛ֦ு͠· ͢ɻ
ϑΥʔϜͷछྨ - FormBase – FormBaseΫϥεɺҰൠతͳ ϑΥʔϜΛ࡞͢Δࡍʹར༻Ͱ ͖·͢ɻ – ྫɿݕࡧϑΥʔϜ –
FormBaseΫϥε FormInterface Λ࣮͍ͯ͠· ͢ɻ
ϑΥʔϜͷछྨ - ConfigFormBase – ConfigFormBaseΫϥεɺγεςϜ ઃఆΛߦ͏ϑΥʔϜΛ࡞͢Δࡍʹ ར༻Ͱ͖·͢ɻ – ྫɿαΠτͷجຊઃఆ –
ConfigFormBaseΫϥε FormBaseΫϥεΛ֦ு͍ͯ͠·͢ɻ
ϑΥʔϜͷछྨ - ConfirmFormBase – ConfirmFormBaseΫϥεɺ֬ೝը໘Λ࣮͍ͨ͠ͱ͖ʹར༻Ͱ͖· ͢ɻ – ྫɿίϯςϯπΞΠςϜͷআ֬ೝ – ConfirmFormBaseΫϥεFormBaseΫϥεΛ֦ு͍ͯ͠·͢ɻ
ϑΥʔϜΫϥεͷϝιου
FormInterfaceͰ༻ҙ͞Ε͍ͯΔϝιου FormInterfaceͰ࣍ͷ4ͭͷநϝιου͕ఆٛ͞Ε͍ͯ·͢ɻ FormInterfaceΛ࣮͢ΔϑΥʔϜΫϥεͰ͜ΕΒͷϝιουͷ࣮ ͕ඞਢͰ͢ɻ – getFormId( ) – buildForm( )
– validateForm( ) – submitForm()
FormInterfaceͰ࣍ͷ4ͭͷநϝιου͕ఆٛ͞Ε͍ͯ·͢ɻ FormInterfaceΛ࣮͢ΔϑΥʔϜΫϥεͰ͜ΕΒͷϝιουͷ࣮͕ ඞਢͰ͢ɻ – getFormId( ) – buildForm( ) –
validateForm() ※FormBaseΫϥεΛ֦ு͢ΔΫϥεͰҙ࣮ – submitForm() FormInterfaceͰ༻ҙ͞Ε͍ͯΔϝιου ͜ΕΒͷϝιουͷ࣮͕ඞ ਢͰ͕͢ɾɾɾ FormBaseΫϥεͰ validateForm()ͷΈ࣮͞Εͯ ͍·͢ɻͳͷͰFormBaseΛ֦ ு͢ΔΫϥεͰ validateForm()ͷΈҙͰ͢ɻ
getFormId() – ϑΥʔϜʹҰҙͷIDΛ༩͠·͢ɻ – ϑΥʔϜʹඞͣID͕ඞཁͰ͢ɻ – ҰҙੑΛ࣮֬ʹ͢ΔʹɺIDʹϞδϡʔϧͷϚγϯ໊ΛؚΊΔ ͜ͱͰ͢ɻ public function
getFormId() { return 'marucha_simple_form'; }
buildForm() – $formྻͰHTMLϑΥʔϜΛߏங͠·͢ɻ public function buildForm(array $form, FormStateInterface $form_state) {
$form['name'] = [ '#type' => 'textfield', '#title' => '໊લ', ]; $form['phone'] = [ '#type' => 'tel', '#title' => 'ి൪߸', ]; $form['submit'] = [ '#type' => 'submit', '#value' => 'อଘ', ]; return $form; }
validateForm() – ͷ͞ɺϝʔϧΞυϨεݕূͳͲೖྗ͕ཁ݅Λຬ͍ͨͯ͠Δ͜ͱΛݕূͰ͖·͢ɻ – EmailValidatorαʔϏεͷisValidؔͰϝʔϧΞυϨεͷݕূ͕ߦ͑·͢ɻ public function validateForm(array &$form, FormStateInterface
$form_state) { if (strlen($form_state->getValue('phone')) < 3) { $form_state->setErrorByName('phone', '3จࣈҎ্ʹ͍ͯͩ͘͠͞ɻ'); } } Τϥʔϝοηʔδ͕ද ࣔ͞Εɺ֘ϑΟʔϧ υ͕͘ͳΓ·͢ɻ Ϣʔβʔ͕ૹ৴ͨ͠ϑΥʔϜͷ $form_stateΦϒδΣΫτ͔Β औಘͰ͖·͢ɻ
submitForm() – ϑΥʔϜ͔Βૹ৴͞ΕͨσʔλΛॲཧͰ͖·͢ɻ – σʔλΛσʔλϕʔεʹอଘ͢ΔɺϝʔϧΛૹ৴͢Δɺεςʔλε ϝοηʔδʹදࣔ͢Δɾɾɾ public function submitForm(array &$form,
FormStateInterface $form_state) { $this->messenger()->addStatus('͝هೖ͋Γ͕ͱ͏͍͟͝·͢ʂ'); }
ϑΥʔϜͷϨϯμϦϯά
ϑΥʔϜྻͱ – ϑΥʔϜྻɺHTMLϑΥʔϜΛߏங͢ΔͨΊͷ࿈ྻͰ͢ɻ – ཁૉͱଐੑΛ࿈ྻͰࢦఆ͢Δ͜ͱͰHTMLϑΥʔϜͱͯ͠ϨϯμϦϯά͞Ε·͢ɻ – ϑΥʔϜྻཁૉͱଐੑͰߏ͞Ε·͢ɻ $form['name'] = [
'#type' => 'textfield', '#title' => '໊લ', ]; $form['phone'] = [ '#type' => 'tel', '#title' => 'ి൪߸', ]; $form['submit'] = [ '#type' => 'submit', '#value' => 'อଘ', ]; return $form; <form action=.. . <input type=”text” … <input type=”tel” … <input type=”submit”...
ཁૉͱଐੑͷݟ͚ํ ཁૉɿ#Ͱ࢝·Βͳ͍ ଐੑɿ#Ͱ࢝·Δ $form['name'] = [ '#type' => 'textfield', '#title'
=> '໊લ', ]; $form['phone'] = [ '#type' => 'tel', '#title' => 'ి൪߸', ]; $form['submit'] = [ '#type' => 'submit', '#value' => 'อଘ', ];
ࢦఆՄೳͳଐੑͷྫ ଐੑ આ໌ ࢦఆྫ #type ཁૉͷλΠϓ '#type' => 'textfield' #title
ཁૉͷλΠτϧ '#title' => '໊લ' #description ཁૉΛઆ໌͢ΔͨΊͷςΩετ '#description' => '໊લΛೖྗͯ͘͠ ͍ͩ͞ɻ' #required ཁૉ͕ೖྗඞਢ͔Ͳ͏͔ '#required' => TRUE ଞʹࢁ͋Γ·͢ɻৄࡉͪ͜ΒΛ͝ཡ͍ͩ͘͞ɻ https://www.drupal.org/docs/drupal-apis/form-api/form-render-elements
ࢦఆՄೳͳtypeଐੑͷ આ໌ ϨϯμϦϯάྫ textfield 1ߦͷςΩετϑΟʔϧυ <input type=”text”... number ೖྗͷͨΊͷϑΟʔϧυ
<input type=”number”... radio / radios ୯Ұ or ෳͷϥδΦϘλϯ <input type=”radio”... email ϝʔϧΞυϨεೖྗͷͨΊͷϑΟʔϧυ <input type=”email”... tel ి൪߸ೖྗͷͨΊͷϑΟʔϧυ <input type=”tel”... hidden ը໘্ʹදࣔ͞Εͳ͍Ӆ͠σʔλ <input type=”hidden”... submit ϑΥʔϜͷૹ৴Ϙλϯ <input type=”submit”... ଞʹࢁ͋Γ·͢ɻৄࡉͪ͜ΒΛ͝ཡ͍ͩ͘͞ɻ https://api.drupal.org/api/drupal/elements https://drupalize.me/tutorial/form-element-reference
ԋश ϑΥʔϜྻΛۦͯ͠৭ΜͳϑΟʔϧυΛ࡞ͬͯΈΑ͏ʂ – ϝʔϧΞυϨεϑΟʔϧυ – ి൪߸ϑΟʔϧυ – ϥδΦϘλϯϑΟʔϧυ – νΣοΫϘοΫεϑΟʔϧυ
– બϑΟʔϧυ – ΧϥʔϑΟʔϧυ ίʔυͪ͜Βˠ https://github.com/hmaruyama/my-drupal9-module/compare/vol4
ϑΥʔϜͷऔಘͱදࣔ
࡞ͨ͠ϑΥʔϜΛදࣔ͢Δ ࡞ͨ͠ϑΥʔϜΛදࣔ͢Δํ๏ओʹ2ͭ͋Γ·͢ɻ – ϑΥʔϜΫϥεΛϧʔςΟϯάγεςϜʹొ͢Δ – FormBuilderαʔϏεͰϑΥʔϜΛऔಘ͢Δ
ϑΥʔϜΫϥεΛϧʔςΟϯάγεςϜʹొ͢Δ _formΩʔʹϑΥʔϜΫϥεΛࢦఆ͢Δ͜ͱͰɺϧʔςΟϯάγεςϜʹొͰ͖ ·͢ɻ͜ΕʹΑͬͯɺࢦఆͨ͠URLύεʹԠͯ͡ϑΥʔϜΛऔಘɺදࣔͰ͖·͢ɻ marucha.form: path: '/marucha/form' defaults: _title: 'Marucha form'
_form: '\Drupal\marucha\Form\MaruchaForm' requirements: _permission: 'access content' ίϯτϩʔϥʔΫϥεͷ ߹ Class::methodͷܗࣜ Ͱهड़͠·͕ͨ͠ɺϑΥʔ ϜΫϥεΫϥε໊ͷΈΛ ࢦఆ͠·͢ɻ
FormBuilderαʔϏεͰϑΥʔϜΛऔಘ͢Δ Form APIͰɺϑΥʔϜͷऔಘͱॲཧʹ༻Ͱ͖Δ FormBuilder αʔϏε͕ ༻ҙ͞Ε͍ͯ·͢ɻ ͜ͷαʔϏεΛར༻͢Δ͜ͱͰɺϒϩοΫͷϧʔτ֎ͰϑΥʔϜͷऔಘͱ ද͕ࣔߦ͑·͢ɻ class MaruchaBlock
extends BlockBase { public function build() { return \Drupal::formBuilder()->getForm('Drupal\marucha\Form\MaruchaForm'); } }
ԋश ϑΥʔϜΛϒϩοΫʹදࣔͯ͠ΈΑ͏ʂ 1. ϑΥʔϜΫϥεΛ࡞͢Δ 2. ϒϩοΫΫϥεΛ࡞ͯ͠ɺϒϩοΫΫϥεͰFormBuilder αʔϏεΛ༻ͯ͠ϑΥʔϜΛऔಘ͢Δ 3. Drupalཧը໘͔Β ϒϩοΫϨΠΞτ
ʹҠಈͯ͠ҙͷ Ϧʔδϣϯʹ࡞ͨ͠ϒϩοΫΛஔ͢Δ ίʔυͪ͜Βˠ https://github.com/hmaruyama/my-drupal9-module/compare/vol4
ϑΥʔϜͷมߋ
ϑΥʔϜͷมߋ طଘͷϑΥʔϜΛมߋ͢Δ߹ɺϑοΫͰߦ͍·͢ɻForm API͔ΒϑΥʔϜΛม ߋ͢ΔͨΊͷϑοΫ͕ఏڙ͞Ε͍ͯ·͢ɻ – hook_form_alter()ɿ༷ʑͳϑΥʔϜΛಉ࣌ʹมߋ͍ͨ͠ͳͲ – hook_form_FORM_ID_alter()ɿ୯ҰͷϑΥʔϜΛมߋ͢Δ
࿅श
࿅श1 ࣍ͷΑ͏ͳϑΥʔϜΫϥεΛ࡞ͨ͠ͱ͜Ζɺ Fatal error͕ൃੜ͠·ͨ͠ɻߟ͑ΒΕΔݪҼͲ ΕͰ͔͢ʁ 1. ࣮͖͢ϝιου͕࣮͞Ε͍ͯͳ͍ɻ 2. ະ༻ͷม͕͋Δɻ 3.
αʔϏεͷΞΫηεʹάϩʔόϧ͕ؔ ༻͞Ε͍ͯΔɻ 4. ྻͷࢦఆʹ [ ] Ͱͳ͘ array() ͕༻͞ Ε͍ͯΔɻ class MaruchaForm extends FormBase { public function buildForm(array $form, FormStateInterface $form_state) { $form['name'] = array( '#type' => 'textfield', '#title' => '໊લ', ); $form['submit'] = array( '#type' => 'submit', '#value' => 'อଘ', ); return $form; } public function validateForm(array &$form, FormStateInterface $form_state) { if (mb_strlen($form_state->getValue('name')) < 3) { $form_state->setErrorByName('name', '3จࣈҎ্ʹ͍ͯͩ͘͠͞ɻ'); } } public function submitForm(array &$form, FormStateInterface $form_state) { \Drupal::messenger()->addStatus('͝هೖ͋Γ͕ͱ͏͍͟͝·͢ʂ'); } }
࿅श1 ࣍ͷΑ͏ͳϑΥʔϜΫϥεΛ࡞ͨ͠ͱ͜Ζɺ Fatal error͕ൃੜ͠·ͨ͠ɻߟ͑ΒΕΔݪҼͲ ΕͰ͔͢ʁ 1. ࣮͖͢ϝιου͕࣮͞Ε͍ͯͳ͍ɻ 2. ະ༻ͷม͕͋Δɻ 3.
αʔϏεͷΞΫηεʹάϩʔόϧ͕ؔ ༻͞Ε͍ͯΔɻ 4. ྻͷࢦఆʹ [ ] Ͱͳ͘ array() ͕༻͞ Ε͍ͯΔɻ class MaruchaForm extends FormBase { public function buildForm(array $form, FormStateInterface $form_state) { $form['name'] = array( '#type' => 'textfield', '#title' => '໊લ', ); $form['submit'] = array( '#type' => 'submit', '#value' => 'อଘ', ); return $form; } public function validateForm(array &$form, FormStateInterface $form_state) { if (mb_strlen($form_state->getValue('name')) < 3) { $form_state->setErrorByName('name', '3จࣈҎ্ʹ͍ͯͩ͘͠͞ɻ'); } } public function submitForm(array &$form, FormStateInterface $form_state) { \Drupal::messenger()->addStatus('͝هೖ͋Γ͕ͱ͏͍͟͝·͢ʂ'); } }
࿅श2 ΧελϜϞδϡʔϧͰ࡞ͨ͠ϑΥʔϜΛϒϩοΫʹදࣔ͢ΔʹͲͷํ ๏͕ར༻Ͱ͖·͔͢ʁ 1. *.moduleϑΝΠϧͰhook_form_FORM_ID_alter()Λ࣮ͯ͠ϑΥʔϜΛ औಘ͢Δɻ 2. ϒϩοΫΫϥεͰdrupal_get_form()Λ༻ͯ͠ϑΥʔϜΛऔಘ͢Δɻ 3. ϒϩοΫΫϥεͰFormBuilderαʔϏεΛ༻ͯ͠ϑΥʔϜΛऔಘ͢
Δɻ
࿅श2 ΧελϜϞδϡʔϧͰ࡞ͨ͠ϑΥʔϜΛϒϩοΫʹදࣔ͢ΔʹͲͷํ ๏͕ར༻Ͱ͖·͔͢ʁ 1. *.moduleϑΝΠϧͰhook_form_FORM_ID_alter()Λ࣮ͯ͠ϑΥʔϜΛ औಘ͢Δɻ 2. ϒϩοΫΫϥεͰdrupal_get_form()Λ༻ͯ͠ϑΥʔϜΛऔಘ͢Δɻ 3. ϒϩοΫΫϥεͰFormBuilderαʔϏεΛ༻ͯ͠ϑΥʔϜΛऔಘ͢
Δɻ
࿅श3 ίΞͰఏڙ͞Ε͍ͯΔϑΥʔϜͷ༰ΛΧελϜϞδϡʔϧଆͰมߋ ͍ͨ͠Ͱ͢ɻ࣍ͷ͏ͪదͳํ๏Λ1ͭબ͍ͯͩ͘͠͞ɻ 1. ίΞΛϋοΫ͢Δɻ 2. hook_form_FORM_ID_alter()Λ࣮ͯ͠ϑΥʔϜΛ্ॻ͖͢Δɻ 3. FormBuilderαʔϏεͷgetForm()Λ༻ͯ͠ϑΥʔϜΛ্ॻ͖͢ Δɻ
࿅श3 ίΞͰఏڙ͞Ε͍ͯΔϑΥʔϜͷ༰ΛΧελϜϞδϡʔϧଆͰมߋ ͍ͨ͠Ͱ͢ɻ࣍ͷ͏ͪదͳํ๏Λ1ͭબ͍ͯͩ͘͠͞ɻ 1. ίΞΛϋοΫ͢Δɻ 2. hook_form_FORM_ID_alter()Λ࣮ͯ͠ϑΥʔϜΛ্ॻ͖͢Δɻ 3. FormBuilderαʔϏεͷgetForm()Λ༻ͯ͠ϑΥʔϜΛ্ॻ͖͢ Δɻ
ຊͷΞδΣϯμऴྃ
ΞδΣϯμ 1. DrupalͷForm APIͱ 2. ϑΥʔϜͷछྨ 3. ϑΥʔϜΫϥεͷϝιου 4. ϑΥʔϜͷϨϯμϦϯά
5. ϑΥʔϜͷऔಘͱදࣔ 6. ϑΥʔϜͷมߋ 7. ࿅श
None