開源CMS Drupal整合可視化構建工具GrapesJS(一)
我們之前介紹過相關的可視化頁面構建工具♀☿☼☀☁☂☄,以及開源的GrapesJS的優勢①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯,簡單來說:
GrapesJS是一個開源的多功能Web Builder框架❣❦❧♡۵,提供了豐富的工具與功能來幫助用戶構建他們心目中想要的網頁㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉。借助GrapesJS♦☜☞☝✍☚☛☟✌✽✾✿❁❃,即使是對代碼一竅不通的普通用戶㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉,通過簡單的拖拽組件以及可視化的內容編輯方式☧☬☸✡♁✙♆。,、':∶;,也可以創造出精美的☾☽❄☃、功能豐富的頁面㈠㈡㈢㈣㈤㈥㈦。
對于開發者而言①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯,GrapesJS提供了豐富的API⒜⒝⒞⒟⒠⒡⒢⒣⒤,例如組件系統⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾、樣式系統♦☜☞☝✍☚☛☟✌✽✾✿❁❃、響應式支持等ⓚⓛⓜⓝⓞⓟⓠⓡⓢ,可以讓開發者輕松定制出符合業務要求的可視化網頁編輯器☾☽❄☃,提高開發效率❻❼❽❾❿⓫⓬⓭⓮⓯⓰,節省成本⑰⑱⑲⑳⓪⓿❶❷❸❹❺。
為什么選擇GrapesJS✺ϟ☇♤♧♡♢♠♣♥,我們這里再簡單說一下☾☽❄☃,我們對可視化構建工具的要求有以下幾點:
1. 可視化㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉,2. 開源ⅲⅳⅴⅵⅶⅷⅸⅹⒶⒷⒸⒹ,3. 能擴展①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯,4. 能定義輸出源碼ⓣⓤⓥⓦⓧⓨⓩ,5. 能搭配CMSⅲⅳⅴⅵⅶⅷⅸⅹⒶⒷⒸⒹ,也是說跟內容管理系統集成㈠㈡㈢㈣㈤㈥㈦,而不是一個單獨的工具☾☽❄☃。
所以✵✶✷✸✹✺✻✼❄❅,綜上來說ⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙ,我們選擇了GrapesJSⓣⓤⓥⓦⓧⓨⓩ,完全能滿足以上要求웃유ღ♋♂。
本文就系列性的介紹☾☽❄☃,我們如何整合Drupal♦☜☞☝✍☚☛☟✌✽✾✿❁❃,通過Grapes JS快速構建Drupal的相關主題頁面ⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉ。

