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