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
September 21, 2022
Programming
170
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
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
XHTMLが残したもの
yosuke_furukawa
PRO
2
680
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
3
490
Claude Codeを組織的に動かして月400PRを実現した話
happy_ryo
0
270
LLMは4年分のCompose移行を再現できるのか?実プロダクト279件のXMLで探る自動化の境界線
makun
0
540
Swift愛好会と私(ウホーイ) / Swift Fan Club and Uhooi
uhooi
0
150
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
200
GKE で Pod の見方を変えたら、スケールアウト時の挙動を真に捉えられた話
stkk
0
110
不幸な GC
chencmd
0
900
ALB ログから Trace を気合で繋げる技術
fohte
7
880
高専キャリア LT 発表内容
crysta1221
6
5.6k
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
150
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
130
Featured
See All Featured
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.2k
New Earth Scene 8
popppiees
3
2.5k
Docker and Python
trallard
47
4.2k
Documentation Writing (for coders)
carmenintech
77
5.5k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
500
[SF Ruby Conf 2025] Rails X
palkan
2
1.4k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
230
Joys of Absence: A Defence of Solitary Play
codingconduct
1
500
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
660
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