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
Druapl テーマ開発入門講座 第6回 アセットライブラリ
Search
アクイアジャパン Acquia Japan
June 15, 2022
Programming
200
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Druapl テーマ開発入門講座 第6回 アセットライブラリ
https://www.acquia.com/jp/events/webinars/drupal-theming-development-vol6
アクイアジャパン Acquia Japan
June 15, 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
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
270
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
360
FDEが実現するAI駆動経営の現在地
gonta
2
280
170k Jobs a Day on GKE: Scaling Mercari's CI Platform - and What's Next for AI-Native Development
junyaokabe
0
110
プロポーザルを書いてもらう
pvcresin
0
490
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
140
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
3
780
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
220
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
570
数百円から始めるRuby電子工作
tarosay
0
140
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
150
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.8k
Featured
See All Featured
How to Ace a Technical Interview
jacobian
281
24k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
640
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
480
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
280
HDC tutorial
michielstock
2
790
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
380
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Designing for humans not robots
tammielis
254
26k
GitHub's CSS Performance
jonrohan
1033
470k
Facilitating Awesome Meetings
lara
57
7.1k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Transcript
ୈ6ճ ΞηοτϥΠϒϥϦ Drupal ςʔϚ ։ൃೖߨ࠲
Drupal ςʔϚ։ൃೖߨ࠲γϦʔζ – Drupalʹ͓͚ΔʮςʔϚʯͱɺWebαΠτͷݟͨΛ୲͏ػೳͰ͢ɻຊΣϏφʔγϦʔ ζͰɺDrupalͷςʔϚ։ൃʹؔ͢ΔجૅࣝΛղઆ͠·͢ɻ – DrupalͷϑϩϯτΤϯυपΓʹ͍ͭͯମܥతʹֶͼ͍ͨํɺࣗͰΧελϜςʔϚΛ࡞Ε ΔΑ͏ʹͳΓ͍ͨํɺΞΫΠΞೝఆσϕϩούʔࢼݧΛࢦ͢ํʹ͓͢͢ΊͰ͢ɻ – DrupalΛҰ௨Γૢ࡞ͨ͜͠ͱ͕͋ΔํΛରͱ͍ͯ͠·͢ɻ·ͩDrupalΛ৮ͬͨ͜ͱ͕ແ
͍ํɺॳ৺ऀ͚DrupalνϡʔτϦΞϧಈըʢຊޠʣΛઌʹݟ͓ͯ͘ͱΑΓཧղ͕ਂ ·Γ·͢ɻ
1. ΞηοτϥΠϒϥϦͱ 2. ΞηοτϥΠϒϥϦΛఆٛ͢Δ 3. ͞·͟·ͳఆٛํ๏ 4. ΞηοτϥΠϒϥϦΛಡΈࠐΉ 5. ϥΠϒϥϦͷΦʔόʔϥΠυͱ֦ு
6. PHPͷΛJavaScriptͰ༻͢Δ 7. ࿅श ΞδΣϯμ
ΞηοτϥΠϒϥϦͱ
ΞηοτϥΠϒϥϦͱ – ΞηοτϥΠϒϥϦͱɺCSSϑΝΠϧJavaScriptϑΝΠϧΛͻͱ·ͱΊ ʹͨ͠ͷͰ͢ɻ – DrupalͰςϯϓϨʔτʹCSSJSͷURLΛຒΊࠐΉͷͰͳ͘ɺΞηοτ ϥΠϒϥϦΛհͯ͠Drupalʹ͑·͢ɻ – ͜ΕʹΑΓɺγεςϜ෦ͰDrupal͕CSSͱJSͷѹॖΩϟογϡɺϩʔυ ͢Δॱ൪ͷࢦఆɺಛఆͷϖʔδͷΈͰಡΈࠐΉͳͲͷॲཧΛߦ͏͜ͱ͕Ͱ͖
·͢ɻ – ΞηοτϥΠϒϥϦ֤ςʔϚͷ *.libraries.yml ϑΝΠϧͰఆٛͰ͖·͢ɻ
ΞηοτϥΠϒϥϦΛಡΈࠐΉͨΊͷखॱ 1. ಡΈࠐΈ͍ͨCSS/JSϑΝΠϧΛ४උ͠·͢ɻ 2. *.libraries.yml ͰΞηοτϥΠϒϥϦΛఆٛ͠·͢ɻ 3. ΞηοτϥΠϒϥϦΛಡΈࠐΈ·͢ɻ a. શͯͷϖʔδͰݺͼग़͢
- *.info.ymlʹఆٛ b. ಛఆͷTwigςϯϓϨʔτ - *.html.twigʹఆٛ c. ಛఆͷϒϩοΫɺϊʔυ - *.themeʹఆٛ https://www.drupal.org/docs/theming-drupal/adding- stylesheets-css-and-javascript-js-to-a-drupal-theme
ΞηοτϥΠϒϥϦΛఆٛ͢Δ
γϯϓϧͳྫ global-styling: version: 1.x css: theme: css/styles.css: {} global-scripts: version:
1.x js: js/script.js: {} ςʔϚσΟϨΫτϦԼʹ*.libraries.yml ϑΝΠϧΛ࡞͠ɺΞηοτϥΠϒϥϦΛఆٛ͠·͢ɻ͜ ͷྫͰزͭͷϥΠϒϥϦ͕ఆٛ͞Ε͍ͯΔͰ͠ΐ͏ʁ
γϯϓϧͳྫ global-styling: version: 1.x css: theme: css/styles.css: {} global-scripts: version:
1.x js: js/script.js: {} Aɿglobal-styling ͱ global-scripts ͷ2ͭͷϥΠϒϥϦ͕ఆٛ͞Ε͍ͯΔ͜ͱ͕Θ͔Γ·͢ɻ͜ͷఆٛ͞Εͨϥ ΠϒϥϦΛ༻ͯ͠ɺαΠτͷ͞·͟·ͳॴͰಡΈࠐΉ͜ͱ͕Ͱ͖·͢ɻ
ࢀߟ) SMACSSͱ – Scalable and Modular Architecture for CSS –
CSSઃܭख๏ͷҰͭɻCSSΛ5ͭͷΧςΰϦʹྨͯ͠هड़͍ͯ͘͜͠ͱͰɺίʔυͷϝϯςφϯεੑΛ্ͤ͞· ͢ɻCSSઃܭख๏ଞʹBEMOOCSS͕༗໊Ͱ͢ɻ – 5ͭͷྨ – Base — HTMLཁૉͷελΠϦϯά – Layout — άϦουγεςϜΛؚΉϖʔδϨΠΞτͷελΠϦϯά – Component — ࠶ར༻ՄೳͳUIཁૉͷελΠϦϯά ※ SMACSSͰModuleͱݺΕΔ – State — ϚεΦʔόʔͳͲͷΫϥΠΞϯτଆͷίϯϙʔωϯτมߋͷελΠϦϯά – Theme — ίϯϙʔωϯτͷࢹ֮తͳελΠϦϯά – DrupalͰSMACSSΛ༻͍ͯCSSΛྨ͠·͢ɻ – Base, Layout, Component, State, Themeͷॱ൪ͰಡΈࠐΉΑ͏ʹͳ͍ͬͯ·͢ɻ
ԋश ίΞͷ *.libraries.yml Λ͍ͯΈΑ͏ – ͲΜͳׅΓͰϥΠϒϥϦ͕ఆٛ͞Ε͍ͯΔ͔ – ͲΜͳΦϓγϣϯ͕༻͞Ε͍ͯΔ͔
͞·͟·ͳఆٛํ๏
CSS/JSΛఆٛ͢Δࡍʹར༻ՄೳͳΦϓγϣϯʢ̍ʣ ྫɿΞηοτ͕طʹॖখ͞Ε͍ͯΔ͔ʢσϑΥϧτfalseʣ ྫɿΞηοτͷιʔεΛࢦఆ͢ΔʢσϑΥϧτfileʣ assets/vendor/ckeditor5/alignment/alignment.js: { minified: true } http://example.com/script.js: {
type: external }
CSS/JSΛఆٛ͢Δࡍʹར༻ՄೳͳΦϓγϣϯʢ̎ʣ ྫɿଐੑΛՃ͢Δ ྫɿଞͷΞηοτͱ૬ରతͳॱংΛௐ͢Δ js/editor.formattedTextEditor.js: { attributes: { defer: true }
} css/components/user.css: { weight: -10 } <script src="/js/editor.formattedTextEditor.js?v=9.3.8" defer></script>
CSS/JSΛఆٛ͢Δࡍʹར༻ՄೳͳΦϓγϣϯʢ̏ʣ ྫɿϝσΟΞλΠϓΛࢦఆ͢ΔʢCSSͷΈࢦఆՄೳʣ ྫɿΞηοτΛू͢Δඞཁ͕͋Δ͔Ͳ͏͔ʢσϑΥϧτtrueʣ css/print.css: { media: print } css/components/messages.css: {
preprocess: false }
CSSͱJSϑΝΠϧͷू [ڥઃఆ]ʼ[ύϑΥʔϚϯε]ʼ[ଳҬ෯࠷దԽ] ͷνΣοΫϘοΫεʹνΣο ΫΛೖΕɺߏΛอଘ ҙ CSSͱJSϑΝΠϧΛूͷରͱ͢ΔͨΊʹɺϑΝΠϧΛςʔϚ·ͨϞ δϡʔϧͷ *.libraries.yml Ͱఆٛ͠ɺಡΈࠐ·ͤΔඞཁ͕͋Γ·͢ɻςϯϓ
ϨʔτʹϑΝΠϧͷϦϯΫΛهड़͢ΔͷόουϓϥΫςΟεͰ͢ɻ ࢀߟ) CSSͱJSͷूʹ͍ͭͯ DrupalͰଟͷCSSϑΝΠϧͱJSϑΝΠϧΛऔΓѻ͍·͢ɻ ͜ΕΒू͢Δ͜ͱͰ1ͭͷʢ·ͨগͷʣϑΝΠϧͱͳΓɺϦΫΤετճΛݮͰ͖·͢ɻ ूલ 100ϑΝΠϧ ूޙ 3ϑΝΠϧ
ґଘؔͷએݴ ϥΠϒϥϦʹґଘؔΛએݴͰ͖·͢ɻdependenciesΩʔͰґଘ͢Δϥ ΠϒϥϦͷΩʔͷϦετΛࢦఆ͠·͢ɻ maintenance_page: version: VERSION css: theme: css/maintenance-page.css: {}
dependencies: - system/maintenance - bartik/global-styling
DrupalίΞͰ༻ҙ͞Ε͍ͯΔΞηοτ jQuerynormalize.cssͳͲɺίΞଆͰ༻ҙ͞Ε͍ͯΔΞηοτ͕͋Γ ·͢ɻcore/assets/vendor σΟϨΫτϦʹશͯͷҰཡ͕͋Γ·͢ɻඞཁ ʹԠͯ͡ґଘؔΛએݴ͠·͢ɻ tour: version: VERSION js: js/tour.js:
{} dependencies: - core/jquery
JavaScript͕ಡΈࠐ·ΕΔॴ σϑΥϧτͰɺͯ͢ͷJSΞηοτϑολͰಡΈࠐ·Ε·͢ɻheaderϓϩύςΟΛ༻͍ͯϔομͰಡΈࠐ ·ͤΔ͜ͱ͕Ͱ͖·͢ɻʢ͜ͷํ๏Ͱએݴ͞ΕͨϥΠϒϥϦͷ·ͨؒతͳґଘؔɺࣗಈతʹϔο μ͔Βϩʔυ͞Ε·͢ɻʣ js-header: header: true js: header.js: {}
js-footer: js: footer.js: {} <html> <head> <js-placeholder token="{{ placeholder_token }}"> </head> <body> {{ page_top }} {{ page }} {{ page_bottom }} <js-bottom-placeholder token="{{ placeholder_token }}"> </body> </html> html.html.twig marucha.libraries.yml
֎෦ΞηοτͷಡΈࠐΈ type: external Ͱ֎෦ϥΠϒϥϦͰ͋Δ͜ͱΛએݴͰ͖·͢ɻఆٛʹ֎෦ϥΠ ϒϥϦʹؔ͢ΔใΛؚΊΔ͜ͱ͓קΊ͠·͢ɻ angular.angularjs: remote: https://github.com/angular version: 1.4.4
license: name: MIT url: https://github.com/angular/angular.js/blob/master/LICENSE gpl-compatible: true js: https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js: { type: external, minified: true }
ΞηοτϥΠϒϥϦΛಡΈࠐΉ
ϥΠϒϥϦͷಡΈࠐΈํ৭ʑ *.libraries.ymlͰΞηοτϥΠϒϥϦΛఆ͚ٛͨͩ͠ͰɺͦΕΒͷϥΠ ϒϥϦDrupalαΠτͰಡΈࠐ·Ε·ͤΜɻDrupalͰ࣍ͷ3ͭͷํ๏ ͰϥΠϒϥϦΛಡΈࠐΉ͜ͱ͕Ͱ͖·͢ɻ – શͯͷϖʔδͰಡΈࠐΉ - *.info.ymlʹهड़ – ಛఆͷTwigςϯϓϨʔτͰಡΈࠐΉ
- *.html.twigʹهड़ – ಛఆͷϒϩοΫɺϊʔυͰಡΈࠐΉ - *.themeʹهड़
શͯͷϖʔδͰಡΈࠐΉ - *.info.ymlʹهड़ name: Marucha type: theme description: '·ΔͷͨΊͷΧελϜςʔϚ' core_version_requirement:
^8 || ^9 base theme: false libraries: - marucha/global-styling - marucha/global-scripts *.info.ymlͷlibrariesΩʔͰΞηοτϥΠϒϥϦΛࢦఆ͢ΔͱɺαΠτશମͰಡΈ ࠐ·Ε·͢ɻ
ಛఆͷTwigςϯϓϨʔτͰಡΈࠐΉ - *.html.twigʹهड़ ςϯϓϨʔτϑΝΠϧͷதͰattach_libraryؔΛ༻͢Δ͜ͱͰɺ ςϯϓϨʔτ͕ಡΈࠐ·ΕͨϖʔδͷΈϥΠϒϥϦΛಡΈࠐΉ͜ ͱ͕Ͱ͖·͢ɻ {{ attach_library('marucha/global-styling') }}
ಛఆͷϒϩοΫɺϊʔυͰಡΈࠐΉ - *.themeʹهड़ ϖʔδͷಛఆͷϒϩοΫ͕දࣔ͞Ε͍ͯΔ࣌ͳͲϖʔδͷαϒηοτ ͰϥΠϒϥϦΛಡΈࠐΈ͍ͨ߹ɺϩδοΫͰϥΠϒϥϦΛग़͚͠ ͍ͨ߹ɺ*.themeϑΝΠϧʹϑοΫؔΛ࣮͢Δ͜ͱͰߦ͑·͢ɻ function umami_preprocess_html(&$variables) { if
(!empty($variables['page']['sidebar'])) { $variables['#attached']['library'][] = 'umami/two-columns'; } } umami.theme
ϥΠϒϥϦͷΦʔόʔϥΠυͱ֦ு
ϥΠϒϥϦΛΦʔόʔϥΠυ͢Δ *.info.ymlͰ libraries-override ΩʔΛ ༻ͯ͠ɺίΞϞδϡʔϧͰఏڙ ͞ΕΔϥΠϒϥϦΛΦʔόʔϥΠυ Ͱ͖·͢ɻ libraries-override: # ϥΠϒϥϦશମΛஔ͖͑Δ
core/drupal.collapse: marucha/collapse # ϑΝΠϧΛผͷϑΝΠϧʹஔ͖͑Δ subtheme/library: css: theme: css/layout.css: css/marucha-layout.css # ϑΝΠϧΛআ͢Δ drupal/dialog: css: theme: dialog.theme.css: false # ϥΠϒϥϦશମΛআ͢Δ core/modernizr: false marucha.info.yml
ϥΠϒϥϦΛ֦ு͢Δ *.info.ymlͰ libraries-extend ΩʔΛ༻ͯ͠ɺίΞϞδϡʔϧͰ ఏڙ͞ΕΔϥΠϒϥϦʹಠࣗͷมߋΛՃ֦͑ͯுͰ͖·͢ɻ libraries-extend: core/drupal.dialog: - bartik/classy.dialog core/drupal.dropbutton:
- bartik/classy.dropbutton core/drupal.progress: - bartik/classy.progress marucha.info.yml
PHPͷΛJavaScriptͰ༻͢Δ
drupalSettingsͱ PHPͰॲཧ͞ΕͨಈతͳΛJavaScriptͰ༻͍ͨ͠߹ɺdrupalSettingsΛ༻ ͯ͠ߦ͏͜ͱ͕Ͱ͖·͢ɻdrupalSettingsίΞͷΞηοτϥΠϒϥϦͷதͰఆ ٛ͞Ε͍ͯ·͢ɻ
drupalSettingsΛ༻͢ΔྲྀΕ ᶃ PHPͷΛ༻͍ͨ͠JavaScriptϑΝΠϧΛΞηοτϥΠϒϥϦʹఆٛ ͢Δ cool-slider: version: 1.x js: js/cool-slider.js: {}
dependencies: - core/jquery - core/drupalSettings JavaSriptϑΝΠϧͰ drupalSettingsΛར༻͢Δ ͨΊʹґଘؔͷએݴ͕ ඞཁɻ marucha.libraries.yml
drupalSettingsΛ༻͢ΔྲྀΕ ᶄ ϑοΫؔͰϥΠϒϥϦΛಡΈࠐΉɻdrupalSettingsΦϒδΣΫτʹ JavaScriptͰ༻͍ͨ͠Λೖ͢Δɻ function marucha_page_attachments_alter(&$page) { $page['#attached']['library'][] = 'marucha/cool-slider';
$page['#attached']['drupalSettings']['marucha']['coolSlider']['foo'] = 'bar'; } marucha.theme
drupalSettingsΛ༻͢ΔྲྀΕ ᶅ JavaScriptϑΝΠϧͰʹΞΫηε͢Δɻ (function ($, Drupal, drupalSettings) { 'use strict';
Drupal.behaviors.mybehavior = { attach: function (context, settings) { console.log(settings.marucha.coolSlider.foo); } }; })(jQuery, Drupal, drupalSettings); cool-slider.js
࿅श
ΧελϜςʔϚͰjQueryΛಡΈࠐΈ͍ͨ߹ɺͲͷΑ͏ʹߦ͏ͷ͕ྑ͍Ͱ͠ΐ ͏͔ʁ 1. html.html.twig ϑΝΠϧͷதͰɺ<script>λάΛ༻͍ͯಡΈࠐ·ͤΔɻ 2. *.libraries.yml ϑΝΠϧͷதͰɺϥΠϒϥϦͷґଘؔͱͯ͠ಡΈࠐ·ͤΔɻ 3. DrupalίΞ͔ΒCDN͕ఏڙ͞Ε͍ͯΔͷͰɺଞͷ֎෦Ξηοτͱಉ༷ʹಡΈ
ࠐ·ͤΔɻ 4. DrupalͰσϑΥϧτͰjQuery͕ΧελϜςʔϚͰར༻Ͱ͖ΔΑ͏ʹͳͬͯ ͍ΔͨΊɺԿ͠ͳͯ͘ྑ͍ɻ ࿅श1
ΧελϜςʔϚͰjQueryΛಡΈࠐΈ͍ͨ߹ɺͲͷΑ͏ʹߦ͏ͷ͕ྑ͍Ͱ͠ΐ ͏͔ʁ 1. html.html.twig ϑΝΠϧͷதͰɺ<script>λάΛ༻͍ͯಡΈࠐ·ͤΔɻ 2. *.libraries.yml ϑΝΠϧͷதͰɺϥΠϒϥϦͷґଘؔͱͯ͠ಡΈࠐ·ͤΔɻ 3. DrupalίΞ͔ΒCDN͕ఏڙ͞Ε͍ͯΔͷͰɺଞͷ֎෦Ξηοτͱಉ༷ʹಡΈ
ࠐ·ͤΔɻ 4. DrupalͰσϑΥϧτͰjQuery͕ΧελϜςʔϚͰར༻Ͱ͖ΔΑ͏ʹͳͬͯ ͍ΔͨΊɺԿ͠ͳͯ͘ྑ͍ɻ ࿅श1 ਖ਼ղɿ2
͋ΔJavaScriptϑΝΠϧΛBodyͷ࠷Լ෦ͰಡΈࠐΈ͍ͨͰ͢ɻͲ͏͢Εྑ͍Ͱ͢ ͔ʁ 1. *.libraries.ymlͰରͷJavaScriptϑΝΠϧʹ { head: false } Λࢦఆ͢Δɻ 2.
*.libraries.ymlͰରͷΞηοτϥΠϒϥϦͷheaderϓϩύςΟʹ true Λࢦఆ ͢Δɻ 3. html.html.twigͰattach_libraryؔΛ༻ͯ͠ಡΈࠐΉɻ 4. DrupalσϑΥϧτͰBodyͷด͡λάޙͰಡΈࠐΉΑ͏ʹͳ͍ͬͯΔͷ Ͱɺಛʹઃఆඞཁͳ͍ɻ ࿅श2
͋ΔJavaScriptϑΝΠϧΛBodyͷ࠷Լ෦ͰಡΈࠐΈ͍ͨͰ͢ɻͲ͏͢Εྑ͍Ͱ͢ ͔ʁ 1. *.libraries.ymlͰରͷJavaScriptϑΝΠϧʹ { head: false } Λࢦఆ͢Δɻ 2.
*.libraries.ymlͰରͷΞηοτϥΠϒϥϦͷheaderϓϩύςΟʹ true Λࢦఆ ͢Δɻ 3. html.html.twigͰattach_libraryؔΛ༻ͯ͠ಡΈࠐΉɻ 4. DrupalσϑΥϧτͰBodyͷด͡λάޙͰಡΈࠐΉΑ͏ʹͳ͍ͬͯΔͷ Ͱɺಛʹઃఆඞཁͳ͍ɻ ࿅श2 ਖ਼ղɿ4
ຊͷΞδΣϯμऴྃ
1. ΞηοτϥΠϒϥϦͱ 2. ΞηοτϥΠϒϥϦΛఆٛ͢Δ 3. ͞·͟·ͳఆٛํ๏ 4. ΞηοτϥΠϒϥϦΛಡΈࠐΉ 5. ϥΠϒϥϦͷΦʔόʔϥΠυͱ֦ு
6. PHPͷΛJavaScriptͰ༻͢Δ 7. ࿅श ΞδΣϯμ
None