Discuz! フォーラムに設定オプションを追加する方法

Discuz! フォーラムに設定オプションを追加する方法
Discuz! フォーラムにはバックグラウンドで多くの設定オプションがあり、これらの設定オプションを通じて多くの機能を実現できます。 Discuz! フォーラムの二次開発中は、いくつかの設定を頻繁に追加し、その設定に基づいてさまざまな操作を実行する必要もあります。次に、Discuz! フォーラムで設定オプションを追加する方法を紹介します。
Discuz! 6.0 を例に挙げてみましょう。まず、Discuz! フォーラム バックエンドの設定インターフェイスを見てみましょう。管理者としてフォーラム バックエンドにログインし、「基本設定」->「基本設定」を選択すると、次のインターフェイスが表示されます。


図1
このページはフレームを使用しています。右下隅のページを右クリックし、「プロパティ」を選択します。ポップアップ ウィンドウで、このページの URL が「/admincp.php?action=settings&do=basic」であることがわかります。このページで使用されているプログラムは admincp.php です。まずはこのファイルを分析してみましょう。
このファイルの 172 行目から 290 行目の内容は次のとおりです。
コードは次のとおりです。
$cpscript = '';
$adminid == 1の場合
$action == 'ホーム'の場合
$cpscript = 'ホーム';
} elseif($action == 'runwizard' && isfounder()) {
$cpscript = 'runwizard';
} そうでない場合は…
} elseif($adminid == 2 || $adminid == 3) {
$action == 'ホーム'の場合
$cpscript = 'ホーム';
} elseif((($allowedituser || $allowbanuser) && ($action == 'editmember' || $action == 'banmember')) || ($allowbanip && $action == 'ipban')) {
$cpscript = 'メンバー';
} そうでなければ……
}
$cpscriptの場合{
} そうでなければ……
}
$cpscriptの場合{
require_once DISCUZ_ROOT.'./admin/'.$cpscript.'.inc.php';
} …
このプログラムは主に、$action 変数に基づいて $cpscript に値を割り当て、$cpscript の値に基づいて admin ディレクトリにプログラム ファイルをインポートします。 179行目の左側の$action値の判定に注目すると、$cpscriptの値が「settings」となっていることがわかります。これは、283行目に導入されたプログラムファイルが「admin/settings.inc.php」であることを意味します。
次に、settings.inc.php ファイルを開くと、内容が非常に長いことがわかります。怖がらずに、注意深く分析してください。
14行目:
コードは次のとおりです。
$operation = $operation ? $operation : (!empty($do) ? $do : '');
ここで、$operation には、GET から受信した $do 値に基づいて値が割り当てられます。この例では、その値は「basic」です。
17行目:
コードは次のとおりです。
$query = $db->query("SELECT * FROM {$tablepre}settings");
$setting = $db->fetch_array($query) の間
$settings[$setting['変数']] = $setting['値'];
}
これらのプログラム セグメントは、データベースからデータを読み取り、後続の呼び出しのために配列 $settings に保存します。
プログラム構造は次のようになります。
コードは次のとおりです。
if(!submitcheck('settingsubmit')) {
$operation == 'アクセス'の場合{

} elseif($operation == 'スタイル') {

} そうでない場合は…
} それ以外 {
//フォーム送信後のデータ処理

}
プログラム内の submitcheck 関数は、フォームが送信されたかどうかを確認するために使用されます。フォームが送信されていない場合は、以前に処理された $operation に従ってフォームが表示されます。ここで、$operation の値は basic であり、以下を実行します。
コードは次のとおりです。
$操作 = '基本';
showtype('settings_general', 'トップ');
showsetting('settings_bbname', 'settingsnew[bbname]', $settings['bbname'], 'text');
showsetting('settings_sitename', 'settingsnew[sitename]', $settings['sitename'], 'text');
showsetting('settings_siteurl', 'settingsnew[siteurl]', $settings['siteurl'], 'text');
showsetting('settings_index_name', 'settingsnew[indexname]', $settings['indexname'], 'text');
showsetting('settings_icp', 'settingsnew[icp]', $settings['icp'], 'text');
showsetting('settings_boardlicensed', 'settingsnew[boardlicensed]', $settings['boardlicensed'], 'radio');
showsetting('settings_bbclosed', 'settingsnew[bbclosed]', $settings['bbclosed'], 'radio');
showsetting('settings_closedreason', 'settingsnew[closedreason]', $settings['closedreason'], 'textarea');
ここでは、カスタム関数 showsetting が使用されています。最初のパラメータは、構成オプションの名前です。2 番目のパラメータは、HTML で表示される入力の名前の値です。3 番目のパラメータは現在の構成オプションの値で、上記のデータベースから見つかった配列 $settings の値です。4 番目のパラメータは、入力のタイプです。独自の構成オプション mytest を追加します。上記のコードの最後に次のコードを追加します。
コードは次のとおりです。
showsetting('settings_mytest', 'settingsnew[mytest]', $settings['mytest'], 'radio');
ページを保存して更新すると、このページの下部に追加のオプションが表示されます。
ただし、settings_mytest が英語であることがわかった場合は、言語パックを変更できます。 templates/default/admincp.lang.php ファイルで、450 行目の下に次のコードを追加します 'settings_closedreason_comment' => 'フォーラムが閉じられたときに表示されるプロンプト メッセージ':
コードは次のとおりです。
'settings_mytest' => 'テストオプション:',
'settings_mytest_comment' => 'テストオプションのプロンプトメッセージ',
保存後、ページを更新すると中国語のプロンプトが表示されます。
ここまでは、インターフェース上の表示の処理は完了しました。次に、フォームが送信された後のデータの処理方法について説明します。 /admin/settings.inc.php ファイルの if(!submitcheck('settingsubmit')) {} セクションでは、else ステートメントが else ステートメントに対応します。コードのこの部分は、まず送信されたデータを処理し、次にそれをすべて $settingsnew 配列に格納します。この配列は、POST によって送信されたデータを実際にチェックします。このファイルの 1140 行目あたりに次のコードがあります。
コードは次のとおりです。
foreach($settingsnew AS $key => $val) {
if(isset($settings[$key]) && $settings[$key] != $val) {
$$キー = $val;
$updatecache = TRUE;
if(in_array($key, array('newbiespan', 'topicperpage', 'postperpage', 'memberperpage', 'hottopic',
'starthreshold'、'delayviewcount'、'visitedforums'、'maxsigrows'、'timeoffset'、'statscachelife'、
'pvfrequence'、'oltimespan'、'seccodestatus'、'maxprice'、'rssttl'、'rewritestatus'、'bdaystatus'、
'maxonlines'、'loadctrl'、'floodctrl'、'regctrl'、'regfloodctrl'、'searchctrl'、'extcredits1'、'extcredits2'、
'extcredits3'、'extcredits4'、'extcredits5'、'extcredits6'、'extcredits7'、'extcredits8'、
「transfermincredits」、「exchangemincredits」、「maxincperthread」、「maxchargespan」、「maxspm」、
'maxsearchresults'、'maxsmilies'、'threadmaxpages'、'membermaxpages'、'maxpostsize'、
'minpostsize'、'maxavatarsize'、'maxavatarpixel'、'maxpolloptions'、'karmaratelimit'、'losslessdel'、
'edittimelimit'、'smcols'、'watermarktrans'、'watermarkquality'、'jscachelife'、'waptpp'、'wapppp'、
'wapmps'、'maxmodworksmonths'、'frameon'、'maxonlinelist'))) {
$val = (float)$val;
}
$db->query("REPLACE INTO {$tablepre}settings (variable, value) VALUES ('$key', '$val')");
}
}
このコードの目的は、$settingsnew 配列に対応するオプションがあるかどうかを確認することです。対応するオプションがあり、それが数値オプションである場合は、浮動小数点数に変換され、すべてがデータ テーブル設定に REPLACE INTO されます。mytest オプションは新しく追加されたもので、データ テーブルにはそのようなオプションはありません。まず、データベースで次の SQL ステートメントを実行する必要があります: REPLACE INTO cdb_settings(variable, value) VALUES('mytest', '0')。テーブル プレフィックスを変更することに注意してください。 mytest オプションがデータベースに保存されるようになりました。
1160 行目あたりで、コード updatecache('settings') が実行され、settingsnew 配列のデータが自動的にキャッシュされます。具体的な実装方法に興味のある方は、/include/cache.func.php ファイルの実装方法を詳しく調べてください。
データがキャッシュされると、/forumdata/cache/cache_settings.php ファイルの $_DCACHE['settings'] 配列に mytest 項目が作成され、このオプションを使用していくつかの操作を実行できるようになります。 /include/common.inc.php ファイルの 93 行目あたりに、次のコードがあります。
コードは次のとおりです。
$cachelost = (@include DISCUZ_ROOT.'./forumdata/cache/cache_settings.php') ? '' : 'settings';
@extract($_DCACHE['設定']);
上記のコードにより、mytest 構成オプションの値が $mytest 変数に直接保存され、$mytest を直接判断して操作を実行できるようになります。 index.php ファイルの 17 行目に次のコードを追加します。
コードは次のとおりです。
もしも($mytest) {
echo 'こんにちは、これはテストです';
}
実行後の効果は次のようになります。