GrapesJS技術基礎架構
對于GrapesJS⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓,我們先從技術層面做一個簡單了解⑰⑱⑲⑳⓪⓿❶❷❸❹❺,以方便后續跟Drupal實現落地的整合✵✶✷✸✹✺✻✼❄❅。
從架構上來講⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵❆❇❈❉❊†☨✞✝☥☦☓☩☯,
GrapesJS的代碼架構主要分為以下幾個部分:
-
核心:GrapesJS的核心負責管理頁面的整體布局和交互웃유ღ♋♂,包括模型ⓣⓤⓥⓦⓧⓨⓩ,視圖和控制器的管理✺ϟ☇♤♧♡♢♠♣♥。
-
模型:GrapesJS的模型負責存儲頁面元素的數據⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵❆❇❈❉❊†☨✞✝☥☦☓☩☯。模型使用Backbone.js庫管理數據☾☽❄☃,以便快速和方便地對數據進行操作웃유ღ♋♂。
-
視圖:GrapesJS的視圖負責呈現頁面元素❻❼❽❾❿⓫⓬⓭⓮⓯⓰。視圖使用Backbone.js的視圖系統管理㈠㈡㈢㈣㈤㈥㈦,并通過Mustache.js模板系統呈現數據㈧㈨㈩⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂。
-
控制器:GrapesJS的控制器負責處理用戶交互㈠㈡㈢㈣㈤㈥㈦,如鼠標點擊和鍵盤輸入♦☜☞☝✍☚☛☟✌✽✾✿❁❃。控制器使用jQuery庫進行事件處理⑰⑱⑲⑳⓪⓿❶❷❸❹❺,并通過核心管理模型和視圖✺ϟ☇♤♧♡♢♠♣♥。
-
插件:GrapesJS的插件負責擴展GrapesJS的功能⒜⒝⒞⒟⒠⒡⒢⒣⒤。插件可以使用核心♀☿☼☀☁☂☄、模型⒔⒕⒖⒗⒘⒙⒚⒛ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅰⅱ、視圖和控制器的功能⑰⑱⑲⑳⓪⓿❶❷❸❹❺,以實現自定義的功能✤✥❋✦✧✩✰✪✫✬✭✮✯❂✡★✱✲✳✴。
通過上述分析ⅲⅳⅴⅵⅶⅷⅸⅹⒶⒷⒸⒹ,我們可以看出GrapesJS的代碼架構是非常靈活和可擴展的⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾,它使用了多種開源庫✤✥❋✦✧✩✰✪✫✬✭✮✯❂✡★✱✲✳✴,以提供快速和方便的功能☧☬☸✡♁✙♆。,、':∶;,并可以通過插件擴展其功能☾☽❄☃。
GrapesJS本身自帶了一些基礎插件✺ϟ☇♤♧♡♢♠♣♥,包括一些常見的控件☈⊙☉℃℉❅,作為可視化編輯器可以開箱即用❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣,而作為框架⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾,它也提供了豐富的API❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣,可以滿足我們實現更多的擴展⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓。
主要包括以下幾點:
- Block Manager - 用戶可以開發自己的控件和組件ⅲⅳⅴⅵⅶⅷⅸⅹⒶⒷⒸⒹ,并實現動態加載㈠㈡㈢㈣㈤㈥㈦。還支持將不同組件拼湊在一起①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯,實現新的復合組件
- Style Manager - 自帶的樣式編輯器ⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙ,涵蓋了常用的CSS屬性㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉,可以像PS一樣去調整頁面元素的樣式①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯。用戶可以自定義出符合自己需求的樣式編輯器
- Asset Manager - 自帶圖片管理器✤✥❋✦✧✩✰✪✫✬✭✮✯❂✡★✱✲✳✴。同時支持替換為自己的圖片解決方案⒜⒝⒞⒟⒠⒡⒢⒣⒤。
- Commands - 即自定義操作㈠㈡㈢㈣㈤㈥㈦,如復制㈧㈨㈩⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂、組件的上移✵✶✷✸✹✺✻✼❄❅、下移等①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯,可以將一些復雜的邏輯變成一個普通的命令綁定到一個按鈕上☾☽❄☃。
- Traits - Trait定義了組件的參數和行為⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵❆❇❈❉❊†☨✞✝☥☦☓☩☯,而GrapesJS默認提供了幾種類型㈠㈡㈢㈣㈤㈥㈦,通過簡單的聲明就可以生成組件的設置項♀☿☼☀☁☂☄。

Drupal與GrapesJS的集成
Drupal作為CMS系統✵✶✷✸✹✺✻✼❄❅,提供了完善的內容管理⒔⒕⒖⒗⒘⒙⒚⒛ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅰⅱ,但其自帶的主題系統☾☽❄☃,雖然強大❣❦❧♡۵,卻具備一定的開發門檻㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉,普通用戶想修改頁面的內容頁面臨成本高的問題✵✶✷✸✹✺✻✼❄❅。
在引入GrapesJS后✤✥❋✦✧✩✰✪✫✬✭✮✯❂✡★✱✲✳✴,用戶能夠將可重復使用ⅲⅳⅴⅵⅶⅷⅸⅹⒶⒷⒸⒹ、輕松編輯的組件轉換成Drupal可以認識的Twig模板ⓚⓛⓜⓝⓞⓟⓠⓡⓢ,可視化的內容⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓、樣式編輯代替了傳統的代碼開發♀☿☼☀☁☂☄,不管是開發者或是站點維護者都能從中受益ⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉ。
為了實現這一目標❣❦❧♡۵,Drupal需要建立一套基于Twig的組件庫ⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉ,GrapesJS則需要實現一個Twig的解析器ⓣⓤⓥⓦⓧⓨⓩ,從而能在用戶將twig組件放到編輯區時㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉,轉換為HTML內容✺ϟ☇♤♧♡♢♠♣♥。當用戶構建完頁面后⒜⒝⒞⒟⒠⒡⒢⒣⒤,借助自定義的API服務將頁面結構ⓣⓤⓥⓦⓧⓨⓩ、組件數據等保存到Drupal數據庫中☧☬☸✡♁✙♆。,、':∶;,并自動生成一個完整的twig頁面模板文件 (page template)ⓚⓛⓜⓝⓞⓟⓠⓡⓢ,供Drupal渲染頁面時使用⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓。這樣一來⒔⒕⒖⒗⒘⒙⒚⒛ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅰⅱ,只要開發者提供了足夠豐富的組件㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉,普通用戶就可以輕松地創建維護自己的站點頁面了ⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙ。
詳情的技術結構ⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙ,參考下圖:

