Opencart是一款由PHP寫成的購物平台系統搭配MySQL資料庫,前後端完整也有不少可以購買的擴充套件,它的授權方式為GPLv3,可以自由地使用更改程式。
但Opencart有一個很詭異的現象,就是它沒有一個像樣的說明文件可以查,不信邪的可以找各大搜尋引擎試試。
雖然沒好的文件可以查,不過把程式碼一行行看還是能掌握七八成,畢竟早晚必定要寫擴充套件,甚至要去修改部分程式碼。
我打算在接下來幾周內,寫一些關於Opencart的文章,會包含基本的擴充模組撰寫與可戶端頁面的改動,主要是會針對3.0.2版,因為新版的教學並不多,另外一定會有金流的部分,會使用綠界,不是因為特別好用或是要廣告,純粹在案子中使用了,綠界的Opencart擴充套件目前沒有支援3.0.X版本,所以一定會有一篇來手動升級擴充套件,在寫這篇文章的時候已經升級完成,不難但有點累。
先分享兩個不錯的教學
第一個 Sajal Soni的教學主題很多,找需要的主題就即可,不然內真的太多。
另一個 台灣碼農在IT邦幫忙鐵人賽活動中所寫的教學,其中還有購買擴充模組踩雷的經驗。
最後,希望可以靠接案子生活
如果你碰到任何Opencart的問題歡迎留言或是寫信,我也在學習,就讓我們一起討論吧!
CompileYourLife
開始編譯生活 不管是寫程式、寫文章、任何事
2018/03/08
2016/05/18
Google Apps Script在Spreadsheet的應用入門
今天有幸需要用到Apps Script
就看看API,看看範例
想說寫個87分的筆記
睽違兩年更新網誌
進入正題
MS Office Excel可以利用VBA撰寫指令
而LibreOffice可以利用LibreOffice, Basic, JavaScript, BeanShell, Python,支援語言很多
Google Spreadsheet利用JavaScript撰寫,搭配Apps Script API可以實現很多功。Apps Script API有許多可以使用的地方幾乎涵蓋所有Google提供的服務。若要將Spreadsheet與Apps Script結合使用有幾個很重要的Classes與Methods需要瞭解。
Class:
操作順序Spreadsheet -> Sheet -> Range
有個簡單的範例
原理相當簡單,配合其他Methods能夠達到更多功能
我忘了最重要的第一部:要如何打開指令碼編輯器
在Google drive中新增Google 試算表 -> 打開工具列中的'工具'標籤 -> 點擊'指令碼編輯器...'
此時會開新的分頁,就可以開始撰寫指令碼。
上方的工具列有個播放的符號按下後會執行指令碼,不過在執行之前要選擇你項要執行的function,下面的圖片是選擇執行叫做testFunction的function。
謝謝收看
就看看API,看看範例
想說寫個87分的筆記
睽違兩年更新網誌
進入正題
MS Office Excel可以利用VBA撰寫指令
而LibreOffice可以利用LibreOffice, Basic, JavaScript, BeanShell, Python,支援語言很多
Google Spreadsheet利用JavaScript撰寫,搭配Apps Script API可以實現很多功。Apps Script API有許多可以使用的地方幾乎涵蓋所有Google提供的服務。若要將Spreadsheet與Apps Script結合使用有幾個很重要的Classes與Methods需要瞭解。
Class:
- Spreadsheet
主要管理開關文件,文件最基礎的設定幾乎都包含在內 - Sheet
一頁頁的表格的設定 - Range
關於儲存格的操作(ex. 設定儲存格資料)
操作順序Spreadsheet -> Sheet -> Range
有個簡單的範例
function testFunction() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var centerList = ['花蓮大專', '台東大專', '屏東大專', '高雄大專', '台南大專', '嘉義大專', '彰化大專', '台中大專', '新竹大專', '台北大專']; var i; for(i=0; i<centerList.length; i++){ ss.insertSheet(centerList[i]); } var sheet; var range; for(i=0; i<centerList.length; i++){ sheet = ss.getSheetByName(centerList[i]); range = sheet.getRange('A1'); range.setValue('No. ' + String(i+1)); } }先利用
SpreadsheetApp.getActiveSpreadsheet();取得要操作的spreadsheet
ss.insertSheet(centerList[i]);把已取得的spreadsheet中新增sheet
sheet = ss.getSheetByName(centerList[i]);使用sheet的名字得到sheet
range = sheet.getRange('A1');選取sheet的儲存格A1
range.setValue('No. ' + String(i+1));設定儲存格的內容。
原理相當簡單,配合其他Methods能夠達到更多功能
我忘了最重要的第一部:要如何打開指令碼編輯器
在Google drive中新增Google 試算表 -> 打開工具列中的'工具'標籤 -> 點擊'指令碼編輯器...'
此時會開新的分頁,就可以開始撰寫指令碼。
上方的工具列有個播放的符號按下後會執行指令碼,不過在執行之前要選擇你項要執行的function,下面的圖片是選擇執行叫做testFunction的function。
謝謝收看
2014/03/02
2013/03/05
Glut on Code::Block
我真的沒有很閒
寫這篇是以免有人跟我一樣陷入泥淖
關於glut繪圖的事
網路上方法千百種
可是就找不到一種適合Code::Block(codeblock)的
或許是小的太笨看不懂別人寫的
只適合打打雜
不會寫程式所以就寫這東西
在如何Code::Block搭配glut
所以我打算自己動手寫個教學(沒有圖文並茂,旦你應該能懂)
首先預備一些材料(下載)(病毒檢測資料)
首先把glut32.dll丟到C:\Windows\System32
把libglut.a和libglut32.a丟到Code::Block下編譯器的lib裡
以我自己的電腦為例
我的Code::Block下編譯器的libD:\Program Files (x86)\CodeBlocks\MinGW\lib
最後把GL資料夾取代編譯器的include/GL
舉個例子D:\Program Files (x86)\CodeBlocks\MinGW\include\GL把整個GL資料夾取代掉
不過在此之前先把原先的GL備份
純粹怕出意外(沒什麼好意外頂多重新安裝一分編譯器)
我的GL資料夾裡不是每個檔案都一定用得到
不過glut能動就好
結束了!
如果還不行可以試試這個(寫完後才找到)
花了三個小時就為了做這件事
我果然很笨阿!
凌晨一點半了,記得做些有意義的事
寫這篇是以免有人跟我一樣陷入泥淖
關於glut繪圖的事
網路上方法千百種
可是就找不到一種適合Code::Block(codeblock)的
或許是小的太笨看不懂別人寫的
只適合打打雜
不會寫程式所以就寫這東西
在如何Code::Block搭配glut
所以我打算自己動手寫個教學(沒有圖文並茂,旦你應該能懂)
首先預備一些材料(下載)(病毒檢測資料)
首先把glut32.dll丟到C:\Windows\System32
把libglut.a和libglut32.a丟到Code::Block下編譯器的lib裡
以我自己的電腦為例
我的Code::Block下編譯器的libD:\Program Files (x86)\CodeBlocks\MinGW\lib
最後把GL資料夾取代編譯器的include/GL
舉個例子D:\Program Files (x86)\CodeBlocks\MinGW\include\GL把整個GL資料夾取代掉
不過在此之前先把原先的GL備份
純粹怕出意外(沒什麼好意外頂多重新安裝一分編譯器)
我的GL資料夾裡不是每個檔案都一定用得到
不過glut能動就好
結束了!
如果還不行可以試試這個(寫完後才找到)
花了三個小時就為了做這件事
我果然很笨阿!
凌晨一點半了,記得做些有意義的事
2012/11/04
程式-回傳記得明確
無聊練習堆疊
這聽起來有點可笑
畢竟這東西我一直沒熟悉過
但堆疊在許多場合時常用到
於是就寫一個基於堆疊的排序法
要先聲明這種排序法不入流
因為是我自己亂搞的
這種排序法需要額外的空間(兩個額外的陣列)
因為操作堆疊一定要有判對堆疊是否已滿的函式
起初那個判斷用的函式只在堆疊為空的時候回傳
我想這樣寫就夠了
等到我全部程式寫完後
排序出來的結果會有些數字順序錯了
有些測試資料又全對
用單部執行追蹤程式進行赫然發現有些判對具應該是TRUE卻變成FALSE
(5>3)&&(ifStackIsEmpty()!=1)(這時的堆疊並非是空的)註1
在這個地方TRUE變成FALSE
大約花了兩個小時還是找不到錯誤
不過就在今天中午吃飯前我明白了
ifStackIsEmpty()函是指針對堆疊為空時回傳
但不為空時的回傳卻沒有寫
導致函式的回傳值變的很奇怪(用「奇怪」是因為可以預測)
各位啊!
你是否也有這樣的困擾
請記得回傳值必須考慮其餘的可能性
不能只針對某一值做出回傳
當不屬於該值時也要做出回傳
不然你可能除錯除了半天也沒用
這種錯誤一次就夠了
找出這種錯誤對我來說真的需要花很多時間
註1:
int ifStackIsEmpty()
{
if(po==(-1))/*po是記錄堆疊最高位置的變數*/
{
return 1;
}
}
這聽起來有點可笑
畢竟這東西我一直沒熟悉過
但堆疊在許多場合時常用到
於是就寫一個基於堆疊的排序法
要先聲明這種排序法不入流
因為是我自己亂搞的
這種排序法需要額外的空間(兩個額外的陣列)
因為操作堆疊一定要有判對堆疊是否已滿的函式
起初那個判斷用的函式只在堆疊為空的時候回傳
我想這樣寫就夠了
等到我全部程式寫完後
排序出來的結果會有些數字順序錯了
有些測試資料又全對
用單部執行追蹤程式進行赫然發現有些判對具應該是TRUE卻變成FALSE
(5>3)&&(ifStackIsEmpty()!=1)(這時的堆疊並非是空的)註1
在這個地方TRUE變成FALSE
大約花了兩個小時還是找不到錯誤
不過就在今天中午吃飯前我明白了
ifStackIsEmpty()函是指針對堆疊為空時回傳
但不為空時的回傳卻沒有寫
導致函式的回傳值變的很奇怪(用「奇怪」是因為可以預測)
各位啊!
你是否也有這樣的困擾
請記得回傳值必須考慮其餘的可能性
不能只針對某一值做出回傳
當不屬於該值時也要做出回傳
不然你可能除錯除了半天也沒用
這種錯誤一次就夠了
找出這種錯誤對我來說真的需要花很多時間
註1:
int ifStackIsEmpty()
{
if(po==(-1))/*po是記錄堆疊最高位置的變數*/
{
return 1;
}
}
2012/09/23
未來幻想
一看到標題以為會是某位趨勢家對未來的幻想
幻想城市生活有飛天車與更便捷的交通
參天的高樓、太陽能,便利且舒適的生活
我並不是不會對這種城市生活嚮往
只是未來使我不解
也令許多人不解
暑假看的一部動畫「C」
是一個戰鬥為主的動畫
用此種方式帶出主角以及相關角色的價值觀
值得一提的是戰鬥時得進行投資才能發動攻擊
投資不是用錢而是用「未來」(未來變成一種貨幣)
未來來的重要性在動畫中被激烈的討論著
未來可以被剝奪也可以被奪取
未來可以數量化
在故事情節中未來被奪取的人的現實生活會改變
其中有人公司倒閉,有人已出生的孩子消失
但沒有詳細描述得到未來的人生活有什麼改變
整部動畫中最有印象的一句話是:「未來是什麼?未來是個曖昧的東西」
其實它全部就是在探討未來的意義
不過我想作者是有答案的
「有希望就有未來」這句通俗,隱藏類似概念的話也多的不可勝數
未來是希望嗎?
不是,我想希望是人想出來的
因為有希望讓自己有面對未來的力量
是個激勵自己的理由
未來一個個到來
一年接一年,一天過一天,一分繼一分,一秒續一秒
未來好似可無限細分因時間細分
在人的感覺上未來與時間應該不可分割
我們用時間前後區分未來、現在、過去
時間無盡的切割
也就說明了有無盡的未來
我希望時間具有量子的特性
一但可用量子描述時間也就可以計算現在到未來某個時間點中間所含有的未來
很幸運的關於時間量子一事是有可能存在的稱為「普朗克時間」
如果能順利解開時間的問題
我認為解開未來就變的可行
然而不能保證解開未來的程度
卻能對未來有更多的瞭解
後記:
今天打完籃球坐在司令台發呆時再次想到「未來」
還沒想清楚的時候突然發現時間被消磨的許多
那種突然像是莫名其妙的被朋友提醒後才發現真有件事是自己遺忘
有時候空想不如起而行
就算不了解未來
可是依舊知道自己該做什麼
這篇不是物理文章
只是充滿疑問而已
我的見聞也就只能寫出這些心得
假如你想多瞭解「時間」可以看<<聚焦物理世界-科學人精采100特輯>>
關於「普朗克時間」維基百科上有
幻想城市生活有飛天車與更便捷的交通
參天的高樓、太陽能,便利且舒適的生活
我並不是不會對這種城市生活嚮往
只是未來使我不解
也令許多人不解
暑假看的一部動畫「C」
是一個戰鬥為主的動畫
用此種方式帶出主角以及相關角色的價值觀
值得一提的是戰鬥時得進行投資才能發動攻擊
投資不是用錢而是用「未來」(未來變成一種貨幣)
未來來的重要性在動畫中被激烈的討論著
未來可以被剝奪也可以被奪取
未來可以數量化
在故事情節中未來被奪取的人的現實生活會改變
其中有人公司倒閉,有人已出生的孩子消失
但沒有詳細描述得到未來的人生活有什麼改變
整部動畫中最有印象的一句話是:「未來是什麼?未來是個曖昧的東西」
其實它全部就是在探討未來的意義
不過我想作者是有答案的
「有希望就有未來」這句通俗,隱藏類似概念的話也多的不可勝數
未來是希望嗎?
不是,我想希望是人想出來的
因為有希望讓自己有面對未來的力量
是個激勵自己的理由
未來一個個到來
一年接一年,一天過一天,一分繼一分,一秒續一秒
未來好似可無限細分因時間細分
在人的感覺上未來與時間應該不可分割
我們用時間前後區分未來、現在、過去
時間無盡的切割
也就說明了有無盡的未來
我希望時間具有量子的特性
一但可用量子描述時間也就可以計算現在到未來某個時間點中間所含有的未來
很幸運的關於時間量子一事是有可能存在的稱為「普朗克時間」
如果能順利解開時間的問題
我認為解開未來就變的可行
然而不能保證解開未來的程度
卻能對未來有更多的瞭解
後記:
今天打完籃球坐在司令台發呆時再次想到「未來」
還沒想清楚的時候突然發現時間被消磨的許多
那種突然像是莫名其妙的被朋友提醒後才發現真有件事是自己遺忘
有時候空想不如起而行
就算不了解未來
可是依舊知道自己該做什麼
這篇不是物理文章
只是充滿疑問而已
我的見聞也就只能寫出這些心得
假如你想多瞭解「時間」可以看<<聚焦物理世界-科學人精采100特輯>>
關於「普朗克時間」維基百科上有
2012/09/16
煎蛋餅記
今晚老媽不在我姐也沒回來
所以我只能自己動手煮菜
其實也沒什麼好煮的,除了青菜以外其他的都只要熱而已
但我還是很無聊的打開冷凍庫
赫然發現有蛋餅皮
心理忖度著
既然沒什麼好讓我發揮的地方
那就不如來煎個蛋餅好了
打了蛋放在一旁
點起火來
先讓鍋子熱一會兒
油倒入個鍋裡
說來奇怪油一入鍋隨即彈出了一些
鍋子是乾的,為何那東西在鍋子裡起舞
要怪就怪那鍋鏟不是乾的
受了點驚嚇
不過不要緊
待會就有蛋餅可以吃
把蛋汁倒入鍋中
蛋漸漸成形
差不多可以放蛋餅皮了
餅皮一放下去
完了,該怎麼翻面
管他三七二十一
鏟子滑入蛋的下方
這一翻,翻了不僅僅是蛋餅更翻了吃蛋餅的期待
蛋與餅分離
餅皮如剛睡醒的棉被折疊
下場是蛋歸蛋、皮歸皮
我終於知道什麼叫做骨肉分離
煎蛋餅成了「炒蛋」與「餅」
炒蛋還是炭燒口味
收拾一下
飯還是要吃
明天還要上學
煮不好就算了吧!...............................................................「老闆!一份蛋餅」
所以我只能自己動手煮菜
其實也沒什麼好煮的,除了青菜以外其他的都只要熱而已
但我還是很無聊的打開冷凍庫
赫然發現有蛋餅皮
心理忖度著
既然沒什麼好讓我發揮的地方
那就不如來煎個蛋餅好了
打了蛋放在一旁
點起火來
先讓鍋子熱一會兒
油倒入個鍋裡
說來奇怪油一入鍋隨即彈出了一些
鍋子是乾的,為何那東西在鍋子裡起舞
要怪就怪那鍋鏟不是乾的
受了點驚嚇
不過不要緊
待會就有蛋餅可以吃
把蛋汁倒入鍋中
蛋漸漸成形
差不多可以放蛋餅皮了
餅皮一放下去
完了,該怎麼翻面
管他三七二十一
鏟子滑入蛋的下方
這一翻,翻了不僅僅是蛋餅更翻了吃蛋餅的期待
蛋與餅分離
餅皮如剛睡醒的棉被折疊
下場是蛋歸蛋、皮歸皮
我終於知道什麼叫做骨肉分離
煎蛋餅成了「炒蛋」與「餅」
炒蛋還是炭燒口味
收拾一下
飯還是要吃
明天還要上學
煮不好就算了吧!...............................................................「老闆!一份蛋餅」
訂閱:
文章 (Atom)