Post view

終於完成在insoler首頁新增一個「討論區最新話題」的區塊

事實上在幾年前,最早一開始架設insoler社群網站的時候,我就想要在網站首頁放入一個討論區的「最新話題」的區塊,因為在原本舊的BNW會議室的首頁就有這種功能。由於BNW會議室是使用phpBB架設的討論區,原本是沒有這種功能,是因為我另外加裝了模組,大幅度修改phpBB的風格版型,所以才能在BNW會議室的首頁列出「會議室最新話題」。

然而,新的海豚系統竟然也沒有這種功能!事實上海豚系統本身也沒有討論區這個模組,而是直接整合一個叫做「Orca Interactive Forum」的討論區系統到海豚裡面。雖然整合「Orca Interactive Forum」的功能在經過多年以後,已經看起來很像是海豚的內部模組,但其實仍舊是相當獨立的模組,有很多原本在「Orca Interactive Forum」的獨立的帳號管理功能都還保留在PHP程式碼裡面,但其實已經完全失去作用!

另外一個問題是海豚系統其實只有把「Orca Interactive Forum」整合到獨立的「Forum」功能表裡面,就連「搜尋討論區內容」都還是要靠「Orca Interactive Forum」的搜尋功能,單獨運作,而不是做到完全看不出來是使用別人寫的討論區。

也因此就連一個非常簡單的在網站首頁放入一個討論區的「最新話題」的區塊,這種需求都無法簡單的完成!經過漫長的等待、忍耐,我在「13 Jun 2016」在原廠網站問了這樣的問題,但卻沒有得到有效的回應。大概是想要「在網站首頁放入一個最新話題的區塊」的站長很少的關係吧?

Forum RECENT TOPICS put on the Homepage?

In the new version of Dolphin, add a RECENT TOPICS block on Homepage?

這就是完成的結果。這是繁體中文版的畫面:

這是簡體中文版的畫面:

這是日本語版本的畫面:

在討論區最新話題的右邊有一個很大的「+」號按鈕,可以用來新增話題。

點選「+」號按鈕就會進入文章的編輯畫面。

其實在海豚系統的「網站首頁」的區塊管理功能裡面,有一個「討論區最新話題」的區塊。但是這個區塊是使用RSS Feed功能來完成,而不是一個系統內建的區塊。雖然透過RSS Feed也可以顯示「討論區最新話題」,但問題是在瀏覽網站首頁的時候,還會另外透過完全不同的RSS Feed功能來顯示討論區的最新話題(還會包括部分內容摘要),看起來會非常奇怪!所以我不使用這個RSS Feed功能做出來的簡陋「討論區最新話題」功能。

要做出一個看起來完全像是海豚的內建功能,就只能花很多時間「徹底研究」海豚首頁區塊的模組,在目前的部落格、相簿等區塊,另外新增一個「討論區最新話題」區塊。

在MySQL資料表的sys_page_compose裡面,用來記錄所有版面的區塊。所以要在index首頁新增一個「討論區最新話題」區塊,就必須在這裡新增一筆資料。Page欄位的位置是index。Func欄位的功能是PHP。Content欄位的內容是:

return BxDolService::call('forum', 'forum_index_page');

這個簡短的PHP程式碼指令其實是參考其他的部落格區塊、新聞區塊等功能做出來的。

return BxDolService::call('blogs', 'blogs_index_page');

return BxDolService::call('news', 'featured_block_index', array(0, 0, false));

return BxDolService::call('news', 'archive_block_index', array(0, 0, false));

return BxDolService::call('spy', 'get_spy_block');

然而,只是在sys_page_compose資料表新增一筆資料,並不會有任何作用!相反的把這個新增的區塊移動到首頁的時候,還會因為找不到forum_index_page這個function函式而發生嚴重的PHP錯誤,導致網頁一片空白!

因為實際上並不存在一個function函式叫做forum_index_page。所以還必須把所需的其他功能全部都完成,這個新的forum_index_page函式才能正常運作。我花了很多時間,在forum模組的class類別檔案夾裡面,新增了4個PHP程式:

BxOrcaConfig.php

BxOrcaDb.php

BxOrcaTemplate.php

