日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DZ插件制作简易入门教程(自学手记)第二篇

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DZ插件制作简易入门教程(自学手记)第二篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

謝謝大家的鼓勵和幫助,我會繼續寫下去。工作忙,只能周末寥寥幾筆,不當之處,請指正,我會修改的。

在開篇中,可以說已經做完了一個完整的插件。不過功能很簡單,只能在表格中央顯示“Hello World!”。下面來做一件事,實現對插件中央顯示的文字進行設定。

有兩種方法可以達到這一目的。

方法一:利用DISCUZ論壇插件管理的自定義變量。
1.1 進入后臺->擴展->論壇插件->管理->詳情->變量
?
  *配置名稱意思是該項設定的名稱(好像有點廢話^_^)。
  *配置變量名是指該項設定所控制的變量。
  *配置類型中有很多種類,因為該例中要設定的是一個字符串,所以選字串。

1.2 上一步完成后,在后臺->擴展->論壇插件,插件列表Hello World插件下面會出現一項參數設置。
?

1.3 點擊參數設置后就能看見所設置的配置(變量)了。
?

1.4 為正確顯示出所設定的內容,對插件程序模塊文件helloworld.inc.php進行編輯并保存。

  • <?
  • if(!defined('IN_DISCUZ')) {
  • ? ? ? ? exit('Access Denied');
  • }

  • if(!$discuz_uid) {//如果想未登陸的游客也能看到本插件,刪除6~8行,謝謝q-tech指正^_^
  • ? ? ? ? showmessage('not_loggedin', null, 'NOPERM');
  • }

  • include DISCUZ_ROOT.'./forumdata/cache/plugin_'.$identifier.'.php';
  • extract($_DPLUGIN[$identifier], EXTR_SKIP);
  • extract($_DPLUGIN[$identifier]['vars']);

  • //$say_string='Hello World!';

  • include template('hw_helloworld');
  • ?>
  • 復制代碼   *在第1.1步中設定好了配置變量后,該變量實際是放在該插件相關的緩存文件中,第10行代碼即將此緩存文件“裝入”。在論壇根目錄/forumdata/cache/下可以找到這個緩存文件,文件名plugin_helloworld.php。
      *如果打開該文件可以發現設定的配置變量say_string存放在一個數組$_DPLUGIN['helloworld']中,名字為$say_string,PHP中變量前面都要有$符號。程序的11、12行代碼就是將此數組“解開”,以得到$say_string變量。關于extract函數和其它語句的的詳細內容請參考PHP手冊。

    1.5 保存后可以嘗試在本篇步驟1.3的界面中提交新值,插件界面上的值應該有變化了。
    ?
    ?

    方法二:自己編寫插件設定程序
      DISCUZ的自定義配置變量基本能夠滿足一般插件的設定需求,但是對比較高級和復雜的插件,還是自己編寫設定程序比較好。下面還以Hello World項目為例子,順帶簡單說一下怎么引用和操作數據庫。

    2.1 在論壇根目錄\plugins\helloworld下新建一個文件setting.inc.php,在論壇根目錄\templates\default下新建一個文件hw_setting.htm。

    2.2 在后臺插件模塊頁面為Hello World插件添加一個程序模塊。
    ?

    2.3 在DISCUZ論壇的數據庫中添加一張數據表命名為cdb_plugin_helloworld,建立一個字段say_string。并插入一條記錄,隨便什么內容吧。我是用phpmyadmin來做這件事的,具體怎么操作請參考mysql手冊。
    ?

    2.4 編輯hw_setting.htm,創建一個提交數據的界面。
    ?
    表單部分的代碼如下:
  • <form name="form1" method="post" action="admincp.php?action=plugins&identifier=$identifier&mod=$mod" >
  • ? ?? ???<div align="center">歡迎詞:
  • ? ?? ?? ? <input type="text" name="textfield" value="$hw_set_saystring">

  • ? ?? ?? ? <input type="submit" name="hw_submit" class="btn" value="提交">
  • ? ? ? ? ? ? ? ?? ?<input type="hidden" name="formhash" value="$hw_formhash">
  • ? ?? ?
  • ? ?? ???</div>
  • ? ?? ?</form>
  • 復制代碼   *因為在插件模塊設置中程序模塊setting的模塊類型設為了“后臺調用(后臺菜單)”,也就是通過admincp.php這個“傳送帶”來運行setting模塊的,所以表單要提交給admincp.php,并且后面要跟上必要的參數,因此,表單的action參數要寫成action="admincp.php?action=plugins&identifier=$identifier&mod=$mod"。在本例中,不用$identifier和$mod變量而直接寫成:action="admincp.php?action=plugins&identifier=helloworld&mod=setting"也不會有錯,但出于安全性和穩定性考慮并不建議這樣寫。
      *表單中必須要有一個name為formhash的隱藏標簽(代碼第6行),用于傳送表單的哈希值進行安全性驗證。其值要事先準備好,這一點見下一步。
      *因為是通過“后臺調用(后臺菜單)”的方式用admincp.php來執行,所以,setting模版的開頭和結尾不用加{template header}和{template footer},這一點將在以后討論。

    2.5 編輯setting.inc.php的內容如下:
  • <?
  • if(submitcheck('hw_submit')){
  • ? ? ? ? $db->query("UPDATE {$tablepre}plugin_helloworld SET say_string='$textfield';");
  • ? ? ? ? cpmsg('設置成功!', 'admincp.php?action=plugins&identifier='.$identifier.'&mod='.$mod,'succeed');
  • }

  • $query= $db->query("SELECT * FROM {$tablepre}plugin_helloworld;");

  • $hw_field=$db->fetch_array($query);

  • $hw_set_saystring=$hw_field['say_string'];

  • $hw_formhash=FORMHASH;

  • include template('hw_setting');
  • ?>
  • 復制代碼   *代碼開始的if判斷是否有表單提交的動作,如果有,則更新數據庫,顯示相關信息并返回。
      *如果沒有表單提交,則查詢數據庫,獲取所需的數據。代碼第7行對數據進行查詢,返回資源號給$query。第9行將此“資源”中的數據提出賦值給$hw_field,得到的$hw_field實際上是一個數組,有點類似ASP中的記錄集,但是又有區別,因為是一個數組,所以沒有游標的概念。本例中只有1條記錄,如果返回的記錄有很多個,則要用while()循環遍歷:
  • while($hw_field=$db->fetch_array($query)){
  •   $var = $hw_field['fieldname'];
  •   ......
  • }
  • 復制代碼 而且還必須這么寫,如果你寫成while($hw_field){.....}是不行的。遍歷完成后,$hw_field即失效,如果要再用,必須重新query()。不過聽說PHP5支持存儲過程的,特向諸位大牛請教^_^。
      *第13行是為模版中的表單生成哈希值,很簡單,直接引用FORMHASH(注意全是大寫)就可以了。這里做了一下傳遞,是因為:我發現模版文件中的代碼好像要被處理過才執行,只認得$打頭的變量。
      *因為是通過“后臺調用(后臺菜單)”的方式用admincp.php來執行,admmincp.php已經進行了權限驗證,所以這里一般不用再對權限做檢查了。

      2.6 編輯前臺程序helloworld.inc.php文件,引用數據庫中的數據傳遞給模版,代碼如下:
  • <?
  • if(!defined('IN_DISCUZ')) {
  • ? ? ? ? exit('Access Denied');
  • }

  • if(!$discuz_uid) {//如果想未登陸的游客也能看到本插件,刪除6~8行,謝謝q-tech指正^_^
  • ? ? ? ? showmessage('not_loggedin', null, 'NOPERM');
  • }

  • $query= $db->query("SELECT * FROM {$tablepre}plugin_helloworld;");

  • $hw_field=$db->fetch_array($query);

  • $say_string=$hw_field['say_string'];

  • include template('hw_helloworld');
  • ?>
  • 復制代碼

    2.7保存所有程序,在后臺->擴展->論壇插件->設置的hello world插件下就會多一項“Hello World!設置”,這個就是我們自己做的插件設定程序,快試試吧。
    ?
      *前面有項“參數設置”是因為在本篇開頭1.1中我們添加了一個配置變量,只要刪除那個配置變量,這一項就沒有了。

      總結:直到接觸到了數據庫,我才體會到了PHP的優勢。雖然它不像ASP那樣豪華,但高效,簡潔。今天帖子的源代碼中引用了一些DISCUZ自有的函數和類,如submitcheck()、cpmsg()、$db->query()、$db->fetch_array()等等。DISCUZ論壇的絕大多數函數分別在論壇根目錄\admin\global.func.php和\include\global.func.php中定義,數據庫的類在\include\db_mysql.class.php中定義。其實如果仔細研究DISCUZ論壇后綴名為.func.php和.class.php的文件能發現很多好東西^_^。只可惜里面什么注釋都沒有,函數型只能一點一點爬代碼。真希望能盡快出一份DISCUZ函數手冊。如果已經有了,請一定告訴我,急需!

    ?

    海口論壇 ?http://www.souhaikou.com

    海口同城微博 http://t.souhaikou.com

    總結

    以上是生活随笔為你收集整理的DZ插件制作简易入门教程(自学手记)第二篇的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。