たとえば,
社内からアクセスするとXOOPSにアクセスできて,
社外からアクセスするとサイト閉鎖(XOOPS)に
アクセスするようにしたいです.
を、例によって site preload で作ってみました。
SiteClose4OutSide.class.php として preload に保存すれば OK です。念のため、 site_default.ini.php の [Legacy.PrimaryPreloads] チャンクから Legacy_SiteClose の一行を削って置いてください。
ダウンロードする場合はこちらをどうぞ。
<?php
if (!defined('XOOPS_ROOT_PATH')) exit();
/// 許可するIPを正規表現でここに書いてね
define("SPECIFIC_IP", "/^127.0.0.\d+$/");
require_once XOOPS_ROOT_PATH . "/modules/legacy/preload/Primary/SiteClose.class.php";
class SiteClose4OutSide extends Legacy_SiteClose
{
function preBlockFilter()
{
if (!preg_match(SPECIFIC_IP, $_SERVER['REMOTE_ADDR']) ||
$this->mRoot->mContext->getXoopsConfig('closesite') == 1)
{
$this->mController->mSetupUser->add("Legacy_SiteClose::callbackSetupUser", XCUBE_DELEGATE_PRIORITY_FINAL);
$this->mRoot->mDelegateManager->add("Site.CheckLogin.Success", array(&$this, "callbackCheckLoginSuccess"));
}
}
}
?>
簡単に説明をしておきますと、 SiteClose はもともとがプリロードで実装されており、サイトクローズ設定が有効なときのみ、それ関係の処理を行うメソッドをデリゲートに登録して働きます。この判定を行っている部分を隠蔽オーバーライドし、 if 文に IP 関係の判定を加えただけのものです。したがって動作にはオリジナルの SiteClose.class.php が必要です。
短いプリロードなら、コードをコピーしてしまったほうがいいと思いますが、もし長ぁいコードで、システムやモジュールにあわせて改変される可能性があるものなら、差分プログラミングに持ち込んだほうが若干プリロードの寿命が延ばせるかもしれません。
preload はモジュール同様、頒布単位となるものですが、もともとモジュールなどの組み合わせだけではこなせない仕事をするための箇所ですので、汎用性を求めるのではなく、色々なものに依存べったりでいいのでさっさと書いてしまって、使う人がいたらラッキーくらいの感覚で掲示板にガンガン貼っちゃうのがいいと思います。
(みんなで弄りやすいと思いますし)
0 件のコメント:
コメントを投稿