BxOrcaModule.php

在BxOrcaConfig.php副程式裡面,其實是一個空白的物件。雖然是空白物件,但是因為海豚系統會自動執行這個物件,所以只好建立一個空白物件。


class BxOrcaConfig
{

}

?>

在BxOrcaDb.php副程式裡面,事實上也是一個空白物件。因為我不需要重新設計一個「BxOrca」系列專用的「物件」。這是一個資料庫專用物件。


class BxOrcaDb
{

}

?>

在BxOrcaDb.php副程式裡面,幾乎也是一個空白物件,裡面只有一個空白的loadTemplates副程式。


class BxOrcaTemplate
{

    function loadTemplates()
    {
    }

}

?>

也就是說真正負責完成「討論區最新話題」區塊,以及實作forum_index_page函式,全部都是放在BxOrcaModule.php這個副程式裡面。其實整個海豚系統裡面也沒有一個叫做forum_index_page的函式,因為「某種理由」實際上的副程式名稱會轉換成另外一個名稱。其實我也不知道是什麼樣的理由,需要轉換副程式名稱,只有原廠的程式設計者才知道。

在資料庫裡面寫的forum_index_page的副程式名稱,會移除所有的 _ 底線符號,然後把首字改成大寫,變成「ForumIndexPage」然後再前面加上一個service名稱。當然,海豚系統會自動呼叫「BxOrca」開頭的物件,所以會自動執行「class BxOrcaModule」這個物件。當然,這也是徹底研究很久以後,才知道的事情。

class BxOrcaModule extends BxDolModule
{
    function serviceForumIndexPage()
    {

        ............
    }
}

?>

老實說,我真的不知道為什麼需要轉換副程式名稱。在資料庫裡面直接寫副程式名稱,不是更簡單易懂?

return BxDolService::call('forum', 'serviceForumIndexPage');

從02.03.2012的5年多前買了海豚系統,建立一個新的insoler網站,在一年多前,在原廠的討論區詢問了Forum RECENT TOPICS put on the Homepage? 的問題,我花了5年多的時間,直到現在才終於完成這個看似非常簡單,卻非常困難,相當棘手的功能。

雖然說看似非常簡單,卻非常困難,但其實BxOrcaModule.php副程式全部才73行程式碼,還包含英語、日本語、繁體中文、簡體中文、韓語、俄語的翻譯。也就是說function serviceForumIndexPage內容一點都不複雜也不難懂。

由於我一直不知道為什麼forum_index_page會變成實際上是呼叫serviceForumIndexPage這個副程式,也不知道為什麼會自動執行class BxOrcaModule這個物件,所以才會花了非常多的時間,才完成這個看似簡單,其實是很頭痛的功能。

新增海豚系統原本沒有的功能

到現在為止,我已經幫海豚系統新增了許多原廠沒有的功能,包括:

1. insoler「雲端相簿」支援直接上傳「RAW照片」檔案,並自動轉成JPEG顯示在相簿裡面

這是第一個,世界初、支援RAW可與寫真愛好者交流「RAW相片」的交友社群網站。所有會員都可以直接上傳RAW照片檔案,網站系統會自動把RAW轉換成JPEG,顯示在會員的相簿裡面。insoler的「雲端相簿」並沒有限制與計算相簿容量功能,所以目前是「無限制容量」。雖然如此,目前也只有某阿光與某中國會員常常使用「insoler雲端相簿」功能。

2. 顯示相片的EXIF資訊與GPS地圖資訊,而且支援多國語系

Dolphin原版只能顯示照片而已,無法顯示EXIF資訊與GPS地圖。

3. 上傳照片使用「非同步」後置處理,上傳照片的時候可以用最高的網路上傳速度,把照片上傳到insoler網站

當然,照片的上傳速度要依據你使用的網路速度為主。雖然我們現在有100M/100M的雙向光纖網路,但因為很少有會員上傳照片,因此實際上能體驗「高速上傳」的人,大概只有某阿光了。

4. 網站完全支援多國語系,包括TinyMCE的編輯器