1. 在GrapesJS里解析twig
Twig不是HTMLⓚⓛⓜⓝⓞⓟⓠⓡⓢ,當GrapesJS加載一段twig代碼時ⅲⅳⅴⅵⅶⅷⅸⅹⒶⒷⒸⒹ,GrapesJS會將其顯示為普通文本①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯,這顯然不是我們想要的結果☾☽❄☃,解決這一問題有兩種方法:
- 實現一個自定義的標簽解析器☈⊙☉℃℉❅,當twig加載時❣❦❧♡۵,將其轉為HTML注釋㈠㈡㈢㈣㈤㈥㈦,同時生成占位元素♀☿☼☀☁☂☄。
- 實現一個即時的twig渲染服務ⓚⓛⓜⓝⓞⓟⓠⓡⓢ,當twig加載時㈧㈨㈩⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂,將twig模板片段發送給服務①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯,獲得真正的HTML并顯示于頁面
方法一在客戶端即可完成❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣,簡單快速♀☿☼☀☁☂☄,缺點是無法看到真實的頁面效果
方法二需要不停調用API服務①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯,會有一定的網絡消耗❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣,但更接近真實的頁面效果
2. 為GrapesJS制作Twig組件
GrapesJS的Block Manager允許其加載遠程的組件庫⒔⒕⒖⒗⒘⒙⒚⒛ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅰⅱ。為此☧☬☸✡♁✙♆。,、':∶;,我們在Drupal下實現了一套組件庫機制ⓣⓤⓥⓦⓧⓨⓩ,借鑒Drupal modules的實現❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣,每個組件均為一個文件夾㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉,其下有組件元數據描述文件ⓣⓤⓥⓦⓧⓨⓩ,模板html文件以及jsⓚⓛⓜⓝⓞⓟⓠⓡⓢ、css文件ⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉ。
例如一個hero文件夾就代表了一個hero組件ⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙ,hero目錄下會有 hero.info.yml, hero.twig, hero.css, hero.js 幾個文件
在GrapesJS初始化的過程中✺ϟ☇♤♧♡♢♠♣♥,通過API獲取組件列表并動態添加到組件庫里♦☜☞☝✍☚☛☟✌✽✾✿❁❃。以hero舉例웃유ღ♋♂,當組件被使用時㈠㈡㈢㈣㈤㈥㈦,hero.twig里的內容會經過解析器被加載到GrapesJS的編輯區❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣,同時會被加載的還有hero.css和hero.jsⅲⅳⅴⅵⅶⅷⅸⅹⒶⒷⒸⒹ。這樣hero的UI/UX就被還原到編輯區里☧☬☸✡♁✙♆。,、':∶;。
組件的使用上還能分為兩種形式: 引用形式和副本形式
- 引用形式 - 頁面保存時㈧㈨㈩⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂,只保存組件的ID✺ϟ☇♤♧♡♢♠♣♥,以include hero.twig的形式來使用組件ⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉ。這種形式下㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉,對組件的更新會自動對頁面生效㈧㈨㈩⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂。
- 副本形式 - 頁面保存時✵✶✷✸✹✺✻✼❄❅,將hero.twig里的內容直接保存⒔⒕⒖⒗⒘⒙⒚⒛ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅰⅱ。對組件的更新不會自動對頁面生效❻❼❽❾❿⓫⓬⓭⓮⓯⓰,用戶必須編輯頁面웃유ღ♋♂,刪除原來的組件并重新添加才能獲得更新✺ϟ☇♤♧♡♢♠♣♥。但好處是用戶可以修改組件的內容⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵❆❇❈❉❊†☨✞✝☥☦☓☩☯、html等而不影響其他頁面⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵❆❇❈❉❊†☨✞✝☥☦☓☩☯。
3. 持久化存儲 Landing Page
GrapesJS 的 Storage Manager 支持將頁面導出為 html 或 json 格式♦☜☞☝✍☚☛☟✌✽✾✿❁❃,同時還有通過樣式編輯器生成的css☈⊙☉℃℉❅。
在與 Drupal 的結合中⒜⒝⒞⒟⒠⒡⒢⒣⒤,HTML會被保存為模板文件ⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙ,json會被保存為entity(例如類型為 landing_page 的 node )⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾,而css可以同時存到模板中與entity里ⅲⅳⅴⅵⅶⅷⅸⅹⒶⒷⒸⒹ。當頁面需要更新時☈⊙☉℃℉❅,GrapesJS會加載entity里的json來恢復page的編輯狀態⒔⒕⒖⒗⒘⒙⒚⒛ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅰⅱ,在更新完成后ⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙ,又重新保存為entity♦☜☞☝✍☚☛☟✌✽✾✿❁❃,并更新模板文件❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣。
可以看到⒜⒝⒞⒟⒠⒡⒢⒣⒤,只要有豐富的組件庫☧☬☸✡♁✙♆。,、':∶;,Drupal構建頁面將變得十分輕松☧☬☸✡♁✙♆。,、':∶;。對于開發者而言㈠㈡㈢㈣㈤㈥㈦,不用再去了解熟悉Drupal的主題機制⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵❆❇❈❉❊†☨✞✝☥☦☓☩☯,只需要了解Twig⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵❆❇❈❉❊†☨✞✝☥☦☓☩☯,甚至僅僅是HTML和CSS就足夠了⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵❆❇❈❉❊†☨✞✝☥☦☓☩☯;對于使用者而言☧☬☸✡♁✙♆。,、':∶;,所見即所得的編輯方式不僅提升了創作體驗ⓚⓛⓜⓝⓞⓟⓠⓡⓢ,也提高了工作效率♀☿☼☀☁☂☄。
4. 應用Drupal的twig模板
GrapesJS 生成了twig模板之后㈧㈨㈩⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂,將模板按照Drupal的規范組織ⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉ,加上info文件웃유ღ♋♂、加上對應的API調用機制✤✥❋✦✧✩✰✪✫✬✭✮✯❂✡★✱✲✳✴、加上assets(圖片等)資源的引用處理ⓚⓛⓜⓝⓞⓟⓠⓡⓢ,就可以生成一個標準的Drupal模板來使用了⒔⒕⒖⒗⒘⒙⒚⒛ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅰⅱ。

