Drupal 模組介紹
Drupal 聯絡表單
Webform
在 <site>/admin/structure/webform/manage/contact 中增減元素 (Elements),最重要的是 KEY 名稱可作為郵件內容。
另外可以修改是否顯示 Title 或 Placeholder (欄位中預先顯示該項目的文字)。
在 <site>/admin/structure/webform/manage/contact/handlers 中已內建 Email notification 為收到留言的電子郵件處理程序 ,Email confirmation 為自動回覆的電子郵件處理程序。
 Email notification 或 Email confirmation 的項目中按下 Edit 後,在右邊的 Edit Email notification handler 窗格為主要設定的頁面。
- Edit Email confirmation handler
- 
- To email
- 
[site:mail](留言者傳送給網站郵件地址設定為site:mail)
- From email
- 
Your Email (email)(contact 的 Elements 為留言者 email)
- From name
- 
Your Name (name)(郵件地址的前面的名稱為留言者姓名)
- Subject (郵件主題)
- 
Custom subject…來自 [webform_submission:values:name] 的聯絡單 (1) 1 採用 [webform_submission:values:?]的token格式來取得內容, 如?為name是在 contact 的 Elements 中的 KEY。
- Body (內容)
- 
Custom body…聯絡姓名: [webform_submission:values:name] 聯絡信箱: [webform_submission:values:email] 留言訊息: [webform_submission:values:message] 
 
- Edit Email confirmation handler
- 
- To email
- 
Your Email (email)(contact 的 Elements 為留言者 email)
- From email
- 
[site:mail](網站傳送給留言者郵件地址設定為site:mail)
- From name
- 
[site:name](傳送給留言者郵件地址的前面的名稱為site:name)
- Subject (郵件主題)
- 
Custom subject…感謝您聯絡我們 
- Body (內容)
- 
Custom body…自行發揮 
 
註:(E-mail 的) From email 已由 webform 中設定,在下列的模組中可忽略 From name。
Mail 模組
modi mailsystem (1) modi mimemail (2)
| 1 | Mail System 可配置郵件格式及發送模組。 | 
| 2 | 發送帶有嵌入式圖像和附件的 MIME 編碼的電子郵件。 | 
- <site>/admin/config/system/mailsystem
- 
- DEFAULT MAIL SYSTEM
- 
- Formatter (郵件格式)
- 
Mime Mail mailer
- Sender (郵件發送模組)
- 
PHPMailer SMTP(支援 ssl 可發送至 Gmail)
 SMTP Mailer(同上)
 Maillog Mail-Plugin(用於測試發送的內容是否正確)
 
 
- 安裝 Mail 測試模組,可在不實際傳送郵件的情況,由記錄檔得知傳送情況
- 
安裝 Mail 測試模組,取一安裝即可。modi mail_safety (1) modi maillog 1 建議安裝 Mail Safety可在傳送外送信件時一併記錄。
- 測試聯絡表單
- 
如果是安裝 Maillog在 <site>/admin/config/system/mailsystem 將 Sender 設為Maillog Mail-Plugin,若安裝mail_safety則不需要更改。Mail Safety 組態- <site>/admin/config/development/mail_safety/settings
- 
- Settings
- 
- 
Stop outgoing mails (停止外送郵件,要外送郵件時記得取消) 
- 
Send mail to dashboard (將外送郵件記錄儲存至 dashboard) 
 
- 
 
 進入 <site>/webform/contact/test 網頁發送測試留言,在 <site>/admin/config/development/mail_safety 查看結果。 Maillog 組態- <site>/admin/config/development/maillog
- 
- Maillog Settings
- 
- 
Allow the e-mails to be sent. 
- 
Create table entries in maillog table for each e-mail. 
- 
Display the e-mails on page. 
 
- 
 
 進入 <site>/webform/contact/test 網頁發送測試留言,在 <site>/admin/reports/maillog 查看結果。 
安裝 SMTP 模組,以下取一即可。
- PHPMailer SMTP
- 
安裝 PHPMailer SMTPmodi phpmailer_smtp PHPMailer SMTP 組態- <site>/admin/config/system/phpmailer-smtp
- Configure the PHPMailer SMTP module
- 
- Primary SMTP server
- 
smtp.gmail.com
- SMTP port
- 
465
- Use secure protocol
- 
SSL
- SMTP AUTHENTICATION
- 
- Username
- 
Gmail 帳號 
- Change password
- 
Gmail 密碼 
 
 
 記得在 <site>/admin/config/system/mailsystem 將 Sender 設為 PHPMailer SMTP。