我個人無法完成多國語系翻譯,所以其實是我自己寫一個翻譯程式,透過微軟翻譯API來翻譯多國語系,目前支援的語系有繁體中文、簡體中文、日本語、英語、俄語、韓語、法語、德語、西班牙語、義大利語、葡萄牙語。

5. 相片、部落格的「評論」功能,可以支援雙向通知功能

原版的海豚系統只有「單向通知」功能,也就是某人(B)在發表意見時單向通知原作者(A),當原作者(A)回覆評論的時候,發表評論的某人(B)卻不會收到任何通知。

6. 在網站首頁新增「討論區最新話題」區塊

原版的海豚系統只能透過RSS Feed在網站首頁顯示「討論區最新話題」區塊。表面上好像可以使用,但其實透過RSS Feed功能的話,瀏覽器會另外呼叫RSS通訊協定,從網站伺服器主機重新送出RSS Feed內容!導致顯示速度更慢,而且還會增加網站伺服器主機與MySQL資料庫主機的負擔。

所以我花了很多時間研究,終於在forum新增了原版沒有的「討論區最新話題」區塊。原版的海豚系統可以在網站首頁顯示「部落格最新日誌」區塊,卻沒有「討論區最新話題」區塊,其實是很奇怪的事情。

7. 支援「更新語系」功能

原本的海豚系統只能匯入新的語系。如果有修改目前語系的內容,例如繁體中文、簡體中文、日本語... 等,必須先刪除語系,才能以匯入新的語系的方式,來匯入修改過的內容。

表面上這似乎沒有什麼太大的問題,但是一但刪除某個語系,比如刪除「繁體中文」就會導致正在用「繁體中文」瀏覽網頁的人,會看到網頁出現亂碼!而且無法刪除系統預設的語系!(預設是英語)如果要刪除系統預設的語系,就必須先把英語改成「繁體中文」,才能刪除英語,再重新匯入修改好的英語!

當然,從資料庫刪除一筆資料,再重新新增一筆資料的話,還會造成資料的ID筆數號碼不斷增加!雖然這不會有太大的問題,但卻很難從對應的ID直接判斷語系。

所以不管是什麼情況,只能「匯入新的語系」是一個非常差,而且是過於簡陋,有點偷工減料的設計!所以我在海豚系統裡面新增了「更新語系」的功能,只要有修改過繁體中文、簡體中文、日本語... 等語系內容,就只要重新匯入一次即可更新完畢。

8. insoler討論區終於可以修改一篇話題的「標題」

由於海豚系統的「討論區」程式系統本身就沒有「發表一篇議題以後,重新修改標題」的功能,所以如果標題裡面打錯字、覺的標題用詞不妥,一但發表討論話題以後,就算打錯字,都無法修改標題內容!其實一個討論區系統,竟然缺少「編輯標題功能」這是非常糟糕的事情。

以前如果會員自己想要修改標題,或是修正錯字,是絕對不可能的任務!這是因為海豚系統的討論區本身就沒有這種設計,並不是因為我禁止會員修改標題!

現在終於可以任意修改文章的標題,或是修改文章的內容。

9. 將MySQL資料庫從3位元編碼的utf8轉換成4位元編碼的utf8mb4

原本海豚系統使用的編碼系統是許多網站常用的utf8_general_ci、utf8_unicode_ci或是utf8_bin。這幾種都是1〜3位元編碼的Unicode多國語系系統。事實上Unicode是一個1〜4位元的多國語系系統,目前最新的版本是2017年6月20日發表的Unicode 10.0.0。由於有一些漢字(屬於極少使用的漢字與異體字)與許多的表情符號,都必須使用4位元編碼的Unicode,所以我把整個資料庫編碼改成最新4位元編碼的utf8mb4_bin或是utf8mb4_general_ci。

這樣就可以在文章裡面直接輸入Unicode 10.0.0支援的表情符號,例如笑臉的「?」、電腦的「?」、滑鼠的「?️」、貓的「?」、狗的「?」,或是漢堡的「?」等等。

蘇言霖 2017/10/14 0 1118
Comments
Order by: 
Per page:
 
  • There are no comments yet
Rate
0 votes
Post info
蘇言霖
「超級懶貓級」社群網站站長
2017/10/14 (2553 days ago)
Actions