掃二維碼與項目經理(lǐ)溝通(tōng)
我們在微(wēi)信上(shàng)24小(xiǎo)時(shí)期待你(nǐ)的(de)聲音(yīn)
解答(dá)本文(wén)疑問(wèn)/技(jì)術咨詢/運營咨詢/技(jì)術建議(yì)/互聯網交流
在前段時(shí)間(jiān)湖(hú)南紅網有(yǒu)一個(gè)需求,大概就是調用用戶被置頂的(de)帖子(zǐ)數排名的(de)top10,測試的(de)基本效果就是首先查詢到top10的(de)uid集合(由于功能模塊原來(lái)的(de)的(de)數據結構中僅在置頂表中查詢得到uid的(de)信息),最終效果如下(xià)(由于測試網站隻有(yǒu)少部分數據,因此下(xià)面隻顯示5個(gè)):
得到uid之後還(hái)需要得到用戶相(xiàng)關的(de)幾個(gè)數據,包括頭像、個(gè)人(rén)主頁的(de)url以及用戶名;頭像在discuz中可以使用avatar方法獲取,個(gè)人(rén)主頁的(de)url通(tōng)過uid直接拼裝即可。而用戶名則需要另外(wài)獲取,可能有(yǒu)人(rén)會說(shuō)直接使用DB類的(de)fetch_first方法查詢common_member表即可查到用戶對(duì)應的(de)用戶名。
但(dàn)一開(kāi)始就有(yǒu)個(gè)前提,那(nà)就是網站的(de)用戶分表了,比如一般分表後會産生(shēng)兩個(gè)用戶表,分别是common_member和(hé)common_member_archive,所以光(guāng)查詢前者肯定是不行的(de)。其實閱讀discuz的(de)本身(shēn)的(de)源代碼就可以發現(xiàn),在很(hěn)多地(dì)方他(tā)的(de)做法都(dōu)是通(tōng)過判斷用戶是否在common_member中,如果存在則直接調用該值,否則需查詢common_member_archive。如下(xià)是discuz本身(shēn)的(de)某個(gè)模塊的(de)源代碼:
這(zhè)樣顯然是可行的(de),但(dàn)是通(tōng)過C類發現(xiàn)并沒有(yǒu)通(tōng)過uid來(lái)查username的(de),隻有(yǒu)通(tōng)過username來(lái)查uid的(de),以上(shàng)就是這(zhè)樣的(de)。如果要用這(zhè)種思路(lù)則需要這(zhè)麽來(lái)寫:
然而,實際上(shàng)有(yǒu)更加簡便的(de)方式的(de)
那(nà)就是通(tōng)過uc來(lái)做處理(lǐ),因為(wèi)要的(de)是用戶名等uc中也保存了的(de)信息,而且對(duì)于普通(tōng)網站用戶而言uc中保存的(de)用戶信息和(hé)dz中保存的(de)用戶信息是一緻的(de)。比如在discuz源代碼中可以看(kàn)到如下(xià)這(zhè)樣的(de)方法:
隻要熟悉discuz開(kāi)發的(de)朋友(yǒu)都(dōu)知道(dào),看(kàn)命名就可以顧名思義的(de),該方法是用于調取uc中的(de)用戶信息的(de)。我們可以在uc_client/client.php找到該方法:
然後可以在uc_client/control/user.php中找到該方法所調用的(de)方法:
也就是我們隻需要在一開(kāi)始的(de)時(shí)候第二個(gè)參數傳入1即可,也就是在該方法中會調用get_user_by_uid(),其中的(de)參數其實是uid。然後我們可以在uc_client/model/user.php找到該方法:
這(zhè)樣就已經調取uc中的(de)用戶信息,需要注意的(de)是,在上(shàng)一步的(de)onget_user方法中返回的(de)時(shí)候并沒有(yǒu)返回用戶的(de)所有(yǒu)信息,也不是返回帶有(yǒu)uid、username、email等這(zhè)些鍵值的(de)數組。所以如果返回的(de)是$user,如果需要取username的(de)值,不能夠寫成$user['username']的(de)。
至此,采用調用uc用戶的(de)方式通(tōng)過discuz的(de)用戶uid獲取的(de)了用戶的(de)用戶名。
我們在微(wēi)信上(shàng)24小(xiǎo)時(shí)期待你(nǐ)的(de)聲音(yīn)
解答(dá)本文(wén)疑問(wèn)/技(jì)術咨詢/運營咨詢/技(jì)術建議(yì)/互聯網交流