図 2 これまでのところ、Discuz! フォーラムにオプションが正常に追加されました。もちろん、フォーラムには他にも多くのオプションがあります。基本的な考え方は同じで、特定の状況に応じて追加できます。

<<:  Docker+K8S+GitLab/SVN+Jenkins+Harbor をベースにした継続的インテグレーション配信環境の構築に関する詳細なチュートリアル

>>:  JSで画面録画機能を作成する

推薦する

Win7 での Mysql 5.7.17 winx64 インストール チュートリアル

ソフトウェア バージョンとプラットフォーム: MySQL-5.7.17-winx64、win7 Ho...

Vue/React シングルページ アプリケーションをリフレッシュなしで復元するソリューション

目次導入なぜわざわざ?落とし穴のあるコミュニティソリューション(Vue を例に挙げる)現時点では良い...

カルーセル例の JavaScript 実装

この記事では、カルーセルの効果を実現するためのJavaScriptの具体的なコードを参考までに共有し...

CSSは親要素の下の最初の子要素を選択します(:first-child)

序文最近、プロジェクトで :first-child を使用したのですが、すぐに思いつきました。これは...

Linux の Docker コンテナで bash を終了する 2 つの方法

bash を終了する場合は、次の 2 つのオプションがあります。最初のもの: Ctrl + d を押...

