發表文章

Xoops模組開發->使用xlanguage3.1RC多國語言模組配合的程式修改-教學撰寫:徐嘉裕Neil hsu

圖片
xlanguage是一套可以切換Xoops語言的模組,也能透過語言標籤來切換語言內容,以達成網站多國語言的目的,xlanguage3.1RC可以完全兼容Xoops2.5.10,而且也已經被Xoops官網收錄於官方模組中,直接安裝起來用能使用了,我已經吧xlanguage模組中文化完成了,有需要的朋友可以點以下連結下載。

xlanguage3.1RC中文化下載

https://drive.google.com/file/d/1Wz8tcHLE-xtM8vwa0_NfVAyH8Xjewwv2/view?usp=sharing


雖然說安裝起來並設定好語言開啟區塊就能使用



但經過實際測試,還是有很多問題需要在其他模組寫程式套件來配合運作,才能達到100%完美應用,否則使用上還是很多不便利的地方,以下為修改模組紀錄彙整。

1、xlanguage的語言切換作用機制主要有兩段,一部分是吧user選擇的語言儲存到setcookie裡面在讀取對應的模組語言包,這部分可以切換UI的語言,另一部分則是資料字段的轉換,例如

[tw]這是中文標題[/tw][en]This is the Chinese title[/en]

所以如果選擇中文顯示[tw]這是中文標題[/tw]中字段,選擇英文則顯示[en]This is the Chinese title[/en],語言標籤會被去掉,但這作用並不是在sql資料導出時做字段判斷,而是用伺服器頂層的Java吧所有PHP輸出的變數都掃過一次比對後擷取語言標籤內容,好處是不用在模組資料輸出去做字串擷取所有的模組都能使用,但會產生一個問題,如果不是輸出頁面的變數,像是幕後傳參寄發E-mail,就無法做語言判斷,反而會吧全部字串都給輸出,像是這樣


收到通知信的人大概也一頭霧水吧,什麼碗糕?解決辦法就是另外寫一個資料轉換function給幕後讀取資料時使用,code如下:

◎吧xlanguagePlugin()放到function.php裡面

