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で画面録画機能を作成する

推薦する

Linux の一般的なハードディスク管理コマンドの紹介

目次1. dfコマンド2. duコマンド3. fsckファイルシステム修復コマンド4. ディスクステ...

Windows 64 ビットに MySQL を再インストールするチュートリアル (Zip バージョン、解凍バージョンの MySQL インストール)

MySQLをアンインストールする1. コントロールパネルで、MySQLのすべてのコンポーネントをア...

MySQL 8.0.16 winx64 のインストールと設定方法のグラフィックチュートリアル (win10 の場合)

この記事では、MySQL 8.0.16 winx64のインストールと設定の具体的な方法を記載します。...

Vue+elementUI コンポーネントは、折りたたみ可能な動的レンダリングのマルチレベル サイドバー ナビゲーションを再帰的に実装します。

かなり前に実装された機能ですが、クリックすると選択したメニュー項目の背景色が白くなることに気付きまし...

mysql5.6 マスタースレーブ設定と非同期の問題の詳細な説明

目次1. MySQL マスタースレーブレプリケーションの原理2. MySQLのコンパイルとインストー...

HTML 名 ID とクラスの違い_PowerNode Java アカデミー

名前タグの名前を指定します。形式 <input type="text" n...

CentOS に MySQL 8.0 をインストールして設定するための詳細な手順

序文CentOS に MySQL をインストールして設定する手順は次のとおりです。文章yumソースか...

MySQLの誤操作後にbinlog2sqlを使用して素早くロールバックする方法の詳細な説明

序文日常の仕事や勉強では、データベースを操作するときに「不注意」によるミスを犯すことは避けられません...

WindowsはVMwareを使用してLinux仮想マシンを作成し、CentOS7.2オペレーティングシステムをインストールします。

目次1. ウィザードに従って仮想マシンを作成します2. オペレーティングシステムをインストールします...

JavaScript のアンチシェイクとスロットリングの違いと実装

目次1. 手ぶれ補正2. スロットリング3. まとめ序文:フロントエンド開発者には、次の 2 つの要...

Dockerfile を使用したカスタムイメージの構築の実装

目次序文Dockerfile の紹介Dockerfileはイメージプロセスを構築するDockerfi...

ウェブページ作成の基本宣言文書型記述(DTD

CSS レイアウトを使用して WEB 標準に準拠した Web ページを作成することは、jb51.ne...

MySQL における主キーが 0 であることと主キーの自己選択制約の関係についての詳しい説明 (詳細)

序文この記事は主にMySQLの主キー0と主キー自己排除制約の関係を紹介し、皆さんの参考と学習のために...

mysql: [エラー] 不明なオプション '--skip-grant-tables'

MySQL データベースがエラー 1045 (28000): ユーザー 'ODBC'...