創作不易✤✥❋✦✧✩✰✪✫✬✭✮✯❂✡★✱✲✳✴,轉載請注明出處❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣!
更多Drupal以及內容管理系統⑰⑱⑲⑳⓪⓿❶❷❸❹❺,請參考我們其他相關文章♦☜☞☝✍☚☛☟✌✽✾✿❁❃,
Drupal與GrapesJS的集成演示請點擊這里>>
更多GrapesJS開發以及Drupal CMS相關內容✤✥❋✦✧✩✰✪✫✬✭✮✯❂✡★✱✲✳✴,請參考我們其他相關文章⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵❆❇❈❉❊†☨✞✝☥☦☓☩☯,
1ⓣⓤⓥⓦⓧⓨⓩ、常見開源可視化低代碼頁面構建框架對比
2⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾、開源可視化低代碼頁面構建框架GrapesJS介紹
3⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓、開源CMS Drupal整合可視化構建工具GrapesJS(一)
4❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣、開源可視化頁面框架GrapesJS教程(二)- 組件開發
5⑰⑱⑲⑳⓪⓿❶❷❸❹❺、可視化頁面框架GrapesJS開發教程(三)- 與Drupal CMS整合
6㈠㈡㈢㈣㈤㈥㈦、開源可視化頁面框架GrapesJS開發教程(四)- 創建 Block
7ⓚⓛⓜⓝⓞⓟⓠⓡⓢ、CMS與可視化構建工具GrapesJS整合之動態組件開發(五)
8♀☿☼☀☁☂☄、常見的CMS平臺比較
9웃유ღ♋♂、在線展覽和多媒體展示建設方案
10✺ϟ☇♤♧♡♢♠♣♥、構建英文網站應該用什么框架✵✶✷✸✹✺✻✼❄❅?
11⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵❆❇❈❉❊†☨✞✝☥☦☓☩☯、外貿網站如何通過SEO和內容引流ⓣⓤⓥⓦⓧⓨⓩ?