阿光與室友ayaka經常在insoler的相片裡面討論關於攝影的心得、分享,或是技術問題。
但是在BOONEX原版的的「通知」功能,只能接受單方向通知!在目前的舊版(其實是原版DolphinPro 7.3.3)的情況,當室友ayaka在阿光上傳的某一張照片,或是幾張照片底下表達意見、想法、看法。在阿光的畫面上會看到這樣的通知訊息。我特別切換到「繁體中文版」,這樣會比較容易說明。
關於這個問題,其實我有在BOONEX討論區提出問題回報,但是很顯然似乎沒人(也就是沒有其他站長)重視這個問題。
Issues: Photo comments and responses
When I comment on some pictures of ABC members, ABC members receive many notifications.
But when the ABC member replies to all the comments I have written, I will not receive any notice.
Photos, videos, sound comments have the same problem.
事實上,我向BOONEX反應關於「comments」評論與「notifications」訊息通知的問題以前,從去年就開始研究這個問題。因為我們都只知道「問題發生的現象」,由於並不是我個人撰寫、研發的網站系統,我當然不可能不知道「通知」的問題,到底是寫在DolphinPro 7.3.3程式碼的哪一個模組裡面?
因此我花了很多時間在:
1. 到處搜尋可能的程式碼。雖然不知道可能的程式碼是什麼,只好從「通知」的訊息,去追尋可能的程式碼。
2. 在可疑的程式碼裡面加上一小段副程式,把「變數內容」寫入到一個指定的檔案。因為無法直接用echo顯示在網頁上。即使我是在「insoler地下社群網站」來研究這個問題。直接用PHP的echo雖然會破壞正式產生的網頁,但重要的是往往無法得到我想要的結果,甚至常常完全無法顯示在網頁上。
3. 找尋與「通知」有關的MySQL資料表。
4. 理解通知程式碼與MySQL資料表之間的關係。
在沒有完全理解清楚以前,可說是完全有看沒有懂!所以就這樣又因為有許多事情,擱置了一些時間,每次有空要再繼續研究,還得先花點時間「回想」之前觸礁的問題,到底是卡在哪裡?
最後終於確認「通知」程式碼是寫在 inc/classes/BxDolFilesModule.php 裡面。但真正問題是,就算找到問題所在,要如何解決?這又讓我傷透腦筋,想了很久,又研究很久以後,終於想到了解決辦法。
我盡量在不新增「通知語系」(因為必須要對應多國語言)的情況下,解決了「通知」的問題。現在新的通知看起來會非常的一目瞭然。一看就知道是在「IMG_9472」「DSC_1538」... 等照片,兩位參與討論。
當然,我必須一次解決單方向「通知」的問題,並不只是改寫「通知訊息」內容而已。所以在修正後的「全新通知」可以讓參與討論的「多人」可以都到通知。例如...
1. 阿光上傳了一張「IMG_0001」的照片
2. 室友ayaka在「IMG_0001」照片底下發表一些想法。
這時候阿光會在「通知」看到「在IMG_0001照片ayaka對進藤ヒカル表達想法」的通知訊息。(到這裡為止是以前的動作)
3. 阿光收到「通知」訊息以後,可以直接點選通知的「IMG_0001」照片的連結,看到ayaka發表的想法,然後直接回覆ayaka的意見。
這時候ayaka會在「通知」看到「在IMG_0001照片進藤ヒカル對ayaka表達想法」的通知訊息。(這是新的動作)
而且以上的兩個人的互相討論、互相通知,可以一直持續下去,並沒有受到討論次數的限制。但是「向右內縮」的網頁版面,會受到一些限制。
1. 阿光上傳了一張「IMG_0001」的照片
2. 室友ayaka在「IMG_0001」照片底下發表一些想法。
這時候阿光會在「通知」看到「在IMG_0001照片ayaka對進藤ヒカル表達想法」的通知訊息。(到這裡為止是以前的動作)
3. 我(蘇言霖)在「IMG_0001」的照片,看到底下室友ayaka發表的意見,我也在ayaka底下回覆一些想法。
這時候室友ayaka會在「通知」看到「在IMG_0001照片蘇言霖對ayaka表達想法」的通知訊息。(這是新的動作)
因為我是直接回覆ayaka的意見,所以原本上傳照片的進藤ヒカル,並不會收到任何通知。(這是目前的功能,事實上YouTube也是採用相同的通知模式)
4. 室友ayaka在看到通知訊息以後,可以對我寫的想法,再以回覆發表其他意見。
這時候蘇言霖會在「通知」看到「在IMG_0001照片ayaka對蘇言霖表達想法」的通知訊息。(這是新的動作)當然進藤ヒカル,並不會收到任何通知。
簡單的說,當你對於某一個「討論」回覆意見的時候,對方就會收到「通知」,而且對方在收到「通知」以後,回覆新的想法,你也會再次收到「通知」。
我終於一次解決了BOONEX原廠只能單向通知,而且永遠都只能通知「上傳照片的人」。其他人的互相討論,其實原本並不會收到任何通知訊息,這就會導致「互動」上的困難。常常或是不斷看對方帳號的「時間表」看看有沒有回信、回覆討論,實在是太辛苦。利用「瀏覽器」的書籤來記住某些照片的討論網頁,不時回去看看有沒有回信或回覆討論,也同樣的痛苦!
其實我有空就會去看一下BOONEX的討論區,如果他們在討論問題時有附上網址的話,就會去看看同樣使用BOONEX的系統架設的其他網站,我發現其他網站幾乎不太使用照片、部落格模組!照片模組幾乎都是用來上傳頭像,頂多是一些簡單的照片。就連這個奇怪的照片張貼時間會變成01.01.1970的怪異問題,BOONEX自己也搞不清楚,討論很久以後才確認是Bug無誤。
Share photo date error 01.01.1970
我猜想大概是許多使用海豚系統架設的網站,因為部落格模組的功能遠不如WordPress,所以很少有會員想要在該網站的部落格寫日誌、文章。更由於相片模組幾乎都是用在上傳頭像,也沒人會去討論別人的大頭照,所以部落格、照片底下的「評論」與「回覆」功能就更少人使用,當然也就沒人在意「回覆」時候的「通知」功能。
「回覆」的「通知」功能看起來好像很容易解決,其實真的並沒有那麼簡單。我猜想很可能因為BOONEX不同的人,分別負責撰寫、維護不同的模組,其中的「相簿」、「影片」、「聲音」剛好是某一個人或是某一個小組負責,而另外的人則是負責「部落格」、「投票」、「事件」、「社團」等模組。
從user的角度來看,不管是「照片」底下的評論,「部落格」底下的評論,還是「影片」、「聲音」底下的評論(雖然這兩個模組,目前還沒有內容)基本上都是「評論」,看起來功能都一樣,全部都是只能單向通知,無法雙向通知。
但其實「相簿」、「影片」、「聲音」的評論的通知是寫在我前面提到的 inc/classes/BxDolFilesModule.php 裡面,如果你手上還有海豚系統的原始程式碼,只要搜尋一下:
bx_import('BxDolFilesModule');
就會發現只有 BxPhotosModule.php、BxSoundsModule.php、BxVideosModule.php 這三個模組程式會載入「BxDolFilesModule.php」模組。因此,就算我修正了相片模組底下的「評論」的「回覆」時的「通知」功能,事實上「部落格」底下的「評論」仍舊是單向通知,完全沒有被修正!
因為寫在「BxDolFilesModule.php」模組程式裡面的「評論」與「通知」功能的這個副程式:
function serviceGetSpyPost()
部落格與其他模組並不使用!部落格模組反而在自己的「BxBlogsModule.php」裡面,另外寫一個「評論」與「通知」功能:
function serviceGetSpyPost()
雖然 function 副程式的名稱完全相同,但因為「BxBlogsModule.php」不會載入「BxDolFilesModule.php」模組,也不會繼承「class BxDolFilesModule」類別,重載同樣名稱的 serviceGetSpyPost 副程式。
按照「物件導向」的基本結構,只要是相同的功能,應該只寫在一個模組裡面,被其他物件或是副程式拿去使用才對。就算其他物件、副程式因為有不同的需求,需要改變功能或是增加功能,也應該要重載(Override、也許中國會使用不同的翻譯名詞)同樣名稱的 serviceGetSpyPost 副程式。但很顯然BOONEX並沒有完全這樣做。
簡單的說,BxPhotosModule.php、BxSoundsModule.php、BxVideosModule.php 這三個模組程式裡面根本就沒有這個副程式:
function serviceGetSpyPost()
因為這個副程式寫在「BxDolFilesModule.php」裡面。而其他的投票、事件等模組,則是部落格在自己的 class BxBlogsModule 類別裡面,寫了自己專屬的 function serviceGetSpyPost,父類別沒有這個副程式,只有繼承的子類別才有。當然就不可能去修正父類別。
所以對我來說,就算花很多時間,從語系、從資料庫的資料表,找到評論的「通知」功能,也總算找到負責處理的 serviceGetSpyPost 副程式,但是要如何解決?卻非常的傷腦筋!
如果按照「部落格」與其他模組的「類別使用習慣」,我應該要在BxPhotosModule.php、BxVideosModule.php、BxSoundsModule.php、 這三個模組裡面用Override重載同樣名稱的function serviceGetSpyPost,然後修正評論的通知問題。但是真的這麼做的話,我就得分別在「相片」、「影片」、「聲音」的類別裡面新增三個function serviceGetSpyPost,再去個別模組修正每一個serviceGetSpyPost的通知問題。
真的這樣做的話就太蠢了!完全脫離「物件導向程式設計」的原則。既然「相片」、「影片」、「聲音」的父類別裡面的function serviceGetSpyPost有問題,我只要修正父類別,也就是只要修正好一個 inc/classes/BxDolFilesModule.php 類別模組,理論上「相片」、「影片」、「聲音」應該是全部一次都會修正完畢。因為這三個模組都沒有自己重新定義serviceGetSpyPost。
但是,部落格與其他模組,全部都沒有在父類別有寫serviceGetSpyPost副程式,全部都是在最後的 class BxBlogsModule 類別裡面,自己長出來新的function serviceGetSpyPost功能,也因此,我即使修正好部落格的評論的通知,也不會解決投票、事件、社團等其他模組。由於insoler目前還沒有使用投票、事件、社團這些模組,所以更簡單的說...
我其實只修正好「照片」與「部落格」這兩個模組的評論回覆的雙向通知而已。當然理論上,「影片」與「聲音」的評論的通知也會一併修正,但其實我並沒有實際測試影片與聲音。所以只能說「理論上」應該也會被修正好才對。
看到這裡,如果你已經覺得頭昏,那也是很正常的。因為我就是被BOONEX的不規則類別行為弄到一個頭N個大,也才會導致很難很快的解決一個從user角度來看,似乎是一個很簡單的「回覆的通知」的問題而已。
這就像是謎一般的「01.01.1970」怪異問題。表面上問題看起來似乎很簡單,就只是回覆評論時,竟然不會通知對方而已,實際上處理起來,卻非常的棘手。