//取得指定模組module資料表值
function modulesmidvar($modulesid="",$var=""){
$modulevar=empty($var) ? 'mid' : $var; // get TRUE
$module_handler …

masonry+imagesloaded+AJAX瀑布流套件整合用法-教學撰寫:徐嘉裕Neil hsu

之前寫過一篇【Bootstrap3瀑布流排版用JS套件-Masonry-教學】
https://neohsuxoops.blogspot.com/2019/08/bootstrap3js-masonry.html

不過這方法只能用在已讀出的資料樣板排版上,例如PHP讀出50筆,然後可以用這個方法來做瀑布流排版,但如果要應用在AJAX上則需要再做修改才能應用。

例如像pinterest網站,預設資料只出現幾筆,然後瀏覽器卷軸到底之後又會出現資料,一直循環開啟到資料全部讀完,以AJAX非同步方式求取資料的瀑布流效果。

AJAX結構跟運作原理就不多說了,這裡直接是masonry套件+imagesloaded套件在AJAX中的應用方式,CODE如下。

1、先在樣板裡面引入三支檔

<script src="http://desandro.github.io/imagesloaded/imagesloaded.pkgd.min.js"></script>
<script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js"></script>
<script src="js/masonryajaxjs.js"></script> //此為呼叫AJAX的JS檔需自行建立

2、在樣板上貼上以下的function,放在三個引入檔的下方
<script> function masonryfunction(){ $('.masonry').imagesLoaded(function() { var msnry = new Masonry(".masonry",{  itemSelector: '.item', columnWidth: <{$enshow.columnWidth}>, //單個物件寬度 gutter: <{$enshow.gutter}>,   //物件邊距 isFitWidth: true }); 
//物件觸發後10毫秒執行一次後終止 setTimeout(function()…

寫一個PHP同條件查詢刪除多個資料表內容的批次刪除function-教學撰寫:徐嘉裕Neil hsu

假設一共有四個資料表有關聯資料,其中一個為主表資料刪除同時連同另外三個資料表中的資料也一起刪除,如果按正常的寫法是

寫一個單獨刪除主表欄位的SQL語法

再寫三個刪除關聯資料的foreach抓出資料後迴圈刪除SQL語法

這樣程式又變得很龐大,所以寫了一個批次刪除的function一次就能吧相同查詢條件的資料全部刪除,這樣程式也精簡很多看了也舒服。

方法如下

1、先在function.php中加上以下的function

//引入共用函數
include_once XOOPS_ROOT_PATH."/modules/neillibrary/function.php";

//批次刪除function
function deleteArr($Arrdate=""){
foreach($Arrdate as $key=> $val){
$dbneme=$Arrdate[$key]['dbneme'];
$where=$Arrdate[$key]['where'];
$deleteArr=databasetablewhile($dbneme,$where);
foreach($deleteArr as $k=> $val){
$where=" where `".$Arrdate[$key]['id']."` = '".$deleteArr[$k][$Arrdate[$key]['id']]."'";
$DBname=$Arrdate[$key]['dbneme'];
deletefunction($where,$DBname);
} }
}

2、然後在要刪除資料的PHP用陣列輸入刪除的查詢項目
$Arrdate = array(); //建構陣列 
//相同where查詢欄位 $whereDB=" where `basid` = '$dbid'"; //刪英資單位 $i=0; $Arrdate[$i]['dbneme']="neilbasicinformation"; //資料表名稱 $Arrd…

CentOS7啟用ssh的設定方法-教學撰寫:徐嘉裕Neil hsu

安裝好CentOS7後可以在圖形化介面中點選右鍵->開啟服務器修改設定後啟用SSH設定,方法如下:

1、先安裝openssh套件
sudo yum install openssh*

2、用gedit開啟sshd_config編輯(不要用vi很難編輯的)
sudo gedit /etc/ssh/sshd_config

3、增加可連線SSH帳號
AllowUsers admin (此欄位需要自行新增)

4、修改PORT吧#註解拿掉(可以改成8022PORT或其他PORT都可以)
Port 22

搜尋PermitRootLogin吧#註解拿掉
PermitRootLogin no

再來把這兩行的#註解拿掉
PermitEmptyPasswords no
PasswordAuthentication yes


sudo systemctl restart sshd.service    重新啟動service

sudo systemctl enable sshd.service    設定開機啟動SSH

sudo semanage port -a -t ssh_port_t -p tcp 22      防火牆允許22 PORT



sudo firewall-cmd --permanent --zone=public --add-port=22/tcp

重新載入防火牆設定
sudo firewall-cmd --reload

sudo  netstat -ant | grep :22 查看 22PORT

查詢現在SELinux設定清單中的SSH服務有哪些Port
sudo semanage port -l | grep ssh
ssh_port_t tcp 8022, 22

怎麼測試?
格式:登入帳號@IP或主機名稱
指令:-p SSH服務Port號

sudo ssh -p 22 andy@192.168.1.100


如設定的Port在清單中,那就表示SSH設定完成防火牆也開啟列外了,之後再用遠端的PuTTY輸入 IP/Port 連線,然後輸入 帳號/密碼,就能用SSH連線進入主機了,有需要的朋友參考看看!

參考資料來源:https://www.brilliantcode.net/124/centos-7-install-and-configure-ssh/

教學撰寫…

解決CentOS Linux release 8.1.1911 安裝LAMPP缺少32 bit compatibility library套件而無法啟用問題!-教學撰寫:徐嘉裕Neil hsu

CentOS Linux release 8.1.1911是運行64位元,如安裝Lampp最新版xampp-linux-x64-7.3.14-0雖然也是64 Bit,但安裝套件還是32位元的,如果CentOS在安裝時沒有安裝32 bit compatibility library套件啟用lampp就會顯示

XAMPP is currently only availably as 32 bit application. Please use a 32 bit compatibility library for your system.

而無法啟用lampp,解決方法就是安裝CentOS 的glibc* libstd* ld-linux.so.2的套件包

輸入以下指令

1. 安裝glibc* libstd* ld-linux.so.2
yum -y install glibc* libstd* ld-linux.so.2

2. 啟動lampp
/opt/lampp/lampp start
經過實際測試原本無法啟動的lampp在安裝glibc* libstd* ld-linux.so.2之後就能正常啟動了
Starting XAMPP for Linux 7.3.14-0... XAMPP: Starting Apache...ok. XAMPP: Starting MySQL...ok. XAMPP: Starting ProFTPD...ok.
頭痛的問題終於解決了,真的的關關難過關關過,做IT產業的人真的會短命阿
有需要人朋友參考看看吧
參考資料來源:http://lekshmideepu.blogspot.com/2013/04/xampp-is-currently-only-available-as-32.html
教學撰寫:徐嘉裕Neil hsu

線上影音模組->FB自動重建縮圖程式-工作心得撰寫:徐嘉裕Neil hsu

圖片
2019年9月開發的線上影音模組,其中有一項功能是用爬蟲去爬FB影片擷取縮圖後儲存資料表的功能 https://neohsuxoops.blogspot.com/2019/09/ajaxphpjsfacebook.html

但最近發現許多原本擷取的FB縮圖都無法讀取了,圖片位置顯示URL signature expired,原來FB影片縮圖也是有時效性的,一段時間fb就會重建縮圖檔,檔名跟時間搓都會變動,難怪一開始擷取的FB縮圖都會變成無法顯示!


解決方法就是寫一個FB自動重建縮圖程式,放在影片區塊程式的前面,然後迴圈檢查FB縮圖如果回傳是URL signature expired則重建縮圖,否則不做操作,這樣並不會消耗系統太多效能,方法如下:

1、先在模組的function.php裡面加上這三個function

//重建縮圖程式
function fbtmburlfunction(,$url="",$tmburl="",$where="",$dbname=""){
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, "".$tmburl."");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, array ('X-Forwarded-For: '.mt_rand(0, 255).'.'.mt_rand(0, 255).'.'.mt_rand(0, 255).'.'.mt_rand(0, 255),));
curl_setopt($ch, CURLOPT_USERAGENT, "Google Bot");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 1); //成功連線伺服器前等時間/秒

使用tadtools的ck編輯器的elfinder上傳貼圖的操作方法-教學撰寫:徐嘉裕Neil hsu

圖片
tadtools的ck編輯器上傳圖片功能已經吧elfinder圖片上傳套件整合了,所以上傳圖片到內文中不要使用上傳功能,改使用影像資訊來上傳圖片,操作說明如下:

1、點選CK編輯器的圖像按鈕



2、影像資訊->點選瀏覽伺服器按鈕




3、開啟elfinder管理介面->選擇左邊要放圖檔的資料夾->點選上傳檔案按鈕



4、點選->選擇要上傳的檔案(或吧檔案拖曳到此框中)



5、開啟檔案選擇框,選擇本地端要上傳的圖檔

6、找到上傳成功的圖檔->滑鼠左鍵點擊兩下



7、設定圖檔參數後送出



8、編輯或調整內容後->送出儲存即可

9、這樣就能吧圖片貼到內中了




操作教學撰寫:徐嘉裕 Neil hsu

解決Xoops網站運作雙IP的問題-教學撰寫:徐嘉裕Neil hsu

網站使用雙IP基本上也沒什麼問題,只要兩個IP都能解析到伺服器端就OK,不過目前遇到的問題是針對桃園市教育局私有雲虛擬主機雙IP問題做處理的,先講解一下環境配置。

私有雲虛擬主機預設有兩組IP,分為內網段跟外網段
例如
內網段IP-10.241.82.101 外網段IP-163.30.41.232 
私有雲會針對學校的IP自動做DNS解析並配置到內網段,換句話說例如A學校進入A學校私有雲的網站,則私有雲DNS自動解析對應內網段IP-10.241.82.101,反之則對應外網段IP-163.30.41.232 。
但遇到一個頭痛的問題,就是外網段無權限解析內網段的私有雲虛擬主機,內網段一樣無法解析外網段的私有雲虛擬主機!!
但Xoops的實體路徑只能設一組,如果設成外網段的IP,則校內就看不到網站,反之設成校內IP,則外網就看不到網站。
解決方案只能修改Xoops的路徑跟前端透過jQuery轉換網址,方法如下:

//php修改部分
1、先找到mainfile.php檔案,用筆記本打開
吧XOOPS_URL替換為
define('XOOPS_URL', "http://".$_SERVER['HTTP_HOST']."");
//$_SERVER['HTTP_HOST']為PHP自動判斷連線IP產生的網址變數,所以這樣用內網段進入XOOPS_URL就會變成內網段IP-10.241.82.101,用外網段進入XOOPS_URL就會變外網段IP-163.30.41.232 ,如此一來內外網就都能開啟網站了!
但這樣只完成了30%,因為假設學校用內網段的CK編輯器上傳了一張圖片,而圖片路徑是被寫入資料庫的,那外網則無法觀看此圖片,因為外網沒有解析內網段的權限。

所以還必須修改佈景加上全局圖片網址自動轉換功能才能完整解決,修改方法如下。

//JS修改部分
在佈景js區加上以下code
<script>
//取得Xoops實體路徑
var xoopsjsurl='<{$xoops_url}>';


//更換URL
$(document).ready(function(){

//如果網站路徑==http://163.30.41.232,吧src跟href中的UR…

PHP使用header下載檔案的方法(確定能開啟檔案不會損毀)-教學撰寫:徐嘉裕Neil hsu

使用php->header下載檔案最常遇見的問題就是下載回來的檔案損毀,或是格式損毀,最主要的原因就是:UTF-8的BOM字元產生的檔頭錯誤。解決方法就是使用ob_clean()+flush();方法如下:

$file = $url;   //下載檔案的完整路徑包含檔名(實體路徑)
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean(); //清除緩存
flush();
readfile($file);
exit;

經過神農氏嘗百草精神測試後這支程式確定是不會出錯了,有需要的朋友參考看看
參考資料來源:http://lab.aoetek.com/index.php/2018/04/25/2018042501/
工作心得撰寫:徐嘉裕 Neil hsu

Smarty->foreach 迴圈抓出第一圈跟最後一圈的方法-教學撰寫:徐嘉裕Neil hsu

圖片
Xoops是使用Smarty樣板引擎,雖然有些判斷在php端就能處理,但是像系統佈景區塊之類的還是用Smarty的code來處理會比較方便,不用再另外寫一堆PHP程式,這裡分享一個在Smarty->foreach 迴圈抓出第一圈跟最後一圈的方法,使用first及last參數即可。

例如像下圖,需要抓出迴圈的第一圈跟最後一圈然後定義CSS做樣式樣的變化!




方法如下

<{foreach item=blockmenulayers from=$block.category name=blockmenulayers}>

<div class=' <{if $smarty.foreach.blockmenulayers.first eq true}>firstbox<{/if}>
<{if $smarty.foreach.blockmenulayers.last eq true}>lastbox<{/if}>panel-titlebox'>

內容內容內容內容內容............

</div>

<{/foreach}>

說明:
<{if $smarty.foreach.blockmenulayers.first eq true}>firstbox<{/if}>
//如果是第一圈first值為true顯示firstbox

<{if $smarty.foreach.blockmenulayers.last eq true}>lastbox<{/if}>
//如果是最後一圈last值為true顯示lastbox

所以class隨迴圈顯示的值就會是!

第一圈->firstbox

最後一圈->lastbox

扣除第一圈跟最後一圈->panel-titlebox

這樣就有三種css樣式可以定義了,讓版面更靈活美觀!!

有需要的朋友參考看看

工作心得撰寫:徐嘉裕 Neil hsu