- SMTP Authentication Support
- 
安裝 SMTP Authentication Supportmodi smtp SMTP 組態- <site>/admin/config/system/smtp
- SMTP Authentication Support
- 
- SMTP SERVER SETTINGS
- 
- SMTP server
- 
smtp.gmail.com
- SMTP port
- 
465
- Use encrypted protocol
- 
Use SSL
- Enable TLS encryption automatically
- 
On
 
- SMTP AUTHENTICATION
- 
- Username
- 
Gmail 帳號 
- Password
- 
Gmail 密碼 
 
- E-MAIL OPTIONS
- 
- E-mail from address
- 
Gmail 帳號 
 
 
 註:本頁上方有 Disabled fields are overridden in site-specific configuration file 的訊息,可忽略它。 記得在 <site>/admin/config/system/mailsystem 將 Sender 設為 SMTP Mailer。
- https://myaccount.google.com/security (登錄帳戶後,每個帳戶的網址都一樣)
- 
- 低安全性應用程式存取權
- 
開啟 
 
- 如何將聯絡表單加入頁面
- 
- 
在 <site>/admin/structure/block 中,按下 Place block。 
- 
出現 Place block窗格中選取Webform按下 Place block。
- 
出現 Configure block窗格中的Webform輸入Contact。
 另一個方法是直接採用 Webform 的預設連結。在 <site>/admin/structure/webform/manage/contact/settings 中 URL PATH SETTINGS 中的 Webform URL alias已預設 /form/contact。
- 
Captcha
modi recaptcha_v3 # The following module(s) will be enabled: recaptcha_v3, captcha (1) modi image_captcha (2)
| 1 | 自動加裝 captcha (CAPTCHA) | 
| 2 | drupal 官方沒有 image_captcha 的網頁,只在上面的 CAPTCHA 網頁中提到了 Image CAPTCHA refresh ,網頁中: 
 https://www.drupal.org/node/2608540 Version: 8.x-1.x-dev Component: Image Captcha (image_captcha) image_captcha 模組,在 Drupal 8 / 9 測試正常。 | 
- <site>/admin/config/people/captcha/recaptcha-v3
- reCAPTCHA v3 settings Add to Default shortcuts
- 
- Site key
- 
輸入註冊 reCAPTCHA v3 的金鑰 
- Secret key
- 
輸入 reCAPTCHA v3 密鑰 
 
- <site>/admin/config/people/captcha/recaptcha-v3-actions/add
- Add reCAPTCHA v3 action
- 
- Label
- 
Contact message 
- Threshold
- 
1 
 0.5 至 1.0 表示可能是人類,人類分數為 1 的情況應該很少,會驗證失敗,可用來測試驗證失敗的情況。
- Fallback challenge
- 
Image (from module image_captcha) 
 驗證失敗時的備援機制,reCAPTCHA v3 驗證失敗除了 Image Captcha 亦可採用 reCAPTCHA (v2) 。
 
- <site>/admin/config/people/captcha
- CAPTCHA settings
- 
- Persistence
- 
- Always add a challenge
- 
採用本選項,運作才會合乎預期,但缺點是在每次都會驗證,如在 reCAPTCHA v3 驗證失敗 (人類分數為 1) 的情況下;預覽 留言需輸入圖形碼, 上一頁 再次 預覽 時需再輸入一次。 
- Omit challenges in a multi-step/preview workflow once the user successfully responds to a challenge.
- 
成功驗證後,可在多步驟 / 預覽工作流程中省略驗證。 
 但實測結果並不正常,在內部網段 reCAPTCHA 已提示下列:如果之前有 (以實際的外部網址) 成功驗證過,那麼將不會再執行圖形驗證。 
 
 