Web データ ストレージ: Cookie、UserData、SessionStorage、WebSqlDatabase

クッキーこれはクライアント ブラウザの状態を保存するための標準的な方法です。Cookie はブラウザ...

HTML+CSS をベースにした素敵なフリップログインおよび登録インターフェースを作成します

素敵なフリップログインと登録インターフェースを作成する序文最近、ネットワーク ディスクを構築しようと...

JavaScriptは組み込みオブジェクトのプロトタイプメソッド実装を追加します

オブジェクトがメソッドを呼び出す順序:インスタンス内にメソッドが存在しない場合は、インスタンス オブ...

6ull が Linux ドライバ モジュールをロードできない問題の解決方法

目次0x01 ドライバーモジュールのロードに失敗しました0x02 ソリューション要約する0x01 ド...

HTML ページに SVG を挿入する複数の方法

SVG (Scalable Vector Graphics)は、XML 構文に基づいた画像形式です。...

JavaScript Three.js でテキストを作成する最初の経験

目次効果テキストの作成を開始するまずフォントローダーを作成するフォントライブラリを読み込むテキストジ...

Centos8 に nginx をインストールするための詳細なチュートリアル (画像とテキスト)

Nginx (「エンジン エックス」と発音) は、インターネット上の最大規模のサイトの負荷を処理す...

Ubuntu 18.04はルート権限を取得し、ルートユーザーとしてログインします

事前に書いておきます:次の手順では、ターミナルにコマンドを入力する必要があります。コンピューターでブ...

Vueは商品詳細ページの商品タブ機能を実装します

この記事の例では、商品詳細ページ機能を実現するためのVueの商品タブの具体的なコードを参考までに共有...