第十章:後端擴充性:Add-ons 與進階 Skin
雖然 MoriForms 的核心是透過 JSON 和前端 Skin 來運作,但我們深知,在真實的專案中,總會有一些需求是僅靠前端技術無法或不應解決的。例如,與其他 WordPress 插件的資料庫進行安全交互、執行複雜的伺服器端運算、或是在資料儲存的生命週期中注入自訂邏輯。
為此,MoriForms 提供了兩種層級分明、功能強大的後端擴充機制。理解它們各自的適用場景,是成為 MoriForms 專家的關鍵一步。
- Add-on 插件 (推薦方式): 用於建立可重用、與外觀無關的通用功能。這是最專業、最安全的擴充方式。
- Skin 的
functions.php
(進階方式): 用於實現與特定 Skin 外觀強烈綁定的輔助性功能。
本章將深入探討這兩種機制,並指導您何時以及如何使用它們。
1. 主要擴充方式:建立 Add-on 插件
當您需要的功能是通用的、可以和任何 Skin 搭配使用的,那麼建立一個獨立的 Add-on 插件是官方推薦的最佳實踐。
適用情境:
- 將提交的資料同步到第三方 CRM 或電子報服務 (如 Mailchimp)。
- 整合進階的垃圾訊息過濾器 (如 Akismet)。
- 在表單提交後,自動在另一個自訂文章類型中建立一篇文章。
- 實現任何與特定外觀無關的商業邏輯。
Add-on 的核心是利用 MoriForms 引擎提供的一系列全域勾點 (Hooks),這些勾點在您專案的內部開發規格文件中有詳細定義。
實戰範例:建立一個「簡易 CRM 同步」Add-on
讓我們來建立一個簡單的 Add-on。當一個特定的「聯絡我們」表單被提交後,它會模擬一次 API 呼叫,將使用者姓名和 Email 傳送到外部 CRM 系統。
-
建立插件檔案: 在您的
wp-content/plugins
目錄下,建立一個名為moriforms-simple-crm
的資料夾,並在其中建立一個檔案moriforms-simple-crm.php
。 -
撰寫插件程式碼: 打開
moriforms-simple-crm.php
並貼上以下內容:PHP
<?php /** * Plugin Name: MoriForms - Simple CRM Sync * Description: An add-on for MoriForms that syncs new submissions to a fake CRM. * Version: 1.0.0 * Author: Your Name */ // 防止直接存取 if (!defined('ABSPATH')) { exit; } // 1. 先檢查 MoriForms 主插件是否存在並啟用 add_action('plugins_loaded', 'moriforms_simple_crm_init'); function moriforms_simple_crm_init() { if (!class_exists('MoriForms_Engine')) { // 如果主插件未啟用,則不執行任何操作 return; } // 2. 將我們的核心邏輯掛載到 MoriForms 最重要的 Action Hook 上 add_action('moriforms_after_submission_saved', 'moriforms_sync_to_crm', 10, 3); } /** * 將提交的資料同步到 CRM。 * * @param int $submission_id 新建立的提交紀錄 ID。 * @param array $validated_data 已通過伺服器驗證的表單資料。 * @param object $form_schema 該表單的完整 Schema 物件。 */ function moriforms_sync_to_crm($submission_id, $validated_data, $form_schema) { // 3. 檢查是否為我們感興趣的表單,避免所有表單都觸發 if ($form_schema->formName !== '極簡聯絡表單') { return; } // 4. 從驗證後的資料中取得姓名和 Email $name = $validated_data['customer_name'] ?? null; $email = $validated_data['customer_email'] ?? null; if (!$name || !$email) { return; // 如果缺少必要資料,則中止 } // 5. 模擬一次對外部 CRM API 的呼叫 $crm_endpoint = 'https://api.fake-crm.com/leads'; $response = wp_remote_post($crm_endpoint, [ 'method' => 'POST', 'headers' => ['Content-Type' => 'application/json'], 'body' => json_encode([ 'name' => $name, 'email' => $email, 'source'=> 'MoriForms Submission #' . $submission_id ]), ]); // (可選) 根據回應結果,在 MoriForms 的日誌中記錄操作 if (is_wp_error($response)) { error_log('MoriForms CRM Sync Failed: ' . $response->get_error_message()); } }
-
啟用與測試: 到 WordPress 後台的「外掛」頁面啟用 "MoriForms - Simple CRM Sync"。現在,每當「極簡聯絡表單」被成功提交後,上述的
moriforms_sync_to_crm
函數就會被自動觸發。
2. 進階擴充方式:使用 Skin 的 functions.php
這是一個可選的、專為進階 Skin 設計的便利工具,它允許 Skin 捆綁一些與自身外觀或功能強烈相關的 PHP 邏輯。
安全性第一 (Security First) MoriForms 引擎會對 Skin 包中的
functions.php
檔案執行嚴格的安全掃描。任何可疑的程式碼,如eval()
、file_put_contents()
或直接存取$_POST
等,都會導致 Skin 安裝失敗。此檔案只應用於實現與外觀相關的輔助功能。
適用情境:
- 動態產生一個
select
欄位的選項(例如,從 WordPress 的文章分類中讀取)。 - 為您的
template.html
提供自訂的、僅此 Skin 使用的模板佔位符 (Tokens)。
實戰範例:為模板新增一個「問候語」佔位符
我們在第九章中介紹過,可以使用 moriforms_template_tokens
這個 Filter 來新增自訂佔位符。這正是 functions.php
的完美應用場景。
-
在 Skin 中建立
functions.php
: 在您的minimalist-contact
Skin 資料夾中,建立functions.php
檔案。PHP (
functions.php
)<?php if (!defined('ABSPATH')) exit; /** * 為模板提供一個動態的問候語。 * @return string */ function minimalist_contact_get_greeting() { if (is_user_logged_in()) { $user = wp_get_current_user(); return '歡迎回來,' . esc_html($user->display_name) . '!'; } return '歡迎訪客!'; } /** * 將問候語註冊為一個模板佔位符。 */ add_filter('moriforms_template_tokens', function($tokens, $form_id) { // 我們將 {{greeting_message}} 這個佔位符,賦值為上面函數的執行結果 $tokens['{{greeting_message}}'] = minimalist_contact_get_greeting(); return $tokens; }, 10, 2);
-
在
template.html
中使用它: 現在,您可以直接在您的template.html
中使用這個新的佔位符。HTML (
template.html
)<div id="{{container_id}}" class="minimalist-contact-wrapper"> <h2>{{greeting_message}}</h2> <div class="form-messages" role="alert"></div> </div>
MoriForms 引擎在渲染模板時,會自動找到並替換這個佔位符。
總結:如何選擇正確的擴充路徑
比較面向 | Add-on 插件 (推薦) | Skin 的 functions.php (進階) |
---|---|---|
適用情境 | 通用功能,與外觀無關 (CRM整合、垃圾訊息過濾) | 與特定 Skin 強相關的輔助功能 (動態產生選項、自訂模板標籤) |
耦合度 | 低 (解耦):功能獨立於任何特定 Skin。 | 高 (耦合):功能與 Skin 的設計緊密綁定。 |
可重用性 | 高:一個 Add-on 可服務於所有 Skin。 | 低:功能只對其所在的 Skin 生效。 |
安全性 | 最高:遵循 WordPress 標準插件安全模型。 | 高:受 MoriForms 引擎的嚴格程式碼掃描限制。 |
建議時機 | 絕大多數情況下。 當您想為 MoriForms 新增一項「功能」時。 | 極少數情況下。 當您想為一個特定的「外觀」提供動態資料時。 |
下一步
恭喜您完成了 MoriForms 開發者文件的核心學習部分!從核心理念、Schema 設計、Skin 開發,到前後端的互動與擴充,您已經掌握了使用 MoriForms 打造專業級表單所需的全方位知識。