測試時最好每次在 <site>/admin/config/people/captcha 執行 Clear the CAPTCHA placement cache 並且在 CLI 執行 drush cr 才不會誤判。
- 將 聯絡表單 (contact) 加入 Captcha 的功能
Honeypot & Antibot
| 1 | 設定時間限制,防止大量垃圾留言,若已採用 reCAPTCHA 應該不需要 Honeypot。 | 
| 2 | 要求啟用 JavaScript 才能使用表單,Google reCAPTCHA 需要 JavaScript 應安裝。 | 
- <site>/admin/config/content/honeypot
- Honeypot configuration
- 
- 
Log blocked form submissions (如果想了解垃圾郵件機器人試圖提交多少,可啟用本功能) - Honeypot element name
- 
myhoneypot (Honeypot 元素名稱,任意命名跟欄位名稱不會重複的名稱) 
 
 
- 
- Honeypot time limit
- 
5 seconds 
- <site>/admin/structure/webform/manage/contact/settings
- Contact
- 
- THIRD PARTY SETTINGS
- 
- ANTIBOT
- 
- 
Protect Contact webform with Antibot 
 
- 
- HONEYPOT
- 
- 
Protect Contact webform with Honeypot 
- 
Add time restriction to Contact webform 
 
- 
 
 
Webform libraries
<link rel="stylesheet" media="all" href="https://cdn.jsdelivr.net/gh/NigelOToole/progress-tracker@v2.0.6/docs/styles/progress-tracker.css" />WEBFORM: EXTERNAL LIBRARIES 19 libraries (0 installed; 2 excluded; 17 CDN) WEBFORM: PRIVATE FILES Private file system is not set.
Webform 模組附帶了一個 composer.libraries.json 檔案,其中包含有關模組本身所需的所有最新函式庫的資訊,可以通過合併
composer.libraries 來安裝。合併是通過 GitHub
上提供的 Composer Merge Plugin  的外掛來完成。
# 切換至站台的根目錄
cd /var/www/$site
drush webform:libraries:composer > composer.libraries.json (1)
composer require wikimedia/composer-merge-plugin (2)| 1 | 下載檔案的模組版本比 <site>/modules/contrib/webform/composer.libraries.json 還新,而且版本跟 <site>/admin/reports/status 一致,這表示要更新該檔案。 | 
| 2 | 安裝 Composer Merge Plugin外掛。 | 
"extra": {
"merge-plugin": { (1)
            "include": [
                "composer.libraries.json" (2)
            ]
        }, (1)
        "drupal-scaffold": {
         ...| 1 | 找出 "extra"插入本段。 | 
| 2 | 下載檔案的位置 (站台路徑的相對位置),以本例而言下載位置為 /var/www/$site/composer.libraries.json。 | 
composer update --lock (1)
drush cr (2)| 1 | 採用 --lock參數,根據 composer.json 的修改情況來異動 composer.lock 檔案並安裝新模組 (不會更新現有模組)。 | 
| 2 | 如果未執行,並不會使用函數庫,可發現 Webform 的網頁的 css js 存取外部的 cdn。 | 
Private file system
進入網頁 <site>/admin/config/media/file-system 看一下內容
- File system
- 
- Public file system path
- 
sites/default/files 
 
即然 sites/default/files 是公開目錄,那麼在其他目錄建立一個 private
mkdir sites/default/private
在 $site/sites/default/settings.php 檔案中加入下列
$settings['file_private_path'] = 'sites/default/private';
Easy Breadcrumb
root/cat root/cat/content-page.html
root/cat/index.html (1) root/cat/content-page.html
| 1 | index.html 的架構可能比較完美,但 Drupal Breadcrumb 無法處理,「類別」的 URL 只能為路徑不能為頁面。 | 
Drupal 內建的 Breadcrumb 會顯示 首頁 也沒有組態功能,加裝 Easy Breadcrumb  才能不顯示 首頁。
- <site>/admin/config/user-interface/easy-breadcrumb
- 
- Easy Breadcrumb
- 
- GENERAL SETTINGS
- 
- 
Include the current page as a segment in the breadcrumb 
- 
Use the real page title when available 
 
- 
- ADVANCED SETTINGS
- 
Paths to be excluded while generating segments 
 若可以應採用 (<site>/admin/structure/block/manage/bootstrap_custom_breadcrumbs) 中的 Pages 來限制顯示 Breadcrumb 頁面。
 
 
modi easy_breadcrumbBlock Classes
安裝 Block Classes ,可在 Block 項目可設定 CSS class,多個 class 以空白字元分開。
- <site>/admin/structure/block 選取任意 Block
- 
- Configure block
- 
- Title CSS class(es)
- 
class1 class2
- Content CSS class(es)
- 
class1 class2
- Block CSS class(es)
- 
class1 class2
 
 
modi block_classesLazy-load
Lazy-load 可延遲加載 圖像 和 iframe,說明參閱: How to enable lazy-loading for inline-images and iframes?
- <site>/admin/config/content/formats 選取一個要延遲加載 format
- 
- 
Lazy-load images and iframes 
 
- 
modi lazy
# mkdir -p /var/www/$site/libraries
cd /var/www/$site/libraries
sudo apt install git -y
git clone https://github.com/aFarkas/lazysizes.git lazysizes
chwww .Advanced CSS/JS Aggregation
- <site>/admin/config/development/performance/advagg
- 
- AdvAgg: Configuration
- 
- AdvAgg Cache Settings
- 
High 
- CSS OPTIONS
- 
- 
Fix improperly set type 
 
- 
- JS OPTIONS
- 
- 
Fix improperly set type 
 
- 
 
 
Advanced CSS/JS Aggregation  實測結果感覺比 Drupal 內建的 <site>/admin/config/development/performance 啟用 Aggregate CSS files / Aggregate JavaScript file 慢,
有空再測試吧。另外,會出現 Source Map 錯誤 bootstrap.min.css.map: HTTP error: status code 404,暫不處理。
composer require drupal/ctools drupal/token
modi advaggSimple XML sitemap
- <site>/admin/structure/types 選取 edit
- 
- Simple XML Sitemap
- 
- Sitemap variants (將 DEFAULT展開 )
- 
- 
Index entities of type <Content type> in variant Default 
 
- 
 
- Sitemap variants (將 
 
drush simple-sitemap:generateSimple XML sitemap  的 <site>/sitemap.xml 支援多國,sitemap.xml 出現了 en 可用 Disable language 來解決。
modi simple_sitemapXML sitemap
modi xmlsitemap
- <site>/admin/config/search/xmlsitemap/entities/settings
- Custom Entities Settings
- 
- Custom sitemap entities settings
- 
- 
Content 
- 
Custom menu link … 
 
- 
 
當選取了 Content 時,則畫面會增加 Content 的 CONTENT TYPE。
- CONTENT TYPE
- 
- 
Article Config 
- 
Basic page 
 
- 
按下 Config 按鈕,設置 Included。
- <site>/admin/config/search/xmlsitemap
- 
- XML sitemap
- 
已經預設了一個 XMLSITEMAP按下 Edit
 
XML sitemap 沒有多國語言。
drush xmlsitemap:rebuildToc.js
Toc.js 可建立一個 Block 顯示文章中的 Toc,缺點是不區分 H2、H3…,ToC 只有一層。
- <site>/admin/structure/block 按下 Place block 選取 Toc.js block
- 
- Configure block
- 
Title * 
 Toc.js block- 
Display title (取消 Toc.js block標題)
 Title
 Table of content(英文標題,多國語言以Translate block修改)
- 
Sticky - Content types (選取要產生 ToC 的類型)
- 
- 
Article 
 
- 
 
 
- 
 
cd /var/www/$site
mkdir -p libraries/toc
curl https://raw.githubusercontent.com/jgallen23/toc/greenkeeper/update-all/dist/toc.min.js > libraries/toc/toc.min.js
modi toc_js- 目錄模組比較
- TOC filter
- 
TOC filter 需在文章內容加入 [toc],雖然可運作,但如果要在另一個 Block 顯示,卻跟 Block 的區域有關,如果要在文章之前的區塊,如 Sidebar First 顯示,那麼 ToC 的內容則不正確。
 Drupal 8 - Table Of Contents From Headings - YouTube
Devel Kint
在 Drupal 8 使用 Kint  (官方模組) 列出變數。
如在 page.html.twig ($site/core/themes/bartik/templates/page.html.twig) 中加入下列,可在網頁中顯示 page 變數內容。
<div id="page-wrapper">
{{ kint(page) }} (1)
  <div id="page">
| 1 | 執行 kint 顯示 page 變數內容,在測試前應先啟用 偵錯模式。 | 
偵錯 php 如在 $site/core/themes/bartik/bartik.theme 中的加入下列,可在管理頁面中顯示變數內容。
function bartik_preprocess_html(&$variables) {
  // 原程式碼
  kint($variables); (1)
}
| 1 | 如果管理頁面顯示錯誤,可改為 ksm($variables); | 
modi kint
composer require kint-php/kint drupal/devel_kint_extras (1)
drush en devel_kint_extras
# The following module(s) will be enabled: devel_kint_extras, devel